Files
Edu/apps/portal-shell/src/widgets/admin/invitation-codes/plugin.manifest.ts
SpecialX 2910a90271 feat(portal-shell): extract domain API layer and migrate 31 widgets
Task 4-10 of portal-shell data abstraction plan (M1-M2).

Add 7 domain API modules under src/lib/api/ (parent/admin/teacher/
student/universal/sidebar/topbar), each exposing semantic hooks that
wrap useWidgetQuery/useWidgetMutation and return flattened domain
models. Widget code now imports from @/lib/api instead of inlining
gql literals.

- 31 widgets migrated (gql literal count in widgets: 0)
- 7 test files (85 cases, all passing)
- topbar.useNotifications renamed to useNotificationBell to avoid
  barrel export collision with universal.useNotifications
- typecheck + lint (0 errors) + test (85/85) verified
2026-07-17 13:07:24 +08:00

41 lines
1.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* invitation-codes 插件清单admin
*
* 邀请码管理,插入 main slot。生成/查看/撤销邀请码。
* 查询/变更经 apollo-router → iam 子图 invitationCodes。
*
* 关联portal-shell spec §3 admin 分类、§5.6 统一 Hook
*/
import type { PluginManifest } from "@/lib/types";
export const manifestMeta: Omit<PluginManifest, "Component"> = {
pluginId: "invitation-codes",
version: "0.1.0",
requiredShellVersion: "^1.0.0",
metadata: {
displayName: "邀请码",
description: "生成并管理用户注册邀请码,支持角色/有效期/次数配置",
category: "admin",
requiredRoles: ["admin"],
defaultSlot: "main",
defaultSize: { colSpan: 2, rowSpan: 1 },
defaultProps: {
defaultMaxUses: 1,
defaultTtlHours: 72,
},
propsSchema: {
type: "object",
properties: {
defaultMaxUses: {
type: "number",
description: "默认最大使用次数1=一次性,>1=批量)",
},
defaultTtlHours: {
type: "number",
description: "默认有效期(小时)",
},
},
},
},
};