openxiangda-cli 2.0.0-alpha.183 → 2.0.0-alpha.185

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/commands/admin.d.ts.map +1 -1
  2. package/dist/commands/admin.js +5 -3
  3. package/dist/commands/admin.js.map +1 -1
  4. package/dist/commands/spec.js +1 -1
  5. package/dist/commands/spec.js.map +1 -1
  6. package/package.json +5 -5
  7. package/template/AGENTS.md +2 -2
  8. package/template/apps/web/e2e/README.md +7 -0
  9. package/template/apps/web/package.json +2 -2
  10. package/template/apps/web/playwright.config.ts +3 -5
  11. package/template/apps/web/vite.config.ts +1 -9
  12. package/template/appspec/app.md +5 -1
  13. package/template/package.json +1 -1
  14. package/template/apps/web/data-api-live.e2e.html +0 -15
  15. package/template/apps/web/e2e/client-fixture.ts +0 -5
  16. package/template/apps/web/e2e/component-defaults-fixture.css +0 -15
  17. package/template/apps/web/e2e/data-api-live-fixture.tsx +0 -162
  18. package/template/apps/web/e2e/data-api-live.spec.ts +0 -144
  19. package/template/apps/web/e2e/field-protocol-fixture.tsx +0 -387
  20. package/template/apps/web/e2e/field-protocol.spec.ts +0 -285
  21. package/template/apps/web/e2e/mobile-files.spec.ts +0 -96
  22. package/template/apps/web/e2e/mobile-reference-fixture.tsx +0 -314
  23. package/template/apps/web/e2e/mobile-reference.spec.ts +0 -360
  24. package/template/apps/web/e2e/mobile-selection.spec.ts +0 -199
  25. package/template/apps/web/e2e/resource-experience-fixture.tsx +0 -491
  26. package/template/apps/web/e2e/resource-platform-mock.ts +0 -202
  27. package/template/apps/web/e2e/resources.spec.ts +0 -488
  28. package/template/apps/web/e2e/standard-admin.spec.ts +0 -511
  29. package/template/apps/web/e2e/workflow-entry-fixture.tsx +0 -107
  30. package/template/apps/web/e2e/workflow-entry.spec.ts +0 -556
  31. package/template/apps/web/e2e/workflow-experience-fixture.tsx +0 -338
  32. package/template/apps/web/e2e/workflow.spec.ts +0 -1265
  33. package/template/apps/web/field-protocol.e2e.html +0 -22
  34. package/template/apps/web/mobile-reference.e2e.html +0 -27
  35. package/template/apps/web/resource-experience.e2e.html +0 -16
  36. package/template/apps/web/scripts/check.mjs +0 -43
  37. package/template/apps/web/test/contracts.test.ts +0 -163
  38. package/template/apps/web/workflow-entry.e2e.html +0 -15
  39. package/template/apps/web/workflow-experience.e2e.html +0 -15
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAA2B;IACzC,MAAM,CAAC,IAAI;;;MAGT;IACF,MAAM,CAAC,KAAK;;;MAGV;IACI,GAAG;;;;;;;;;;;;;;;;;;;CASV"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAGhE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAA2B;IACzC,MAAM,CAAC,IAAI;;;MAGT;IACF,MAAM,CAAC,KAAK;;;MAGV;IACI,GAAG;;;;;;;;;;;;;;;;;;;CAUV"}
@@ -1,5 +1,6 @@
1
1
  import { Args, Flags } from "@oclif/core";
2
2
  import { OpenXiangdaCommand, workspaceFlags } from "../base.js";
3
+ import { DEVELOPER_ENVIRONMENTS, developerEnvironment } from "openxiangda-devkit-core";
3
4
  export default class Admin extends OpenXiangdaCommand {
4
5
  static summary = "只读查看当前应用管理能力和流程节点运行配置";
5
6
  static args = {
@@ -8,18 +9,19 @@ export default class Admin extends OpenXiangdaCommand {
8
9
  };
9
10
  static flags = {
10
11
  ...workspaceFlags,
11
- environment: Flags.string({ options: ["test", "production"], default: "test", summary: "读取环境;默认测试环境" }),
12
+ environment: Flags.string({ options: [...DEVELOPER_ENVIRONMENTS], default: "test", summary: "读取环境;默认测试环境" }),
12
13
  };
13
14
  async run() {
14
15
  const { args, flags } = await this.parse(Admin);
16
+ const environment = developerEnvironment(flags.environment);
15
17
  if (args.action === "context") {
16
18
  if (args.workflowCode)
17
19
  throw new Error("ADMIN_CONTEXT_UNEXPECTED_WORKFLOW_CODE");
18
- return this.present(await this.services.administrationContext(flags.cwd, flags.environment));
20
+ return this.present(await this.services.administrationContext(flags.cwd, environment));
19
21
  }
20
22
  if (!args.workflowCode)
21
23
  throw new Error("WORKFLOW_CODE_REQUIRED: 请指定流程代码");
22
- return this.present(await this.services.workflowNodeConfigurations(flags.cwd, args.workflowCode, flags.environment));
24
+ return this.present(await this.services.workflowNodeConfigurations(flags.cwd, args.workflowCode, environment));
23
25
  }
24
26
  }
25
27
  //# sourceMappingURL=admin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC;IACzC,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QACzE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;KAC9D,CAAC;IACF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;KACxG,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACvH,CAAC"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC;IACzC,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QACzE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;KAC9D,CAAC;IACF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;KAC7G,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACjH,CAAC"}
@@ -15,7 +15,7 @@ export default class Spec extends OpenXiangdaCommand {
15
15
  action: Args.string({ required: true, options: [...actions] }),
16
16
  target: Args.string({
17
17
  required: false,
18
- summary: "capability/change id,或 context selector",
18
+ summary: "能力/变更 ID,或 context 的 ADR、DES-* 设计 selector",
19
19
  }),
20
20
  };
21
21
  static flags = {
@@ -1 +1 @@
1
- {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda-cli",
3
- "version": "2.0.0-alpha.183",
3
+ "version": "2.0.0-alpha.185",
4
4
  "description": "OpenXiangda 2.0 应用生命周期命令、创建器与模板。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,10 +21,10 @@
21
21
  ],
22
22
  "dependencies": {
23
23
  "@oclif/core": "4.13.3",
24
- "openxiangda-contracts": "2.0.0-alpha.92",
25
- "openxiangda-devkit-core": "2.0.0-alpha.118",
26
- "openxiangda-mcp": "2.0.0-alpha.118",
27
- "openxiangda-skill-kit": "2.0.0-alpha.144"
24
+ "openxiangda-contracts": "2.0.0-alpha.94",
25
+ "openxiangda-devkit-core": "2.0.0-alpha.120",
26
+ "openxiangda-mcp": "2.0.0-alpha.120",
27
+ "openxiangda-skill-kit": "2.0.0-alpha.146"
28
28
  },
29
29
  "devDependencies": {
30
30
  "tsx": "4.23.12",
@@ -12,13 +12,13 @@
12
12
  - 日常使用 dev 和聚焦测试。只验证时使用 check;授权部署时直接 deploy,它已包含检查、测试和构建。生产必须指定成功测试运行并复用同一版本。
13
13
  - deploy 默认持续反馈并跟踪平台结果;观察中断用 status <运行ID> --watch 继续,保留原运行,不重新构建。平台部署成功后仍需真实角色业务验收。
14
14
  - 开发开始先同步远端默认主分支;同一工作区只有一个写者。发布前将本轮源码、生成契约与记录合入并推送主分支,从干净且同步的主分支冻结候选;任务分支已推送不等于已合入主线。不要覆盖其他会话改动或自动合并所有分支。
15
- - 默认读取 AppSpec 当前规格、活动变更和阶段缺口,按角色、规则、页面、数据澄清模糊需求,再评估架构、权限和性能边界。总纲保存长期规则,本轮变更关联需求、任务、源码与 AC 验收;测试发布前完成设计与计划,生产晋级前保存绑定原测试运行及包摘要的实际验收报告。更新当前规则、验证与发布结果和交接后归档;不得编造确认或通过结果。
15
+ - 默认读取 AppSpec 当前规格、设计索引、活动变更和阶段缺口。新应用先用自然语言对话主动发现模块,完成本期 PRD、旅程、逐页交互、视觉/原型、权限与架构设计及实际确认,形成内容摘要绑定的评审基线后再制定实施计划和实现业务;参见 docs product-design 和 docs interaction-patterns。既有应用仅修订受影响设计,不把 AI 建议写成用户确认。总纲保存长期规则,本轮变更关联需求、任务、源码与 AC 验收;测试发布前完成设计与计划,生产晋级前保存绑定原测试运行及包摘要的实际验收报告。更新当前规则、验证与发布结果和交接后归档;不得编造确认或通过结果。
16
16
  - 根据变化风险记录业务意图。无行为变化引用已有记录;已有授权和已确认意图不重复向用户请求机械确认。真实角色和浏览器验收与本地测试分别记录。
17
17
  - 失败保留错误码、指针和原候选;查询平台状态后使用允许的恢复操作,不自动重放未知结果。
18
18
 
19
19
  MCP 使用同一项目 CLI:`pnpm exec openxiangda --mcp-stdio --cwd <workspace>`。先读取 workspace_context,再按任务读取 docs_read 和当前契约。登录、创建及长期 dev 使用 CLI/终端。
20
20
 
21
- 详细用法:`pnpm openxiangda docs development`、`docs frontend`、`docs data-authz`、`docs administration`、`docs testing`、`docs delivery`。按需加载,无需每次通读全部资料。
21
+ 详细用法:`pnpm openxiangda docs product-design`、`docs interaction-patterns`、`docs development`、`docs frontend`、`docs data-authz`、`docs administration`、`docs testing`、`docs delivery`。按需加载,无需每次通读全部资料。
22
22
  <!-- OPENXIANGDA:END -->
23
23
 
24
24
  ## 项目自有约定
@@ -0,0 +1,7 @@
1
+ # 本应用的浏览器验收
2
+
3
+ 在此目录按 AppSpec 的实际验收条件添加 `*.spec.ts`。模板没有预先通过的业务用例;尚未编写用例时,`pnpm test:e2e` 会提示未发现测试。
4
+
5
+ 先启动完整连接开发环境,确认目标是测试环境,再通过 `OPENXIANGDA_E2E_BASE_URL` 指定它的 Web 地址并运行 `pnpm test:e2e`。使用平台正式提供的测试身份,分别验证允许与拒绝路径、PC 与移动页面、操作后数据及历史记录。登录信息不提交 Git。
6
+
7
+ 测试页面与接口属于当前应用。模拟响应可用于局部交互回归,应明确记录范围;它不能证明平台权限或真实业务通过。工具链维护者的通用组件夹具不会复制到这里。
@@ -5,7 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
8
- "check": "tsc -p tsconfig.json --noEmit && node scripts/check.mjs",
8
+ "check": "tsc -p tsconfig.json --noEmit",
9
9
  "test": "tsx --test test/*.test.ts",
10
10
  "test:e2e": "playwright test",
11
11
  "build": "tsc -p tsconfig.json --noEmit && vite build && node scripts/verify-build.mjs"
@@ -14,7 +14,7 @@
14
14
  "@ant-design/icons": "6.2.3",
15
15
  "@refinedev/core": "5.0.12",
16
16
  "antd": "6.4.3",
17
- "openxiangda": "2.0.0-alpha.110",
17
+ "openxiangda": "2.0.0-alpha.112",
18
18
  "react": "19.2.8",
19
19
  "react-dom": "19.2.8",
20
20
  "react-router-dom": "7.8.2"
@@ -6,9 +6,7 @@ const baseURL =
6
6
 
7
7
  export default defineConfig({
8
8
  testDir: './e2e',
9
- // The development server owns one mutable dependency-optimizer generation.
10
- // Serial browser entrypoints prevent a second HTML graph from invalidating
11
- // an in-flight transformed module during release acceptance.
9
+ // e2e/ 中添加本应用的真实业务验收,测试账户与环境由测试代码明确选择。
12
10
  workers: 1,
13
11
  use: { baseURL, trace: 'retain-on-failure' },
14
12
  webServer: process.env.OPENXIANGDA_E2E_BASE_URL
@@ -19,7 +17,7 @@ export default defineConfig({
19
17
  reuseExistingServer: false,
20
18
  env: {
21
19
  OPENXIANGDA_WEB_PORT: String(e2ePort),
22
- OPENXIANGDA_ENVIRONMENT_KEY: 'production',
20
+ OPENXIANGDA_ENVIRONMENT_KEY: 'preproduction',
23
21
  OPENXIANGDA_DEV_PROXY:
24
22
  process.env.OPENXIANGDA_E2E_PLATFORM_URL ||
25
23
  'http://127.0.0.1:7001',
@@ -33,7 +31,7 @@ function resolveE2ePort() {
33
31
  const port = Number(configured);
34
32
  if (!Number.isInteger(port) || port < 1024 || port > 65535) {
35
33
  throw new Error(
36
- 'OPENXIANGDA_E2E_PORT must be an integer between 1024 and 65535'
34
+ 'OPENXIANGDA_E2E_PORT 必须是 1024 65535 之间的整数'
37
35
  );
38
36
  }
39
37
  return port;
@@ -10,15 +10,7 @@ export default defineConfig({
10
10
  plugins: [react(), tailwindcss()],
11
11
  base: './',
12
12
  optimizeDeps: {
13
- entries: [
14
- 'index.html',
15
- 'data-api-live.e2e.html',
16
- 'field-protocol.e2e.html',
17
- 'mobile-reference.e2e.html',
18
- 'resource-experience.e2e.html',
19
- 'workflow-experience.e2e.html',
20
- 'workflow-entry.e2e.html',
21
- ],
13
+ entries: ['index.html'],
22
14
  },
23
15
  server: {
24
16
  host: '127.0.0.1',
@@ -6,7 +6,7 @@ status: active
6
6
  ---
7
7
  # OpenXiangda 应用
8
8
 
9
- 本文件保存当前有效目标与设计约束。正式变更关联 ChangeSpec;测试发布前核对设计与验收计划,生产晋级前核对实际验收。资源、字段、权限和动作的实现以
9
+ 本文件是当前有效设计的总纲与目录。新应用先完成产品发现、详细设计与实际确认,形成评审基线后再制定实施计划;按 docs product-design 在 AppSpec 中建立相关材料。正式变更关联 ChangeSpec;测试发布前核对设计与验收计划,生产晋级前核对实际验收。资源、字段、权限和动作的实现以
10
10
  `openxiangda.config.ts` 与实时编译合同为准。
11
11
 
12
12
  ## 业务目标
@@ -23,6 +23,10 @@ status: active
23
23
 
24
24
  ### 不包含
25
25
 
26
+ ## 设计资料目录
27
+
28
+ <!-- 引用产品、旅程、页面、视觉、权限、架构与评审的稳定 ID;详细规则各有唯一归属。 -->
29
+
26
30
  ## 能力目录
27
31
 
28
32
  <!-- 复杂业务再在 capabilities/ 下增加 CAP-*;简单应用的稳定规则直接写在本文件。 -->
@@ -22,7 +22,7 @@
22
22
  "build": "pnpm --recursive build"
23
23
  },
24
24
  "devDependencies": {
25
- "openxiangda": "2.0.0-alpha.110",
25
+ "openxiangda": "2.0.0-alpha.112",
26
26
  "typescript": "5.9.3"
27
27
  }
28
28
  }
@@ -1,15 +0,0 @@
1
- <!doctype html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="openxiangda-runtime-base" content="/" />
7
- <meta name="openxiangda-app-code" content="native-projection-app" />
8
- <meta name="openxiangda-environment" content="production" />
9
- <title>OpenXiangda Standard Data API Live Acceptance</title>
10
- </head>
11
- <body>
12
- <div id="root"></div>
13
- <script type="module" src="/e2e/data-api-live-fixture.tsx"></script>
14
- </body>
15
- </html>
@@ -1,5 +0,0 @@
1
- export {
2
- requestApplicationApi,
3
- searchDirectory,
4
- searchResource,
5
- } from 'openxiangda/core';
@@ -1,15 +0,0 @@
1
- .component-defaults-page {
2
- display: grid;
3
- align-content: start;
4
- gap: 16px;
5
- padding: 24px;
6
- }
7
-
8
- .component-defaults-panel {
9
- border: 1px solid var(--ant-color-border-secondary);
10
- border-radius: var(--ant-border-radius);
11
- background: var(--ant-color-bg-container);
12
- padding: 24px;
13
- color: var(--ant-color-text);
14
- box-shadow: var(--ant-box-shadow-tertiary);
15
- }
@@ -1,162 +0,0 @@
1
- import { Refine } from '@refinedev/core';
2
- import { App as AntdApp } from 'antd';
3
- import React from 'react';
4
- import ReactDOM from 'react-dom/client';
5
- import { MemoryRouter, Route, Routes } from 'react-router-dom';
6
- import {
7
- OpenXiangdaUiProvider,
8
- createApplicationProvider,
9
- GeneratedResourcePage,
10
- OpenXiangdaResourceDefinitionsProvider,
11
- RuntimeBoundary,
12
- type GeneratedResourceDefinition,
13
- } from 'openxiangda/react';
14
- import 'openxiangda/react/styles.css';
15
-
16
- const code = 'field-records';
17
- const capabilityBase = `app:native-projection-app:data:${code}`;
18
- const capabilities = {
19
- read: `${capabilityBase}:read`,
20
- create: `${capabilityBase}:create`,
21
- update: `${capabilityBase}:update`,
22
- delete: `${capabilityBase}:delete`,
23
- };
24
-
25
- function fieldCapabilities() {
26
- return {
27
- readCapabilities: [capabilities.read],
28
- createCapabilities: [capabilities.create],
29
- updateCapabilities: [capabilities.update],
30
- };
31
- }
32
-
33
- export const liveDefinition: GeneratedResourceDefinition = {
34
- code,
35
- name: '字段协议记录',
36
- capabilities,
37
- surface: {
38
- mutationOwner: 'native',
39
- generated: {
40
- list: true,
41
- detail: true,
42
- create: true,
43
- update: true,
44
- delete: true,
45
- },
46
- fields: {
47
- text_short: {
48
- label: '标题',
49
- type: 'text.short',
50
- widget: 'text',
51
- requiredHint: true,
52
- maxLength: 120,
53
- list: true,
54
- searchable: true,
55
- sortable: true,
56
- ...fieldCapabilities(),
57
- },
58
- option_single: {
59
- label: '单选快照',
60
- type: 'option.single',
61
- widget: 'radio',
62
- options: [
63
- { label: 'Open', value: 'open' },
64
- { label: 'Closed', value: 'closed' },
65
- ],
66
- list: true,
67
- ...fieldCapabilities(),
68
- },
69
- option_multiple: {
70
- label: '多选快照',
71
- type: 'option.multiple',
72
- widget: 'checkbox',
73
- options: [
74
- { label: 'Open', value: 'open' },
75
- { label: 'Urgent', value: 'urgent' },
76
- ],
77
- list: true,
78
- ...fieldCapabilities(),
79
- },
80
- location_value: {
81
- label: '精确定位',
82
- type: 'location',
83
- widget: 'location',
84
- list: true,
85
- ...fieldCapabilities(),
86
- },
87
- },
88
- list: {
89
- defaultPageSize: 20,
90
- searchableFields: ['text_short'],
91
- filterFields: ['option_single'],
92
- defaultSort: { field: 'text_short', order: 'asc' },
93
- },
94
- form: { layout: 'sections' },
95
- detail: { layout: 'sections' },
96
- mobile: { enabled: true },
97
- },
98
- };
99
-
100
- const definitions = { [code]: liveDefinition };
101
- const provider = createApplicationProvider(definitions);
102
- const routeBase = `/admin/resources/${code}`;
103
- const routePaths = {
104
- fallback: '/admin',
105
- list: routeBase,
106
- create: `${routeBase}/new`,
107
- detail: `${routeBase}/:id`,
108
- edit: `${routeBase}/:id/edit`,
109
- };
110
- const initialPath =
111
- new URLSearchParams(window.location.search).get('initial') || routeBase;
112
-
113
- function resourcePage(mode: 'list' | 'create' | 'edit' | 'detail') {
114
- return (
115
- <GeneratedResourcePage
116
- definition={liveDefinition}
117
- mode={mode}
118
- paths={routePaths}
119
- resourceCode={code}
120
- />
121
- );
122
- }
123
-
124
- ReactDOM.createRoot(document.getElementById('root')!).render(
125
- <React.StrictMode>
126
- <OpenXiangdaResourceDefinitionsProvider definitions={definitions}>
127
- <OpenXiangdaUiProvider>
128
- <AntdApp>
129
- <RuntimeBoundary>
130
- <MemoryRouter initialEntries={[initialPath]}>
131
- <Refine
132
- dataProvider={provider}
133
- resources={[
134
- {
135
- name: code,
136
- list: routePaths.list,
137
- create: routePaths.create,
138
- edit: routePaths.edit,
139
- show: routePaths.detail,
140
- },
141
- ]}
142
- >
143
- <Routes>
144
- <Route path={routePaths.list} element={resourcePage('list')} />
145
- <Route path={routePaths.create} element={resourcePage('create')} />
146
- <Route
147
- path={routePaths.detail}
148
- element={resourcePage('detail')}
149
- />
150
- <Route
151
- path={routePaths.edit}
152
- element={resourcePage('edit')}
153
- />
154
- </Routes>
155
- </Refine>
156
- </MemoryRouter>
157
- </RuntimeBoundary>
158
- </AntdApp>
159
- </OpenXiangdaUiProvider>
160
- </OpenXiangdaResourceDefinitionsProvider>
161
- </React.StrictMode>
162
- );
@@ -1,144 +0,0 @@
1
- import { expect, test } from '@playwright/test';
2
-
3
- const liveEnabled = process.env.OPENXIANGDA_LIVE_DATA_API === '1';
4
- const title = 'UI live field record';
5
-
6
- test.describe('@live-data-api standard resource UI', () => {
7
- test.setTimeout(90_000);
8
- test.skip(
9
- !liveEnabled,
10
- 'Requires the disposable PostgreSQL Native Data API acceptance bridge.'
11
- );
12
-
13
- test.beforeEach(async ({ context }) => {
14
- await context.addCookies([
15
- {
16
- name: 'openxiangda-field-ui-role',
17
- value: 'super',
18
- domain: '127.0.0.1',
19
- path: '/',
20
- },
21
- ]);
22
- });
23
-
24
- test('runs create, list, query, get, update, audit and delete through the standard page', async ({
25
- context,
26
- page,
27
- }) => {
28
- await context.grantPermissions(['geolocation']);
29
- await context.setGeolocation({
30
- longitude: 120.123456,
31
- latitude: 30.234567,
32
- accuracy: 4,
33
- });
34
- await page.goto(
35
- '/data-api-live.e2e.html?initial=/admin/resources/field-records',
36
- );
37
- await expect(page.locator('.oxa-list-surface')).toBeVisible();
38
-
39
- await page.getByRole('button', { name: '新增字段协议记录' }).click();
40
- await expect(page.getByRole('heading', { name: '新增字段协议记录' })).toBeVisible();
41
- await page.getByLabel('标题').fill(title);
42
- await page.getByRole('radio', { name: 'Open' }).check();
43
- const openCheckbox = page.getByRole('checkbox', { name: 'Open' });
44
- const urgentCheckbox = page.getByRole('checkbox', { name: 'Urgent' });
45
- await openCheckbox.click();
46
- await urgentCheckbox.click();
47
- await expect(openCheckbox).toBeChecked();
48
- await expect(urgentCheckbox).toBeChecked();
49
- await page.getByRole('button', { name: '浏览器定位' }).click();
50
- await expect(page.getByText('120.123456, 30.234567')).toBeVisible();
51
- await page.getByRole('button', { name: /^保\s*存$/ }).click();
52
-
53
- await expect(page.locator('.oxa-list-surface')).toBeVisible();
54
- await page.locator('.oxa-search-panel .ant-select').first().click();
55
- await page.getByText('标题', { exact: true }).last().click();
56
- await page.getByPlaceholder('关键词').fill(title);
57
- await page.getByRole('button', { name: /查询/ }).click();
58
- const createdRow = page.getByRole('row').filter({ hasText: title });
59
- await expect(createdRow).toHaveCount(1);
60
- await expect(createdRow).toContainText('Open');
61
- await expect(createdRow).toContainText('Urgent');
62
- await expect(createdRow).toContainText('120.123456, 30.234567');
63
-
64
- await createdRow.getByRole('button', { name: '查看' }).click();
65
- await expect(page.getByRole('heading', { name: '字段协议记录详情' })).toBeVisible();
66
- await expect(page.getByText(title, { exact: true })).toBeVisible();
67
- await expect(page.getByText(/浏览器定位/)).toBeVisible();
68
- await page.locator('.oxa-audit-collapse .ant-collapse-header').click();
69
- await expect(page.getByText('创建', { exact: true })).toBeVisible();
70
- await page.screenshot({
71
- fullPage: true,
72
- path: 'test-results/data-api-live-detail.png',
73
- });
74
-
75
- await page.getByRole('button', { name: /编辑/ }).click();
76
- await page.getByLabel('标题').fill(`${title} updated`);
77
- await page.getByRole('radio', { name: 'Closed' }).check();
78
- await page.getByRole('checkbox', { name: 'Open' }).click();
79
- await expect(page.getByRole('checkbox', { name: 'Open' })).not.toBeChecked();
80
- await page.getByRole('button', { name: /^保存修改$/ }).click();
81
- await expect(page.getByText(`${title} updated`, { exact: true })).toBeVisible();
82
- await expect(page.getByText('Closed', { exact: true })).toBeVisible();
83
-
84
- await page.getByRole('button', { name: '返回列表' }).click();
85
- const updatedRow = page
86
- .getByRole('row')
87
- .filter({ hasText: `${title} updated` });
88
- await expect(updatedRow).toHaveCount(1);
89
- await updatedRow.getByRole('button', { name: '删除' }).click();
90
- await page.getByRole('button', { name: /^确\s*定$/ }).click();
91
- await expect(updatedRow).toHaveCount(0);
92
- });
93
-
94
- test('applies PostgreSQL row scope to the standard list and query UI', async ({
95
- context,
96
- page,
97
- }) => {
98
- await context.clearCookies();
99
- await context.addCookies([
100
- {
101
- name: 'openxiangda-field-ui-role',
102
- value: 'restricted',
103
- domain: '127.0.0.1',
104
- path: '/',
105
- },
106
- ]);
107
- await page.goto(
108
- '/data-api-live.e2e.html?initial=/admin/resources/field-records',
109
- );
110
- await expect(page.locator('.oxa-list-surface')).toBeVisible();
111
- await page.locator('.oxa-search-panel .ant-select').first().click();
112
- await page.getByText('标题', { exact: true }).last().click();
113
- await page.getByPlaceholder('关键词').fill('UI RLS');
114
- await page.getByRole('button', { name: /查询/ }).click();
115
- await expect(page.getByText('UI RLS visible', { exact: true })).toBeVisible();
116
- await expect(page.getByText('UI RLS hidden', { exact: true })).toHaveCount(0);
117
- await page.screenshot({
118
- fullPage: true,
119
- path: 'test-results/data-api-live-rls.png',
120
- });
121
- });
122
-
123
- test('fails closed in the standard page when the role has no read capability', async ({
124
- context,
125
- page,
126
- }) => {
127
- await context.clearCookies();
128
- await context.addCookies([
129
- {
130
- name: 'openxiangda-field-ui-role',
131
- value: 'denied',
132
- domain: '127.0.0.1',
133
- path: '/',
134
- },
135
- ]);
136
- await page.goto(
137
- '/data-api-live.e2e.html?initial=/admin/resources/field-records',
138
- );
139
- await expect(
140
- page.getByText('当前平台用户无字段协议记录页面权限', { exact: true })
141
- ).toBeVisible();
142
- await expect(page.locator('.oxa-list-surface')).toHaveCount(0);
143
- });
144
- });