openxiangda 1.0.148 → 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 (26) hide show
  1. package/openxiangda-skills/references/pages/page-sdk.md +19 -0
  2. package/package.json +1 -1
  3. package/packages/sdk/dist/{ProcessPreview-BoblxCUt.d.mts → ProcessPreview-BOCARAvP.d.mts} +9 -1
  4. package/packages/sdk/dist/{ProcessPreview-BoblxCUt.d.ts → ProcessPreview-BOCARAvP.d.ts} +9 -1
  5. package/packages/sdk/dist/components/index.cjs +33 -21
  6. package/packages/sdk/dist/components/index.cjs.map +1 -1
  7. package/packages/sdk/dist/components/index.d.mts +4 -4
  8. package/packages/sdk/dist/components/index.d.ts +4 -4
  9. package/packages/sdk/dist/components/index.mjs +33 -21
  10. package/packages/sdk/dist/components/index.mjs.map +1 -1
  11. package/packages/sdk/dist/{dataManagementApi-BCzfV88G.d.mts → dataManagementApi-CLMqf79O.d.mts} +1 -1
  12. package/packages/sdk/dist/{dataManagementApi-_FFNPv2e.d.ts → dataManagementApi-DhpRKmlp.d.ts} +1 -1
  13. package/packages/sdk/dist/runtime/index.cjs +375 -30
  14. package/packages/sdk/dist/runtime/index.cjs.map +1 -1
  15. package/packages/sdk/dist/runtime/index.d.mts +3 -3
  16. package/packages/sdk/dist/runtime/index.d.ts +3 -3
  17. package/packages/sdk/dist/runtime/index.mjs +377 -32
  18. package/packages/sdk/dist/runtime/index.mjs.map +1 -1
  19. package/packages/sdk/dist/runtime/react.cjs +12 -0
  20. package/packages/sdk/dist/runtime/react.cjs.map +1 -1
  21. package/packages/sdk/dist/runtime/react.d.mts +24 -2
  22. package/packages/sdk/dist/runtime/react.d.ts +24 -2
  23. package/packages/sdk/dist/runtime/react.mjs +12 -0
  24. package/packages/sdk/dist/runtime/react.mjs.map +1 -1
  25. package/templates/openxiangda-react-spa/AGENTS.md +7 -0
  26. package/templates/openxiangda-react-spa/src/pages/defaults/FilePreviewRoutePage.tsx +18 -33
@@ -124,4 +124,11 @@ import { PermissionBoundary, useAppMenus, useRuntimeBootstrap } from "openxiangd
124
124
  - 数据列表:`/view/:appType/admin/data/:formUuid`
125
125
  - 文件预览:`/view/:appType/file-preview?ticket=...`
126
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
+
127
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={