openxiangda 1.0.147 → 1.0.149

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 (32) hide show
  1. package/README.md +10 -0
  2. package/lib/cli.js +191 -3
  3. package/openxiangda-skills/SKILL.md +2 -0
  4. package/openxiangda-skills/references/pages/page-sdk.md +19 -0
  5. package/openxiangda-skills/skills/openxiangda-core/SKILL.md +3 -0
  6. package/openxiangda-skills/skills/openxiangda-form/SKILL.md +24 -0
  7. package/package.json +2 -1
  8. package/packages/sdk/dist/{ProcessPreview-BoblxCUt.d.mts → ProcessPreview-BOCARAvP.d.mts} +9 -1
  9. package/packages/sdk/dist/{ProcessPreview-BoblxCUt.d.ts → ProcessPreview-BOCARAvP.d.ts} +9 -1
  10. package/packages/sdk/dist/components/index.cjs +33 -21
  11. package/packages/sdk/dist/components/index.cjs.map +1 -1
  12. package/packages/sdk/dist/components/index.d.mts +4 -4
  13. package/packages/sdk/dist/components/index.d.ts +4 -4
  14. package/packages/sdk/dist/components/index.mjs +33 -21
  15. package/packages/sdk/dist/components/index.mjs.map +1 -1
  16. package/packages/sdk/dist/{dataManagementApi-BCzfV88G.d.mts → dataManagementApi-CLMqf79O.d.mts} +1 -1
  17. package/packages/sdk/dist/{dataManagementApi-_FFNPv2e.d.ts → dataManagementApi-DhpRKmlp.d.ts} +1 -1
  18. package/packages/sdk/dist/runtime/index.cjs +375 -30
  19. package/packages/sdk/dist/runtime/index.cjs.map +1 -1
  20. package/packages/sdk/dist/runtime/index.d.mts +3 -3
  21. package/packages/sdk/dist/runtime/index.d.ts +3 -3
  22. package/packages/sdk/dist/runtime/index.mjs +377 -32
  23. package/packages/sdk/dist/runtime/index.mjs.map +1 -1
  24. package/packages/sdk/dist/runtime/react.cjs +12 -0
  25. package/packages/sdk/dist/runtime/react.cjs.map +1 -1
  26. package/packages/sdk/dist/runtime/react.d.mts +24 -2
  27. package/packages/sdk/dist/runtime/react.d.ts +24 -2
  28. package/packages/sdk/dist/runtime/react.mjs +12 -0
  29. package/packages/sdk/dist/runtime/react.mjs.map +1 -1
  30. package/templates/openxiangda-react-spa/AGENTS.md +8 -0
  31. package/templates/openxiangda-react-spa/src/pages/defaults/FilePreviewRoutePage.tsx +18 -33
  32. package/templates/sy-lowcode-app-workspace/AGENTS.md +1 -0
@@ -31,6 +31,7 @@ pnpm build
31
31
  pnpm build-js-code
32
32
  pnpm deploy -- --profile <name>
33
33
  openxiangda workspace publish --profile <name> --form <formCode>
34
+ openxiangda form export <formCode> --mode package --profile <name> --output ./exports/
34
35
  openxiangda doctor --profile <name> --json
35
36
  openxiangda design gates --topic public-access --json
36
37
  openxiangda sdd context --json
@@ -123,4 +124,11 @@ import { PermissionBoundary, useAppMenus, useRuntimeBootstrap } from "openxiangd
123
124
  - 数据列表:`/view/:appType/admin/data/:formUuid`
124
125
  - 文件预览:`/view/:appType/file-preview?ticket=...`
125
126
 
127
+ 附件预览约定:
128
+
129
+ - 应用代码优先使用 `AttachmentField`,或通过 React SPA PageSdk(`usePageSdk()` 返回的 `sdk`)调用 `sdk.createFileAccessTicket(bucketName, objectName, fileName, "preview", { appType })` 获取 `previewPageUrl` 后打开。
130
+ - `previewPageUrl` 是给用户打开的页面入口;`previewUrl` / `/service/file/preview-by-ticket/:ticket` 是文件内容流,只供预览页内部 iframe、PDF、图片或视频组件加载。
131
+ - 全局兼容入口 `/view/file-preview?ticket=...` 只有在后端能从 URL、ticket payload 或 `FILE_PREVIEW_APP_TYPE` 推导 appType 时才会被 React SPA runtime 接管。若响应头仍是 `X-OpenXiangda-Runtime-Mode: legacy`,检查 ticket 是否含 appType、URL 是否带 `appType`、runtime release 是否已激活、以及服务端兜底配置。
132
+ - 需要自定义文件预览 UI 时,在 `src/runtime/default-page-overrides.tsx` 覆盖 `file-preview`;自定义组件仍应读取 ticket metadata 和 `/service/file/*` 接口,不要直接拼旧 view/workbench 参数。
133
+
126
134
  需要自定义默认页时,在 `src/runtime/default-page-overrides.tsx` 中按页面类型和 `formUuid` 注册覆盖组件。不要回到旧平台 `isRenderNav` 或 workbench 参数模型。
@@ -1,4 +1,5 @@
1
- import { ExternalLink, LockKeyhole, ShieldCheck } from "lucide-react";
1
+ import { LockKeyhole, ShieldCheck } from "lucide-react";
2
+ import { BuiltinRouteRenderer, type BrowserRuntimeRouteResolution } from "openxiangda/runtime";
2
3
  import { useParams } from "react-router-dom";
3
4
 
4
5
  import {
@@ -6,11 +7,8 @@ import {
6
7
  resolveDefaultPageOverride,
7
8
  } from "@/runtime/default-page-overrides";
8
9
  import {
9
- PageHeader,
10
- Panel,
11
10
  PrimaryButton,
12
11
  StatePage,
13
- StatusPill,
14
12
  } from "@/shared/ui";
15
13
 
16
14
  const servicePrefix = process.env.APP_SERVICE_PREFIX || "/service";
@@ -18,38 +16,25 @@ const servicePrefix = process.env.APP_SERVICE_PREFIX || "/service";
18
16
  export function FilePreviewRoutePage() {
19
17
  const params = useParams();
20
18
  const ticket = new URLSearchParams(window.location.search).get("ticket") || "";
21
- const appType = params.appType || process.env.OPENXIANGDA_APP_TYPE || process.env.APP_TYPE || "";
19
+ const runtimeEntry = (window as any).__OPENXIANGDA_RUNTIME_ENTRY__;
20
+ const appType = params.appType || runtimeEntry?.appType || process.env.OPENXIANGDA_APP_TYPE || process.env.APP_TYPE || "";
22
21
  const Override = resolveDefaultPageOverride(defaultPageOverrides, "file-preview");
23
- const previewUrl = ticket
24
- ? `${servicePrefix.replace(/\/+$/, "")}/file/preview-by-ticket/${encodeURIComponent(ticket)}`
25
- : "";
22
+ const route: BrowserRuntimeRouteResolution = {
23
+ appType,
24
+ kind: "file-preview",
25
+ mode: "builtin-route",
26
+ params: { ticket },
27
+ path: window.location.pathname,
28
+ query: { ticket },
29
+ runtime: {
30
+ renderer: "openxiangda-builtin",
31
+ surface: "file-preview",
32
+ },
33
+ search: window.location.search,
34
+ };
26
35
 
27
36
  const defaultNode = ticket ? (
28
- <div className="min-w-0 space-y-5">
29
- <PageHeader
30
- actions={
31
- <PrimaryButton onClick={() => window.open(previewUrl, "_blank", "noopener,noreferrer")}>
32
- <ExternalLink size={17} />
33
- 新窗口打开
34
- </PrimaryButton>
35
- }
36
- description="通过安全链接打开文件内容。若浏览器无法直接预览,可在新窗口中打开或下载。"
37
- meta={
38
- <>
39
- <StatusPill tone="blue">文件预览</StatusPill>
40
- <StatusPill tone="emerald">安全访问</StatusPill>
41
- </>
42
- }
43
- title="文件预览"
44
- />
45
- <Panel className="min-h-[70vh] overflow-hidden p-0">
46
- <iframe
47
- className="min-h-[70vh] w-full border-0 bg-white"
48
- src={previewUrl}
49
- title="文件预览"
50
- />
51
- </Panel>
52
- </div>
37
+ <BuiltinRouteRenderer appType={appType} route={route} servicePrefix={servicePrefix} />
53
38
  ) : (
54
39
  <StatePage
55
40
  actions={
@@ -22,6 +22,7 @@
22
22
  | 创建应用 / 新建 app / 初始化工作区 | `openxiangda-app` | `openxiangda workspace init <dir> --profile <name> --app-name "..."` |
23
23
  | 绑定已有应用 | `openxiangda-app` | `openxiangda workspace bind --profile <name> --app-type APP_XXX` |
24
24
  | 创建 / 改表单字段、schema、表单页 | `openxiangda-form` | 编辑 `src/forms/<code>/{schema.ts,page.tsx}` → `workspace publish --form <code>` |
25
+ | 导出表单数据 / 图片 / 附件 / Excel / zip | `openxiangda-form` | `openxiangda form export <formCode> --mode xlsx|xlsx-images|package --profile <name>` |
25
26
  | 创建 / 改自定义代码页、portal、看板 | `openxiangda-page` | 编辑 `src/pages/<code>/` → `workspace publish --page <code>` |
26
27
  | 审批流程 / 流程节点 / JS_CODE | `openxiangda-workflow-automation` | `openxiangda workflow validate / create / publish` |
27
28
  | 自动化 / 定时任务 / 提交触发 / cron | `openxiangda-workflow-automation` | `openxiangda automation validate / create / publish / enable` |