@sparqjs/schema-vue 0.1.0

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 (190) hide show
  1. package/dist/asset/index.d.ts +5 -0
  2. package/dist/asset/index.d.ts.map +1 -0
  3. package/dist/asset/picker/AssetPickerParts.d.ts +43 -0
  4. package/dist/asset/picker/AssetPickerParts.d.ts.map +1 -0
  5. package/dist/asset/picker/AssetPickerRoot.d.ts +36 -0
  6. package/dist/asset/picker/AssetPickerRoot.d.ts.map +1 -0
  7. package/dist/asset/picker/AssetPickerServerPanel.d.ts +38 -0
  8. package/dist/asset/picker/AssetPickerServerPanel.d.ts.map +1 -0
  9. package/dist/asset/picker/index.d.ts +4 -0
  10. package/dist/asset/picker/index.d.ts.map +1 -0
  11. package/dist/asset/picker/service.d.ts +4 -0
  12. package/dist/asset/picker/service.d.ts.map +1 -0
  13. package/dist/asset/picker/types.d.ts +50 -0
  14. package/dist/asset/picker/types.d.ts.map +1 -0
  15. package/dist/asset/preview/AssetPreview.d.ts +64 -0
  16. package/dist/asset/preview/AssetPreview.d.ts.map +1 -0
  17. package/dist/asset/preview/index.d.ts +3 -0
  18. package/dist/asset/preview/index.d.ts.map +1 -0
  19. package/dist/asset/preview/registry.d.ts +35 -0
  20. package/dist/asset/preview/registry.d.ts.map +1 -0
  21. package/dist/asset/service.d.ts +39 -0
  22. package/dist/asset/service.d.ts.map +1 -0
  23. package/dist/asset/upload/AssetUploadPanel.d.ts +82 -0
  24. package/dist/asset/upload/AssetUploadPanel.d.ts.map +1 -0
  25. package/dist/asset/upload/executor.d.ts +59 -0
  26. package/dist/asset/upload/executor.d.ts.map +1 -0
  27. package/dist/asset/upload/files.d.ts +16 -0
  28. package/dist/asset/upload/files.d.ts.map +1 -0
  29. package/dist/asset/upload/hash-file.d.ts +7 -0
  30. package/dist/asset/upload/hash-file.d.ts.map +1 -0
  31. package/dist/asset/upload/hash-worker.d.ts +2 -0
  32. package/dist/asset/upload/hash-worker.d.ts.map +1 -0
  33. package/dist/asset/upload/index.d.ts +6 -0
  34. package/dist/asset/upload/index.d.ts.map +1 -0
  35. package/dist/asset/upload/queue.d.ts +23 -0
  36. package/dist/asset/upload/queue.d.ts.map +1 -0
  37. package/dist/assets/hash-worker-DEktbSny.js +8 -0
  38. package/dist/assets/hash-worker-DEktbSny.js.map +1 -0
  39. package/dist/components/SparqView.d.ts +65 -0
  40. package/dist/components/SparqView.d.ts.map +1 -0
  41. package/dist/custom-components/IconInput/IconInput.d.ts +45 -0
  42. package/dist/custom-components/IconInput/IconInput.d.ts.map +1 -0
  43. package/dist/custom-components/IconInput/SqIcon.d.ts +29 -0
  44. package/dist/custom-components/IconInput/SqIcon.d.ts.map +1 -0
  45. package/dist/custom-components/IconInput/SqIconInput.d.ts +184 -0
  46. package/dist/custom-components/IconInput/SqIconInput.d.ts.map +1 -0
  47. package/dist/custom-components/IconInput/index.d.ts +5 -0
  48. package/dist/custom-components/IconInput/index.d.ts.map +1 -0
  49. package/dist/custom-components/JsonEditor/JsonEditor.d.ts +39 -0
  50. package/dist/custom-components/JsonEditor/JsonEditor.d.ts.map +1 -0
  51. package/dist/custom-components/JsonEditor/SqJson.d.ts +103 -0
  52. package/dist/custom-components/JsonEditor/SqJson.d.ts.map +1 -0
  53. package/dist/custom-components/JsonEditor/index.d.ts +5 -0
  54. package/dist/custom-components/JsonEditor/index.d.ts.map +1 -0
  55. package/dist/custom-components/KeyValueEditor/KeyValueEditor.d.ts +37 -0
  56. package/dist/custom-components/KeyValueEditor/KeyValueEditor.d.ts.map +1 -0
  57. package/dist/custom-components/KeyValueEditor/SqKeyValue.d.ts +102 -0
  58. package/dist/custom-components/KeyValueEditor/SqKeyValue.d.ts.map +1 -0
  59. package/dist/custom-components/KeyValueEditor/index.d.ts +5 -0
  60. package/dist/custom-components/KeyValueEditor/index.d.ts.map +1 -0
  61. package/dist/custom-components/RichText/RichText.d.ts +49 -0
  62. package/dist/custom-components/RichText/RichText.d.ts.map +1 -0
  63. package/dist/custom-components/RichText/SqRichText.d.ts +139 -0
  64. package/dist/custom-components/RichText/SqRichText.d.ts.map +1 -0
  65. package/dist/custom-components/RichText/index.d.ts +3 -0
  66. package/dist/custom-components/RichText/index.d.ts.map +1 -0
  67. package/dist/custom-components/Upload/SqFileUpload.d.ts +42 -0
  68. package/dist/custom-components/Upload/SqFileUpload.d.ts.map +1 -0
  69. package/dist/custom-components/Upload/SqImageUpload.d.ts +42 -0
  70. package/dist/custom-components/Upload/SqImageUpload.d.ts.map +1 -0
  71. package/dist/custom-components/Upload/SqUpload.d.ts +45 -0
  72. package/dist/custom-components/Upload/SqUpload.d.ts.map +1 -0
  73. package/dist/custom-components/Upload/Upload.d.ts +44 -0
  74. package/dist/custom-components/Upload/Upload.d.ts.map +1 -0
  75. package/dist/custom-components/Upload/index.d.ts +5 -0
  76. package/dist/custom-components/Upload/index.d.ts.map +1 -0
  77. package/dist/custom-components/index.d.ts +681 -0
  78. package/dist/custom-components/index.d.ts.map +1 -0
  79. package/dist/custom-components/shared/props.d.ts +5 -0
  80. package/dist/custom-components/shared/props.d.ts.map +1 -0
  81. package/dist/custom-components/shared/render.d.ts +4 -0
  82. package/dist/custom-components/shared/render.d.ts.map +1 -0
  83. package/dist/custom-components/shared/standalone.d.ts +53 -0
  84. package/dist/custom-components/shared/standalone.d.ts.map +1 -0
  85. package/dist/custom-components/types.d.ts +20 -0
  86. package/dist/custom-components/types.d.ts.map +1 -0
  87. package/dist/display-format.d.ts +2 -0
  88. package/dist/display-format.d.ts.map +1 -0
  89. package/dist/index.d.ts +15 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +5995 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/install.d.ts +9 -0
  94. package/dist/install.d.ts.map +1 -0
  95. package/dist/keys.d.ts +74 -0
  96. package/dist/keys.d.ts.map +1 -0
  97. package/dist/presentation/host.d.ts +33 -0
  98. package/dist/presentation/host.d.ts.map +1 -0
  99. package/dist/presentation/index.d.ts +2 -0
  100. package/dist/presentation/index.d.ts.map +1 -0
  101. package/dist/registry/component.d.ts +121 -0
  102. package/dist/registry/component.d.ts.map +1 -0
  103. package/dist/registry/contribution.d.ts +95 -0
  104. package/dist/registry/contribution.d.ts.map +1 -0
  105. package/dist/registry/icon.d.ts +21 -0
  106. package/dist/registry/icon.d.ts.map +1 -0
  107. package/dist/registry/index.d.ts +5 -0
  108. package/dist/registry/index.d.ts.map +1 -0
  109. package/dist/registry/rich-text.d.ts +52 -0
  110. package/dist/registry/rich-text.d.ts.map +1 -0
  111. package/dist/render/action-context.d.ts +16 -0
  112. package/dist/render/action-context.d.ts.map +1 -0
  113. package/dist/render/audit.d.ts +5 -0
  114. package/dist/render/audit.d.ts.map +1 -0
  115. package/dist/render/container-structure.d.ts +20 -0
  116. package/dist/render/container-structure.d.ts.map +1 -0
  117. package/dist/render/context.d.ts +52 -0
  118. package/dist/render/context.d.ts.map +1 -0
  119. package/dist/render/embedded-view.d.ts +5 -0
  120. package/dist/render/embedded-view.d.ts.map +1 -0
  121. package/dist/render/field-node.d.ts +11 -0
  122. package/dist/render/field-node.d.ts.map +1 -0
  123. package/dist/render/index.d.ts +22 -0
  124. package/dist/render/index.d.ts.map +1 -0
  125. package/dist/render/layout-node.d.ts +22 -0
  126. package/dist/render/layout-node.d.ts.map +1 -0
  127. package/dist/render/page-structure.d.ts +7 -0
  128. package/dist/render/page-structure.d.ts.map +1 -0
  129. package/dist/render/structure.d.ts +7 -0
  130. package/dist/render/structure.d.ts.map +1 -0
  131. package/dist/render/view-node.d.ts +2 -0
  132. package/dist/render/view-node.d.ts.map +1 -0
  133. package/dist/render/view-structures.d.ts +24 -0
  134. package/dist/render/view-structures.d.ts.map +1 -0
  135. package/dist/runtime/controller.d.ts +4 -0
  136. package/dist/runtime/controller.d.ts.map +1 -0
  137. package/dist/runtime/feedback.d.ts +19 -0
  138. package/dist/runtime/feedback.d.ts.map +1 -0
  139. package/dist/runtime/index.d.ts +6 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/renderer.d.ts +8 -0
  142. package/dist/runtime/renderer.d.ts.map +1 -0
  143. package/dist/runtime/state.d.ts +6 -0
  144. package/dist/runtime/state.d.ts.map +1 -0
  145. package/dist/runtime/write-back.d.ts +11 -0
  146. package/dist/runtime/write-back.d.ts.map +1 -0
  147. package/dist/semantic-components/FieldDisplay.d.ts +12 -0
  148. package/dist/semantic-components/FieldDisplay.d.ts.map +1 -0
  149. package/dist/semantic-components/FieldLink.d.ts +8 -0
  150. package/dist/semantic-components/FieldLink.d.ts.map +1 -0
  151. package/dist/semantic-components/HelpText.d.ts +8 -0
  152. package/dist/semantic-components/HelpText.d.ts.map +1 -0
  153. package/dist/semantic-components/SectionBlock.d.ts +8 -0
  154. package/dist/semantic-components/SectionBlock.d.ts.map +1 -0
  155. package/dist/semantic-components/StatusTag.d.ts +14 -0
  156. package/dist/semantic-components/StatusTag.d.ts.map +1 -0
  157. package/dist/semantic-components/Thumbnail.d.ts +8 -0
  158. package/dist/semantic-components/Thumbnail.d.ts.map +1 -0
  159. package/dist/semantic-components/index.d.ts +16 -0
  160. package/dist/semantic-components/index.d.ts.map +1 -0
  161. package/dist/semantic-components/types.d.ts +28 -0
  162. package/dist/semantic-components/types.d.ts.map +1 -0
  163. package/dist/shell/audit-panel.d.ts +12 -0
  164. package/dist/shell/audit-panel.d.ts.map +1 -0
  165. package/dist/shell/detail-shell.d.ts +4 -0
  166. package/dist/shell/detail-shell.d.ts.map +1 -0
  167. package/dist/shell/index.d.ts +3 -0
  168. package/dist/shell/index.d.ts.map +1 -0
  169. package/dist/types.d.ts +403 -0
  170. package/dist/types.d.ts.map +1 -0
  171. package/dist/ui/adapter.d.ts +53 -0
  172. package/dist/ui/adapter.d.ts.map +1 -0
  173. package/dist/ui/index.d.ts +4 -0
  174. package/dist/ui/index.d.ts.map +1 -0
  175. package/dist/ui/kit.d.ts +56 -0
  176. package/dist/ui/kit.d.ts.map +1 -0
  177. package/dist/ui/schema-ui.d.ts +86 -0
  178. package/dist/ui/schema-ui.d.ts.map +1 -0
  179. package/package.json +41 -0
  180. package/src/asset/picker/style.css +537 -0
  181. package/src/asset/preview/style.css +382 -0
  182. package/src/asset/upload/style.css +167 -0
  183. package/src/custom-components/IconInput/style.css +101 -0
  184. package/src/custom-components/KeyValueEditor/style.css +44 -0
  185. package/src/custom-components/Upload/style.css +313 -0
  186. package/src/detail/style.css +427 -0
  187. package/src/render/style.css +230 -0
  188. package/src/semantic-components/style.css +263 -0
  189. package/src/style.css +9 -0
  190. package/src/tokens.css +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/keys.ts","../src/custom-components/shared/props.ts","../src/custom-components/shared/render.ts","../src/custom-components/IconInput/SqIcon.ts","../src/custom-components/IconInput/IconInput.tsx","../src/custom-components/shared/standalone.ts","../src/custom-components/IconInput/SqIconInput.ts","../src/custom-components/JsonEditor/JsonEditor.tsx","../src/custom-components/JsonEditor/SqJson.ts","../src/custom-components/KeyValueEditor/KeyValueEditor.tsx","../src/custom-components/KeyValueEditor/SqKeyValue.ts","../src/custom-components/RichText/RichText.ts","../src/custom-components/RichText/SqRichText.ts","../src/asset/upload/AssetUploadPanel.ts","../src/asset/upload/files.ts","../src/asset/upload/queue.ts","../src/asset/upload/hash-file.ts","../src/asset/upload/executor.ts","../../../../../internal/frontend-core/src/kernel.ts","../src/asset/preview/registry.ts","../src/asset/preview/AssetPreview.tsx","../src/custom-components/Upload/Upload.ts","../src/ui/adapter.ts","../src/ui/kit.ts","../src/ui/schema-ui.ts","../src/custom-components/Upload/SqFileUpload.ts","../src/custom-components/Upload/SqImageUpload.ts","../src/custom-components/Upload/SqUpload.ts","../src/custom-components/index.ts","../src/semantic-components/FieldLink.tsx","../src/semantic-components/FieldDisplay.tsx","../src/semantic-components/HelpText.tsx","../src/semantic-components/SectionBlock.tsx","../src/semantic-components/StatusTag.tsx","../src/semantic-components/Thumbnail.tsx","../src/semantic-components/index.ts","../src/registry/component.ts","../src/registry/icon.ts","../src/registry/rich-text.ts","../src/registry/contribution.ts","../src/render/context.ts","../src/runtime/controller.ts","../src/runtime/feedback.ts","../src/runtime/state.ts","../src/runtime/renderer.ts","../src/runtime/write-back.ts","../src/render/action-context.ts","../src/display-format.ts","../src/shell/audit-panel.ts","../src/shell/detail-shell.ts","../src/render/audit.ts","../src/render/view-structures.ts","../src/render/embedded-view.ts","../src/render/field-node.ts","../src/render/layout-node.ts","../src/render/page-structure.ts","../src/render/structure.ts","../src/render/container-structure.ts","../src/render/index.ts","../src/presentation/host.ts","../src/components/SparqView.ts","../src/asset/picker/AssetPickerParts.tsx","../src/asset/picker/AssetPickerServerPanel.tsx","../src/asset/picker/AssetPickerRoot.ts","../src/asset/picker/service.ts","../src/install.ts"],"sourcesContent":["import type { SchemaRuntime } from '@sparqjs/schema-core'\nimport type { InjectionKey } from 'vue'\nimport type { SchemaRenderer, SchemaUiAdapter } from './types'\nimport type { SchemaHostPresentation } from './presentation'\nimport type {\n SchemaComponentRegistry,\n SchemaRendererKernel,\n SparqIconRegistry,\n SparqRichTextRegistry,\n} from './registry'\nimport type { UiKit } from './ui'\nimport type { SparqAssetPreviewRegistry, SparqAssetService } from './asset'\n\n/**\n * 当前 Vue 应用使用的前端贡献运行环境。\n *\n * 插件宿主可注入该实例安装 renderer 贡献,普通业务组件不应直接修改其中内容。\n */\nexport const SPARQ_FRONTEND_KERNEL_KEY: InjectionKey<SchemaRendererKernel> = Symbol('sparq.frontend-kernel')\n\n/**\n * Schema runtime 的 Vue 注入 key。\n *\n * 预设插件和业务侧局部 provide 应使用该 key,避免字符串 key 冲突。\n */\nexport const SPARQ_SCHEMA_RUNTIME_KEY: InjectionKey<SchemaRuntime> = Symbol('sparq.schema.runtime')\n\n/**\n * Vue 渲染器的注入 key。\n *\n * 主要用于高级定制场景;普通组件只需要注入 runtime。\n */\nexport const SPARQ_SCHEMA_RENDERER_KEY: InjectionKey<SchemaRenderer> = Symbol('sparq.schema.renderer')\n\n/**\n * Schema 宿主展示能力。\n *\n * iframe 插件可通过该接口把 root/parent 弹层交给 Admin 等外层宿主承载。\n */\nexport const SPARQ_SCHEMA_PRESENTATION_KEY: InjectionKey<SchemaHostPresentation> = Symbol('sparq.schema.presentation')\n\n/**\n * Vue UI 适配器的注入 key。\n *\n * 预设插件或业务侧可以通过该 key 提供具体 UI 渲染实现。\n */\nexport const SPARQ_SCHEMA_UI_ADAPTER_KEY: InjectionKey<SchemaUiAdapter> = Symbol('sparq.schema.ui-adapter')\n\n/**\n * UI 组件集的注入 key。\n *\n * 自定义组件可通过 useSparqUi 获取当前 UI 体系的基础组件。\n */\nexport const SPARQ_UI_KIT_KEY: InjectionKey<UiKit> = Symbol('sparq.ui-kit')\n\n/**\n * 业务组件注册表的注入 key。\n *\n * schema 中的自定义 component 会通过该注册表解析。\n */\nexport const SPARQ_COMPONENT_REGISTRY_KEY: InjectionKey<SchemaComponentRegistry> = Symbol('sparq.component-registry')\n\n/**\n * Icon 注册表。\n *\n * SqIcon / SqIconInput 会通过该注册表解析当前可用图标。\n */\nexport const SPARQ_ICON_REGISTRY_KEY: InjectionKey<SparqIconRegistry> = Symbol('sparq.icon-registry')\n\n/**\n * 富文本编辑器注册表。\n *\n * SqRichText 会通过该注册表解析当前可用编辑器,支持本地与远程加载编辑器。\n */\nexport const SPARQ_RICH_TEXT_REGISTRY_KEY: InjectionKey<SparqRichTextRegistry> = Symbol('sparq.rich-text-registry')\n\n/**\n * 资源服务。\n *\n * image-upload / file-upload / rich-text 通过该服务上传文件或打开资源管理器。\n */\nexport const SPARQ_ASSET_SERVICE_KEY: InjectionKey<SparqAssetService> = Symbol('sparq.asset-service')\n\n/**\n * 资源预览注册表。\n *\n * 资源选择器和上传组件通过该注册表按 matcher 解析插件预览实现。\n */\nexport const SPARQ_ASSET_PREVIEW_REGISTRY_KEY: InjectionKey<SparqAssetPreviewRegistry> =\n Symbol('sparq.asset-preview-registry')\n","import type { FormComponentProps } from '../types'\n\nexport function createControlProps(input: FormComponentProps): Record<string, unknown> {\n return {\n ...(input.props ?? {}),\n modelValue: input.value,\n 'onUpdate:modelValue': input.onChange,\n onBlur: input.onBlur,\n disabled: input.disabled === true || input.loading === true,\n readonly: input.readonly,\n loading: input.loading,\n 'data-sparq-form-component': input.componentKey,\n 'data-sparq-field': input.node?.field ?? input.field?.name,\n }\n}\n\nexport function toStringValue(value: unknown): string {\n if (value === undefined || value === null) {\n return ''\n }\n\n return typeof value === 'string' ? value : String(value)\n}\n\nexport function resolveEmptyValue(input: FormComponentProps, fallback: unknown = undefined): unknown {\n if (!input.props || !('emptyValue' in input.props)) {\n return fallback\n }\n\n return input.props.emptyValue\n}\n","import type { VNodeChild } from 'vue'\nimport type { UiKit } from '../../ui'\n\nexport function renderRequiredControl(\n ui: UiKit,\n key: string,\n props?: Record<string, unknown>,\n slots?: unknown,\n): VNodeChild {\n const rendered = ui.render(key, props, slots)\n if (rendered === undefined) {\n throw new Error(`Sparq form component requires UI kit control \"${key}\".`)\n }\n\n return rendered\n}\n","import { defineComponent, h, inject, type PropType } from 'vue'\nimport type { SparqIconRegistry } from '../../registry'\nimport { SPARQ_ICON_REGISTRY_KEY } from '../../keys'\n\nexport const SqIcon = defineComponent({\n name: 'SqIcon',\n props: {\n name: String,\n icons: {\n type: Object as PropType<SparqIconRegistry>,\n default: undefined,\n },\n size: {\n type: [String, Number],\n default: 16,\n },\n },\n setup(props, { attrs }) {\n const injectedIcons = props.icons ? undefined : inject(SPARQ_ICON_REGISTRY_KEY, undefined)\n\n return () => {\n if (!props.name) {\n return undefined\n }\n\n const registry = props.icons ?? injectedIcons\n const style = {\n width: normalizeSize(props.size),\n height: normalizeSize(props.size),\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...(attrs.style as Record<string, unknown> | undefined),\n }\n\n return (\n registry?.render(props.name, {\n ...attrs,\n style,\n }) ??\n h(\n 'span',\n {\n ...attrs,\n class: ['sparq-icon', attrs.class],\n style: {\n ...style,\n border: '1px solid currentColor',\n borderRadius: '4px',\n fontSize: '11px',\n lineHeight: 1,\n },\n 'data-sparq-icon': props.name,\n },\n props.name.slice(0, 1).toUpperCase(),\n )\n )\n }\n },\n})\n\nfunction normalizeSize(size: string | number): string {\n return typeof size === 'number' ? `${size}px` : size\n}\n","import { SCHEMA_UI_BUTTON, SCHEMA_UI_DIALOG, SCHEMA_UI_TEXT } from '@sparqjs/schema-core'\nimport { computed, defineComponent, h, ref, type PropType } from 'vue'\nimport type { SparqIconRegistry } from '../../registry'\nimport type { UiKit } from '../../ui'\nimport { createControlProps } from '../shared/props'\nimport { renderRequiredControl } from '../shared/render'\nimport type { FormComponentProps } from '../types'\nimport { SqIcon } from './SqIcon'\n\nexport type IconInputOption = string | {\n label?: string\n value: string\n keywords?: string[]\n namespace?: string\n}\n\ninterface NormalizedIconOption {\n label: string\n value: string\n keywords: string[]\n namespace?: string\n}\n\nexport function IconInput(input: FormComponentProps, ui: UiKit, icons?: SparqIconRegistry) {\n return h(SqIconInputControl, {\n input,\n ui,\n icons,\n 'data-sparq-icon-input': '',\n } as InstanceType<typeof SqIconInputControl>['$props'])\n}\n\nexport const SqIconInputControl = defineComponent({\n name: 'SqIconInputControl',\n inheritAttrs: false,\n props: {\n input: {\n type: Object as PropType<FormComponentProps>,\n required: true,\n },\n ui: {\n type: Object as PropType<UiKit>,\n required: true,\n },\n icons: {\n type: Object as PropType<SparqIconRegistry>,\n default: undefined,\n },\n },\n setup(props, { attrs }) {\n const visible = ref(false)\n const keyword = ref('')\n const allOptions = computed(() => resolveIconOptions(props.input, props.icons))\n const filteredOptions = computed(() => filterIconOptions(allOptions.value, keyword.value))\n const selectedUnavailable = computed(\n () => Boolean(props.input.value) && !allOptions.value.some((option) => option.value === props.input.value),\n )\n const allowCustom = computed(() => props.input.props?.allowCustom === true)\n const interactiveDisabled = computed(\n () => props.input.disabled === true || props.input.loading === true || props.input.readonly === true,\n )\n\n const emitValueChange = (value: string) => {\n if (interactiveDisabled.value) {\n return\n }\n\n if (value === props.input.value) {\n return\n }\n\n props.input.onChange?.(value)\n }\n\n const selectIcon = (value: string) => {\n emitValueChange(value)\n visible.value = false\n }\n const openIconDialog = (event?: Event) => {\n event?.preventDefault?.()\n event?.stopPropagation?.()\n if (!interactiveDisabled.value) {\n visible.value = true\n }\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-sparq-icon-input': '',\n class: ['sparq-icon-input', attrs.class],\n style: attrs.style,\n },\n [\n renderRequiredControl(\n props.ui,\n SCHEMA_UI_TEXT,\n {\n ...createControlProps(props.input),\n modelValue: props.input.value,\n disabled: props.input.disabled === true || props.input.loading === true,\n readonly: props.input.readonly === true || !allowCustom.value,\n placeholder:\n props.input.props?.placeholder ??\n props.input.field?.label ??\n props.input.node?.field ??\n (allowCustom.value ? '请输入图标值或选择图标' : '请选择图标'),\n clearable: props.input.props?.clearable ?? true,\n 'onUpdate:modelValue'(value: unknown) {\n const nextValue = toText(value)\n if (allowCustom.value || nextValue === '') {\n emitValueChange(nextValue)\n }\n },\n },\n {\n prefix: () =>\n props.input.value\n ? h(\n 'span',\n {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n },\n },\n [\n h(SqIcon, {\n name: toText(props.input.value),\n icons: props.icons,\n size: 16,\n } as InstanceType<typeof SqIcon>['$props']),\n ],\n )\n : undefined,\n append: () =>\n renderRequiredControl(\n props.ui,\n SCHEMA_UI_BUTTON,\n {\n disabled: interactiveDisabled.value,\n onClick: openIconDialog,\n 'data-slot': 'icon-picker-trigger',\n },\n {\n default: () => props.input.props?.buttonText ?? '选择',\n },\n ),\n },\n ),\n selectedUnavailable.value\n ? h(\n 'p',\n {\n class: 'sparq-icon-input__status is-warning',\n role: 'status',\n 'data-slot': 'icon-unavailable',\n },\n '当前图标不可用,原值已保留。',\n )\n : undefined,\n renderIconDialog(\n props.ui,\n props.input,\n props.icons,\n visible.value,\n keyword.value,\n filteredOptions.value,\n {\n setVisible(value) {\n visible.value = value\n },\n setKeyword(value) {\n keyword.value = value\n },\n selectIcon,\n },\n ),\n ],\n )\n },\n})\n\nfunction renderIconDialog(\n ui: UiKit,\n input: FormComponentProps,\n icons: SparqIconRegistry | undefined,\n visible: boolean,\n keyword: string,\n options: NormalizedIconOption[],\n handlers: {\n setVisible(value: boolean): void\n setKeyword(value: string): void\n selectIcon(value: string): void\n },\n) {\n return renderRequiredControl(\n ui,\n SCHEMA_UI_DIALOG,\n {\n modelValue: visible,\n title: input.props?.title ?? '选择图标',\n width: input.props?.dialogWidth ?? '720px',\n appendToBody: input.props?.appendToBody ?? true,\n 'append-to-body': input.props?.appendToBody ?? true,\n 'onUpdate:modelValue'(value: boolean) {\n handlers.setVisible(value)\n },\n 'data-sparq-icon-input-dialog': '',\n },\n {\n header: () =>\n h(\n 'span',\n { class: 'sparq-icon-input-dialog__title' },\n String(input.props?.title ?? '选择图标'),\n ),\n default: () =>\n h(\n 'div',\n {\n class: 'sparq-icon-input-dialog',\n },\n [\n renderRequiredControl(\n ui,\n SCHEMA_UI_TEXT,\n {\n modelValue: keyword,\n placeholder: input.props?.searchPlaceholder ?? '搜索图标',\n clearable: true,\n 'onUpdate:modelValue'(value: unknown) {\n handlers.setKeyword(toText(value))\n },\n 'data-slot': 'icon-search',\n },\n {\n prefix: () =>\n h(SqIcon, {\n name: toText(input.props?.searchIcon ?? 'search'),\n icons,\n size: 16,\n } as InstanceType<typeof SqIcon>['$props']),\n },\n ),\n options.length\n ? renderIconGrid(icons, options, toText(input.value), handlers.selectIcon)\n : h(\n 'div',\n {\n class: 'sparq-icon-input-empty',\n 'data-slot': 'icon-empty',\n },\n String(\n input.props?.emptyText ??\n (keyword ? '未找到匹配图标' : '当前图标集没有可选项'),\n ),\n ),\n ],\n ),\n },\n )\n}\n\nfunction renderIconGrid(\n icons: SparqIconRegistry | undefined,\n options: NormalizedIconOption[],\n currentValue: string,\n selectIcon: (value: string) => void,\n) {\n return h(\n 'div',\n {\n class: 'sparq-icon-input-grid',\n 'data-slot': 'icon-grid',\n },\n options.map((option) =>\n h(\n 'button',\n {\n type: 'button',\n key: option.value,\n class: ['sparq-icon-input-option', currentValue === option.value ? 'is-selected' : undefined],\n 'data-slot': 'icon-option',\n 'data-icon-value': option.value,\n onClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n selectIcon(option.value)\n },\n },\n [\n h(SqIcon, {\n name: option.value,\n icons,\n size: 20,\n } as InstanceType<typeof SqIcon>['$props']),\n h(\n 'span',\n { class: 'sparq-icon-input-option__label' },\n option.label,\n ),\n ],\n ),\n ),\n )\n}\n\nfunction resolveIconOptions(input: FormComponentProps, icons: SparqIconRegistry | undefined): NormalizedIconOption[] {\n const propOptions = input.props?.icons ?? input.props?.options\n if (Array.isArray(propOptions)) {\n return propOptions.map(normalizeIconOption).filter((option): option is NormalizedIconOption => Boolean(option))\n }\n\n const namespace = typeof input.props?.namespace === 'string' ? input.props.namespace : undefined\n\n return [...(icons?.entries() ?? [])]\n .map(([name, icon]) => ({\n label: icon.label ?? name,\n value: name,\n namespace: icon.namespace,\n keywords: icon.keywords ?? [name, icon.label ?? ''],\n }))\n .filter((option) => !namespace || option.namespace === namespace)\n}\n\nfunction normalizeIconOption(value: unknown): NormalizedIconOption | undefined {\n if (typeof value === 'string') {\n return {\n label: value,\n value,\n keywords: [value],\n }\n }\n\n if (typeof value !== 'object' || value === null || !('value' in value)) {\n return undefined\n }\n\n const option = value as { label?: unknown; value?: unknown; keywords?: unknown; namespace?: unknown }\n if (typeof option.value !== 'string') {\n return undefined\n }\n\n return {\n label: typeof option.label === 'string' ? option.label : option.value,\n value: option.value,\n namespace: typeof option.namespace === 'string' ? option.namespace : undefined,\n keywords: Array.isArray(option.keywords)\n ? option.keywords.filter((keyword): keyword is string => typeof keyword === 'string')\n : [option.value, typeof option.label === 'string' ? option.label : ''],\n }\n}\n\nfunction filterIconOptions(options: NormalizedIconOption[], keyword: string): NormalizedIconOption[] {\n const query = keyword.trim().toLowerCase()\n if (!query) {\n return options\n }\n\n return options.filter((option) =>\n [option.value, option.label, ...option.keywords].some((field) => field.toLowerCase().includes(query)),\n )\n}\n\nfunction toText(value: unknown): string {\n return typeof value === 'string' ? value : String(value ?? '')\n}\n","import { inject, type PropType } from 'vue'\nimport { SPARQ_UI_KIT_KEY } from '../../keys'\nimport type { SparqIconRegistry, SparqRichTextRegistry } from '../../registry'\nimport type { UiKit } from '../../ui'\n\nexport const standaloneFormComponentProps = {\n modelValue: {\n type: null,\n default: undefined,\n },\n componentProps: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n errors: {\n type: Array as PropType<string[]>,\n default: undefined,\n },\n emptyValue: {\n type: null,\n default: undefined,\n },\n uiKit: {\n type: Object as PropType<UiKit>,\n default: undefined,\n },\n icons: {\n type: Object as PropType<SparqIconRegistry>,\n default: undefined,\n },\n richTextEditors: {\n type: Object as PropType<SparqRichTextRegistry>,\n default: undefined,\n },\n}\n\nexport function useStandaloneUiKit(props: { uiKit?: UiKit }): () => UiKit {\n const injected = props.uiKit ? undefined : inject(SPARQ_UI_KIT_KEY, undefined)\n\n return () => {\n const resolved = props.uiKit ?? injected\n if (!resolved) {\n throw new Error('Standalone Sparq form components require a UI kit prop or installed schema renderer plugin.')\n }\n\n return resolved\n }\n}\n\nexport function createStandaloneComponentProps(\n props: {\n componentProps?: Record<string, unknown>\n emptyValue?: unknown\n },\n attrs: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n ...attrs,\n ...(props.componentProps ?? {}),\n emptyValue: props.emptyValue,\n }\n}\n","import { defineComponent, inject, type PropType } from 'vue'\nimport { IconInput, type IconInputOption } from './IconInput'\nimport { SPARQ_ICON_REGISTRY_KEY } from '../../keys'\nimport {\n createStandaloneComponentProps,\n standaloneFormComponentProps,\n useStandaloneUiKit,\n} from '../shared/standalone'\n\nexport const SqIconInput = defineComponent({\n name: 'SqIconInput',\n inheritAttrs: false,\n props: {\n ...standaloneFormComponentProps,\n placeholder: {\n type: String,\n default: '请输入图标值或选择图标',\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Array as PropType<IconInputOption[]>,\n default: undefined,\n },\n namespace: {\n type: String,\n default: '',\n },\n title: {\n type: String,\n default: '选择图标',\n },\n buttonText: {\n type: String,\n default: '选择',\n },\n dialogWidth: {\n type: [String, Number],\n default: '720px',\n },\n searchPlaceholder: {\n type: String,\n default: '搜索图标',\n },\n emptyText: {\n type: String,\n default: '未找到匹配图标',\n },\n },\n emits: ['update:modelValue', 'change', 'blur'],\n setup(props, { attrs, emit }) {\n const getUiKit = useStandaloneUiKit(props)\n const injectedIcons = props.icons ? undefined : inject(SPARQ_ICON_REGISTRY_KEY, undefined)\n\n return () =>\n IconInput(\n {\n componentKey: 'icon-input',\n value: props.modelValue,\n props: createStandaloneComponentProps(\n {\n ...props,\n componentProps: {\n placeholder: props.placeholder,\n clearable: props.clearable,\n options: props.options,\n namespace: props.namespace,\n title: props.title,\n buttonText: props.buttonText,\n dialogWidth: props.dialogWidth,\n searchPlaceholder: props.searchPlaceholder,\n emptyText: props.emptyText,\n ...(props.componentProps ?? {}),\n },\n },\n attrs,\n ),\n disabled: props.disabled,\n readonly: props.readonly,\n loading: props.loading,\n errors: props.errors,\n onChange(value) {\n emit('update:modelValue', value)\n emit('change', value)\n },\n onBlur() {\n emit('blur')\n },\n },\n getUiKit(),\n props.icons ?? injectedIcons,\n )\n },\n})\n","import { SCHEMA_UI_TEXTAREA } from '@sparqjs/schema-core'\nimport { defineComponent, h, ref, watch, type PropType } from 'vue'\nimport type { UiKit } from '../../ui'\nimport { createControlProps, resolveEmptyValue } from '../shared/props'\nimport { renderRequiredControl } from '../shared/render'\nimport type { FormComponentProps } from '../types'\n\nexport type JsonEditorMode = 'any' | 'object' | 'array'\n\nexport interface JsonValidationResult {\n valid: boolean\n value?: unknown\n error?: Error\n}\n\nexport interface JsonEditorResolvedOptions {\n mode: JsonEditorMode\n indent: number\n formatOnBlur: boolean\n}\n\nexport function JsonEditor(input: FormComponentProps, ui: UiKit) {\n return h(SqJsonControl, {\n input,\n ui,\n })\n}\n\nexport const SqJsonControl = defineComponent({\n name: 'SqJsonControl',\n props: {\n input: {\n type: Object as PropType<FormComponentProps>,\n required: true,\n },\n ui: {\n type: Object as PropType<UiKit>,\n required: true,\n },\n },\n setup(props) {\n const text = ref(formatJsonValue(props.input.value, resolveJsonOptions(props.input).indent))\n const valid = ref(true)\n\n watch(\n () => props.input.value,\n (value) => {\n if (!valid.value) {\n return\n }\n\n text.value = formatJsonValue(value, resolveJsonOptions(props.input).indent)\n },\n {\n deep: true,\n },\n )\n\n return () => {\n const options = resolveJsonOptions(props.input)\n const controlProps = createControlProps(props.input)\n\n return renderRequiredControl(props.ui, SCHEMA_UI_TEXTAREA, {\n ...controlProps,\n modelValue: text.value,\n autosize: props.input.props?.autosize ?? {\n minRows: 4,\n maxRows: 12,\n },\n spellcheck: props.input.props?.spellcheck ?? false,\n 'aria-invalid': valid.value ? undefined : 'true',\n 'data-json-valid': valid.value ? 'true' : 'false',\n 'onUpdate:modelValue'(value: unknown) {\n const nextText = toJsonText(value)\n text.value = nextText\n\n const result = parseJsonText(nextText, props.input)\n valid.value = result.valid\n emitJsonValidity(props.input, result)\n if (result.valid) {\n props.input.onChange?.(result.value)\n }\n },\n onBlur() {\n const result = parseJsonText(text.value, props.input)\n valid.value = result.valid\n emitJsonValidity(props.input, result)\n if (result.valid && options.formatOnBlur) {\n text.value = formatJsonValue(result.value, options.indent)\n }\n props.input.onBlur?.()\n },\n })\n }\n },\n})\n\nexport function formatJsonValue(value: unknown, indent = 2): string {\n if (value === undefined || value === null || value === '') {\n return ''\n }\n\n if (typeof value === 'string') {\n return value\n }\n\n try {\n return JSON.stringify(value, null, normalizeIndent(indent))\n } catch {\n return String(value)\n }\n}\n\nexport function parseJsonText(value: unknown, input: FormComponentProps = {}): JsonValidationResult {\n const text = toJsonText(value)\n if (!text.trim()) {\n return {\n valid: true,\n value: resolveEmptyValue(input),\n }\n }\n\n try {\n const parsed = JSON.parse(text)\n const mode = resolveJsonOptions(input).mode\n const modeError = validateJsonMode(parsed, mode)\n if (modeError) {\n return {\n valid: false,\n error: modeError,\n }\n }\n\n return {\n valid: true,\n value: parsed,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }\n }\n}\n\nfunction resolveJsonOptions(input: FormComponentProps): JsonEditorResolvedOptions {\n const props = input.props ?? {}\n\n return {\n mode: normalizeMode(props.mode),\n indent: normalizeIndent(props.indent),\n formatOnBlur: props.formatOnBlur !== false,\n }\n}\n\nfunction normalizeMode(value: unknown): JsonEditorMode {\n if (value === 'object' || value === 'array' || value === 'any') {\n return value\n }\n\n return 'any'\n}\n\nfunction normalizeIndent(value: unknown): number {\n const indent = typeof value === 'number' ? value : Number(value ?? 2)\n if (!Number.isFinite(indent)) {\n return 2\n }\n\n return Math.max(0, Math.min(8, Math.floor(indent)))\n}\n\nfunction validateJsonMode(value: unknown, mode: JsonEditorMode): Error | undefined {\n if (mode === 'array' && !Array.isArray(value)) {\n return new Error('JSON value must be an array.')\n }\n\n if (mode === 'object' && (!isPlainObject(value) || Array.isArray(value))) {\n return new Error('JSON value must be an object.')\n }\n\n return undefined\n}\n\nfunction emitJsonValidity(input: FormComponentProps, result: JsonValidationResult): void {\n input.onValidChange?.(result.valid)\n if (!result.valid && result.error) {\n input.onParseError?.(result.error)\n }\n}\n\nfunction toJsonText(value: unknown): string {\n return typeof value === 'string' ? value : String(value ?? '')\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype\n}\n\n","import { defineComponent } from 'vue'\nimport { JsonEditor } from './JsonEditor'\nimport {\n createStandaloneComponentProps,\n standaloneFormComponentProps,\n useStandaloneUiKit,\n} from '../shared/standalone'\n\nexport const SqJson = defineComponent({\n name: 'SqJson',\n inheritAttrs: false,\n props: standaloneFormComponentProps,\n emits: ['update:modelValue', 'update:text', 'valid-change', 'parse-error', 'blur'],\n setup(props, { attrs, emit }) {\n const getUiKit = useStandaloneUiKit(props)\n\n return () =>\n JsonEditor(\n {\n componentKey: 'json-editor',\n value: props.modelValue,\n props: createStandaloneComponentProps(props, attrs),\n disabled: props.disabled,\n readonly: props.readonly,\n loading: props.loading,\n errors: props.errors,\n onChange(value) {\n emit('update:modelValue', value)\n },\n onValidChange(valid) {\n emit('valid-change', valid)\n },\n onParseError(error) {\n emit('parse-error', error)\n },\n onBlur() {\n emit('blur')\n },\n },\n getUiKit(),\n )\n },\n})\n","import { SCHEMA_UI_BUTTON, SCHEMA_UI_TEXT, SCHEMA_UI_TEXTAREA } from '@sparqjs/schema-core'\nimport { defineComponent, h, ref, watch, type PropType } from 'vue'\nimport type { UiKit } from '../../ui'\nimport { createControlProps, resolveEmptyValue } from '../shared/props'\nimport { renderRequiredControl } from '../shared/render'\nimport type { FormComponentProps } from '../types'\nimport { formatJsonValue, parseJsonText } from '../JsonEditor'\n\nexport type KeyValueEditorMode = 'rows' | 'json'\n\nexport interface KeyValueRow {\n key: string\n value: string\n}\n\nexport function KeyValueEditor(input: FormComponentProps, ui: UiKit) {\n return h(SqKeyValueControl, {\n input,\n ui,\n })\n}\n\nexport const SqKeyValueControl = defineComponent({\n name: 'SqKeyValueControl',\n props: {\n input: {\n type: Object as PropType<FormComponentProps>,\n required: true,\n },\n ui: {\n type: Object as PropType<UiKit>,\n required: true,\n },\n },\n setup(props) {\n const mode = ref(resolveInitialMode(props.input))\n const rows = ref<KeyValueRow[]>(toKeyValueRows(props.input.value))\n const jsonText = ref(formatJsonValue(toKeyValueObject(rows.value), resolveIndent(props.input)))\n const jsonValid = ref(true)\n const valueSignature = ref(createValueSignature(props.input.value))\n\n watch(\n () => props.input.value,\n (value) => {\n const nextSignature = createValueSignature(value)\n if (nextSignature === valueSignature.value) {\n return\n }\n\n valueSignature.value = nextSignature\n if (mode.value === 'json' && !jsonValid.value) {\n return\n }\n\n rows.value = toKeyValueRows(value)\n jsonText.value = formatJsonValue(toKeyValueObject(rows.value), resolveIndent(props.input))\n },\n {\n deep: true,\n },\n )\n\n return () =>\n h(\n 'div',\n {\n class: ['sparq-key-value-editor', `sparq-key-value-editor--${mode.value}`],\n 'data-sparq-key-value-editor': mode.value,\n },\n [\n props.input.props?.showModeSwitch === true\n ? renderModeSwitch(props.ui, mode.value, props.input, (nextMode) => {\n if (nextMode === mode.value) {\n return\n }\n\n mode.value = nextMode\n if (nextMode === 'json') {\n jsonValid.value = true\n jsonText.value = formatJsonValue(toKeyValueObject(rows.value), resolveIndent(props.input))\n } else {\n const result = parseJsonText(jsonText.value, {\n ...props.input,\n props: {\n ...props.input.props,\n mode: 'object',\n },\n })\n if (result.valid) {\n rows.value = toKeyValueRows(result.value)\n jsonValid.value = true\n }\n }\n })\n : undefined,\n mode.value === 'json'\n ? renderJsonMode(props.ui, props.input, jsonText.value, jsonValid.value, (text, valid) => {\n jsonText.value = text\n jsonValid.value = valid\n }, (output) => {\n valueSignature.value = createValueSignature(output)\n })\n : renderRowsMode(props.ui, props.input, rows.value, (nextRows) => {\n rows.value = nextRows\n emitRowsChange(nextRows, props.input, (output) => {\n valueSignature.value = createValueSignature(output)\n })\n }),\n ],\n )\n },\n})\n\nfunction renderModeSwitch(\n ui: UiKit,\n mode: KeyValueEditorMode,\n input: FormComponentProps,\n setMode: (mode: KeyValueEditorMode) => void,\n) {\n return h(\n 'div',\n {\n class: 'sparq-key-value-editor__toolbar',\n 'data-slot': 'key-value-toolbar',\n },\n [\n renderRequiredControl(ui, SCHEMA_UI_BUTTON, createModeButtonProps(input, mode === 'rows', () => setMode('rows')), {\n default: () => 'Rows',\n }),\n renderRequiredControl(ui, SCHEMA_UI_BUTTON, createModeButtonProps(input, mode === 'json', () => setMode('json')), {\n default: () => 'JSON',\n }),\n ],\n )\n}\n\nfunction renderRowsMode(\n ui: UiKit,\n input: FormComponentProps,\n rows: KeyValueRow[],\n setRows: (rows: KeyValueRow[]) => void,\n) {\n const visibleRows = rows.length ? rows : createEmptyRows()\n const duplicateKeys = getDuplicateKeys(visibleRows)\n const error = resolveRowsError(duplicateKeys)\n\n return h(\n 'div',\n {\n class: 'sparq-key-value-editor__rows',\n 'data-slot': 'key-value-rows',\n },\n [\n error ? renderRowsError(error) : undefined,\n ...visibleRows.map((row, index) =>\n renderKeyValueRow(ui, input, visibleRows, row, index, duplicateKeys.has(row.key.trim()), setRows),\n ),\n ],\n )\n}\n\nfunction renderRowsError(error: string) {\n return h(\n 'div',\n {\n class: 'sparq-key-value-editor__error',\n role: 'alert',\n 'data-slot': 'key-value-error',\n },\n error,\n )\n}\n\nfunction renderKeyValueRow(\n ui: UiKit,\n input: FormComponentProps,\n rows: KeyValueRow[],\n row: KeyValueRow,\n index: number,\n duplicated: boolean,\n setRows: (rows: KeyValueRow[]) => void,\n) {\n return h(\n 'div',\n {\n class: 'sparq-key-value-editor__row',\n 'data-slot': 'key-value-row',\n 'data-row-index': String(index),\n 'data-duplicated': duplicated ? 'true' : 'false',\n },\n [\n h(\n 'div',\n {\n class: 'sparq-key-value-editor__cell',\n 'data-slot': 'key-cell',\n },\n [\n renderRequiredControl(ui, SCHEMA_UI_TEXT, {\n ...createInputProps(input),\n modelValue: row.key,\n placeholder: input.props?.keyPlaceholder ?? 'key',\n error: duplicated ? 'Duplicate key' : undefined,\n 'aria-invalid': duplicated ? 'true' : undefined,\n 'data-slot': 'key',\n 'data-duplicated': duplicated ? 'true' : 'false',\n 'onUpdate:modelValue'(value: unknown) {\n setRows(updateRow(rows, index, {\n key: toText(value),\n }))\n },\n }),\n ],\n ),\n h(\n 'div',\n {\n class: 'sparq-key-value-editor__cell',\n 'data-slot': 'value-cell',\n },\n [\n renderRequiredControl(ui, SCHEMA_UI_TEXT, {\n ...createInputProps(input),\n modelValue: row.value,\n placeholder: input.props?.valuePlaceholder ?? 'value',\n 'data-slot': 'value',\n 'onUpdate:modelValue'(value: unknown) {\n setRows(updateRow(rows, index, {\n value: toText(value),\n }))\n },\n }),\n ],\n ),\n index === 0\n ? renderRequiredControl(ui, SCHEMA_UI_BUTTON, createActionButtonProps(input, () => setRows([...rows, createEmptyRow()])), {\n default: () => '+',\n })\n : renderRequiredControl(\n ui,\n SCHEMA_UI_BUTTON,\n createActionButtonProps(input, () => setRows(removeRow(rows, index))),\n {\n default: () => '-',\n },\n ),\n ],\n )\n}\n\nfunction renderJsonMode(\n ui: UiKit,\n input: FormComponentProps,\n text: string,\n valid: boolean,\n setText: (text: string, valid: boolean) => void,\n setOutputSignature: (output: unknown) => void,\n) {\n return renderRequiredControl(ui, SCHEMA_UI_TEXTAREA, {\n ...createControlProps(input),\n modelValue: text,\n autosize: input.props?.autosize ?? {\n minRows: 4,\n maxRows: 10,\n },\n spellcheck: input.props?.spellcheck ?? false,\n 'aria-invalid': valid ? undefined : 'true',\n 'data-json-valid': valid ? 'true' : 'false',\n 'onUpdate:modelValue'(value: unknown) {\n const nextText = toText(value)\n const result = parseJsonText(nextText, {\n ...input,\n props: {\n ...input.props,\n mode: 'object',\n },\n })\n\n setText(nextText, result.valid)\n input.onValidChange?.(result.valid)\n if (result.valid) {\n const output = toKeyValueOutput(toKeyValueRows(result.value), input)\n setOutputSignature(output)\n input.onChange?.(output)\n } else if (result.error) {\n input.onParseError?.(result.error)\n }\n },\n onBlur() {\n const result = parseJsonText(text, {\n ...input,\n props: {\n ...input.props,\n mode: 'object',\n },\n })\n input.onValidChange?.(result.valid)\n if (result.valid) {\n setText(formatJsonValue(result.value, resolveIndent(input)), true)\n } else if (result.error) {\n input.onParseError?.(result.error)\n }\n input.onBlur?.()\n },\n })\n}\n\nexport function formatKeyValue(value: unknown): string {\n return toKeyValueRows(value)\n .map((row) => `${row.key}=${row.value}`)\n .join('\\n')\n}\n\nexport function parseKeyValueText(value: unknown, input: FormComponentProps = {}): Record<string, string> | unknown {\n const text = toText(value)\n if (!text.trim()) {\n return resolveEmptyValue(input)\n }\n\n return toKeyValueOutput(\n text\n .split(/\\r?\\n/)\n .filter((line) => line.trim())\n .map((line) => {\n const separator = line.indexOf('=')\n if (separator === -1) {\n return {\n key: line.trim(),\n value: '',\n }\n }\n\n return {\n key: line.slice(0, separator).trim(),\n value: line.slice(separator + 1).trim(),\n }\n }),\n input,\n )\n}\n\nexport function toKeyValueRows(value: unknown): KeyValueRow[] {\n if (value === undefined || value === null || value === '') {\n return createEmptyRows()\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (!isRecord(item)) {\n return undefined\n }\n\n return {\n key: toText(item.key),\n value: toText(item.value),\n }\n })\n .filter((row): row is KeyValueRow => Boolean(row))\n }\n\n if (typeof value === 'string') {\n const parsed = parseKeyValueText(value)\n return toKeyValueRows(parsed)\n }\n\n if (!isRecord(value)) {\n return [\n {\n key: '',\n value: toText(value),\n },\n ]\n }\n\n const rows = Object.entries(value).map(([key, item]) => ({\n key,\n value: toTextValue(item),\n }))\n\n return rows.length ? rows : createEmptyRows()\n}\n\nexport function toKeyValueObject(rows: KeyValueRow[]): Record<string, string> {\n const result: Record<string, string> = {}\n\n for (const row of rows) {\n const key = row.key.trim()\n if (!key) {\n continue\n }\n\n result[key] = row.value\n }\n\n return result\n}\n\nfunction toKeyValueOutput(rows: KeyValueRow[], input: FormComponentProps): Record<string, string> | unknown {\n const result = toKeyValueObject(rows)\n\n return Object.keys(result).length ? result : resolveEmptyValue(input)\n}\n\nfunction emitRowsChange(rows: KeyValueRow[], input: FormComponentProps, onOutput: (output: unknown) => void): void {\n const duplicates = getDuplicateKeys(rows)\n if (duplicates.size) {\n input.onValidChange?.(false)\n input.onParseError?.(new Error(`Duplicate key: ${Array.from(duplicates).join(', ')}`))\n return\n }\n\n const output = toKeyValueOutput(rows, input)\n input.onValidChange?.(true)\n onOutput(output)\n input.onChange?.(output)\n}\n\nfunction getDuplicateKeys(rows: KeyValueRow[]): Set<string> {\n const counts = new Map<string, number>()\n\n for (const row of rows) {\n const key = row.key.trim()\n if (!key) {\n continue\n }\n\n counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n\n return new Set([...counts.entries()].filter(([, count]) => count > 1).map(([key]) => key))\n}\n\nfunction resolveRowsError(duplicateKeys: Set<string>): string | undefined {\n if (duplicateKeys.size) {\n return `Duplicate key: ${Array.from(duplicateKeys).join(', ')}. Please modify the key.`\n }\n\n return undefined\n}\n\nfunction updateRow(rows: KeyValueRow[], index: number, patch: Partial<KeyValueRow>): KeyValueRow[] {\n return rows.map((row, rowIndex) =>\n rowIndex === index\n ? {\n ...row,\n ...patch,\n }\n : row,\n )\n}\n\nfunction removeRow(rows: KeyValueRow[], index: number): KeyValueRow[] {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index)\n\n return nextRows.length ? nextRows : createEmptyRows()\n}\n\nfunction createInputProps(input: FormComponentProps): Record<string, unknown> {\n return {\n disabled: input.disabled === true || input.loading === true,\n readonly: input.readonly,\n loading: input.loading,\n onBlur: input.onBlur,\n style: {\n width: '100%',\n minWidth: 0,\n },\n 'data-sparq-form-component': input.componentKey,\n }\n}\n\nfunction createActionButtonProps(input: FormComponentProps, onClick: () => void): Record<string, unknown> {\n return {\n type: 'default',\n size: input.props?.buttonSize ?? 'default',\n disabled: input.disabled === true || input.readonly === true || input.loading === true,\n onClick,\n style: {\n minWidth: '36px',\n },\n 'data-slot': 'action',\n }\n}\n\nfunction createModeButtonProps(input: FormComponentProps, active: boolean, onClick: () => void): Record<string, unknown> {\n return {\n type: active ? 'primary' : 'default',\n disabled: input.disabled === true || input.loading === true,\n onClick,\n 'data-slot': 'mode',\n 'data-active': active ? 'true' : 'false',\n }\n}\n\nfunction resolveInitialMode(input: FormComponentProps): KeyValueEditorMode {\n return input.props?.mode === 'json' ? 'json' : 'rows'\n}\n\nfunction resolveIndent(input: FormComponentProps): number {\n const value = input.props?.indent\n const indent = typeof value === 'number' ? value : Number(value ?? 2)\n\n return Number.isFinite(indent) ? indent : 2\n}\n\nfunction createEmptyRows(): KeyValueRow[] {\n return [createEmptyRow()]\n}\n\nfunction createEmptyRow(): KeyValueRow {\n return {\n key: '',\n value: '',\n }\n}\n\nfunction toText(value: unknown): string {\n return typeof value === 'string' ? value : String(value ?? '')\n}\n\nfunction toTextValue(value: unknown): string {\n if (value === undefined || value === null) {\n return ''\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n\n return String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction createValueSignature(value: unknown): string {\n if (value === undefined || value === null) {\n return ''\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n","import { defineComponent } from 'vue'\nimport { KeyValueEditor } from './KeyValueEditor'\nimport {\n createStandaloneComponentProps,\n standaloneFormComponentProps,\n useStandaloneUiKit,\n} from '../shared/standalone'\n\nexport const SqKeyValue = defineComponent({\n name: 'SqKeyValue',\n inheritAttrs: false,\n props: standaloneFormComponentProps,\n emits: ['update:modelValue', 'valid-change', 'parse-error', 'blur'],\n setup(props, { attrs, emit }) {\n const getUiKit = useStandaloneUiKit(props)\n\n return () =>\n KeyValueEditor(\n {\n componentKey: 'key-value',\n value: props.modelValue,\n props: createStandaloneComponentProps(props, attrs),\n disabled: props.disabled,\n readonly: props.readonly,\n loading: props.loading,\n errors: props.errors,\n onChange(value) {\n emit('update:modelValue', value)\n },\n onValidChange(valid) {\n emit('valid-change', valid)\n },\n onParseError(error) {\n emit('parse-error', error)\n },\n onBlur() {\n emit('blur')\n },\n },\n getUiKit(),\n )\n },\n})\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue'\nimport type { SparqAssetService } from '../../asset'\nimport {\n readSparqRichTextToolbar,\n renderSparqRichTextEditor,\n type SparqRichTextEditorDefinition,\n type SparqRichTextRegistry,\n} from '../../registry'\nimport type { UiKit } from '../../ui'\nimport type { FormComponentProps } from '../types'\n\nexport function RichText(\n input: FormComponentProps,\n ui: UiKit,\n editors?: SparqRichTextRegistry,\n assetService?: SparqAssetService,\n) {\n return h(SqRichTextControl, {\n input,\n ui,\n editors,\n assetService,\n 'data-sparq-rich-text': '',\n } as InstanceType<typeof SqRichTextControl>['$props'])\n}\n\nexport const SqRichTextControl = defineComponent({\n name: 'SqRichTextControl',\n inheritAttrs: false,\n props: {\n input: {\n type: Object as PropType<FormComponentProps>,\n required: true,\n },\n ui: {\n type: Object as PropType<UiKit>,\n required: true,\n },\n editors: {\n type: Object as PropType<SparqRichTextRegistry>,\n default: undefined,\n },\n assetService: {\n type: Object as PropType<SparqAssetService>,\n default: undefined,\n },\n },\n setup(props, { attrs }) {\n const loadedEditor = ref<SparqRichTextEditorDefinition>()\n const loading = ref(false)\n const error = ref<Error>()\n const editorName = computed(() => resolveEditorName(props.input))\n const toolbar = computed(() => readSparqRichTextToolbar(props.input.props?.toolbar))\n const stickyStyle = computed(() => ({\n '--sparq-rich-text-sticky-offset': toCssSize(toolbar.value?.stickyOffset ?? 0),\n }))\n const registryEditor = computed(() => props.editors?.get(editorName.value) ?? props.editors?.get('fallback'))\n\n watch(\n registryEditor,\n async (editor) => {\n loadedEditor.value = undefined\n error.value = undefined\n\n if (!editor?.loader) {\n loadedEditor.value = editor\n return\n }\n\n loading.value = true\n try {\n loadedEditor.value = await editor.loader()\n } catch (reason) {\n error.value = reason instanceof Error ? reason : new Error(String(reason))\n } finally {\n loading.value = false\n }\n },\n {\n immediate: true,\n },\n )\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n style: {\n width: '100%',\n minWidth: 0,\n flex: '1 1 100%',\n ...stickyStyle.value,\n ...normalizeStyle(attrs.style),\n },\n 'data-sparq-rich-text': '',\n 'data-toolbar-sticky': toolbar.value?.sticky === true ? 'true' : undefined,\n 'data-editor': editorName.value,\n },\n renderRichTextContent(\n props.input,\n props.ui,\n loadedEditor.value,\n loading.value,\n error.value,\n props.assetService,\n ) ?? undefined,\n )\n },\n})\n\nfunction normalizeStyle(style: unknown): Record<string, unknown> {\n return style && typeof style === 'object' && !Array.isArray(style) ? (style as Record<string, unknown>) : {}\n}\n\nfunction toCssSize(value: string | number): string {\n return typeof value === 'number' ? value + 'px' : value\n}\n\nfunction renderRichTextContent(\n input: FormComponentProps,\n ui: UiKit,\n editor: SparqRichTextEditorDefinition | undefined,\n loading: boolean,\n error: Error | undefined,\n assetService: SparqAssetService | undefined,\n) {\n if (loading) {\n return h('div', { 'data-slot': 'rich-text-loading' }, String(input.props?.loadingText ?? '加载富文本编辑器...'))\n }\n\n if (error) {\n return h('div', { 'data-slot': 'rich-text-error' }, error.message)\n }\n\n if (!editor) {\n return h(\n 'div',\n { 'data-slot': 'rich-text-missing' },\n `Rich text editor \"${resolveEditorName(input)}\" is not registered.`,\n )\n }\n\n return renderSparqRichTextEditor(editor, {\n value: toText(input.value),\n props: input.props,\n disabled: input.disabled,\n readonly: input.readonly,\n loading: input.loading,\n ui,\n assetService,\n onChange(value) {\n input.onChange?.(value)\n },\n onBlur: input.onBlur,\n })\n}\n\nfunction resolveEditorName(input: FormComponentProps): string {\n return typeof input.props?.editor === 'string' ? input.props.editor : 'fallback'\n}\n\nfunction toText(value: unknown): string {\n return typeof value === 'string' ? value : String(value ?? '')\n}\n","import { defineComponent, inject, type PropType } from 'vue'\nimport type { RichTextToolbarConfig } from '@sparqjs/schema-protocol'\nimport { SPARQ_ASSET_SERVICE_KEY, SPARQ_RICH_TEXT_REGISTRY_KEY } from '../../keys'\nimport type { SparqAssetService } from '../../asset'\nimport { RichText } from './RichText'\nimport {\n createStandaloneComponentProps,\n standaloneFormComponentProps,\n useStandaloneUiKit,\n} from '../shared/standalone'\n\nexport const SqRichText = defineComponent({\n name: 'SqRichText',\n inheritAttrs: false,\n props: {\n ...standaloneFormComponentProps,\n editor: {\n type: String,\n default: undefined,\n },\n toolbar: {\n type: Object as PropType<RichTextToolbarConfig>,\n default: undefined,\n },\n editorProps: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n assetService: {\n type: Object as PropType<SparqAssetService>,\n default: undefined,\n },\n },\n emits: ['update:modelValue', 'blur'],\n setup(props, { attrs, emit }) {\n const getUiKit = useStandaloneUiKit(props)\n const injectedEditors = props.richTextEditors ? undefined : inject(SPARQ_RICH_TEXT_REGISTRY_KEY, undefined)\n const injectedAssetService = props.assetService ? undefined : inject(SPARQ_ASSET_SERVICE_KEY, undefined)\n\n return () =>\n RichText(\n {\n componentKey: 'rich-text',\n value: props.modelValue,\n props: createRichTextProps(props, attrs),\n disabled: props.disabled,\n readonly: props.readonly,\n loading: props.loading,\n errors: props.errors,\n onChange(value) {\n emit('update:modelValue', value)\n },\n onBlur() {\n emit('blur')\n },\n },\n getUiKit(),\n props.richTextEditors ?? injectedEditors,\n props.assetService ?? injectedAssetService,\n )\n },\n})\n\nfunction createRichTextProps(\n props: {\n componentProps?: Record<string, unknown>\n emptyValue?: unknown\n editor?: string\n toolbar?: RichTextToolbarConfig\n editorProps?: Record<string, unknown>\n },\n attrs: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n ...createStandaloneComponentProps(props, attrs),\n ...(props.editor ? { editor: props.editor } : undefined),\n ...(props.toolbar ? { toolbar: props.toolbar } : undefined),\n ...(props.editorProps ? { editorProps: props.editorProps } : undefined),\n }\n}\n","import { defineComponent, h, ref, type PropType } from 'vue'\nimport type { SparqUploadTask } from '../service'\n\nexport const SparqAssetUploadPanel = defineComponent({\n name: 'SparqAssetUploadPanel',\n props: {\n tasks: {\n type: Array as PropType<SparqUploadTask[]>,\n default: () => [],\n },\n accept: {\n type: String,\n default: undefined,\n },\n multiple: {\n type: Boolean,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n compact: {\n type: Boolean,\n default: false,\n },\n removable: {\n type: Boolean,\n default: false,\n },\n emptyText: {\n type: String,\n default: '尚未选择文件',\n },\n },\n emits: {\n addFiles: (_files: File[]) => true,\n cancel: (_task: SparqUploadTask) => true,\n retry: (_task: SparqUploadTask) => true,\n remove: (_task: SparqUploadTask) => true,\n },\n setup(props, { emit }) {\n const dragging = ref(false)\n\n function addFiles(files: File[]): void {\n if (!props.disabled && files.length) emit('addFiles', files)\n }\n\n return () =>\n h('section', { class: ['sparq-asset-upload', props.compact ? 'is-compact' : undefined] }, [\n h(\n 'label',\n {\n class: [\n 'sparq-asset-upload__dropzone',\n dragging.value ? 'is-dragging' : undefined,\n props.disabled ? 'is-disabled' : undefined,\n ],\n onDrop(event: DragEvent) {\n event.preventDefault()\n dragging.value = false\n addFiles(Array.from(event.dataTransfer?.files ?? []))\n },\n onDragenter(event: DragEvent) {\n event.preventDefault()\n if (!props.disabled) dragging.value = true\n },\n onDragover(event: DragEvent) {\n event.preventDefault()\n },\n onDragleave(event: DragEvent) {\n event.preventDefault()\n if (event.currentTarget === event.target) dragging.value = false\n },\n },\n [\n h('input', {\n type: 'file',\n multiple: props.multiple,\n accept: props.accept,\n disabled: props.disabled,\n class: 'sparq-asset-upload__file-input',\n onChange(event: Event) {\n const input = event.target as HTMLInputElement\n addFiles(Array.from(input.files ?? []))\n input.value = ''\n },\n }),\n h('span', { class: 'sparq-asset-upload__drop-icon', 'aria-hidden': 'true' }, '+'),\n h('span', { class: 'sparq-asset-upload__drop-title' }, '选择文件或拖拽到此处'),\n ],\n ),\n props.tasks.length\n ? h(\n 'div',\n { class: 'sparq-asset-upload__task-list' },\n props.tasks.map((task) =>\n renderTask(task, props.removable, {\n cancel: (current) => emit('cancel', current),\n retry: (current) => emit('retry', current),\n remove: (current) => emit('remove', current),\n }),\n ),\n )\n : h('div', { class: 'sparq-asset-upload__empty' }, props.emptyText),\n ])\n },\n})\n\nfunction renderTask(\n task: SparqUploadTask,\n removable: boolean,\n actions: Record<'cancel' | 'retry' | 'remove', (task: SparqUploadTask) => void>,\n) {\n return h('div', { key: task.id, class: 'sparq-asset-upload__task', title: task.error?.message }, [\n h('span', { class: 'sparq-asset-upload__task-name' }, task.file.name),\n h('span', { class: 'sparq-asset-upload__task-size' }, formatFileSize(task.file.size)),\n h('span', { class: 'sparq-asset-upload__task-progress', role: 'progressbar', 'aria-valuenow': task.progress }, [\n h('span', { style: { width: `${task.progress}%` } }),\n ]),\n h('span', { class: ['sparq-asset-upload__task-status', `is-${task.status}`] }, resolveUploadStatusLabel(task)),\n h('span', { class: 'sparq-asset-upload__task-actions' }, [\n task.status === 'error' || task.status === 'canceled'\n ? renderTaskAction('重试', () => actions.retry(task))\n : undefined,\n task.status === 'pending' || task.status === 'uploading'\n ? renderTaskAction('取消', () => actions.cancel(task))\n : undefined,\n removable && task.status !== 'uploading' && task.status !== 'success'\n ? renderTaskAction('移除', () => actions.remove(task))\n : undefined,\n ]),\n ])\n}\n\nfunction renderTaskAction(label: string, onClick: () => void) {\n return h(\n 'button',\n {\n type: 'button',\n class: 'sparq-asset-upload__task-action',\n onClick,\n },\n label,\n )\n}\n\nfunction resolveUploadStatusLabel(task: SparqUploadTask): string {\n if (task.status === 'uploading' && task.phase) {\n const phases: Record<NonNullable<SparqUploadTask['phase']>, string> = {\n preparing: '准备中',\n hashing: '校验中',\n uploading: '上传中',\n completing: '处理中',\n }\n return phases[task.phase]\n }\n const labels: Record<SparqUploadTask['status'], string> = {\n pending: '等待',\n uploading: '上传中',\n success: '完成',\n error: '失败',\n canceled: '已取消',\n }\n return labels[task.status]\n}\n\nfunction formatFileSize(size: number): string {\n if (size < 1024) return `${size} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n","import type { SparqUploadOptions } from '../service'\n\nexport type SparqUploadValidationCode = 'type_not_allowed' | 'file_too_large'\n\nexport class SparqUploadValidationError extends Error {\n constructor(\n readonly code: SparqUploadValidationCode,\n message: string,\n ) {\n super(message)\n this.name = 'SparqUploadValidationError'\n }\n}\n\nexport interface SparqUploadFileFilterResult {\n accepted: File[]\n rejected: Array<{ file: File; error: SparqUploadValidationError }>\n}\n\nexport function validateSparqUploadFile(\n file: File,\n options: Pick<SparqUploadOptions, 'accept' | 'maxSize' | 'type'>,\n): SparqUploadValidationError | undefined {\n if (!acceptsFile(file, options.accept, options.type)) {\n return new SparqUploadValidationError('type_not_allowed', `${file.name} 的文件类型不符合上传要求。`)\n }\n if (options.maxSize !== undefined && options.maxSize > 0 && file.size > options.maxSize) {\n return new SparqUploadValidationError('file_too_large', `${file.name} 超过允许的文件大小。`)\n }\n return undefined\n}\n\nexport function filterSparqUploadFiles(\n files: readonly File[],\n options: Pick<SparqUploadOptions, 'accept' | 'maxSize' | 'type'>,\n): SparqUploadFileFilterResult {\n const accepted: File[] = []\n const rejected: SparqUploadFileFilterResult['rejected'] = []\n for (const file of files) {\n const error = validateSparqUploadFile(file, options)\n if (error) rejected.push({ file, error })\n else accepted.push(file)\n }\n return { accepted, rejected }\n}\n\nfunction acceptsFile(file: File, accept: string | undefined, type: SparqUploadOptions['type']): boolean {\n if (type === 'image' && !isImageFile(file)) return false\n if (!accept) return true\n\n const entries = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n if (!entries.length) return true\n\n const fileName = file.name.toLowerCase()\n const mime = file.type.toLowerCase()\n return entries.some((entry) => {\n if (entry.startsWith('.')) return fileName.endsWith(entry)\n if (entry.endsWith('/*')) return mime.startsWith(entry.slice(0, -1))\n return mime === entry\n })\n}\n\nfunction isImageFile(file: File): boolean {\n return file.type.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|avif)$/i.test(file.name)\n}\n","import { shallowRef, type ShallowRef } from 'vue'\nimport type { SparqAsset, SparqAssetService, SparqUploadOptions, SparqUploadTask } from '../service'\nimport { validateSparqUploadFile } from './files'\n\nexport interface SparqUploadQueueOptions {\n upload: SparqAssetService['upload']\n concurrency?: number\n autoStart?: boolean\n onSuccess?: (asset: SparqAsset, task: SparqUploadTask) => void\n onError?: (error: Error, task: SparqUploadTask) => void\n}\n\nexport interface SparqUploadQueue {\n tasks: ShallowRef<SparqUploadTask[]>\n add(files: readonly File[], options: SparqUploadOptions): SparqUploadTask[]\n waitFor(tasks: readonly SparqUploadTask[]): Promise<SparqUploadTask[]>\n start(): void\n cancel(task: SparqUploadTask | string): void\n retry(task: SparqUploadTask | string): void\n remove(task: SparqUploadTask | string): void\n clearFinished(): void\n reset(): void\n}\n\nlet uploadTaskSequence = 0\n\n/** 创建由调用方上传执行器驱动的内存队列;队列生命周期和清理由持有方负责。 */\nexport function createSparqUploadQueue(options: SparqUploadQueueOptions): SparqUploadQueue {\n const tasks = shallowRef<SparqUploadTask[]>([])\n const taskOptions = new Map<string, SparqUploadOptions>()\n const controllers = new Map<string, AbortController>()\n const attempts = new Map<string, number>()\n const completions = new Map<string, TaskCompletion>()\n const concurrency = Math.max(1, Math.floor(options.concurrency ?? 3))\n const autoStart = options.autoStart !== false\n let started = autoStart\n let activeCount = 0\n\n function add(files: readonly File[], uploadOptions: SparqUploadOptions): SparqUploadTask[] {\n const nextTasks = files.map((file) => createTask(file, validateSparqUploadFile(file, uploadOptions)))\n for (const task of nextTasks) {\n taskOptions.set(task.id, uploadOptions)\n completions.set(task.id, createTaskCompletion())\n }\n tasks.value = [...tasks.value, ...nextTasks]\n for (const task of nextTasks) {\n if (task.status === 'error' && task.error) {\n completions.get(task.id)?.resolve(task)\n options.onError?.(task.error, task)\n }\n }\n if (autoStart) started = true\n drain()\n return nextTasks\n }\n\n function waitFor(targets: readonly SparqUploadTask[]): Promise<SparqUploadTask[]> {\n return Promise.all(\n targets.map((task) => {\n const current = findTask(task.id)\n if (current && isTerminal(current)) return current\n return completions.get(task.id)?.promise ?? task\n }),\n )\n }\n\n function start(): void {\n started = true\n drain()\n }\n\n function cancel(task: SparqUploadTask | string): void {\n const id = taskID(task)\n const current = findTask(id)\n if (!current || (current.status !== 'pending' && current.status !== 'uploading')) return\n\n attempts.set(id, (attempts.get(id) ?? 0) + 1)\n controllers.get(id)?.abort()\n const canceled = updateTask(id, { status: 'canceled', phase: undefined })\n if (canceled) completions.get(id)?.resolve(canceled)\n drain()\n }\n\n function retry(task: SparqUploadTask | string): void {\n const id = taskID(task)\n const current = findTask(id)\n if (!current || (current.status !== 'error' && current.status !== 'canceled')) return\n\n completions.set(id, createTaskCompletion())\n const uploadOptions = taskOptions.get(id)\n const validationError = uploadOptions ? validateSparqUploadFile(current.file, uploadOptions) : undefined\n if (validationError) {\n const failed = updateTask(id, { status: 'error', progress: 0, error: validationError, asset: undefined })\n if (failed) {\n completions.get(id)?.resolve(failed)\n options.onError?.(validationError, failed)\n }\n return\n }\n updateTask(id, { status: 'pending', progress: 0, phase: undefined, error: undefined, asset: undefined })\n drain()\n }\n\n function remove(task: SparqUploadTask | string): void {\n const id = taskID(task)\n const current = findTask(id)\n if (!current || current.status === 'uploading') return\n tasks.value = tasks.value.filter((item) => item.id !== id)\n taskOptions.delete(id)\n attempts.delete(id)\n completions.delete(id)\n }\n\n function clearFinished(): void {\n const removable = new Set(\n tasks.value\n .filter((task) => task.status === 'success' || task.status === 'canceled')\n .map((task) => task.id),\n )\n tasks.value = tasks.value.filter((task) => !removable.has(task.id))\n for (const id of removable) {\n taskOptions.delete(id)\n attempts.delete(id)\n completions.delete(id)\n }\n }\n\n function reset(): void {\n for (const task of tasks.value) {\n attempts.set(task.id, (attempts.get(task.id) ?? 0) + 1)\n const finished =\n task.status === 'pending' || task.status === 'uploading'\n ? { ...task, status: 'canceled' as const }\n : task\n completions.get(task.id)?.resolve(finished)\n }\n for (const controller of controllers.values()) controller.abort()\n tasks.value = []\n taskOptions.clear()\n completions.clear()\n controllers.clear()\n started = autoStart\n }\n\n function drain(): void {\n if (!started) return\n while (activeCount < concurrency) {\n const task = tasks.value.find((item) => item.status === 'pending')\n if (!task) return\n void run(task)\n }\n }\n\n async function run(task: SparqUploadTask): Promise<void> {\n const uploadOptions = taskOptions.get(task.id)\n if (!uploadOptions) return\n\n activeCount += 1\n const attempt = (attempts.get(task.id) ?? 0) + 1\n attempts.set(task.id, attempt)\n const controller = new AbortController()\n controllers.set(task.id, controller)\n updateTask(task.id, { status: 'uploading', progress: 0, phase: undefined, error: undefined })\n\n try {\n const asset = await options.upload(task.file, uploadOptions, {\n signal: controller.signal,\n onProgress(progress) {\n if (attempts.get(task.id) !== attempt) return\n updateTask(task.id, { progress: normalizeProgress(progress) })\n },\n onPhase(phase) {\n if (attempts.get(task.id) !== attempt) return\n updateTask(task.id, { phase })\n },\n })\n if (attempts.get(task.id) !== attempt || findTask(task.id)?.status === 'canceled') return\n\n const completed = updateTask(task.id, {\n status: 'success',\n progress: 100,\n phase: undefined,\n asset,\n error: undefined,\n })\n if (completed) {\n completions.get(task.id)?.resolve(completed)\n options.onSuccess?.(asset, completed)\n }\n } catch (caught) {\n if (attempts.get(task.id) !== attempt || findTask(task.id)?.status === 'canceled') return\n\n const error = caught instanceof Error ? caught : new Error('资源上传失败。')\n const failed = updateTask(task.id, { status: 'error', phase: undefined, error })\n if (failed) {\n completions.get(task.id)?.resolve(failed)\n options.onError?.(error, failed)\n }\n } finally {\n activeCount -= 1\n if (controllers.get(task.id) === controller) controllers.delete(task.id)\n drain()\n }\n }\n\n function findTask(id: string): SparqUploadTask | undefined {\n return tasks.value.find((task) => task.id === id)\n }\n\n function updateTask(id: string, patch: Partial<SparqUploadTask>): SparqUploadTask | undefined {\n let updated: SparqUploadTask | undefined\n tasks.value = tasks.value.map((task) => {\n if (task.id !== id) return task\n updated = { ...task, ...patch }\n return updated\n })\n return updated\n }\n\n return { tasks, add, waitFor, start, cancel, retry, remove, clearFinished, reset }\n}\n\ninterface TaskCompletion {\n promise: Promise<SparqUploadTask>\n resolve: (task: SparqUploadTask) => void\n}\n\nfunction createTaskCompletion(): TaskCompletion {\n let resolve!: (task: SparqUploadTask) => void\n const promise = new Promise<SparqUploadTask>((complete) => {\n resolve = complete\n })\n return { promise, resolve }\n}\n\nfunction isTerminal(task: SparqUploadTask): boolean {\n return task.status === 'success' || task.status === 'error' || task.status === 'canceled'\n}\n\nfunction createTask(file: File, error?: Error): SparqUploadTask {\n uploadTaskSequence += 1\n return {\n id: `sparq-upload-${Date.now()}-${uploadTaskSequence}`,\n file,\n progress: 0,\n status: error ? 'error' : 'pending',\n error,\n }\n}\n\nfunction taskID(task: SparqUploadTask | string): string {\n return typeof task === 'string' ? task : task.id\n}\n\nfunction normalizeProgress(progress: number): number {\n if (!Number.isFinite(progress)) return 0\n return Math.max(0, Math.min(100, Math.round(progress)))\n}\n","export interface SparqFileHashes {\n md5: string\n sha256: string\n}\n\ninterface HashWorkerProgress {\n type: 'progress'\n progress: number\n}\n\ninterface HashWorkerSuccess {\n type: 'success'\n md5: string\n sha256: string\n}\n\ninterface HashWorkerError {\n type: 'error'\n message: string\n}\n\ntype HashWorkerMessage = HashWorkerProgress | HashWorkerSuccess | HashWorkerError\n\n/** 在独立 Worker 中增量计算文件指纹;Worker 或 WASM 不可用时由上层降级为无指纹上传。 */\nexport function hashSparqUploadFile(\n file: File,\n signal?: AbortSignal,\n onProgress?: (progress: number) => void,\n): Promise<SparqFileHashes> {\n if (typeof Worker === 'undefined') return Promise.reject(new Error('当前环境不支持文件哈希 Worker。'))\n if (signal?.aborted) return Promise.reject(createAbortError())\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('./hash-worker.ts', import.meta.url), { type: 'module' })\n const abort = () => {\n worker.terminate()\n reject(createAbortError())\n }\n signal?.addEventListener('abort', abort, { once: true })\n worker.onmessage = (event: MessageEvent<HashWorkerMessage>) => {\n const message = event.data\n if (message.type === 'progress') {\n onProgress?.(message.progress)\n return\n }\n signal?.removeEventListener('abort', abort)\n worker.terminate()\n if (message.type === 'success') {\n resolve({ md5: message.md5, sha256: message.sha256 })\n return\n }\n reject(new Error(message.message))\n }\n worker.onerror = () => {\n signal?.removeEventListener('abort', abort)\n worker.terminate()\n reject(new Error('文件哈希 Worker 执行失败。'))\n }\n worker.postMessage({ file })\n })\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException !== 'undefined') return new DOMException('上传已取消。', 'AbortError')\n const error = new Error('上传已取消。')\n error.name = 'AbortError'\n return error\n}\n","import type { SparqAsset, SparqAssetService, SparqUploadExecution, SparqUploadOptions } from '../service'\nimport { hashSparqUploadFile, type SparqFileHashes } from './hash-file'\n\n// 调用方未加载服务端上传策略时使用该值,避免设置接口异常阻断普通上传入口。\nexport const defaultSparqMultipartThreshold = 16 * 1024 * 1024\n\nexport interface SparqMultipartMetadata {\n title: string\n original_title: string\n bucket?: string\n content_type?: string\n driver?: string\n visibility?: string\n group_code?: string\n metadata?: Record<string, unknown>\n md5?: string\n sha256?: string\n}\n\nexport interface SparqPrepareUploadInput extends SparqMultipartMetadata {\n size: number\n}\n\nexport interface SparqPrepareUploadResult {\n exists: boolean\n asset?: SparqAsset\n bucket?: string\n key: string\n upload_id?: string\n part_size?: number\n}\n\nexport interface SparqUploadedPart {\n part_no: number\n size: number\n etag?: string\n}\n\nexport interface SparqMultipartUploadTransport {\n uploadDirect(file: File, options: SparqUploadOptions, execution?: SparqUploadExecution): Promise<SparqAsset>\n prepare(input: SparqPrepareUploadInput, signal?: AbortSignal): Promise<SparqPrepareUploadResult>\n uploadPart(\n input: { upload_id: string; part_no: number; file: Blob },\n execution?: { signal?: AbortSignal; onProgress?: (loaded: number) => void },\n ): Promise<SparqUploadedPart>\n listParts(uploadId: string, signal?: AbortSignal): Promise<SparqUploadedPart[]>\n complete(\n input: SparqMultipartMetadata & { upload_id: string; key: string },\n signal?: AbortSignal,\n ): Promise<SparqAsset>\n abort(uploadId: string): Promise<void>\n}\n\nexport interface CreateSparqUploadExecutorOptions {\n multipartThreshold?: number\n partConcurrency?: number\n partRetries?: number\n hashFile?: typeof hashSparqUploadFile\n resolveMetadata?: (file: File, options: SparqUploadOptions) => SparqMultipartMetadata\n}\n\n/** 创建普通上传与分片上传共用的执行入口,调用方只提供强类型传输实现。 */\nexport function createSparqUploadExecutor(\n transport: SparqMultipartUploadTransport,\n options: CreateSparqUploadExecutorOptions = {},\n): SparqAssetService['upload'] {\n const threshold = options.multipartThreshold ?? defaultSparqMultipartThreshold\n const hashFile = options.hashFile ?? hashSparqUploadFile\n const partConcurrency = positiveInteger(options.partConcurrency, 3)\n const partRetries = nonNegativeInteger(options.partRetries, 3)\n\n return async (file, uploadOptions, execution) => {\n if (file.size < threshold) {\n execution?.onPhase?.('uploading')\n return transport.uploadDirect(file, uploadOptions, execution)\n }\n\n throwIfAborted(execution?.signal)\n execution?.onPhase?.('hashing')\n const hashes = await optionalFileHashes(file, hashFile, execution)\n throwIfAborted(execution?.signal)\n\n execution?.onPhase?.('preparing')\n const metadata = {\n ...(options.resolveMetadata?.(file, uploadOptions) ?? defaultMultipartMetadata(file, uploadOptions)),\n ...hashes,\n }\n const prepared = await transport.prepare({ ...metadata, size: file.size }, execution?.signal)\n if (prepared.exists) {\n if (!prepared.asset) throw new Error('服务端命中已有资源,但没有返回资源信息。')\n execution?.onProgress?.(100)\n return prepared.asset\n }\n if (!prepared.upload_id || !prepared.part_size) throw new Error('服务端没有返回有效的分片上传会话。')\n\n const uploadId = prepared.upload_id\n try {\n const uploadedParts = await transport.listParts(uploadId, execution?.signal)\n execution?.onPhase?.('uploading')\n await uploadFileParts({\n transport,\n file,\n uploadId,\n partSize: prepared.part_size,\n uploadedParts,\n concurrency: partConcurrency,\n retries: partRetries,\n signal: execution?.signal,\n onProgress: (loaded) => execution?.onProgress?.(10 + (loaded / file.size) * 85),\n })\n throwIfAborted(execution?.signal)\n execution?.onPhase?.('completing')\n execution?.onProgress?.(96)\n const asset = await transport.complete(\n {\n ...metadata,\n upload_id: uploadId,\n bucket: prepared.bucket ?? metadata.bucket,\n key: prepared.key,\n },\n execution?.signal,\n )\n execution?.onProgress?.(100)\n return asset\n } catch (error) {\n await ignoreAbortError(transport.abort(uploadId))\n throw error\n }\n }\n}\n\ninterface UploadFilePartsOptions {\n transport: SparqMultipartUploadTransport\n file: File\n uploadId: string\n partSize: number\n uploadedParts: SparqUploadedPart[]\n concurrency: number\n retries: number\n signal?: AbortSignal\n onProgress: (loaded: number) => void\n}\n\nasync function uploadFileParts(options: UploadFilePartsOptions): Promise<void> {\n const parts = createFileParts(options.file, options.partSize)\n const completed = new Map(options.uploadedParts.map((part) => [part.part_no, part]))\n const loadedByPart = new Map<number, number>()\n const pending = parts.filter((part) => {\n const existing = completed.get(part.partNo)\n if (!existing || existing.size !== part.blob.size) return true\n loadedByPart.set(part.partNo, existing.size)\n return false\n })\n reportLoaded(loadedByPart, options.onProgress)\n\n const controller = new AbortController()\n const cancel = () => controller.abort()\n options.signal?.addEventListener('abort', cancel, { once: true })\n if (options.signal?.aborted) controller.abort()\n let cursor = 0\n let failure: unknown\n\n const workers = Array.from({ length: Math.min(options.concurrency, pending.length) }, async () => {\n while (!failure && cursor < pending.length) {\n const part = pending[cursor]\n cursor += 1\n if (!part) return\n try {\n await uploadPartWithRetry(\n options.transport,\n options.uploadId,\n part,\n options.retries,\n controller.signal,\n (loaded) => {\n loadedByPart.set(part.partNo, Math.min(loaded, part.blob.size))\n reportLoaded(loadedByPart, options.onProgress)\n },\n )\n loadedByPart.set(part.partNo, part.blob.size)\n reportLoaded(loadedByPart, options.onProgress)\n } catch (error) {\n failure = error\n controller.abort()\n }\n }\n })\n await Promise.all(workers)\n options.signal?.removeEventListener('abort', cancel)\n if (failure) throw failure\n throwIfAborted(options.signal)\n}\n\nasync function uploadPartWithRetry(\n transport: SparqMultipartUploadTransport,\n uploadId: string,\n part: FilePart,\n retries: number,\n signal: AbortSignal,\n onProgress: (loaded: number) => void,\n): Promise<void> {\n let attempt = 0\n while (true) {\n throwIfAborted(signal)\n attempt += 1\n try {\n await transport.uploadPart(\n { upload_id: uploadId, part_no: part.partNo, file: part.blob },\n { signal, onProgress },\n )\n return\n } catch (error) {\n if (attempt > retries || !isRetryableUploadError(error)) throw error\n await abortableDelay(250 * attempt, signal)\n }\n }\n}\n\ninterface FilePart {\n partNo: number\n blob: Blob\n}\n\nfunction createFileParts(file: File, partSize: number): FilePart[] {\n if (!Number.isFinite(partSize) || partSize <= 0) throw new Error('服务端返回的分片大小无效。')\n const parts: FilePart[] = []\n for (let offset = 0, partNo = 1; offset < file.size; offset += partSize, partNo += 1) {\n parts.push({ partNo, blob: file.slice(offset, Math.min(offset + partSize, file.size)) })\n }\n return parts\n}\n\nasync function optionalFileHashes(\n file: File,\n hashFile: typeof hashSparqUploadFile,\n execution?: SparqUploadExecution,\n): Promise<Partial<SparqFileHashes>> {\n try {\n const hashes = await hashFile(file, execution?.signal, (progress) => execution?.onProgress?.(progress * 10))\n execution?.onProgress?.(10)\n return hashes\n } catch (error) {\n if (execution?.signal?.aborted || isAbortError(error)) throw error\n execution?.onProgress?.(0)\n return {}\n }\n}\n\nfunction defaultMultipartMetadata(file: File, options: SparqUploadOptions): SparqMultipartMetadata {\n const propsGroup = options.props?.groupCode\n return {\n title: options.title ?? file.name,\n original_title: file.name,\n content_type: file.type || undefined,\n group_code: options.group ?? (typeof propsGroup === 'string' && propsGroup !== '' ? propsGroup : undefined),\n }\n}\n\nfunction reportLoaded(loadedByPart: Map<number, number>, onProgress: (loaded: number) => void): void {\n let loaded = 0\n for (const value of loadedByPart.values()) loaded += value\n onProgress(loaded)\n}\n\nfunction isRetryableUploadError(error: unknown): boolean {\n const status = errorStatus(error)\n return status === undefined || status === 408 || status === 429 || status >= 500\n}\n\nfunction errorStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') return undefined\n if ('status' in error && typeof error.status === 'number') return error.status\n if (\n 'response' in error &&\n error.response &&\n typeof error.response === 'object' &&\n 'status' in error.response &&\n typeof error.response.status === 'number'\n ) {\n return error.response.status\n }\n return undefined\n}\n\nfunction nonNegativeInteger(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isInteger(value) && value >= 0 ? value : fallback\n}\n\nfunction abortableDelay(duration: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(timer)\n reject(createAbortError())\n }\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', abort)\n resolve()\n }, duration)\n signal.addEventListener('abort', abort, { once: true })\n })\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw createAbortError()\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError'\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException !== 'undefined') return new DOMException('上传已取消。', 'AbortError')\n const error = new Error('上传已取消。')\n error.name = 'AbortError'\n return error\n}\n\nasync function ignoreAbortError(promise: Promise<void>): Promise<void> {\n try {\n await promise\n } catch {\n // 清理失败不能覆盖真正的上传错误,服务端会按会话 TTL 回收临时分片。\n }\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n return value === undefined ? fallback : Math.max(1, Math.floor(value))\n}\n","/** 贡献来源层级。层级决定覆盖顺序,priority 只能在同层级内调整顺序。 */\nexport type ContributionLayer = 'builtin' | 'plugin' | 'host' | 'local'\n\n/**\n * 领域声明的强类型贡献点。\n *\n * key 必须在整个前端应用中稳定且唯一;泛型只约束该贡献点允许安装和读取的 value 类型。\n */\nexport interface ContributionPoint<T> {\n /** 贡献点稳定标识,例如 designer.capability-cards。 */\n readonly key: string\n /** 仅用于保留泛型关系,不会写入运行时对象。 */\n readonly __value?: T\n}\n\n/** 单个贡献项。同一贡献点内使用 key 参与覆盖和恢复。 */\nexport interface ContributionInput<T> {\n /** 领域内稳定标识,例如组件名或 capability key。 */\n key: string\n /** 由领域注册表解释的贡献内容。 */\n value: T\n /** 同层级内的解析优先级,数值更大的贡献生效。 */\n priority?: number\n}\n\n/** 同一贡献点、同一来源层级的一组贡献。 */\nexport interface ContributionSet<T> {\n point: ContributionPoint<T>\n entries: readonly ContributionInput<T>[]\n /** 默认按 plugin 层安装,宿主和内置能力必须显式声明自己的层级。 */\n layer?: ContributionLayer\n}\n\n/**\n * 一个 owner 的原子安装单元。\n *\n * 插件可以在一个 bundle 中贡献多个领域;卸载 handle 时这些内容会一起移除,避免部分残留。\n */\nexport interface ContributionBundle {\n /** 贡献来源稳定标识,用于冲突诊断和插件卸载定位。 */\n owner: string\n contributions: readonly ContributionSet<unknown>[]\n}\n\n/** registry 对外暴露的当前生效项,保留来源信息供诊断和管理界面使用。 */\nexport interface ResolvedContribution<T> {\n point: string\n key: string\n owner: string\n layer: ContributionLayer\n priority: number\n value: T\n}\n\n/** 重复贡献诊断。覆盖仍会生效,但宿主可以向开发者展示冲突来源。 */\nexport interface ContributionDiagnostic {\n code: 'duplicate-contribution'\n point: string\n key: string\n owners: string[]\n activeOwner: string\n message: string\n}\n\n/** 安装结果。dispose 可重复调用,并会恢复仍然有效的上一层贡献。 */\nexport interface ContributionHandle {\n dispose(): void\n}\n\n/** 单个贡献点的只读解析入口。 */\nexport interface ContributionRegistry<T> {\n /** 获取当前生效 value,不暴露被覆盖的内部注册栈。 */\n get(key: string): T | undefined\n /** 判断指定 key 当前是否存在生效贡献。 */\n has(key: string): boolean\n /** 按贡献首次安装顺序返回当前生效项,领域需要其他顺序时自行排序。 */\n entries(): readonly ResolvedContribution<T>[]\n /**\n * 按层级、同层优先级和安装时间查找第一个匹配项。\n *\n * matcher 只负责领域判断;Kernel 负责统一选择顺序,适用于资源预览等多个不同 key 都可能匹配的贡献点。\n */\n find(matcher: (entry: ResolvedContribution<T>) => boolean): ResolvedContribution<T> | undefined\n /** 返回当前贡献点内的重复 key,不把正常覆盖静默隐藏。 */\n diagnostics(): readonly ContributionDiagnostic[]\n /** 监听当前贡献点的安装和卸载;返回函数取消监听,取消后不会再接收通知。 */\n subscribe(listener: () => void): () => void\n}\n\n/** 一个应用或领域实例的贡献运行环境,不使用模块级全局状态。 */\nexport interface FrontendKernel {\n /** 原子安装 bundle,并返回控制本次安装生命周期的 handle。 */\n install(bundle: ContributionBundle): ContributionHandle\n /** 获取贡献点的稳定 registry facade;同一 kernel 内重复调用会返回同一对象。 */\n registry<T>(point: ContributionPoint<T>): ContributionRegistry<T>\n}\n\n/** 创建贡献运行环境时的宿主级错误处理配置。 */\nexport interface CreateFrontendKernelOptions {\n /**\n * 接收 registry 订阅者抛出的异常。\n *\n * 订阅者只观察解析结果,不能阻断已经完成的贡献安装或卸载;该回调自身的异常也会被隔离。\n */\n onSubscriberError?: (error: unknown) => void\n}\n\ninterface StoredContribution {\n id: symbol\n sequence: number\n point: string\n key: string\n owner: string\n layer: ContributionLayer\n priority: number\n value: unknown\n}\n\nconst layerWeights: Record<ContributionLayer, number> = {\n builtin: 0,\n plugin: 100,\n host: 200,\n local: 300,\n}\n\n/**\n * 声明领域贡献点。\n *\n * 该函数只建立类型和稳定 key,不创建全局 registry;实际状态归属于 FrontendKernel 实例。\n */\nexport function defineContributionPoint<T>(key: string): ContributionPoint<T> {\n requireIdentifier(key, '贡献点 key')\n return Object.freeze({ key })\n}\n\n/** 创建类型安全的贡献集合,供 ContributionBundle 组合多个领域贡献。 */\nexport function defineContributionSet<T>(\n point: ContributionPoint<T>,\n entries: readonly ContributionInput<T>[],\n layer: ContributionLayer = 'plugin',\n): ContributionSet<T> {\n return { point, entries, layer }\n}\n\n/**\n * 创建隔离的前端贡献运行环境。\n *\n * 注册、订阅和卸载都只影响当前实例,适用于 Admin 应用、设计器实例和测试隔离。\n */\nexport function createFrontendKernel(options: CreateFrontendKernelOptions = {}): FrontendKernel {\n const registrations = new Map<string, Map<string, StoredContribution[]>>()\n const listeners = new Map<string, Set<() => void>>()\n const registries = new Map<string, ContributionRegistry<unknown>>()\n let sequence = 0\n\n function install(bundle: ContributionBundle): ContributionHandle {\n requireIdentifier(bundle.owner, '贡献 owner')\n const pending = bundle.contributions.flatMap((set) => {\n requireIdentifier(set.point.key, '贡献点 key')\n return set.entries.map((entry) => {\n requireIdentifier(entry.key, `贡献点 ${set.point.key} 的条目 key`)\n return {\n id: Symbol(`${bundle.owner}:${set.point.key}:${entry.key}`),\n sequence: sequence++,\n point: set.point.key,\n key: entry.key,\n owner: bundle.owner,\n layer: set.layer ?? 'plugin',\n priority: entry.priority ?? 0,\n value: entry.value,\n } satisfies StoredContribution\n })\n })\n const affectedPoints = new Set(pending.map((entry) => entry.point))\n\n for (const entry of pending) {\n const point = registrations.get(entry.point) ?? new Map<string, StoredContribution[]>()\n const entries = point.get(entry.key) ?? []\n entries.push(entry)\n point.set(entry.key, entries)\n registrations.set(entry.point, point)\n }\n notify(affectedPoints)\n\n let disposed = false\n return {\n dispose() {\n if (disposed) {\n return\n }\n disposed = true\n const ids = new Set(pending.map((entry) => entry.id))\n for (const pointKey of affectedPoints) {\n const point = registrations.get(pointKey)\n if (!point) {\n continue\n }\n for (const [entryKey, entries] of point) {\n const next = entries.filter((entry) => !ids.has(entry.id))\n if (next.length) {\n point.set(entryKey, next)\n } else {\n point.delete(entryKey)\n }\n }\n if (!point.size) {\n registrations.delete(pointKey)\n }\n }\n notify(affectedPoints)\n },\n }\n }\n\n function registry<T>(point: ContributionPoint<T>): ContributionRegistry<T> {\n const existing = registries.get(point.key)\n if (existing) {\n return existing as ContributionRegistry<T>\n }\n\n const resolved: ContributionRegistry<T> = {\n get(key) {\n return activeEntry(point.key, key)?.value as T | undefined\n },\n has(key) {\n return activeEntry(point.key, key) !== undefined\n },\n entries() {\n const stored = registrations.get(point.key)\n if (!stored) {\n return []\n }\n return [...stored.entries()]\n .map(([, entries]) => resolveActiveEntry(entries))\n .filter((entry): entry is StoredContribution => entry !== undefined)\n .map((entry) => toResolvedContribution<T>(entry))\n },\n find(matcher) {\n const stored = registrations.get(point.key)\n if (!stored) {\n return undefined\n }\n const candidates = [...stored.values()]\n .map((entries) => resolveActiveEntry(entries))\n .filter((entry): entry is StoredContribution => entry !== undefined)\n .sort(compareStoredContributionPrecedence)\n const matched = candidates.find((entry) => matcher(toResolvedContribution<T>(entry)))\n return matched ? toResolvedContribution<T>(matched) : undefined\n },\n diagnostics() {\n const stored = registrations.get(point.key)\n if (!stored) {\n return []\n }\n return [...stored.entries()].flatMap(([key, entries]) => {\n if (entries.length < 2) {\n return []\n }\n const active = resolveActiveEntry(entries)\n if (!active) {\n return []\n }\n const owners = [...new Set(entries.map((entry) => entry.owner))]\n return [\n {\n code: 'duplicate-contribution' as const,\n point: point.key,\n key,\n owners,\n activeOwner: active.owner,\n message: `贡献点 ${point.key} 的 ${key} 由 ${owners.join('、')} 重复提供,当前使用 ${active.owner}。`,\n },\n ]\n })\n },\n subscribe(listener) {\n const pointListeners = listeners.get(point.key) ?? new Set<() => void>()\n pointListeners.add(listener)\n listeners.set(point.key, pointListeners)\n return () => {\n pointListeners.delete(listener)\n if (!pointListeners.size) {\n listeners.delete(point.key)\n }\n }\n },\n }\n registries.set(point.key, resolved as ContributionRegistry<unknown>)\n return resolved\n }\n\n function activeEntry(point: string, key: string): StoredContribution | undefined {\n return resolveActiveEntry(registrations.get(point)?.get(key) ?? [])\n }\n\n function notify(points: Iterable<string>): void {\n for (const point of points) {\n for (const listener of listeners.get(point) ?? []) {\n try {\n listener()\n } catch (error) {\n reportSubscriberError(error)\n }\n }\n }\n }\n\n function reportSubscriberError(error: unknown): void {\n try {\n options.onSubscriberError?.(error)\n } catch {\n // 错误报告属于观察行为,不能反向破坏已经完成的贡献状态变更。\n }\n }\n\n return { install, registry }\n}\n\nfunction resolveActiveEntry(entries: readonly StoredContribution[]): StoredContribution | undefined {\n return entries.reduce<StoredContribution | undefined>((active, entry) => {\n if (!active) {\n return entry\n }\n const activeLayer = layerWeights[active.layer]\n const entryLayer = layerWeights[entry.layer]\n if (entryLayer !== activeLayer) {\n return entryLayer > activeLayer ? entry : active\n }\n if (entry.priority !== active.priority) {\n return entry.priority > active.priority ? entry : active\n }\n return entry.sequence > active.sequence ? entry : active\n }, undefined)\n}\n\nfunction compareStoredContributionPrecedence(left: StoredContribution, right: StoredContribution): number {\n const layer = layerWeights[right.layer] - layerWeights[left.layer]\n if (layer !== 0) {\n return layer\n }\n const priority = right.priority - left.priority\n if (priority !== 0) {\n return priority\n }\n return right.sequence - left.sequence\n}\n\nfunction toResolvedContribution<T>(entry: StoredContribution): ResolvedContribution<T> {\n return {\n point: entry.point,\n key: entry.key,\n owner: entry.owner,\n layer: entry.layer,\n priority: entry.priority,\n value: entry.value as T,\n }\n}\n\nfunction requireIdentifier(value: string, label: string): void {\n if (!value) {\n throw new Error(`${label} 不能为空`)\n }\n}\n","import { defineContributionPoint } from '@sparqjs/frontend-core'\nimport { inject, shallowRef, type VNode } from 'vue'\nimport { SPARQ_ASSET_PREVIEW_REGISTRY_KEY } from '../../keys'\nimport type {\n SchemaRendererContributionPoint,\n SchemaRendererContributionRegistry,\n SchemaRendererKernel,\n} from '../../registry'\nimport type { SparqAsset } from '../service'\nimport type { AssetPreviewDialogOptions, AssetPreviewSize } from './AssetPreview'\n\n/** 插件提供的单类资源预览实现。matcher 决定该实现是否适用于当前资源。 */\nexport interface SparqAssetPreviewDefinition {\n /** 预览实现的稳定标识,用于覆盖、诊断和卸载恢复。 */\n key: string\n /** 同层级存在多个匹配实现时,数值更大的实现优先。 */\n priority?: number\n /** 根据资源类型、MIME、扩展名或插件元数据判断是否支持该资源。 */\n matcher: (asset: SparqAsset) => boolean\n /** 渲染完整预览弹窗;实现负责关闭入口、加载状态和键盘交互。 */\n renderDialog: (asset: SparqAsset, options: AssetPreviewDialogOptions) => VNode\n /** 渲染缩略内容;外层点击行为和统一尺寸由 renderer 管理。 */\n renderThumb?: (asset: SparqAsset, size: AssetPreviewSize) => VNode\n}\n\n/** 根据资源解析当前生效预览实现的领域注册表。 */\nexport interface SparqAssetPreviewRegistry {\n /** 按贡献层级、同层 priority 和最近安装顺序返回第一个 matcher 命中的实现。 */\n resolve(asset: SparqAsset): SparqAssetPreviewDefinition | undefined\n /** 返回当前生效实现,供插件管理和诊断界面展示。 */\n entries(): readonly SparqAssetPreviewDefinition[]\n}\n\n/** Schema Vue 资源预览贡献点。 */\nexport const schemaRendererAssetPreviewPoint = defineContributionPoint<SparqAssetPreviewDefinition>(\n 'renderer.asset-previews',\n) as SchemaRendererContributionPoint<SparqAssetPreviewDefinition>\n\n/** 创建随 Kernel 安装和卸载自动失效的资源预览注册表。 */\nexport function createLiveSparqAssetPreviewRegistry(kernel: SchemaRendererKernel): SparqAssetPreviewRegistry {\n return createSparqAssetPreviewRegistry(kernel.registry(schemaRendererAssetPreviewPoint))\n}\n\n/**\n * 获取当前 Vue 应用提供的资源预览注册表。\n *\n * 未安装 renderer 时返回 undefined,由纯渲染函数继续使用内置图片预览和文件占位回退。\n */\nexport function useSparqAssetPreviewRegistry(): SparqAssetPreviewRegistry | undefined {\n return inject(SPARQ_ASSET_PREVIEW_REGISTRY_KEY, undefined)\n}\n\nfunction createSparqAssetPreviewRegistry(\n registry: SchemaRendererContributionRegistry<SparqAssetPreviewDefinition>,\n): SparqAssetPreviewRegistry {\n const version = shallowRef(0)\n registry.subscribe(() => {\n version.value += 1\n })\n\n return {\n resolve(asset) {\n version.value\n return registry.find((entry) => entry.value.matcher(asset))?.value\n },\n entries() {\n version.value\n return registry.entries().map((entry) => entry.value)\n },\n }\n}\n","import { Teleport, defineComponent, h, ref, type PropType, type Ref, type VNode } from 'vue'\nimport type { SparqAsset, SparqAssetType } from '../service'\nimport {\n useSparqAssetPreviewRegistry,\n type SparqAssetPreviewDefinition,\n type SparqAssetPreviewRegistry,\n} from './registry'\n\nexport type AssetPreviewSize = 'card' | 'thumb'\n\nexport interface AssetPreviewState {\n asset: Ref<SparqAsset | undefined>\n scale: Ref<number>\n rotate: Ref<number>\n loading: Ref<boolean>\n failed: Ref<boolean>\n open: (asset: SparqAsset) => void\n close: () => void\n markLoaded: () => void\n markFailed: () => void\n zoomIn: () => void\n zoomOut: () => void\n rotateLeft: () => void\n rotateRight: () => void\n reset: () => void\n}\n\nexport interface AssetPreviewDialogOptions {\n close: () => void\n scale?: number\n rotate?: number\n loading?: boolean\n failed?: boolean\n onLoad?: () => void\n onError?: () => void\n zoomIn?: () => void\n zoomOut?: () => void\n rotateLeft?: () => void\n rotateRight?: () => void\n reset?: () => void\n}\n\n/** renderer 默认安装的图片预览实现,插件可以使用更高层级或同 key 覆盖。 */\nexport const builtInImageAssetPreview: SparqAssetPreviewDefinition = {\n key: 'image',\n matcher: (asset) => resolveAssetType(asset) === 'image',\n renderDialog: renderImageAssetPreviewDialog,\n renderThumb: (asset) => (<img src={asset.url} alt={resolveAssetLabel(asset)} />) as VNode,\n}\n\nexport const AssetPreviewDialog = defineComponent({\n name: 'SparqAssetPreviewDialog',\n props: {\n asset: {\n type: Object as PropType<SparqAsset>,\n required: true,\n },\n },\n emits: {\n close: () => true,\n },\n setup(props, { emit }) {\n const preview = createAssetPreviewState()\n const previewRegistry = useSparqAssetPreviewRegistry()\n preview.open(props.asset)\n const close = () => emit('close')\n\n return () =>\n renderAssetPreviewDialog(\n props.asset,\n {\n close,\n scale: preview.scale.value,\n rotate: preview.rotate.value,\n loading: preview.loading.value,\n failed: preview.failed.value,\n onLoad: preview.markLoaded,\n onError: preview.markFailed,\n zoomIn: preview.zoomIn,\n zoomOut: preview.zoomOut,\n rotateLeft: preview.rotateLeft,\n rotateRight: preview.rotateRight,\n reset: preview.reset,\n },\n previewRegistry,\n )\n },\n})\n\nexport function createAssetPreviewState(): AssetPreviewState {\n const asset = ref<SparqAsset>()\n const scale = ref(1)\n const rotate = ref(0)\n const loading = ref(false)\n const failed = ref(false)\n\n const reset = () => {\n scale.value = 1\n rotate.value = 0\n }\n\n return {\n asset,\n scale,\n rotate,\n loading,\n failed,\n open(nextAsset) {\n asset.value = nextAsset\n loading.value = true\n failed.value = false\n reset()\n },\n close() {\n asset.value = undefined\n loading.value = false\n failed.value = false\n reset()\n },\n markLoaded() {\n loading.value = false\n failed.value = false\n },\n markFailed() {\n loading.value = false\n failed.value = true\n },\n zoomIn() {\n scale.value = Math.min(7, Number((scale.value + 0.2).toFixed(2)))\n },\n zoomOut() {\n scale.value = Math.max(0.2, Number((scale.value - 0.2).toFixed(2)))\n },\n rotateLeft() {\n rotate.value -= 90\n },\n rotateRight() {\n rotate.value += 90\n },\n reset,\n }\n}\n\nexport function renderAssetPreviewDialog(\n asset: SparqAsset,\n options: (() => void) | AssetPreviewDialogOptions,\n registry?: SparqAssetPreviewRegistry,\n): VNode {\n const controls = typeof options === 'function' ? { close: options } : options\n const preview = resolveAssetPreview(asset, registry)\n return preview?.renderDialog(asset, controls) ?? renderFallbackAssetPreviewDialog(asset, controls)\n}\n\nfunction renderImageAssetPreviewDialog(asset: SparqAsset, controls: AssetPreviewDialogOptions): VNode {\n const scale = controls.scale ?? 1\n const rotate = controls.rotate ?? 0\n const loading = controls.loading === true\n const failed = controls.failed === true\n\n return (\n <Teleport to='body'>\n <div\n class='sparq-asset-preview__dialog'\n role='dialog'\n aria-modal='true'\n aria-label='图片预览'\n tabindex={-1}\n onKeydown={(event: KeyboardEvent) => handlePreviewKeydown(event, controls)}\n >\n <div class='sparq-asset-preview__mask' onClick={controls.close} />\n <section class='sparq-asset-preview__panel'>\n <header class='sparq-asset-preview__header'>\n <div class='sparq-asset-preview__title'>{resolveAssetLabel(asset)}</div>\n <button\n type='button'\n class='sparq-asset-preview__close'\n onClick={controls.close}\n aria-label='关闭预览'\n >\n ×\n </button>\n </header>\n <div\n class={[\n 'sparq-asset-preview__stage',\n loading ? 'is-loading' : undefined,\n failed ? 'is-failed' : undefined,\n ]}\n >\n {loading ? renderPreviewPlaceholder('图片加载中') : undefined}\n {failed ? renderPreviewPlaceholder('图片加载失败') : undefined}\n <div class='sparq-asset-preview__image-frame'>\n <img\n src={asset.url}\n alt={resolveAssetLabel(asset)}\n class={loading || failed ? 'is-hidden' : undefined}\n style={{ transform: `scale(${scale}) rotate(${rotate}deg)` }}\n onLoad={controls.onLoad}\n onError={controls.onError}\n />\n </div>\n </div>\n {renderPreviewToolbar(controls, scale)}\n <dl class='sparq-asset-preview__meta'>\n <div>\n <dt>类型</dt>\n <dd>{resolveAssetTypeLabel(resolveAssetType(asset))}</dd>\n </div>\n <div>\n <dt>大小</dt>\n <dd>{formatAssetSize(asset.size)}</dd>\n </div>\n {asset.mime ? (\n <div>\n <dt>MIME</dt>\n <dd>{asset.mime}</dd>\n </div>\n ) : undefined}\n <div>\n <dt>地址</dt>\n <dd>{asset.url}</dd>\n </div>\n </dl>\n </section>\n </div>\n </Teleport>\n ) as VNode\n}\n\nfunction renderFallbackAssetPreviewDialog(asset: SparqAsset, controls: AssetPreviewDialogOptions): VNode {\n return (\n <Teleport to='body'>\n <div\n class='sparq-asset-preview__dialog'\n role='dialog'\n aria-modal='true'\n aria-label='资源预览'\n tabindex={-1}\n >\n <div class='sparq-asset-preview__mask' onClick={controls.close} />\n <section class='sparq-asset-preview__panel'>\n <header class='sparq-asset-preview__header'>\n <div class='sparq-asset-preview__title'>{resolveAssetLabel(asset)}</div>\n <button\n type='button'\n class='sparq-asset-preview__close'\n onClick={controls.close}\n aria-label='关闭预览'\n >\n ×\n </button>\n </header>\n <div class='sparq-asset-preview__stage'>\n <span class='sparq-asset-preview__file-label'>{resolveAssetFileLabel(asset)}</span>\n </div>\n </section>\n </div>\n </Teleport>\n ) as VNode\n}\n\nfunction renderPreviewPlaceholder(text: string): VNode {\n return (\n <div class='sparq-asset-preview__placeholder' role='status' aria-live='polite'>\n <span class='sparq-asset-preview__spinner' aria-hidden='true' />\n <span class='sparq-asset-preview__placeholder-text'>{text}</span>\n </div>\n ) as VNode\n}\n\nfunction renderPreviewToolbar(controls: AssetPreviewDialogOptions, scale: number): VNode {\n const hasControls = Boolean(\n controls.zoomIn || controls.zoomOut || controls.rotateLeft || controls.rotateRight || controls.reset,\n )\n if (!hasControls) {\n return (<div class='sparq-asset-preview__toolbar is-empty' />) as VNode\n }\n\n return (\n <div class='sparq-asset-preview__toolbar' role='toolbar' aria-label='图片预览工具栏'>\n {renderPreviewTool('−', '缩小', controls.zoomOut, scale <= 0.2)}\n <span class='sparq-asset-preview__scale'>{`${Math.round(scale * 100)}%`}</span>\n {renderPreviewTool('+', '放大', controls.zoomIn, scale >= 7)}\n <span class='sparq-asset-preview__divider' />\n {renderPreviewTool('↶', '向左旋转', controls.rotateLeft)}\n {renderPreviewTool('↷', '向右旋转', controls.rotateRight)}\n <span class='sparq-asset-preview__divider' />\n {renderPreviewTool('1:1', '重置', controls.reset)}\n </div>\n ) as VNode\n}\n\nfunction renderPreviewTool(label: string, title: string, onClick: (() => void) | undefined, disabled = false): VNode {\n return (\n <button\n type='button'\n class='sparq-asset-preview__tool'\n title={title}\n aria-label={title}\n disabled={!onClick || disabled}\n onClick={onClick}\n >\n {label}\n </button>\n ) as VNode\n}\n\nfunction handlePreviewKeydown(event: KeyboardEvent, controls: AssetPreviewDialogOptions): void {\n if (event.key === 'Escape') {\n event.preventDefault()\n controls.close()\n return\n }\n if (event.key === '+' || event.key === '=') {\n event.preventDefault()\n controls.zoomIn?.()\n return\n }\n if (event.key === '-') {\n event.preventDefault()\n controls.zoomOut?.()\n return\n }\n if (event.key === '0') {\n event.preventDefault()\n controls.reset?.()\n }\n}\n\nexport function renderAssetPreviewThumb(\n asset: SparqAsset,\n size: AssetPreviewSize,\n openPreview?: (asset: SparqAsset) => void,\n registry?: SparqAssetPreviewRegistry,\n): VNode {\n const preview = resolveAssetPreview(asset, registry)\n const previewProps =\n openPreview && preview\n ? {\n class: ['sparq-asset-preview__thumb', `is-${size}`, 'is-previewable'],\n title: '预览图片',\n onClick(event: MouseEvent) {\n event.stopPropagation()\n openPreview(asset)\n },\n }\n : {\n class: ['sparq-asset-preview__thumb', `is-${size}`],\n }\n\n if (preview?.renderThumb) {\n return (<span {...previewProps}>{preview.renderThumb(asset, size)}</span>) as VNode\n }\n\n return (\n <span {...previewProps}>\n <span class='sparq-asset-preview__file-label'>{resolveAssetFileLabel(asset)}</span>\n </span>\n ) as VNode\n}\n\nexport function resolveAssetLabel(asset: SparqAsset): string {\n return asset.title ?? asset.name ?? asset.url\n}\n\nexport function resolveAssetSummary(asset: SparqAsset): string {\n const parts = [resolveAssetTypeLabel(resolveAssetType(asset))]\n const size = formatAssetSize(asset.size)\n if (size !== '-') {\n parts.push(size)\n }\n\n const time = resolveAssetTime(asset)\n if (time) {\n parts.push(time)\n }\n\n return parts.join(' · ')\n}\n\nexport function resolveAssetTypeLabel(type: SparqAssetType): string {\n const labels: Record<SparqAssetType, string> = {\n image: '图片',\n video: '视频',\n audio: '音频',\n file: '文件',\n }\n\n return labels[type]\n}\n\nexport function resolveAssetType(asset: SparqAsset): SparqAssetType {\n if (asset.type) {\n return asset.type\n }\n if (asset.mime?.startsWith('image/')) {\n return 'image'\n }\n if (asset.mime?.startsWith('video/')) {\n return 'video'\n }\n if (asset.mime?.startsWith('audio/')) {\n return 'audio'\n }\n if (/\\.(avif|png|jpe?g|gif|webp|svg)$/i.test(asset.url)) {\n return 'image'\n }\n\n return 'file'\n}\n\nexport function resolveAssetFileLabel(asset: SparqAsset): string {\n const extension = String(asset.name ?? asset.url)\n .split('?')[0]\n .split('#')[0]\n .split('.')\n .pop()\n ?.trim()\n .toUpperCase()\n\n if (extension && extension.length <= 5 && extension !== String(asset.name ?? asset.url).toUpperCase()) {\n return extension\n }\n\n return resolveAssetType(asset).toUpperCase()\n}\n\nexport function isPreviewableAsset(asset: SparqAsset, registry?: SparqAssetPreviewRegistry): boolean {\n return resolveAssetPreview(asset, registry) !== undefined\n}\n\nfunction resolveAssetPreview(\n asset: SparqAsset,\n registry?: SparqAssetPreviewRegistry,\n): SparqAssetPreviewDefinition | undefined {\n return registry?.resolve(asset) ?? (builtInImageAssetPreview.matcher(asset) ? builtInImageAssetPreview : undefined)\n}\n\nexport function formatAssetSize(size: number | undefined): string {\n if (typeof size !== 'number' || !Number.isFinite(size) || size <= 0) {\n return '-'\n }\n if (size < 1024) {\n return `${size} B`\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`\n }\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n\nfunction resolveAssetTime(asset: SparqAsset): string {\n const value = asset.metadata?.uploadedAt ?? asset.metadata?.createdAt ?? asset.metadata?.updatedAt\n if (typeof value !== 'string' && typeof value !== 'number') {\n return ''\n }\n\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) {\n return String(value)\n }\n\n return date.toLocaleDateString()\n}\n","import { computed, defineComponent, h, onBeforeUnmount, ref, type PropType } from 'vue'\nimport type { AssetValueMode } from '@sparqjs/schema-protocol'\nimport type { SparqAsset, SparqAssetService, SparqAssetType, SparqUploadTask } from '../../asset'\nimport { createSparqUploadQueue } from '../../asset/upload'\nimport {\n createAssetPreviewState,\n formatAssetSize,\n isPreviewableAsset,\n renderAssetPreviewDialog,\n renderAssetPreviewThumb,\n useSparqAssetPreviewRegistry,\n type SparqAssetPreviewRegistry,\n} from '../../asset/preview'\nimport type { UiKit } from '../../ui'\nimport type { FormComponentProps } from '../types'\n\nexport type UploadType = 'image' | 'file'\nexport type UploadChangeEvent = 'upload' | 'pick' | 'remove' | 'clear' | 'change'\n\ninterface UploadItem {\n key: string\n asset?: SparqAsset\n task?: SparqUploadTask\n index?: number\n}\n\nexport function ImageUpload(input: FormComponentProps, _ui: UiKit, assetService?: SparqAssetService) {\n return h(SqUploadControl, {\n input,\n assetService,\n type: 'image',\n 'data-sparq-image-upload': '',\n } as InstanceType<typeof SqUploadControl>['$props'])\n}\n\nexport function FileUpload(input: FormComponentProps, _ui: UiKit, assetService?: SparqAssetService) {\n return h(SqUploadControl, {\n input,\n assetService,\n type: 'file',\n 'data-sparq-file-upload': '',\n } as InstanceType<typeof SqUploadControl>['$props'])\n}\n\nexport const SqUploadControl = defineComponent({\n name: 'SqUploadControl',\n inheritAttrs: false,\n props: {\n input: {\n type: Object as PropType<FormComponentProps>,\n required: true,\n },\n assetService: {\n type: Object as PropType<SparqAssetService>,\n default: undefined,\n },\n type: {\n type: String as PropType<UploadType>,\n required: true,\n },\n },\n setup(props, { attrs }) {\n const fileInput = ref<HTMLInputElement>()\n const preview = createAssetPreviewState()\n const assetPreviews = useSparqAssetPreviewRegistry()\n const emittedAssets = ref<SparqAsset[]>(normalizeAssets(props.input.value, resolveValueMode(props.input.props)))\n const uploadQueue = createSparqUploadQueue({\n upload(file, options, execution) {\n if (!props.assetService) return Promise.reject(new Error('Asset service is not configured.'))\n return props.assetService.upload(file, options, execution)\n },\n onSuccess(asset) {\n appendAssets([asset], 'upload')\n },\n })\n const tasks = uploadQueue.tasks\n onBeforeUnmount(uploadQueue.reset)\n const assets = computed(() =>\n normalizeAssets(props.input.value, resolveValueMode(props.input.props), emittedAssets.value),\n )\n const limit = computed(() => resolveLimit(props.input.props))\n const disabled = computed(() => props.input.disabled === true || props.input.readonly === true)\n const activeTasks = computed(() =>\n tasks.value.filter((task) => task.status === 'pending' || task.status === 'uploading'),\n )\n const visibleTasks = computed(() => tasks.value.filter((task) => task.status !== 'success'))\n const canAdd = computed(() => limit.value === 0 || assets.value.length + activeTasks.value.length < limit.value)\n const editableTitle = computed(\n () => props.input.props?.editableTitle === true || props.input.props?.editable === true,\n )\n const hasPicker = computed(\n () => Boolean(props.assetService?.pick) && typeof props.input.props?.uploadEndpoint !== 'string',\n )\n const items = computed<UploadItem[]>(() => [\n ...assets.value.map((asset, index) => ({\n key: `asset:${asset.id ?? asset.url ?? index}`,\n asset,\n index,\n })),\n ...visibleTasks.value.map((task) => ({\n key: `task:${task.id}`,\n task,\n })),\n ])\n\n const emitAssets = (assets: SparqAsset[], event: UploadChangeEvent, changedAssets: SparqAsset[] = assets) => {\n emittedAssets.value = assets\n const value = resolveOutputValue(assets, props.input.props)\n props.input.onChange?.(value, {\n value,\n event,\n asset: changedAssets[0] ?? assets[0],\n assets,\n })\n }\n\n const handleFiles = (files: File[]) => {\n if (!props.assetService || disabled.value || !canAdd.value) {\n return\n }\n\n const multiple = resolveMultiple(props.input.props)\n const uploadFiles = limitFiles(\n files,\n resolveRemaining(limit.value, assets.value.length + activeTasks.value.length),\n )\n uploadQueue.add(uploadFiles, {\n type: resolveAssetType(props.type),\n accept: resolveAccept(props.input.props, props.type),\n maxSize: resolveMaxSize(props.input.props),\n multiple,\n field: props.input.field?.name,\n props: props.input.props,\n })\n }\n const appendAssets = (assets: SparqAsset[], event: UploadChangeEvent) => {\n const current = resolveMultiple(props.input.props)\n ? normalizeAssets(props.input.value, resolveValueMode(props.input.props), emittedAssets.value)\n : []\n emitAssets(applyLimit([...current, ...assets], limit.value), event, assets)\n }\n const pickAssets = async () => {\n if (!hasPicker.value || !props.assetService?.pick || disabled.value || !canAdd.value) {\n return\n }\n\n const remaining = resolveRemaining(limit.value, assets.value.length + activeTasks.value.length)\n const pickedAssets = await props.assetService.pick({\n type: resolveAssetType(props.type),\n accept: resolveAccept(props.input.props, props.type),\n maxSize: resolveMaxSize(props.input.props),\n multiple: resolveMultiple(props.input.props),\n limit: remaining === Number.POSITIVE_INFINITY ? undefined : remaining,\n field: props.input.field?.name,\n props: props.input.props,\n })\n appendAssets(pickedAssets, 'pick')\n }\n const removeAsset = (asset: SparqAsset) => {\n const nextAssets = assets.value.filter((item) => !isSameAsset(item, asset))\n emitAssets(nextAssets, nextAssets.length ? 'remove' : 'clear', [asset])\n }\n const updateAssetTitle = (index: number, title: string) => {\n const changedAsset = assets.value[index]\n ? {\n ...assets.value[index],\n title,\n }\n : undefined\n const nextAssets = assets.value.map((asset, assetIndex) =>\n assetIndex === index && changedAsset ? changedAsset : asset,\n )\n emitAssets(nextAssets, 'change', changedAsset ? [changedAsset] : [])\n }\n const openAsset = (asset: SparqAsset) => {\n if (isPreviewableAsset(asset, assetPreviews)) {\n preview.open(asset)\n return\n }\n if (!asset.url) {\n return\n }\n\n window.open(asset.url, '_blank', 'noopener,noreferrer')\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n class: ['sparq-upload', `sparq-upload--${props.type}`, attrs.class],\n 'data-sparq-upload': props.type,\n },\n [\n h('input', {\n ref: fileInput,\n type: 'file',\n accept: resolveAccept(props.input.props, props.type),\n multiple: resolveMultiple(props.input.props),\n style: { display: 'none' },\n disabled: disabled.value || !props.assetService || !canAdd.value,\n onChange(event: Event) {\n const input = event.target as HTMLInputElement\n void handleFiles(Array.from(input.files ?? []))\n input.value = ''\n },\n }),\n props.type === 'image'\n ? renderImageUpload({\n items: items.value,\n canShowUpload: canAdd.value,\n disabled: disabled.value,\n hasAssetService: Boolean(props.assetService),\n hasPicker: hasPicker.value,\n uploadText: String(props.input.props?.uploadText ?? '文件上传'),\n pickText: String(props.input.props?.pickText ?? '选择图片'),\n editableTitle: editableTitle.value,\n triggerUpload: () => fileInput.value?.click(),\n pickAssets,\n removeAsset,\n cancelUpload: uploadQueue.cancel,\n retryUpload: uploadQueue.retry,\n updateAssetTitle,\n openAsset,\n assetPreviews,\n })\n : renderFileUpload({\n items: items.value,\n canShowUpload: canAdd.value,\n disabled: disabled.value,\n hasAssetService: Boolean(props.assetService),\n hasPicker: hasPicker.value,\n uploadText: String(props.input.props?.uploadText ?? '文件上传'),\n pickText: String(props.input.props?.pickText ?? '选择文件'),\n editableTitle: editableTitle.value,\n triggerUpload: () => fileInput.value?.click(),\n pickAssets,\n removeAsset,\n cancelUpload: uploadQueue.cancel,\n retryUpload: uploadQueue.retry,\n updateAssetTitle,\n openAsset,\n assetPreviews,\n }),\n !props.assetService\n ? h('div', { class: 'sparq-upload__error' }, 'Asset service is not configured.')\n : undefined,\n preview.asset.value\n ? renderAssetPreviewDialog(\n preview.asset.value,\n {\n close: preview.close,\n scale: preview.scale.value,\n rotate: preview.rotate.value,\n loading: preview.loading.value,\n failed: preview.failed.value,\n onLoad: preview.markLoaded,\n onError: preview.markFailed,\n zoomIn: preview.zoomIn,\n zoomOut: preview.zoomOut,\n rotateLeft: preview.rotateLeft,\n rotateRight: preview.rotateRight,\n reset: preview.reset,\n },\n assetPreviews,\n )\n : undefined,\n ],\n )\n },\n})\n\ninterface UploadRenderState {\n items: UploadItem[]\n canShowUpload: boolean\n disabled: boolean\n hasAssetService: boolean\n hasPicker: boolean\n uploadText: string\n pickText: string\n editableTitle: boolean\n triggerUpload: () => void\n pickAssets: () => Promise<void>\n removeAsset: (asset: SparqAsset) => void\n cancelUpload: (task: SparqUploadTask) => void\n retryUpload: (task: SparqUploadTask) => void\n updateAssetTitle: (index: number, title: string) => void\n openAsset: (asset: SparqAsset) => void\n assetPreviews?: SparqAssetPreviewRegistry\n}\n\nfunction renderImageUpload(state: UploadRenderState) {\n return h('div', { class: 'sparq-upload__image-grid' }, [\n state.canShowUpload ? renderImageEntry(state) : undefined,\n ...state.items.map((item) => renderImageItem(item, state)),\n ])\n}\n\nfunction renderFileUpload(state: UploadRenderState) {\n return h('div', { class: 'sparq-upload__file-area' }, [\n state.canShowUpload ? renderFileActions(state) : undefined,\n state.items.length\n ? h(\n 'ul',\n { class: 'sparq-upload__file-list' },\n state.items.map((item) => renderFileItem(item, state)),\n )\n : undefined,\n ])\n}\n\nfunction renderImageEntry(state: UploadRenderState) {\n return h('div', { class: 'sparq-upload__image-entry' }, [\n h('span', { class: 'sparq-upload__image-plus', 'aria-hidden': 'true' }, '+'),\n h('div', { class: 'sparq-upload__overlay' }, [\n h('div', { class: 'sparq-upload__overlay-actions' }, [\n renderActionButton(state.uploadText, state.disabled || !state.hasAssetService, state.triggerUpload),\n state.hasPicker\n ? renderActionButton(state.pickText, state.disabled, () => {\n void state.pickAssets()\n })\n : undefined,\n ]),\n ]),\n ])\n}\n\nfunction renderFileActions(state: UploadRenderState) {\n return h('div', { class: 'sparq-upload__actions' }, [\n renderActionButton(state.uploadText, state.disabled || !state.hasAssetService, state.triggerUpload),\n state.hasPicker\n ? renderActionButton(state.pickText, state.disabled, () => {\n void state.pickAssets()\n })\n : undefined,\n ])\n}\n\nfunction renderImageItem(item: UploadItem, state: UploadRenderState) {\n if (item.task) {\n return h('div', { key: item.key, class: 'sparq-upload__image-item is-task' }, [\n h('div', { class: 'sparq-upload__image-task' }, [\n h('span', { class: 'sparq-upload__image-task-name' }, item.task.file.name),\n renderProgress(item.task),\n h('span', { class: 'sparq-upload__status' }, resolveStatusText(item.task.status)),\n item.task.status === 'pending' || item.task.status === 'uploading'\n ? renderIconButton('取消', () => state.cancelUpload(item.task!))\n : renderIconButton('重试', () => state.retryUpload(item.task!)),\n ]),\n ])\n }\n\n const asset = item.asset!\n return h('div', { key: item.key, class: 'sparq-upload__image-item' }, [\n h('img', {\n class: 'sparq-upload__image',\n src: asset.url,\n alt: asset.title ?? asset.name ?? asset.url,\n }),\n h('div', { class: 'sparq-upload__overlay' }, [\n h('div', { class: 'sparq-upload__overlay-actions' }, [\n renderActionButton('预览', false, () => state.openAsset(asset)),\n renderActionButton('删除', state.disabled, () => state.removeAsset(asset)),\n ]),\n ]),\n state.editableTitle && item.index !== undefined\n ? h('input', {\n class: 'sparq-upload__title-input',\n value: asset.title ?? asset.name ?? '',\n placeholder: '请输入文件标题',\n disabled: state.disabled,\n onInput(event: Event) {\n state.updateAssetTitle(item.index!, (event.target as HTMLInputElement).value)\n },\n })\n : undefined,\n ])\n}\n\nfunction renderFileItem(item: UploadItem, state: UploadRenderState) {\n if (item.task) {\n return h('li', { key: item.key, class: 'sparq-upload__file-item is-task' }, [\n h('div', { class: 'sparq-upload__file-icon' }, renderFileLabel(item.task.file.name, item.task.file.type)),\n h('div', { class: 'sparq-upload__file-main' }, [\n h('span', { class: 'sparq-upload__file-title' }, item.task.file.name),\n renderProgress(item.task),\n ]),\n h('div', { class: 'sparq-upload__file-size' }, formatAssetSize(item.task.file.size)),\n h('div', { class: 'sparq-upload__file-actions' }, [\n h('span', { class: 'sparq-upload__status' }, resolveStatusText(item.task.status)),\n item.task.status === 'pending' || item.task.status === 'uploading'\n ? renderIconButton('取消', () => state.cancelUpload(item.task!))\n : renderIconButton('重试', () => state.retryUpload(item.task!)),\n ]),\n ])\n }\n\n const asset = item.asset!\n return h('li', { key: item.key, class: 'sparq-upload__file-item' }, [\n h(\n 'div',\n { class: 'sparq-upload__file-icon' },\n isPreviewableAsset(asset, state.assetPreviews)\n ? renderAssetPreviewThumb(asset, 'thumb', undefined, state.assetPreviews)\n : renderFileLabel(asset.name ?? asset.url, asset.mime),\n ),\n h('div', { class: 'sparq-upload__file-main' }, [\n state.editableTitle && item.index !== undefined\n ? h('input', {\n class: 'sparq-upload__file-title-input',\n value: asset.title ?? asset.name ?? '',\n placeholder: '请输入文件标题',\n disabled: state.disabled,\n onInput(event: Event) {\n state.updateAssetTitle(item.index!, (event.target as HTMLInputElement).value)\n },\n })\n : h(\n 'button',\n {\n type: 'button',\n class: 'sparq-upload__file-title',\n onClick() {\n state.openAsset(asset)\n },\n },\n asset.title ?? asset.name ?? asset.url,\n ),\n ]),\n h('div', { class: 'sparq-upload__file-size' }, formatAssetSize(asset.size)),\n h('div', { class: 'sparq-upload__file-actions' }, [\n renderIconButton(isPreviewableAsset(asset, state.assetPreviews) ? '预览' : '打开', () =>\n state.openAsset(asset),\n ),\n renderIconButton('删除', () => state.removeAsset(asset), state.disabled),\n ]),\n ])\n}\n\nfunction renderActionButton(label: string, disabled: boolean, onClick: () => void) {\n return h(\n 'button',\n {\n type: 'button',\n class: 'sparq-upload__button',\n disabled,\n onClick,\n },\n label,\n )\n}\n\nfunction renderIconButton(label: string, onClick: () => void, disabled = false) {\n return h(\n 'button',\n {\n type: 'button',\n class: 'sparq-upload__icon-button',\n title: label,\n 'aria-label': label,\n disabled,\n onClick,\n },\n label,\n )\n}\n\nfunction renderProgress(task: SparqUploadTask) {\n return h('div', { class: 'sparq-upload__progress' }, [\n h('span', {\n class: 'sparq-upload__progress-bar',\n style: {\n width: `${Math.max(0, Math.min(100, task.progress))}%`,\n },\n }),\n ])\n}\n\nfunction renderFileLabel(name: string | undefined, mime?: string) {\n return h('span', { class: 'sparq-upload__file-label' }, resolveFileLabel(name, mime))\n}\n\nfunction normalizeAssets(value: unknown, valueMode: AssetValueMode, cachedAssets: SparqAsset[] = []): SparqAsset[] {\n if (!value) {\n return []\n }\n if (Array.isArray(value)) {\n return value.flatMap((item) => normalizeAssets(item, valueMode, cachedAssets))\n }\n if (typeof value === 'object' && typeof (value as SparqAsset).url === 'string') {\n return [value as SparqAsset]\n }\n if (valueMode === 'id') {\n return findCachedAssetById(cachedAssets, value)\n }\n if (typeof value === 'string') {\n return [{ url: value }]\n }\n\n return []\n}\n\nfunction resolveOutputValue(assets: SparqAsset[], props?: Record<string, unknown>): unknown {\n const valueMode = resolveValueMode(props)\n const multiple = resolveMultiple(props)\n\n if (multiple) {\n return assets.flatMap((asset) => resolveAssetValue(asset, valueMode))\n }\n\n const asset = assets[0]\n if (!asset) {\n return null\n }\n\n const value = resolveAssetValue(asset, valueMode)\n return value.length ? value[0] : null\n}\n\nfunction resolveValueMode(props?: Record<string, unknown>): AssetValueMode {\n if (props?.valueMode === 'id' || props?.valueMode === 'asset') {\n return props.valueMode\n }\n\n return 'url'\n}\n\nfunction resolveAssetValue(asset: SparqAsset, valueMode: AssetValueMode): unknown[] {\n switch (valueMode) {\n case 'asset':\n return [asset]\n case 'id':\n if (asset.id === undefined || asset.id === null || asset.id === '') {\n console.error('[sparq-upload] valueMode \"id\" requires asset.id. Asset has been ignored.', asset)\n return []\n }\n return [asset.id]\n case 'url':\n default:\n return [asset.url]\n }\n}\n\nfunction findCachedAssetById(cachedAssets: SparqAsset[], value: unknown): SparqAsset[] {\n if (typeof value !== 'string' && typeof value !== 'number') {\n return []\n }\n\n const asset = cachedAssets.find((item) => item.id === value)\n return asset ? [asset] : []\n}\n\nfunction resolveMultiple(props?: Record<string, unknown>): boolean {\n const limit = resolveLimit(props)\n return props?.multiple === true || limit === 0 || limit > 1\n}\n\nfunction resolveLimit(props?: Record<string, unknown>): number {\n if (typeof props?.limit === 'number' && props.limit >= 0) {\n return props.limit\n }\n\n return props?.multiple === true ? 0 : 1\n}\n\nfunction resolveRemaining(limit: number, count: number): number {\n if (limit === 0) {\n return Number.POSITIVE_INFINITY\n }\n\n return Math.max(0, limit - count)\n}\n\nfunction limitFiles(files: File[], remaining: number): File[] {\n if (remaining === Number.POSITIVE_INFINITY) {\n return files\n }\n\n return files.slice(0, remaining)\n}\n\nfunction applyLimit(assets: SparqAsset[], limit: number): SparqAsset[] {\n const nextAssets = dedupeAssets(assets)\n if (limit === 0) {\n return nextAssets\n }\n\n return nextAssets.slice(0, limit)\n}\n\nfunction dedupeAssets(assets: SparqAsset[]): SparqAsset[] {\n const result: SparqAsset[] = []\n for (const asset of assets) {\n if (!result.some((item) => isSameAsset(item, asset))) {\n result.push(asset)\n }\n }\n\n return result\n}\n\nfunction resolveAccept(props: Record<string, unknown> | undefined, type: UploadType): string {\n if (typeof props?.accept === 'string') {\n return props.accept\n }\n\n return type === 'image' ? 'image/*' : ''\n}\n\nfunction resolveMaxSize(props?: Record<string, unknown>): number | undefined {\n return typeof props?.maxSize === 'number' && props.maxSize > 0 ? props.maxSize : undefined\n}\n\nfunction resolveAssetType(type: UploadType): SparqAssetType {\n return type === 'image' ? 'image' : 'file'\n}\n\nfunction isSameAsset(left: SparqAsset, right: SparqAsset): boolean {\n if (left.id !== undefined && right.id !== undefined) {\n return left.id === right.id\n }\n\n return left.url === right.url\n}\n\nfunction resolveFileLabel(name: string | undefined, mime?: string): string {\n const extension = String(name ?? '')\n .split('?')[0]\n .split('#')[0]\n .split('.')\n .pop()\n ?.trim()\n .toUpperCase()\n\n if (extension && extension.length <= 5 && extension !== String(name ?? '').toUpperCase()) {\n return extension\n }\n if (mime?.startsWith('image/')) {\n return 'IMG'\n }\n if (mime?.startsWith('video/')) {\n return 'VID'\n }\n if (mime?.startsWith('audio/')) {\n return 'AUD'\n }\n\n return 'FILE'\n}\n\nfunction resolveStatusText(status: SparqUploadTask['status']): string {\n switch (status) {\n case 'pending':\n return '等待中'\n case 'uploading':\n return '上传中'\n case 'success':\n return '完成'\n case 'error':\n return '失败'\n case 'canceled':\n return '已取消'\n default:\n return status\n }\n}\n","import { h, type VNode, type VNodeArrayChildren, type VNodeChild } from 'vue'\nimport type {\n SchemaActionContext,\n SchemaContainerContext,\n SchemaDetailShellContext,\n SchemaFormShellContext,\n SchemaUiAdapter,\n SchemaUiContext,\n SparqViewState,\n} from '../types'\n\n/**\n * 将容器渲染委托给当前 UI 适配器。\n */\nexport function renderContainer(context: SchemaContainerContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n return uiAdapter?.renderContainer?.(context) ?? renderMissingUiRenderer('renderContainer')\n}\n\n/**\n * 渲染 loading 和 error 状态使用的兜底容器。\n */\nexport function renderStatusContainer(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n const children =\n state.status === 'loading'\n ? 'Loading schema...'\n : state.status === 'error'\n ? state.diagnostics.map((diagnostic) => diagnostic.message).join('\\n')\n : undefined\n\n return (\n uiAdapter?.renderContainer?.({\n ...context,\n kind: 'section',\n children,\n }) ?? renderMissingUiRenderer('renderContainer')\n )\n}\n\n/**\n * 使用带 `data-slot` 的普通容器包裹子节点。\n */\nexport function renderSlot(slot: string, children: VNodeChild, props?: Record<string, unknown>): VNodeChild {\n return h(\n 'div',\n {\n ...props,\n 'data-slot': slot,\n },\n normalizeChildren(children),\n )\n}\n\n/**\n * 使用 section slot 包裹页面内嵌区域。\n */\nexport function renderViewSlot(slot: string, children: VNodeChild): VNodeChild {\n return h(\n 'section',\n {\n 'data-slot': slot,\n },\n normalizeChildren(children),\n )\n}\n\n/**\n * 将已解析动作渲染委托给当前 UI 适配器。\n *\n * 隐藏动作不渲染内容,也不会注册执行器。\n */\nexport function renderAction(context: SchemaActionContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n if (context.action.props?.visible === false) {\n return undefined\n }\n\n context.controller?.registerActionExecutor(context.action.action, context.execute)\n\n return uiAdapter?.renderAction?.(context) ?? renderMissingUiRenderer('renderAction')\n}\n\n/**\n * 将表单外壳渲染委托给当前 UI 适配器。\n */\nexport function renderFormShell(context: SchemaFormShellContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n if (!context.open) {\n return undefined\n }\n\n return uiAdapter?.renderFormShell?.(context) ?? renderMissingUiRenderer('renderFormShell')\n}\n\n/**\n * 将详情外壳渲染委托给当前 UI 适配器。\n */\nexport function renderDetailShell(context: SchemaDetailShellContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n if (!context.open) {\n return undefined\n }\n\n return uiAdapter?.renderDetailShell?.(context) ?? renderMissingUiRenderer('renderDetailShell')\n}\n\n/**\n * 解析当前渲染路径下的表单外壳展示方式。\n */\nexport function resolveFormPresentation(\n context: SchemaUiContext,\n embeddedInPage: boolean,\n): SchemaFormShellContext['presentation'] {\n if (embeddedInPage) {\n return context.controller?.page.formPresentation ?? 'dialog'\n }\n\n return 'default'\n}\n\n/**\n * 解析当前渲染路径下表单外壳是否打开。\n */\nexport function resolveFormOpen(context: SchemaUiContext, embeddedInPage: boolean): boolean {\n if (embeddedInPage) {\n return context.controller?.page.formOpen ?? false\n }\n\n return true\n}\n\n/**\n * 根据详情 wrapper 配置解析详情外壳展示方式。\n */\nexport function resolveDetailPresentation(\n view: Pick<SchemaDetailShellContext['detail'], 'wrapper'>,\n embeddedInPage = true,\n): SchemaDetailShellContext['presentation'] {\n if (view.wrapper?.type === 'drawer') {\n return 'drawer'\n }\n\n if (view.wrapper?.type === 'inline') {\n return 'inline'\n }\n\n if (view.wrapper?.type === 'panel' || view.wrapper?.type === 'card') {\n return 'panel'\n }\n\n if (view.wrapper?.type === 'default') {\n return 'default'\n }\n\n return embeddedInPage ? 'dialog' : 'panel'\n}\n\n/**\n * UI 适配器缺少必要渲染器时抛出稳定错误。\n */\nexport function renderMissingUiRenderer(name: string): never {\n throw new Error(`Sparq Vue UI adapter is missing ${name}.`)\n}\n\n/**\n * 传入原生 `h()` 调用前规范化 children。\n */\nexport function normalizeChildren(children: VNodeChild): string | number | VNode | VNodeArrayChildren | undefined {\n if (children === null || children === undefined || typeof children === 'boolean') {\n return undefined\n }\n\n return children\n}\n","import { h, inject, type Component, type VNodeChild } from 'vue'\nimport { SPARQ_UI_KIT_KEY } from '../keys'\n\n/**\n * UI 组件集渲染上下文。\n *\n * 当前先保留最小字段,后续接入状态、scope 和诊断时再扩展。\n */\nexport interface UiRenderContext {\n /** 当前组件 key。 */\n name: string\n}\n\n/**\n * UI 组件集中的组件定义。\n *\n * component 便于业务组件直接组合;render 便于渲染器统一处理 props、slots 和默认属性。\n */\nexport interface UiComponent {\n /** 实际组件。Vue 渲染层会按当前框架解释该值。 */\n component?: unknown\n props?: Record<string, unknown>\n /** 渲染函数。缺失时默认使用 component 渲染。 */\n render?: (props?: Record<string, unknown>, slots?: unknown, context?: UiRenderContext) => VNodeChild\n}\n\n/**\n * UI 组件集注册输入。\n */\nexport type UiKitSeed = Record<string, UiComponent> | Iterable<readonly [string, UiComponent]>\n\n/**\n * UI 组件集。\n *\n * 自定义组件可通过 useSparqUi 获取当前 UI 体系的基础组件。\n */\nexport interface UiKit {\n /** 获取 UI 组件定义。 */\n get(name: string): UiComponent | undefined\n /** 判断 UI 组件是否存在。 */\n has(name: string): boolean\n /** 渲染 UI 组件。 */\n render(name: string, props?: Record<string, unknown>, slots?: unknown): VNodeChild | undefined\n /** 遍历 UI 组件定义。 */\n entries(): IterableIterator<[string, UiComponent]>\n}\n\n/**\n * 创建 UI 组件集。\n */\nexport function createUiKit(seed: UiKitSeed = {}): UiKit {\n const components = new Map<string, UiComponent>(isIterableSeed(seed) ? seed : Object.entries(seed))\n\n return {\n get(name) {\n return components.get(name)\n },\n has(name) {\n return components.has(name)\n },\n render(name, props, slots) {\n const entry = components.get(name)\n if (!entry) {\n return undefined\n }\n\n const mergedProps = mergeUiProps(entry.props, props)\n\n if (entry.render) {\n return entry.render(mergedProps, slots, { name })\n }\n\n if (entry.component) {\n return h(entry.component as Component, mergedProps, slots as never)\n }\n\n return undefined\n },\n entries() {\n return components.entries()\n },\n }\n}\n\n/**\n * 合并 UI 组件集。\n *\n * 后面的组件集会覆盖前面的同名组件,用于业务项目覆盖预设默认组件。\n */\nexport function mergeUiKit(...kits: Array<UiKit | undefined>): UiKit {\n const entries: Array<[string, UiComponent]> = []\n\n for (const kit of kits) {\n if (!kit) {\n continue\n }\n\n entries.push(...kit.entries())\n }\n\n return createUiKit(entries)\n}\n\n/**\n * 获取当前 UI 组件集。\n */\nexport function useSparqUi(): UiKit {\n const ui = inject(SPARQ_UI_KIT_KEY, undefined)\n if (!ui) {\n throw new Error('Sparq UI kit is not provided. Install a schema renderer plugin with uiKit.')\n }\n\n return ui\n}\n\n/**\n * 判断 seed 是否是可迭代 entries。\n */\nfunction isIterableSeed(seed: UiKitSeed): seed is Iterable<readonly [string, UiComponent]> {\n return Symbol.iterator in Object(seed)\n}\n\nfunction mergeUiProps(\n defaults: Record<string, unknown> | undefined,\n props: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!defaults) {\n return props\n }\n\n if (!props) {\n return defaults\n }\n\n return {\n ...defaults,\n ...props,\n }\n}\n","import {\n SCHEMA_UI_ALERT,\n SCHEMA_UI_BUTTON,\n SCHEMA_UI_BUTTON_GROUP,\n SCHEMA_UI_CARD,\n SCHEMA_UI_CASCADER,\n SCHEMA_UI_CHECKBOX,\n SCHEMA_UI_CHECKBOX_GROUP,\n SCHEMA_UI_COL,\n SCHEMA_UI_COLLAPSE,\n SCHEMA_UI_COLLAPSE_ITEM,\n SCHEMA_UI_COLOR_PICKER,\n SCHEMA_UI_DATE_PICKER,\n SCHEMA_UI_DIALOG,\n SCHEMA_UI_DIVIDER,\n SCHEMA_UI_DRAWER,\n SCHEMA_UI_DROPDOWN,\n SCHEMA_UI_DROPDOWN_ITEM,\n SCHEMA_UI_DROPDOWN_MENU,\n SCHEMA_UI_EMPTY,\n SCHEMA_UI_FORM,\n SCHEMA_UI_FORM_ITEM,\n SCHEMA_UI_NUMBER,\n SCHEMA_UI_OPTION,\n SCHEMA_UI_OPTION_GROUP,\n SCHEMA_UI_PAGINATION,\n SCHEMA_UI_RADIO,\n SCHEMA_UI_RADIO_GROUP,\n SCHEMA_UI_RATE,\n SCHEMA_UI_ROW,\n SCHEMA_UI_SCROLLBAR,\n SCHEMA_UI_SELECT,\n SCHEMA_UI_SLIDER,\n SCHEMA_UI_SWITCH,\n SCHEMA_UI_TABLE,\n SCHEMA_UI_TABLE_COLUMN,\n SCHEMA_UI_TAB_PANE,\n SCHEMA_UI_TABS,\n SCHEMA_UI_TAG,\n SCHEMA_UI_TEXT,\n SCHEMA_UI_TEXTAREA,\n SCHEMA_UI_TIME_PICKER,\n SCHEMA_UI_TREE,\n SCHEMA_UI_TREE_SELECT,\n type SchemaUiKey,\n} from '@sparqjs/schema-core'\nimport { defineComponent, type PropType, type VNodeChild } from 'vue'\nimport { type UiKit, useSparqUi } from './kit'\n\nexport type SchemaUiRenderType = SchemaUiKey | (string & {})\nexport type SchemaUiProps = Record<string, unknown>\nexport type SchemaUiSlots = unknown\n\nexport interface SchemaUiProxy {\n render(name: SchemaUiRenderType, props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n text(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n textarea(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n number(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n select(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n treeSelect(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n cascader(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n radioGroup(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n checkboxGroup(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n switch(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n rate(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n datePicker(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n timePicker(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n slider(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n colorPicker(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n button(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n buttonGroup(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n form(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n formItem(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n table(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n tableColumn(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n tree(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n pagination(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n alert(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n card(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n tag(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n empty(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n checkbox(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n col(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n collapse(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n collapseItem(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n dialog(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n divider(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n drawer(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n dropdown(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n dropdownItem(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n dropdownMenu(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n option(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n optionGroup(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n radio(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n row(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n scrollbar(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n tabPane(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n tabs(props?: SchemaUiProps, slots?: SchemaUiSlots): VNodeChild | undefined\n}\n\nconst schemaUiProxyCache = new WeakMap<UiKit, SchemaUiProxy>()\n\n/**\n * 获取 Vue 渲染层 UI 代理。\n */\nexport function useSchemaUi(): SchemaUiProxy {\n return getSchemaUiProxy(useSparqUi())\n}\n\n/**\n * 获取指定 UI Kit 的全局复用代理。\n */\nexport function getSchemaUiProxy(uiKit: UiKit): SchemaUiProxy {\n const cached = schemaUiProxyCache.get(uiKit)\n if (cached) {\n return cached\n }\n\n const proxy = createSchemaUiProxy(uiKit)\n schemaUiProxyCache.set(uiKit, proxy)\n return proxy\n}\n\n/**\n * 基于指定 UI Kit 创建 Vue 渲染层 UI 代理。\n */\nexport function createSchemaUiProxy(uiKit: UiKit): SchemaUiProxy {\n const render = (name: SchemaUiRenderType, props?: SchemaUiProps, slots?: SchemaUiSlots) => uiKit.render(name, props, slots)\n\n return {\n render,\n text: (props, slots) => render(SCHEMA_UI_TEXT, props, slots),\n textarea: (props, slots) => render(SCHEMA_UI_TEXTAREA, props, slots),\n number: (props, slots) => render(SCHEMA_UI_NUMBER, props, slots),\n select: (props, slots) => render(SCHEMA_UI_SELECT, props, slots),\n treeSelect: (props, slots) => render(SCHEMA_UI_TREE_SELECT, props, slots),\n cascader: (props, slots) => render(SCHEMA_UI_CASCADER, props, slots),\n radioGroup: (props, slots) => render(SCHEMA_UI_RADIO_GROUP, props, slots),\n checkboxGroup: (props, slots) => render(SCHEMA_UI_CHECKBOX_GROUP, props, slots),\n switch: (props, slots) => render(SCHEMA_UI_SWITCH, props, slots),\n rate: (props, slots) => render(SCHEMA_UI_RATE, props, slots),\n datePicker: (props, slots) => render(SCHEMA_UI_DATE_PICKER, props, slots),\n timePicker: (props, slots) => render(SCHEMA_UI_TIME_PICKER, props, slots),\n slider: (props, slots) => render(SCHEMA_UI_SLIDER, props, slots),\n colorPicker: (props, slots) => render(SCHEMA_UI_COLOR_PICKER, props, slots),\n button: (props, slots) => render(SCHEMA_UI_BUTTON, props, slots),\n buttonGroup: (props, slots) => render(SCHEMA_UI_BUTTON_GROUP, props, slots),\n form: (props, slots) => render(SCHEMA_UI_FORM, props, slots),\n formItem: (props, slots) => render(SCHEMA_UI_FORM_ITEM, props, slots),\n table: (props, slots) => render(SCHEMA_UI_TABLE, props, slots),\n tableColumn: (props, slots) => render(SCHEMA_UI_TABLE_COLUMN, props, slots),\n tree: (props, slots) => render(SCHEMA_UI_TREE, props, slots),\n pagination: (props, slots) => render(SCHEMA_UI_PAGINATION, props, slots),\n alert: (props, slots) => render(SCHEMA_UI_ALERT, props, slots),\n card: (props, slots) => render(SCHEMA_UI_CARD, props, slots),\n tag: (props, slots) => render(SCHEMA_UI_TAG, props, slots),\n empty: (props, slots) => render(SCHEMA_UI_EMPTY, props, slots),\n checkbox: (props, slots) => render(SCHEMA_UI_CHECKBOX, props, slots),\n col: (props, slots) => render(SCHEMA_UI_COL, props, slots),\n collapse: (props, slots) => render(SCHEMA_UI_COLLAPSE, props, slots),\n collapseItem: (props, slots) => render(SCHEMA_UI_COLLAPSE_ITEM, props, slots),\n dialog: (props, slots) => render(SCHEMA_UI_DIALOG, props, slots),\n divider: (props, slots) => render(SCHEMA_UI_DIVIDER, props, slots),\n drawer: (props, slots) => render(SCHEMA_UI_DRAWER, props, slots),\n dropdown: (props, slots) => render(SCHEMA_UI_DROPDOWN, props, slots),\n dropdownItem: (props, slots) => render(SCHEMA_UI_DROPDOWN_ITEM, props, slots),\n dropdownMenu: (props, slots) => render(SCHEMA_UI_DROPDOWN_MENU, props, slots),\n option: (props, slots) => render(SCHEMA_UI_OPTION, props, slots),\n optionGroup: (props, slots) => render(SCHEMA_UI_OPTION_GROUP, props, slots),\n radio: (props, slots) => render(SCHEMA_UI_RADIO, props, slots),\n row: (props, slots) => render(SCHEMA_UI_ROW, props, slots),\n scrollbar: (props, slots) => render(SCHEMA_UI_SCROLLBAR, props, slots),\n tabPane: (props, slots) => render(SCHEMA_UI_TAB_PANE, props, slots),\n tabs: (props, slots) => render(SCHEMA_UI_TABS, props, slots),\n }\n}\n\nexport const SqRender = defineComponent({\n name: 'SqRender',\n inheritAttrs: false,\n props: {\n type: {\n type: String as PropType<SchemaUiRenderType>,\n required: true,\n },\n props: {\n type: Object as PropType<SchemaUiProps>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }) {\n const ui = useSchemaUi()\n\n return () => ui.render(props.type, mergeRenderProps(props.props, attrs), slots)\n },\n})\n\nfunction mergeRenderProps(\n props: SchemaUiProps | undefined,\n attrs: Record<string, unknown>,\n): SchemaUiProps | undefined {\n if (!Object.keys(attrs).length) {\n return props\n }\n\n return {\n ...props,\n ...attrs,\n }\n}\n","import { defineComponent, inject, type PropType } from 'vue'\nimport { SPARQ_ASSET_SERVICE_KEY, SPARQ_UI_KIT_KEY } from '../../keys'\nimport { createUiKit } from '../../ui'\nimport type { SparqAssetService } from '../../asset'\nimport type { FormComponentProps } from '../types'\nimport { FileUpload } from './Upload'\n\nexport const SqFileUpload = defineComponent({\n name: 'SqFileUpload',\n props: {\n modelValue: null as unknown as PropType<unknown>,\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n props: { type: Object as PropType<Record<string, unknown>>, default: () => ({}) },\n assetService: Object as PropType<SparqAssetService>,\n },\n emits: ['update:modelValue'],\n setup(props, { emit }) {\n const ui = inject(SPARQ_UI_KIT_KEY, createUiKit())\n const injectedAssetService = inject(SPARQ_ASSET_SERVICE_KEY, undefined)\n\n return () =>\n FileUpload(\n {\n value: props.modelValue,\n disabled: props.disabled,\n readonly: props.readonly,\n props: props.props,\n onChange(value) {\n emit('update:modelValue', value)\n },\n } satisfies FormComponentProps,\n ui,\n props.assetService ?? injectedAssetService,\n )\n },\n})\n","import { defineComponent, inject, type PropType } from 'vue'\nimport { SPARQ_ASSET_SERVICE_KEY, SPARQ_UI_KIT_KEY } from '../../keys'\nimport { createUiKit } from '../../ui'\nimport type { SparqAssetService } from '../../asset'\nimport type { FormComponentProps } from '../types'\nimport { ImageUpload } from './Upload'\n\nexport const SqImageUpload = defineComponent({\n name: 'SqImageUpload',\n props: {\n modelValue: null as unknown as PropType<unknown>,\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n props: { type: Object as PropType<Record<string, unknown>>, default: () => ({}) },\n assetService: Object as PropType<SparqAssetService>,\n },\n emits: ['update:modelValue'],\n setup(props, { emit }) {\n const ui = inject(SPARQ_UI_KIT_KEY, createUiKit())\n const injectedAssetService = inject(SPARQ_ASSET_SERVICE_KEY, undefined)\n\n return () =>\n ImageUpload(\n {\n value: props.modelValue,\n disabled: props.disabled,\n readonly: props.readonly,\n props: props.props,\n onChange(value) {\n emit('update:modelValue', value)\n },\n } satisfies FormComponentProps,\n ui,\n props.assetService ?? injectedAssetService,\n )\n },\n})\n","import { computed, defineComponent, h, inject, type PropType } from 'vue'\nimport { SPARQ_ASSET_SERVICE_KEY } from '../../keys'\nimport type { SparqAssetService } from '../../asset'\nimport type { FormComponentProps } from '../types'\nimport { SqUploadControl, type UploadType } from './Upload'\n\nexport const SqUpload = defineComponent({\n name: 'SqUpload',\n props: {\n modelValue: null as unknown as PropType<unknown>,\n type: String as PropType<UploadType>,\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n props: { type: Object as PropType<Record<string, unknown>>, default: () => ({}) },\n assetService: Object as PropType<SparqAssetService>,\n },\n emits: ['update:modelValue'],\n setup(props, { emit }) {\n const injectedAssetService = inject(SPARQ_ASSET_SERVICE_KEY, undefined)\n const uploadType = computed<UploadType>(() => resolveUploadType(props.type))\n\n return () =>\n h(SqUploadControl, {\n input: {\n value: props.modelValue,\n disabled: props.disabled,\n readonly: props.readonly,\n props: props.props,\n onChange(value) {\n emit('update:modelValue', value)\n },\n } satisfies FormComponentProps,\n assetService: props.assetService ?? injectedAssetService,\n type: uploadType.value,\n 'data-sparq-upload-standalone': uploadType.value,\n } as InstanceType<typeof SqUploadControl>['$props'])\n },\n})\n\nfunction resolveUploadType(value: UploadType | undefined): UploadType {\n return value === 'image' ? 'image' : 'file'\n}\n","import {\n SCHEMA_COMPONENT_ICON,\n SCHEMA_COMPONENT_ICON_INPUT,\n SCHEMA_COMPONENT_FILE_UPLOAD,\n SCHEMA_COMPONENT_IMAGE_UPLOAD,\n SCHEMA_COMPONENT_JSON_EDITOR,\n SCHEMA_COMPONENT_KEY_VALUE,\n SCHEMA_COMPONENT_RICH_TEXT,\n} from '@sparqjs/schema-core'\nimport type { SchemaComponentRegistrySeed } from '../registry'\nimport { IconInput, SqIcon, SqIconInput } from './IconInput'\nimport { JsonEditor, SqJson } from './JsonEditor'\nimport { KeyValueEditor, SqKeyValue } from './KeyValueEditor'\nimport { RichText, SqRichText } from './RichText'\nimport { FileUpload, ImageUpload, SqFileUpload, SqImageUpload, SqUpload } from './Upload'\n\nexport { IconInput, SqIcon, SqIconInput, SqIconInputControl } from './IconInput'\nexport type { IconInputOption } from './IconInput'\nexport { JsonEditor, SqJson, SqJsonControl, formatJsonValue, parseJsonText } from './JsonEditor'\nexport {\n KeyValueEditor,\n SqKeyValue,\n SqKeyValueControl,\n formatKeyValue,\n parseKeyValueText,\n toKeyValueObject,\n toKeyValueRows,\n} from './KeyValueEditor'\nexport { RichText, SqRichText, SqRichTextControl } from './RichText'\nexport { FileUpload, ImageUpload, SqFileUpload, SqImageUpload, SqUpload, SqUploadControl } from './Upload'\nexport type { FormComponentProps } from './types'\n\nexport const DEFAULT_CUSTOM_COMPONENTS = {\n SqJson,\n SqKeyValue,\n SqIcon,\n SqIconInput,\n SqRichText,\n SqUpload,\n SqImageUpload,\n SqFileUpload,\n} as const\n\n/**\n * 创建 Vue 渲染器默认自定义组件。\n *\n * 这些组件只依赖 Vue 渲染器的 UI 组件集,不直接绑定 Element Plus 等具体 UI 库。\n */\nexport function createDefaultCustomComponents(): SchemaComponentRegistrySeed {\n return {\n [SCHEMA_COMPONENT_JSON_EDITOR]: {\n render(props, _slots, context) {\n return JsonEditor(props ?? {}, context!.ui)\n },\n },\n [SCHEMA_COMPONENT_KEY_VALUE]: {\n render(props, _slots, context) {\n return KeyValueEditor(props ?? {}, context!.ui)\n },\n },\n [SCHEMA_COMPONENT_ICON]: {\n render(props, _slots, context) {\n return IconInput(props ?? {}, context!.ui, context?.icons)\n },\n },\n [SCHEMA_COMPONENT_ICON_INPUT]: {\n render(props, _slots, context) {\n return IconInput(props ?? {}, context!.ui, context?.icons)\n },\n },\n [SCHEMA_COMPONENT_RICH_TEXT]: {\n render(props, _slots, context) {\n return RichText(props ?? {}, context!.ui, context?.richTextEditors, context?.assetService)\n },\n },\n [SCHEMA_COMPONENT_IMAGE_UPLOAD]: {\n render(props, _slots, context) {\n return ImageUpload(props ?? {}, context!.ui, context?.assetService)\n },\n },\n [SCHEMA_COMPONENT_FILE_UPLOAD]: {\n render(props, _slots, context) {\n return FileUpload(props ?? {}, context!.ui, context?.assetService)\n },\n },\n }\n}\n","import { interpolateTemplate } from '@sparqjs/schema-core'\nimport { h } from 'vue'\nimport type { SemanticFieldProps } from './types'\n\n/**\n * 渲染字段跳转链接。\n *\n * href 可直接配置,也可使用 hrefTemplate,例如 `/customers/${id}`。\n */\nexport function FieldLink(input: SemanticFieldProps) {\n const props = input.props ?? {}\n const href = resolveHref(input)\n if (!href) {\n return <span class=\"sparq-field-display sparq-field-display--empty\">-</span>\n }\n const text = input.text ?? String(props.text ?? formatValue(input.value))\n\n return (\n <a\n {...props}\n class={['sparq-field-link', props.class]}\n href={href}\n target={String(props.target ?? '') || undefined}\n rel={props.target === '_blank' ? 'noopener noreferrer' : undefined}\n data-sparq-component=\"link\"\n >\n {text}\n </a>\n )\n}\n\nfunction resolveHref(input: SemanticFieldProps): string | undefined {\n const props = input.props ?? {}\n if (typeof props.href === 'string') {\n return props.href\n }\n\n if (typeof props.hrefTemplate === 'string') {\n return interpolateTemplate(props.hrefTemplate, {\n row: input.record,\n record: input.record,\n value: input.value,\n })\n }\n\n if (typeof input.value === 'string' && /^https?:\\/\\//.test(input.value)) {\n return input.value\n }\n\n return undefined\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return '-'\n }\n\n return String(value)\n}\n","import { h } from 'vue'\nimport type { SemanticFieldProps } from './types'\n\n/**\n * 渲染基础字段展示文本。\n *\n * 表格和详情的默认展示组件会复用该实现;更复杂的业务展示应通过同名组件覆盖。\n */\nexport function FieldDisplay(input: SemanticFieldProps) {\n const text = resolveDisplayText(input)\n\n return (\n <span\n class={[\n 'sparq-field-display',\n input.componentKey ? `sparq-field-display--${input.componentKey}` : undefined,\n input.props?.class,\n ]}\n style={input.props?.style as Record<string, string> | undefined}\n title={typeof text === 'string' ? text : undefined}\n data-sparq-component={input.componentKey ?? 'field-display'}\n >\n {text}\n </span>\n )\n}\n\n/**\n * 渲染附件链接列表。\n */\nexport function FileLinkList(input: SemanticFieldProps) {\n const values = normalizeList(input.value)\n\n if (values.length === 0) {\n return <span class=\"sparq-field-display sparq-field-display--empty\">-</span>\n }\n\n return (\n <span class=\"sparq-file-link-list\" data-sparq-component=\"file-link-list\">\n {values.map((value, index) => (\n <a key={`${value}-${index}`} class=\"sparq-file-link\" href={value} target=\"_blank\" rel=\"noopener noreferrer\">\n {filename(value)}\n </a>\n ))}\n </span>\n )\n}\n\nfunction resolveDisplayText(input: SemanticFieldProps): string {\n if (input.componentKey === 'relation-label') {\n return formatRelationLabel(input)\n }\n\n if (input.componentKey === 'json-summary') {\n return formatJSONSummary(input.value)\n }\n\n return input.text ?? formatValue(input.value)\n}\n\nfunction formatRelationLabel(input: SemanticFieldProps): string {\n const label = resolveRelationLabel(input)\n const value = input.value\n if (input.props?.showValue !== true || value === undefined || value === null || value === '') {\n return formatValue(label)\n }\n\n const labelText = formatValue(label)\n const valueText = formatValue(value)\n if (labelText === valueText || labelText === '-') {\n return valueText\n }\n return `${labelText}(${valueText})`\n}\n\nfunction resolveRelationLabel(input: SemanticFieldProps): unknown {\n const fieldName = input.field?.name\n if (!fieldName || !input.record) {\n return input.value\n }\n\n return input.record[`_${fieldName}_label`] ?? input.record[`${fieldName}_label`] ?? input.value\n}\n\nfunction formatJSONSummary(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return '-'\n }\n\n if (typeof value === 'string') {\n return value\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return '-'\n }\n\n if (Array.isArray(value)) {\n return value.map(formatValue).join(', ')\n }\n\n if (typeof value === 'object') {\n return formatJSONSummary(value)\n }\n\n return String(value)\n}\n\nfunction normalizeList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).filter(Boolean)\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n return [value]\n }\n\n return []\n}\n\nfunction filename(value: string): string {\n const clean = value.split(/[?#]/, 1)[0] ?? value\n const name = clean.split('/').filter(Boolean).pop()\n\n return name || value\n}\n","import { h } from 'vue'\nimport type { SemanticHelpProps } from './types'\n\n/**\n * 渲染 schema help 文本。\n *\n * 这是 renderer 层的默认语义组件;业务项目可通过 component registry 覆盖 `help`。\n */\nexport function HelpText(props: SemanticHelpProps) {\n if (!props.text) {\n return undefined\n }\n\n return (\n <div\n {...props.props}\n class={['sparq-help-text', props.props?.class]}\n data-sparq-component=\"help\"\n data-slot=\"help\"\n data-placement={props.placement}\n >\n {props.text}\n </div>\n )\n}\n","import { h } from 'vue'\nimport type { SemanticSectionProps, SemanticSlots } from './types'\n\n/**\n * 渲染 section 语义区块。\n *\n * section 只表达轻量区块样式;需要卡片外观时应使用 `card` 布局节点。\n */\nexport function SectionBlock(props: SemanticSectionProps, slots: SemanticSlots = {}) {\n const node = props.node\n const extraProps = props.props ?? {}\n\n return (\n <section\n {...extraProps}\n class={['sparq-section-block', 'sparq-view-node', 'sparq-view-node-section', node?.raw.className, extraProps.class]}\n style={node?.raw.style}\n data-sparq-component=\"section\"\n data-sparq-view-node=\"\"\n data-node-id={node?.id}\n data-node-type={node?.type}\n data-node-span={String(node?.raw.props?.span ?? '')}\n >\n {props.title || props.help ? (\n <header class=\"sparq-section-block__header\" data-slot=\"node-header\">\n {props.title ? (\n <div class=\"sparq-section-block__title\" data-slot=\"node-title\">\n {props.title}\n </div>\n ) : undefined}\n {props.help ? (\n <div\n class=\"sparq-section-block__help sparq-help-text\"\n data-sparq-component=\"help\"\n data-slot=\"node-help\"\n data-placement=\"section\"\n >\n {props.help}\n </div>\n ) : undefined}\n </header>\n ) : undefined}\n <div class=\"sparq-section-block__body\" data-slot=\"section-body\">\n {slots.default?.()}\n </div>\n </section>\n )\n}\n","import { h } from 'vue'\nimport type { SemanticFieldProps } from './types'\n\ninterface StatusOption {\n label?: string\n value?: unknown\n type?: string\n color?: string\n meta?: Record<string, unknown>\n}\n\nexport interface StatusDisplay {\n type?: string\n background_color?: string\n text_color?: string\n}\n\ntype TagType = 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'error'\ntype TagEffect = 'light' | 'dark' | 'plain'\ntype TagSize = 'large' | 'default' | 'small'\n\nconst STATUS_TYPE_MAP: Record<string, string> = {\n active: 'success',\n enabled: 'success',\n success: 'success',\n done: 'success',\n disabled: 'info',\n inactive: 'info',\n pending: 'warning',\n warning: 'warning',\n failed: 'danger',\n error: 'danger',\n danger: 'danger',\n}\nconst TAG_TYPES = new Set<TagType>(['default', 'primary', 'success', 'info', 'warning', 'danger', 'error'])\nconst TAG_EFFECTS = new Set<TagEffect>(['light', 'dark', 'plain'])\nconst TAG_SIZES = new Set<TagSize>(['large', 'default', 'small'])\n\n/**\n * 渲染状态标签。\n *\n * 默认从字段 options 中解析 label,也允许通过 props.statusMap 覆盖展示文本和状态类型。\n */\nexport function StatusTag(input: SemanticFieldProps) {\n const value = input.value\n const props = input.props ?? {}\n const option = resolveStatusOption(input, value)\n const display = resolveStatusDisplay(input, option)\n const text = option?.label ?? formatBooleanValue(input, value) ?? input.text ?? formatValue(value)\n const type = normalizeTagType(display?.type ?? option?.type ?? props.type ?? inferStatusType(value))\n const effect = normalizeTagEffect(props.effect)\n const size = normalizeTagSize(props.size)\n const round = Boolean(props.round)\n const hit = Boolean(props.hit)\n const className = props.class\n\n return (\n <span\n {...props}\n class={[\n 'sparq-status-tag',\n `sparq-status-tag--${type}`,\n effect ? `sparq-status-tag--${effect}` : undefined,\n size && size !== 'default' ? `sparq-status-tag--${size}` : undefined,\n hit ? 'is-hit' : undefined,\n round ? 'is-round' : undefined,\n className,\n ]}\n style={{\n ...(display?.type === 'custom' && display.background_color\n ? {\n backgroundColor: display.background_color,\n color: display.text_color ?? resolveReadableTextColor(display.background_color),\n borderColor: display.background_color,\n }\n : option?.color\n ? { backgroundColor: option.color }\n : undefined),\n ...(props.style as Record<string, string>),\n }}\n data-sparq-component=\"status-tag\"\n data-status-type={type}\n data-display-type={display?.type ?? type}\n >\n <span class=\"sparq-status-tag__content\">{text}</span>\n </span>\n )\n}\n\nfunction resolveStatusOption(input: SemanticFieldProps, value: unknown): StatusOption | undefined {\n const statusMap = input.props?.statusMap\n if (isRecord(statusMap)) {\n const mapped = statusMap[String(value)]\n if (isRecord(mapped)) {\n return mapped as StatusOption\n }\n\n if (mapped !== undefined) {\n return {\n label: String(mapped),\n }\n }\n }\n\n return resolveOptions(input).find((option) => option.value === value || String(option.value) === String(value))\n}\n\nfunction resolveStatusDisplay(input: SemanticFieldProps, option: StatusOption | undefined): StatusDisplay | undefined {\n const configured = input.props?.display\n if (isRecord(configured)) {\n return configured as StatusDisplay\n }\n const metadata = option?.meta?.display\n return isRecord(metadata) ? (metadata as StatusDisplay) : undefined\n}\n\nfunction resolveOptions(input: SemanticFieldProps): StatusOption[] {\n const runtimeOptions = input.options\n const propOptions = input.props?.options\n const fieldOptions = input.field?.options?.items\n const options = Array.isArray(runtimeOptions) ? runtimeOptions : Array.isArray(propOptions) ? propOptions : fieldOptions\n\n return Array.isArray(options) ? (options as StatusOption[]) : []\n}\n\nfunction inferStatusType(value: unknown): string {\n if (value === true || value === 'true' || value === 1 || value === '1') {\n return 'success'\n }\n\n if (value === false || value === 'false' || value === 0 || value === '0') {\n return 'info'\n }\n\n return STATUS_TYPE_MAP[String(value)] ?? 'default'\n}\n\nfunction formatBooleanValue(input: SemanticFieldProps, value: unknown): string | undefined {\n if (input.componentKey !== 'boolean-tag' && input.field?.type !== 'boolean' && input.field?.type !== 'bool') {\n return undefined\n }\n\n const display = input.field?.extensions?.display\n if (isRecord(display)) {\n if (isTruthyBooleanValue(value) && typeof display.true_text === 'string') {\n return display.true_text\n }\n\n if (isFalsyBooleanValue(value) && typeof display.false_text === 'string') {\n return display.false_text\n }\n }\n\n if (isTruthyBooleanValue(value)) {\n return '是'\n }\n\n if (isFalsyBooleanValue(value)) {\n return '否'\n }\n\n return undefined\n}\n\nfunction isTruthyBooleanValue(value: unknown): boolean {\n return value === true || value === 'true' || value === 1 || value === '1'\n}\n\nfunction isFalsyBooleanValue(value: unknown): boolean {\n return value === false || value === 'false' || value === 0 || value === '0'\n}\n\nfunction normalizeTagType(value: unknown): TagType {\n const type = String(value || 'primary')\n\n return TAG_TYPES.has(type as TagType) ? (type as TagType) : 'primary'\n}\n\nexport function resolveReadableTextColor(backgroundColor: string): '#000000' | '#FFFFFF' {\n if (!/^#[0-9a-fA-F]{6}$/.test(backgroundColor)) {\n return '#000000'\n }\n return relativeLuminance(backgroundColor) > 0.179 ? '#000000' : '#FFFFFF'\n}\n\nfunction relativeLuminance(color: string): number {\n const channels = [0, 1, 2].map((index) => parseInt(color.slice(1 + index * 2, 3 + index * 2), 16) / 255)\n const linear = channels.map((channel) => (channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4))\n return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722\n}\n\nfunction normalizeTagEffect(value: unknown): TagEffect | undefined {\n if (!value) {\n return undefined\n }\n\n const effect = String(value)\n\n return TAG_EFFECTS.has(effect as TagEffect) ? (effect as TagEffect) : undefined\n}\n\nfunction normalizeTagSize(value: unknown): TagSize | undefined {\n if (!value) {\n return undefined\n }\n\n const size = String(value)\n\n return TAG_SIZES.has(size as TagSize) ? (size as TagSize) : undefined\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return '-'\n }\n\n return String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import { h } from 'vue'\nimport type { SemanticFieldProps } from './types'\n\n/**\n * 渲染图片缩略图。\n *\n * 支持单个 URL、URL 数组,以及包含 url/src/thumb 字段的对象数组。\n */\nexport function Thumbnail(input: SemanticFieldProps) {\n const props = input.props ?? {}\n const urls = resolveUrls(input.value)\n const size = Number(props.size ?? 40)\n const limit = Number(props.limit ?? 3)\n const visibleUrls = urls.slice(0, limit)\n\n return (\n <div\n {...props}\n class={['sparq-thumbnail-list', props.class]}\n data-sparq-component=\"thumbnail\"\n data-count={String(urls.length)}\n >\n {visibleUrls.length\n ? visibleUrls.map((url) => (\n <img\n class=\"sparq-thumbnail\"\n src={url}\n alt={String(props.alt ?? '')}\n width={size}\n height={size}\n loading=\"lazy\"\n />\n ))\n : <span class=\"sparq-thumbnail-empty\">-</span>}\n {urls.length > visibleUrls.length ? (\n <span class=\"sparq-thumbnail-more\">+{urls.length - visibleUrls.length}</span>\n ) : undefined}\n </div>\n )\n}\n\nfunction resolveUrls(value: unknown): string[] {\n if (typeof value === 'string') {\n return value ? [value] : []\n }\n\n if (!Array.isArray(value)) {\n return resolveUrl(value) ? [resolveUrl(value) as string] : []\n }\n\n return value.map(resolveUrl).filter((url): url is string => Boolean(url))\n}\n\nfunction resolveUrl(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value !== 'object' || value === null) {\n return undefined\n }\n\n const record = value as Record<string, unknown>\n const raw = record.thumb ?? record.thumbnail ?? record.url ?? record.src\n\n return typeof raw === 'string' ? raw : undefined\n}\n","import {\n SCHEMA_COMPONENT_HELP,\n SCHEMA_COMPONENT_LINK,\n SCHEMA_COMPONENT_BOOLEAN_TAG,\n SCHEMA_COMPONENT_DATE_TEXT,\n SCHEMA_COMPONENT_DATETIME_TEXT,\n SCHEMA_COMPONENT_FILE_LINK_LIST,\n SCHEMA_COMPONENT_IMAGE_THUMBNAIL,\n SCHEMA_COMPONENT_JSON_SUMMARY,\n SCHEMA_COMPONENT_NUMBER_TEXT,\n SCHEMA_COMPONENT_RELATION_LABEL,\n SCHEMA_COMPONENT_SECTION,\n SCHEMA_COMPONENT_STATUS_TAG,\n SCHEMA_COMPONENT_TAG,\n SCHEMA_COMPONENT_TAGS,\n SCHEMA_COMPONENT_THUMBNAIL,\n SCHEMA_COMPONENT_TEXT_ELLIPSIS,\n SCHEMA_COMPONENT_TIME_TEXT,\n} from '@sparqjs/schema-core'\nimport type { SchemaComponentRegistrySeed } from '../registry'\nimport { FieldLink } from './FieldLink'\nimport { FieldDisplay, FileLinkList } from './FieldDisplay'\nimport { HelpText } from './HelpText'\nimport { SectionBlock } from './SectionBlock'\nimport { StatusTag } from './StatusTag'\nimport { Thumbnail } from './Thumbnail'\n\nexport { FieldLink } from './FieldLink'\nexport { FieldDisplay, FileLinkList } from './FieldDisplay'\nexport { HelpText } from './HelpText'\nexport { SectionBlock } from './SectionBlock'\nexport { StatusTag, resolveReadableTextColor } from './StatusTag'\nexport { Thumbnail } from './Thumbnail'\nexport type { SemanticFieldProps, SemanticHelpProps, SemanticSectionProps } from './types'\nexport type { StatusDisplay } from './StatusTag'\n\n/**\n * 创建 Vue 渲染器默认语义组件。\n *\n * 这些组件只依赖 Vue/HTML 语义,不绑定具体 UI 组件库;业务注册同名组件时会覆盖这里的默认实现。\n */\nexport function createDefaultSemanticComponents(): SchemaComponentRegistrySeed {\n return {\n [SCHEMA_COMPONENT_HELP]: {\n render(props) {\n return HelpText(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_SECTION]: {\n render(props, slots) {\n return SectionBlock(props ?? {}, slots as never)\n },\n },\n [SCHEMA_COMPONENT_STATUS_TAG]: {\n render(props) {\n return StatusTag(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_TAG]: {\n render(props) {\n return StatusTag(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_TAGS]: {\n render(props) {\n return StatusTag(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_BOOLEAN_TAG]: {\n render(props) {\n return StatusTag(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_LINK]: {\n render(props) {\n return FieldLink(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_TEXT_ELLIPSIS]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_NUMBER_TEXT]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_DATE_TEXT]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_DATETIME_TEXT]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_TIME_TEXT]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_RELATION_LABEL]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_JSON_SUMMARY]: {\n render(props) {\n return FieldDisplay(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_FILE_LINK_LIST]: {\n render(props) {\n return FileLinkList(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_THUMBNAIL]: {\n render(props) {\n return Thumbnail(props ?? {})\n },\n },\n [SCHEMA_COMPONENT_IMAGE_THUMBNAIL]: {\n render(props) {\n return Thumbnail(props ?? {})\n },\n },\n }\n}\n","import type { Diagnostic, RuntimeViewNode, SchemaRuntime } from '@sparqjs/schema-core'\nimport type { OptionItem, RenderMode, ResourceField } from '@sparqjs/schema-protocol'\nimport { h, inject, type Component, type VNodeChild } from 'vue'\nimport { SPARQ_COMPONENT_REGISTRY_KEY } from '../keys'\nimport { createDefaultCustomComponents } from '../custom-components'\nimport { createDefaultSemanticComponents } from '../semantic-components'\nimport type { SparqIconRegistry } from './icon'\nimport type { SparqRichTextRegistry } from './rich-text'\nimport type { SparqAssetService } from '../asset'\nimport type { SchemaFieldBlurHandler, SchemaFieldChangeHandler, SchemaFieldErrors } from '../types'\nimport type { UiKit } from '../ui'\n\n/**\n * 业务组件渲染上下文。\n *\n * 当前先保留最小字段,后续接入节点、字段、状态和动作上下文时再扩展。\n */\nexport interface SchemaComponentRenderContext {\n /** schema 中声明的 component key。 */\n name: string\n /** 当前 UI kit。 */\n ui: UiKit\n /** 当前 runtime。 */\n runtime?: SchemaRuntime\n /** 当前 icon 注册表。 */\n icons?: SparqIconRegistry\n /** 当前富文本编辑器注册表。 */\n richTextEditors?: SparqRichTextRegistry\n /** 当前资源服务。 */\n assetService?: SparqAssetService\n /** 当前渲染模式。 */\n mode?: RenderMode\n /** 当前视图名称。 */\n viewName?: string\n /** 当前资源编码。 */\n resource?: string\n /** 当前诊断集合。 */\n diagnostics?: Diagnostic[]\n /** 当前字段节点。 */\n node?: RuntimeViewNode\n /** 当前字段定义。 */\n field?: ResourceField\n}\n\n/**\n * 字段业务组件 props。\n *\n * 该结构只放跨 UI 体系稳定的信息;具体 UI 库的 props 差异由 UI kit 或 UI adapter 适配。\n */\nexport interface SchemaFieldComponentProps {\n /** 允许后续扩展稳定字段,例如 value、onChange。 */\n [key: string]: unknown\n /** 当前字段节点。 */\n node: RuntimeViewNode\n /** 当前字段定义。 */\n field?: ResourceField\n /** schema 中解析出的组件 key。 */\n componentKey?: string\n /** 节点业务 props。 */\n props?: Record<string, unknown>\n /** 字段是否禁用。 */\n disabled?: boolean\n /** 字段是否只读。 */\n readonly?: boolean\n /** 字段占位提示。 */\n placeholder?: string\n /** 当前字段值。 */\n value?: unknown\n /** 字段值变更回调。 */\n onChange?: SchemaFieldChangeHandler\n /** 字段失焦回调。 */\n onBlur?: SchemaFieldBlurHandler\n /** 字段错误消息。 */\n errors?: SchemaFieldErrors\n /** 字段是否处于加载状态。 */\n loading?: boolean\n /** 字段当前可用选项。 */\n options?: OptionItem[]\n /** 当前表单值,供需要跨字段预览的业务组件读取。 */\n formValues?: Record<string, unknown>\n}\n\n/**\n * 业务组件定义。\n *\n * 业务组件用于 rich-text、resource-picker、icon-picker 这类 schema component。\n */\nexport interface SchemaComponent {\n /** 实际组件。 */\n component?: unknown\n /** 渲染函数。缺失时默认使用 component 渲染。 */\n render?: (props?: Record<string, unknown>, slots?: unknown, context?: SchemaComponentRenderContext) => VNodeChild\n}\n\n/**\n * 业务组件注册输入。\n */\nexport type SchemaComponentRegistrySeed = Record<string, SchemaComponent> | Iterable<readonly [string, SchemaComponent]>\n\n/**\n * 业务组件注册表。\n */\nexport interface SchemaComponentRegistry {\n /** 获取业务组件定义。 */\n get(name: string): SchemaComponent | undefined\n /** 判断业务组件是否存在。 */\n has(name: string): boolean\n /** 渲染业务组件。 */\n render(\n name: string,\n props?: Record<string, unknown>,\n slots?: unknown,\n context?: Partial<Omit<SchemaComponentRenderContext, 'name'>>,\n ): VNodeChild | undefined\n /** 遍历业务组件定义。 */\n entries(): IterableIterator<[string, SchemaComponent]>\n}\n\n/**\n * 创建业务组件注册表。\n *\n * 默认会包含 renderer 内置语义组件;传入 seed 的同名组件会覆盖默认实现。\n */\nexport function createSchemaComponentRegistry(seed: SchemaComponentRegistrySeed = {}): SchemaComponentRegistry {\n const components = new Map<string, SchemaComponent>([\n ...(Object.entries(createDefaultSemanticComponents()) as Array<[string, SchemaComponent]>),\n ...(Object.entries(createDefaultCustomComponents()) as Array<[string, SchemaComponent]>),\n ])\n for (const [name, component] of isIterableSeed(seed) ? seed : Object.entries(seed)) {\n components.set(name, component)\n }\n\n return {\n get(name) {\n return components.get(name)\n },\n has(name) {\n return components.has(name)\n },\n render(name, props, slots, context) {\n const entry = components.get(name)\n if (!entry) {\n return undefined\n }\n const renderContext = {\n ...context,\n name,\n ui: requireUiKit(context?.ui),\n }\n\n if (entry.render) {\n return entry.render(props, slots, renderContext)\n }\n\n if (entry.component) {\n return h(entry.component as Component, props, slots as never)\n }\n\n return undefined\n },\n entries() {\n return components.entries()\n },\n }\n}\n\n/**\n * 合并业务组件注册表。\n *\n * 后面的注册表会覆盖前面的同名组件。\n */\nexport function mergeSchemaComponentRegistry(\n ...registries: Array<SchemaComponentRegistry | undefined>\n): SchemaComponentRegistry {\n const entries: Array<[string, SchemaComponent]> = []\n\n for (const registry of registries) {\n if (!registry) {\n continue\n }\n\n entries.push(...registry.entries())\n }\n\n return createSchemaComponentRegistry(entries)\n}\n\n/**\n * 获取当前业务组件注册表。\n */\nexport function useSparqComponents(): SchemaComponentRegistry {\n const registry = inject(SPARQ_COMPONENT_REGISTRY_KEY, undefined)\n if (!registry) {\n throw new Error('Sparq component registry is not provided. Install a schema renderer plugin with components.')\n }\n\n return registry\n}\n\n/**\n * 判断 seed 是否是可迭代 entries。\n */\nfunction isIterableSeed(seed: SchemaComponentRegistrySeed): seed is Iterable<readonly [string, SchemaComponent]> {\n return Symbol.iterator in Object(seed)\n}\n\n/**\n * 获取业务组件渲染所需 UI kit。\n */\nfunction requireUiKit(ui: UiKit | undefined): UiKit {\n if (!ui) {\n throw new Error('Schema component rendering requires a UI kit.')\n }\n\n return ui\n}\n","import { h, inject, type Component, type VNodeChild } from 'vue'\nimport { SPARQ_BASE_ICON_NAMES, resolveSparqIconName } from '@sparqjs/schema-core'\nimport { SPARQ_ICON_REGISTRY_KEY } from '../keys'\n\nexport interface SparqIconDefinition {\n label?: string\n keywords?: string[]\n namespace?: string\n component?: unknown\n render?: (props?: Record<string, unknown>) => VNodeChild\n props?: Record<string, unknown>\n}\n\nexport type SparqIconRegistrySeed =\n | Record<string, SparqIconDefinition>\n | Iterable<readonly [string, SparqIconDefinition]>\n\nexport interface SparqIconRegistry {\n get(name: string): SparqIconDefinition | undefined\n has(name: string): boolean\n render(name: string, props?: Record<string, unknown>): VNodeChild | undefined\n entries(): IterableIterator<[string, SparqIconDefinition]>\n}\n\nexport function createDefaultIconRegistry(): SparqIconRegistry {\n return createSparqIconRegistry(\n SPARQ_BASE_ICON_NAMES.map((name) => [\n name,\n {\n label: formatIconLabel(name),\n },\n ] as const),\n )\n}\n\nexport function createSparqIconRegistry(seed: SparqIconRegistrySeed = {}): SparqIconRegistry {\n const icons = new Map<string, SparqIconDefinition>(isIterableSeed(seed) ? seed : Object.entries(seed))\n\n return {\n get(name) {\n return icons.get(resolveSparqIconName(name)) ?? icons.get(name)\n },\n has(name) {\n return icons.has(resolveSparqIconName(name)) || icons.has(name)\n },\n render(name, props) {\n const resolvedName = resolveSparqIconName(name)\n const icon = icons.get(resolvedName) ?? icons.get(name)\n if (!icon) {\n return undefined\n }\n\n const mergedProps = {\n ...(icon.props ?? {}),\n ...(props ?? {}),\n }\n\n if (icon.render) {\n return icon.render(mergedProps)\n }\n\n if (icon.component) {\n return h(icon.component as Component, mergedProps)\n }\n\n return h(\n 'span',\n {\n ...mergedProps,\n class: ['sparq-icon', mergedProps.class],\n 'data-sparq-icon': resolvedName,\n 'aria-hidden': mergedProps['aria-label'] ? undefined : 'true',\n },\n resolvedName.slice(0, 1).toUpperCase(),\n )\n },\n entries() {\n return icons.entries()\n },\n }\n}\n\nexport function mergeSparqIconRegistry(...registries: Array<SparqIconRegistry | undefined>): SparqIconRegistry {\n const entries: Array<[string, SparqIconDefinition]> = []\n\n for (const registry of registries) {\n if (!registry) {\n continue\n }\n\n entries.push(...registry.entries())\n }\n\n return createSparqIconRegistry(entries)\n}\n\nexport function useSparqIcons(): SparqIconRegistry {\n const registry = inject(SPARQ_ICON_REGISTRY_KEY, undefined)\n if (!registry) {\n throw new Error('Sparq icon registry is not provided. Install a schema renderer plugin with icons.')\n }\n\n return registry\n}\n\nfunction isIterableSeed(seed: SparqIconRegistrySeed): seed is Iterable<readonly [string, SparqIconDefinition]> {\n return Symbol.iterator in Object(seed)\n}\n\nfunction formatIconLabel(name: string): string {\n return name\n .split('-')\n .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))\n .join(' ')\n}\n","import type { RichTextToolbarBoundary, RichTextToolbarConfig, RichTextToolbarMode } from '@sparqjs/schema-protocol'\nimport { h, inject, type Component, type VNodeChild } from 'vue'\nimport { SPARQ_RICH_TEXT_REGISTRY_KEY } from '../keys'\nimport type { SparqAssetService } from '../asset'\nimport type { UiKit } from '../ui'\n\nexport type SparqRichTextToolbarMode = RichTextToolbarMode\nexport type SparqRichTextToolbarBoundary = RichTextToolbarBoundary\nexport type SparqRichTextToolbarConfig = RichTextToolbarConfig\n\nexport interface SparqRichTextEditorCapabilities {\n toolbar?: string[]\n stickyToolbar?: boolean\n sourceMode?: boolean\n upload?: boolean\n readonly?: boolean\n disabled?: boolean\n}\n\nexport interface SparqRichTextRenderProps {\n value: string\n props?: Record<string, unknown>\n disabled?: boolean\n readonly?: boolean\n loading?: boolean\n ui: UiKit\n assetService?: SparqAssetService\n onChange?: (value: string) => void\n onBlur?: () => void\n}\n\nexport interface SparqRichTextEditorDefinition {\n label?: string\n namespace?: string\n keywords?: string[]\n capabilities?: SparqRichTextEditorCapabilities\n normalizeToolbar?: (toolbar: SparqRichTextToolbarConfig, props: SparqRichTextRenderProps) => Record<string, unknown>\n component?: unknown\n render?: (props: SparqRichTextRenderProps) => VNodeChild\n loader?: () => Promise<SparqRichTextEditorDefinition>\n props?: Record<string, unknown>\n}\n\nexport type SparqRichTextRegistrySeed =\n | Record<string, SparqRichTextEditorDefinition>\n | Iterable<readonly [string, SparqRichTextEditorDefinition]>\n\nexport interface SparqRichTextRegistry {\n get(name: string): SparqRichTextEditorDefinition | undefined\n has(name: string): boolean\n entries(): IterableIterator<[string, SparqRichTextEditorDefinition]>\n}\n\nexport function createDefaultRichTextRegistry(): SparqRichTextRegistry {\n return createSparqRichTextRegistry({\n fallback: {\n label: 'Fallback',\n namespace: 'renderer',\n capabilities: {\n readonly: true,\n disabled: true,\n },\n render(props) {\n return h('textarea', {\n ...(props.props ?? {}),\n value: props.value,\n disabled: props.disabled === true || props.loading === true,\n readonly: props.readonly,\n rows: props.props?.rows ?? 8,\n onInput(event: Event) {\n props.onChange?.((event.target as HTMLTextAreaElement).value)\n },\n onBlur: props.onBlur,\n 'data-sparq-rich-text-fallback': '',\n })\n },\n },\n })\n}\n\nexport function createSparqRichTextRegistry(seed: SparqRichTextRegistrySeed = {}): SparqRichTextRegistry {\n const editors = new Map<string, SparqRichTextEditorDefinition>(isIterableSeed(seed) ? seed : Object.entries(seed))\n\n return {\n get(name) {\n return editors.get(name)\n },\n has(name) {\n return editors.has(name)\n },\n entries() {\n return editors.entries()\n },\n }\n}\n\nexport function mergeSparqRichTextRegistry(\n ...registries: Array<SparqRichTextRegistry | undefined>\n): SparqRichTextRegistry {\n const entries: Array<[string, SparqRichTextEditorDefinition]> = []\n\n for (const registry of registries) {\n if (!registry) {\n continue\n }\n\n entries.push(...registry.entries())\n }\n\n return createSparqRichTextRegistry(entries)\n}\n\nexport function renderSparqRichTextEditor(\n editor: SparqRichTextEditorDefinition,\n props: SparqRichTextRenderProps,\n): VNodeChild {\n const mergedProps: SparqRichTextRenderProps = {\n ...props,\n props: {\n ...(editor.props ?? {}),\n ...(props.props ?? {}),\n },\n }\n const toolbar = readSparqRichTextToolbar(mergedProps.props?.toolbar)\n if (toolbar && editor.normalizeToolbar) {\n mergedProps.props = {\n ...mergedProps.props,\n ...editor.normalizeToolbar(toolbar, mergedProps),\n }\n }\n\n if (editor.render) {\n return editor.render(mergedProps)\n }\n\n if (editor.component) {\n return h(editor.component as Component, mergedProps as never)\n }\n\n return undefined\n}\n\nexport function readSparqRichTextToolbar(value: unknown): SparqRichTextToolbarConfig | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n return value as SparqRichTextToolbarConfig\n}\n\nexport function resolveSparqRichTextToolbarItems(\n toolbar: SparqRichTextToolbarConfig | undefined,\n presets: Record<Exclude<SparqRichTextToolbarMode, 'custom'>, readonly string[]>,\n mapper: Record<string, string | string[] | undefined> = {},\n): string[] {\n const mode = toolbar?.mode === 'custom' ? 'default' : (toolbar?.mode ?? 'default')\n const sourceItems = toolbar?.items?.length ? toolbar.items : [...(presets[mode] ?? presets.default)]\n const excludes = new Set((toolbar?.exclude ?? []).flatMap((item) => mapToolbarItem(item, mapper)))\n\n return sourceItems.flatMap((item) => mapToolbarItem(item, mapper)).filter((item) => !excludes.has(item))\n}\n\nexport function createSparqRichTextStickyStyle(\n toolbar: SparqRichTextToolbarConfig | undefined,\n): Record<string, string> | undefined {\n if (toolbar?.sticky !== true) {\n return undefined\n }\n\n return {\n position: 'sticky',\n top: toCssSize(toolbar.stickyOffset ?? 0),\n zIndex: '10',\n }\n}\n\nexport function useSparqRichTextEditors(): SparqRichTextRegistry {\n const registry = inject(SPARQ_RICH_TEXT_REGISTRY_KEY, undefined)\n if (!registry) {\n throw new Error(\n 'Sparq rich text registry is not provided. Install a schema renderer plugin with richTextEditors.',\n )\n }\n\n return registry\n}\n\nfunction mapToolbarItem(item: string, mapper: Record<string, string | string[] | undefined>): string[] {\n const mapped = mapper[item]\n if (Array.isArray(mapped)) {\n return mapped\n }\n return [mapped ?? item]\n}\n\nfunction toCssSize(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value\n}\n\nfunction isIterableSeed(\n seed: SparqRichTextRegistrySeed,\n): seed is Iterable<readonly [string, SparqRichTextEditorDefinition]> {\n return Symbol.iterator in Object(seed)\n}\n","import { defineContributionPoint, defineContributionSet } from '@sparqjs/frontend-core'\nimport { shallowRef } from 'vue'\nimport { schemaRendererAssetPreviewPoint, type SparqAssetPreviewDefinition } from '../asset/preview'\nimport { createSchemaComponentRegistry, type SchemaComponent, type SchemaComponentRegistry } from './component'\nimport { createSparqIconRegistry, type SparqIconDefinition, type SparqIconRegistry } from './icon'\nimport {\n createSparqRichTextRegistry,\n type SparqRichTextEditorDefinition,\n type SparqRichTextRegistry,\n} from './rich-text'\n\n/** Renderer 贡献来源层级。层级优先于同层级内的 priority。 */\nexport type SchemaRendererContributionLayer = 'builtin' | 'plugin' | 'host' | 'local'\n\n/** Renderer 贡献安装结果。 */\nexport interface SchemaRendererContributionHandle {\n dispose(): void\n}\n\n/** Renderer 贡献点的公开结构,只用于保持领域条目的类型关系。 */\nexport interface SchemaRendererContributionPoint<T> {\n readonly key: string\n readonly __value?: T\n}\n\n/** Renderer 当前解析出的贡献条目。 */\nexport interface ResolvedSchemaRendererContribution<T> {\n point: string\n key: string\n owner: string\n layer: SchemaRendererContributionLayer\n priority: number\n value: T\n}\n\n/** Renderer 贡献点的只读查询入口。 */\nexport interface SchemaRendererContributionRegistry<T> {\n get(key: string): T | undefined\n has(key: string): boolean\n entries(): readonly ResolvedSchemaRendererContribution<T>[]\n find(\n matcher: (entry: ResolvedSchemaRendererContribution<T>) => boolean,\n ): ResolvedSchemaRendererContribution<T> | undefined\n diagnostics(): readonly {\n code: 'duplicate-contribution'\n point: string\n key: string\n owners: string[]\n activeOwner: string\n message: string\n }[]\n subscribe(listener: () => void): () => void\n}\n\n/**\n * Schema renderer 暴露给可信宿主的最小贡献环境。\n *\n * 该 facade 不暴露私有 `@sparqjs/frontend-core` 包;宿主可以复用 renderer 创建的实例安装和卸载贡献。\n */\nexport interface SchemaRendererKernel {\n install(bundle: {\n owner: string\n contributions: readonly {\n point: SchemaRendererContributionPoint<unknown>\n entries: readonly {\n key: string\n value: unknown\n priority?: number\n }[]\n layer?: SchemaRendererContributionLayer\n }[]\n }): SchemaRendererContributionHandle\n registry<T>(point: SchemaRendererContributionPoint<T>): SchemaRendererContributionRegistry<T>\n}\n\n/** Schema Vue 运行时组件贡献点。 */\nexport const schemaRendererComponentPoint: SchemaRendererContributionPoint<SchemaComponent> =\n defineContributionPoint<SchemaComponent>('renderer.schema-components')\n\n/** Schema Vue 图标贡献点。 */\nexport const schemaRendererIconPoint: SchemaRendererContributionPoint<SparqIconDefinition> =\n defineContributionPoint<SparqIconDefinition>('renderer.icons')\n\n/** Schema Vue 富文本编辑器贡献点。 */\nexport const schemaRendererRichTextPoint: SchemaRendererContributionPoint<SparqRichTextEditorDefinition> =\n defineContributionPoint<SparqRichTextEditorDefinition>('renderer.rich-text-editors')\n\n/**\n * 插件向 Schema Vue renderer 提供的稳定贡献描述。\n *\n * 每个字段只包含插件实际提供的条目,不接收带默认内容的完整 registry,避免插件重复声明 renderer 内置能力。\n */\nexport interface SchemaRendererContribution {\n /** 插件或预设的稳定来源标识,用于冲突诊断和卸载定位。 */\n owner: string\n /** 默认使用 plugin;renderer 预设和宿主适配层可以显式选择其他层级。 */\n layer?: SchemaRendererContributionLayer\n components?: Readonly<Record<string, SchemaComponent>>\n icons?: Readonly<Record<string, SparqIconDefinition>>\n richTextEditors?: Readonly<Record<string, SparqRichTextEditorDefinition>>\n /** 可并存的资源预览实现;matcher 和 priority 由资源预览领域负责解释。 */\n assetPreviews?: readonly SparqAssetPreviewDefinition[]\n}\n\n/**\n * 原子安装 renderer 贡献。\n *\n * 返回 handle 控制本次组件、图标、富文本和资源预览贡献的共同生命周期,卸载后 live registry 会自动恢复上一层实现。\n */\nexport function installSchemaRendererContribution(\n kernel: SchemaRendererKernel,\n contribution: SchemaRendererContribution,\n): SchemaRendererContributionHandle {\n const layer = contribution.layer ?? 'plugin'\n return kernel.install({\n owner: contribution.owner,\n contributions: [\n defineContributionSet(\n schemaRendererComponentPoint,\n Object.entries(contribution.components ?? {}).map(([key, value]) => ({ key, value })),\n layer,\n ),\n defineContributionSet(\n schemaRendererIconPoint,\n Object.entries(contribution.icons ?? {}).map(([key, value]) => ({ key, value })),\n layer,\n ),\n defineContributionSet(\n schemaRendererRichTextPoint,\n Object.entries(contribution.richTextEditors ?? {}).map(([key, value]) => ({ key, value })),\n layer,\n ),\n defineContributionSet(\n schemaRendererAssetPreviewPoint,\n (contribution.assetPreviews ?? []).map((preview) => ({\n key: preview.key,\n value: preview,\n priority: preview.priority,\n })),\n layer,\n ),\n ],\n })\n}\n\n/** 创建随 kernel 安装和卸载自动更新的组件 registry。 */\nexport function createLiveSchemaComponentRegistry(kernel: SchemaRendererKernel): SchemaComponentRegistry {\n const registry = kernel.registry(schemaRendererComponentPoint)\n const snapshot = shallowRef(\n createSchemaComponentRegistry(registry.entries().map((entry) => [entry.key, entry.value] as const)),\n )\n registry.subscribe(() => {\n snapshot.value = createSchemaComponentRegistry(\n registry.entries().map((entry) => [entry.key, entry.value] as const),\n )\n })\n return {\n get: (name) => snapshot.value.get(name),\n has: (name) => snapshot.value.has(name),\n render: (name, props, slots, context) => snapshot.value.render(name, props, slots, context),\n entries: () => snapshot.value.entries(),\n }\n}\n\n/** 创建随 kernel 安装和卸载自动更新的图标 registry。 */\nexport function createLiveSparqIconRegistry(kernel: SchemaRendererKernel): SparqIconRegistry {\n const registry = kernel.registry(schemaRendererIconPoint)\n const snapshot = shallowRef(\n createSparqIconRegistry(registry.entries().map((entry) => [entry.key, entry.value] as const)),\n )\n registry.subscribe(() => {\n snapshot.value = createSparqIconRegistry(registry.entries().map((entry) => [entry.key, entry.value] as const))\n })\n return {\n get: (name) => snapshot.value.get(name),\n has: (name) => snapshot.value.has(name),\n render: (name, props) => snapshot.value.render(name, props),\n entries: () => snapshot.value.entries(),\n }\n}\n\n/** 创建随 kernel 安装和卸载自动更新的富文本 registry。 */\nexport function createLiveSparqRichTextRegistry(kernel: SchemaRendererKernel): SparqRichTextRegistry {\n const registry = kernel.registry(schemaRendererRichTextPoint)\n const snapshot = shallowRef(\n createSparqRichTextRegistry(registry.entries().map((entry) => [entry.key, entry.value] as const)),\n )\n registry.subscribe(() => {\n snapshot.value = createSparqRichTextRegistry(\n registry.entries().map((entry) => [entry.key, entry.value] as const),\n )\n })\n return {\n get: (name) => snapshot.value.get(name),\n has: (name) => snapshot.value.has(name),\n entries: () => snapshot.value.entries(),\n }\n}\n","import {\n resolveFieldRuntimeState,\n type ExpressionContext,\n type RuntimeRenderableView,\n type RuntimeTableFilter,\n type SchemaRuntime,\n} from '@sparqjs/schema-core'\nimport type { SchemaComponentRegistry, SparqIconRegistry, SparqRichTextRegistry } from '../registry'\nimport type { SparqAssetService } from '../asset'\nimport type {\n SchemaActionHandler,\n SchemaFieldActivateHandler,\n SchemaFormState,\n SchemaTableFilterContext,\n SchemaUiContext,\n SparqViewController,\n SparqViewState,\n} from '../types'\nimport type { UiKit } from '../ui'\n\n/**\n * 构建所有渲染路径共享的基础渲染器上下文。\n *\n * 调用方未注入 UI 组件集时使用 `defaultUiKit`。\n * 没有活跃 controller 表单状态时,`form` 作为独立表单兜底。\n */\nexport function createSchemaUiContext(\n state: SparqViewState,\n runtime: SchemaRuntime,\n defaultUiKit: UiKit,\n uiKit: UiKit | undefined,\n components: SchemaComponentRegistry | undefined,\n icons: SparqIconRegistry | undefined,\n richTextEditors: SparqRichTextRegistry | undefined,\n assetService: SparqAssetService | undefined,\n form: SchemaFormState | undefined,\n onAction: SchemaActionHandler | undefined,\n controller: SparqViewController | undefined,\n retry?: () => void,\n onFieldActivate?: SchemaFieldActivateHandler,\n): SchemaUiContext {\n return {\n state,\n runtime,\n resource: state.resource,\n payload: state.payload,\n tableReloadFilters: state.filters,\n diagnostics: state.diagnostics,\n ui: uiKit ?? defaultUiKit,\n components,\n icons,\n richTextEditors,\n assetService,\n form: resolveContextForm(state, controller, form),\n controller,\n onAction,\n onFieldActivate,\n retry,\n resolveTableReloadView() {\n return resolveReloadTableViewName({\n state,\n })\n },\n resolveTableReloadFilters() {\n return state.filters\n },\n }\n}\n\n/**\n * 选择与当前渲染模式匹配的表单状态。\n *\n * 搜索模式使用 `controller.search`。\n * 其他模式优先使用 `controller.form`,再回退到独立表单状态。\n */\nexport function resolveContextForm(\n state: SparqViewState,\n controller: SparqViewController | undefined,\n fallback: SchemaFormState | undefined,\n): SchemaFormState | undefined {\n if (state.mode === 'search') {\n return controller?.search ?? fallback\n }\n\n return controller?.form ?? fallback\n}\n\n/**\n * 构建单个表格筛选项使用的渲染上下文。\n *\n * 表格筛选项始终绑定搜索表单状态。\n */\nexport function createTableFilterContext(\n context: SchemaUiContext,\n filter: RuntimeTableFilter,\n): SchemaTableFilterContext {\n const initialOptions = resolveFieldRuntimeState({\n field: filter.fieldSchema,\n dataSource: filter.dataSource,\n mode: context.state.mode,\n formMode: context.controller?.page.formMode,\n }).options\n const form = context.controller?.search ?? context.form\n\n return {\n ...context,\n form,\n filter,\n options:\n filter.field && form?.options && Object.prototype.hasOwnProperty.call(form.options, filter.field)\n ? form.options[filter.field] ?? []\n : initialOptions,\n }\n}\n\n/**\n * 构建 visible 和 disabled 条件使用的表达式上下文。\n *\n * 行级渲染优先使用 `record`。\n * 没有活跃行数据时回退到页面记录。\n */\nexport function createExpressionContext(\n context: Pick<SchemaUiContext, 'controller' | 'form' | 'payload' | 'resource' | 'state'>,\n record?: Record<string, unknown>,\n): ExpressionContext {\n return {\n schema: context.state.schema?.schema,\n row: record,\n record: record ?? context.controller?.page.record,\n form: context.form?.values,\n query:\n context.state.mode === 'search'\n ? context.controller?.search.values\n : context.controller?.table.state.searchValues ?? context.controller?.search.values,\n selection: context.controller?.table.state.selection,\n recycleMode: context.controller?.table.state.recycleMode,\n payload: context.payload,\n mode: context.state.mode,\n formMode: context.controller?.page.formMode,\n viewName: context.state.viewName,\n resource: context.resource,\n }\n}\n\n/**\n * 读取当前资源的主键字段名。\n */\nexport function getPrimaryKey(context: SchemaUiContext): string {\n return context.state.schema?.schema.primaryKey ?? 'id'\n}\n\n/**\n * 从单条记录中读取主键值。\n */\nexport function getRecordId(\n context: SchemaUiContext,\n record: Record<string, unknown> | undefined,\n): unknown {\n return record?.[getPrimaryKey(context)]\n}\n\n/**\n * 解析动作完成后需要重载的表格视图名称。\n */\nexport function getTableReloadView(context: SchemaUiContext): string {\n return context.tableReloadView ?? context.resolveTableReloadView?.() ?? resolveReloadTableViewName(context)\n}\n\n/**\n * 根据当前渲染状态解析默认表格视图名称。\n *\n * 页面模式优先使用 `page.tableName`。\n * 其他模式回退到当前 `viewName`。\n */\nexport function resolveReloadTableViewName(\n context: Pick<SchemaUiContext, 'state'>,\n): string {\n if (context.state.mode === 'page' && isRuntimePageView(context.state.view)) {\n return context.state.view.tableName ?? 'default'\n }\n\n return context.state.viewName\n}\n\nfunction isRuntimePageView(\n view: RuntimeRenderableView | undefined,\n): view is RuntimeRenderableView & { tableName?: string } {\n return Boolean(view && typeof view === 'object' && 'tableName' in view)\n}\n","import { reactive } from 'vue'\nimport {\n BUILTIN_ACTION_SUBMIT,\n createSessionController,\n createSessionControllerState,\n type RuntimeTableTree,\n type SchemaRuntime,\n} from '@sparqjs/schema-core'\nimport type { CreateSparqViewControllerOptions, SparqViewController } from '../types'\n\nexport function createSparqViewController(options: CreateSparqViewControllerOptions = {}): SparqViewController {\n const state = reactive(\n createSessionControllerState({\n initialValues: options.initialValues,\n applyDefaults: options.applyDefaults,\n schema: options.schema,\n initialPage: options.initialPage,\n initialPageSize: options.initialPageSize,\n }),\n )\n const session = createSessionController({\n ...options,\n state,\n })\n\n const { tableState: _tableState, ...rest } = session\n\n return {\n ...rest,\n form: state.form,\n search: state.search,\n page: state.page,\n action: state.action,\n table: {\n state: state.tableState,\n reload: session.reloadTable,\n setRecycleMode: session.setRecycleMode,\n changeSelection(selection: unknown[]) {\n session.changeTableSelection({\n selection,\n })\n },\n changeSort(input: {\n sort: unknown\n runtime: SchemaRuntime\n resource?: string\n view?: string\n tableMode?: string\n tableTree?: RuntimeTableTree\n payload?: unknown\n }) {\n return session.changeTableSort(input)\n },\n changePage(input: {\n page: number\n runtime: SchemaRuntime\n resource?: string\n view?: string\n tableMode?: string\n tableTree?: RuntimeTableTree\n payload?: unknown\n }) {\n return session.changeTablePage(input)\n },\n changePageSize(input: {\n pageSize: number\n runtime: SchemaRuntime\n resource?: string\n view?: string\n tableMode?: string\n tableTree?: RuntimeTableTree\n payload?: unknown\n }) {\n return session.changeTablePageSize(input)\n },\n setSearchValues: session.setSearchValues,\n setPagination: session.setPagination,\n setSelection: session.setSelection,\n setSort: session.setSort,\n },\n submit() {\n return session.execute(BUILTIN_ACTION_SUBMIT)\n },\n }\n}\n\nexport function useSparqView(options: CreateSparqViewControllerOptions = {}): SparqViewController {\n return createSparqViewController(options)\n}\n","import type { ActionConfirmInput, SchemaRuntime, SchemaRuntimeNotice } from '@sparqjs/schema-core'\nimport { inject } from 'vue'\nimport { SPARQ_SCHEMA_RUNTIME_KEY } from '../keys'\n\nexport type SchemaFeedbackNoticeOptions = Omit<SchemaRuntimeNotice, 'type' | 'message'>\n\nexport interface SchemaFeedback {\n notify(notice: SchemaRuntimeNotice): Promise<void>\n success(message: string, options?: SchemaFeedbackNoticeOptions): Promise<void>\n error(message: string, options?: SchemaFeedbackNoticeOptions): Promise<void>\n warning(message: string, options?: SchemaFeedbackNoticeOptions): Promise<void>\n info(message: string, options?: SchemaFeedbackNoticeOptions): Promise<void>\n confirmAction(input: ActionConfirmInput): Promise<boolean>\n}\n\n/**\n * 获取 Vue 渲染层运行时反馈代理。\n */\nexport function useSchemaFeedback(): SchemaFeedback {\n const runtime = inject(SPARQ_SCHEMA_RUNTIME_KEY, undefined)\n if (!runtime) {\n throw new Error('Sparq schema runtime is not provided. Install a schema renderer plugin with runtime.')\n }\n\n return createSchemaFeedback(runtime)\n}\n\n/**\n * 基于指定 runtime 创建反馈代理。\n */\nexport function createSchemaFeedback(runtime: SchemaRuntime): SchemaFeedback {\n const notify = async (notice: SchemaRuntimeNotice) => {\n await runtime.options.notify?.(notice)\n }\n\n return {\n notify,\n success(message, options) {\n return notifyWithType(notify, 'success', message, options)\n },\n error(message, options) {\n return notifyWithType(notify, 'error', message, options)\n },\n warning(message, options) {\n return notifyWithType(notify, 'warning', message, options)\n },\n info(message, options) {\n return notifyWithType(notify, 'info', message, options)\n },\n async confirmAction(input) {\n return runtime.options.confirmAction?.(input) ?? true\n },\n }\n}\n\nfunction notifyWithType(\n notify: (notice: SchemaRuntimeNotice) => Promise<void>,\n type: SchemaRuntimeNotice['type'],\n message: string,\n options?: SchemaFeedbackNoticeOptions,\n): Promise<void> {\n return notify({\n ...options,\n type,\n message,\n })\n}\n","import {\n buildResourceViewModel,\n createDiagnostic,\n createSchemaRuntime,\n getErrorMessage,\n resolveRenderView,\n type SchemaRuntime,\n} from '@sparqjs/schema-core'\nimport type { FieldOptionFilterConfig, RenderMode, SchemaResource } from '@sparqjs/schema-protocol'\nimport type { SparqViewProps, SparqViewState } from '../types'\n\nexport function resolveSparqViewState(props: SparqViewProps, runtime?: SchemaRuntime): SparqViewState {\n const mode = props.mode ?? 'page'\n const viewName = props.view ?? 'default'\n const activeRuntime = props.runtime ?? runtime\n\n if (!props.schema) {\n return {\n status: 'idle',\n loading: false,\n mode,\n viewName,\n resource: props.resource,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n diagnostics: [],\n fatal: false,\n }\n }\n\n return buildReadySparqViewState({\n mode,\n viewName,\n resource: props.resource,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n schema: props.schema,\n runtime: activeRuntime,\n })\n}\n\nexport async function loadSparqViewState(props: SparqViewProps, runtime?: SchemaRuntime): Promise<SparqViewState> {\n const mode = props.mode ?? 'page'\n const viewName = props.view ?? 'default'\n const activeRuntime = props.runtime ?? runtime ?? createSchemaRuntime()\n\n if (props.schema) {\n return resolveSparqViewState(props, activeRuntime)\n }\n\n if (!props.resource) {\n return {\n status: 'idle',\n loading: false,\n mode,\n viewName,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n diagnostics: [],\n fatal: false,\n }\n }\n\n try {\n const schema = await activeRuntime.loadSchema({\n resource: props.resource,\n source: props.source,\n payload: props.payload,\n })\n\n return buildReadySparqViewState({\n mode,\n viewName,\n resource: props.resource,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n schema,\n runtime: activeRuntime,\n })\n } catch (error) {\n return {\n status: 'error',\n loading: false,\n mode,\n viewName,\n resource: props.resource,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n diagnostics: [\n createDiagnostic('error', {\n code: 'SCHEMA_LOAD_FAILED',\n message: getErrorMessage(error, 'Failed to load schema.'),\n hint: 'Provide a runtime with dataAdapter.loadSchema, or pass schema directly.',\n source: 'runtime',\n fatal: true,\n }),\n ],\n error,\n fatal: true,\n }\n }\n}\n\nexport function createSparqViewLoadingState(props: SparqViewProps): SparqViewState {\n return {\n status: 'loading',\n loading: true,\n mode: props.mode ?? 'page',\n viewName: props.view ?? 'default',\n resource: props.resource,\n payload: props.payload,\n filters: props.filters,\n hideFormFooter: props.hideFormFooter,\n diagnostics: [],\n fatal: false,\n }\n}\n\ninterface BuildReadySparqViewStateInput {\n mode: RenderMode\n viewName: string\n resource?: string\n payload?: unknown\n filters?: FieldOptionFilterConfig[]\n hideFormFooter?: boolean\n schema: SchemaResource\n runtime?: SchemaRuntime\n}\n\nfunction buildReadySparqViewState(input: BuildReadySparqViewStateInput): SparqViewState {\n const viewModel = input.runtime?.buildViewModel(input.schema) ?? buildResourceViewModel(input.schema)\n const resolved =\n input.runtime?.resolveView({\n viewModel,\n mode: input.mode,\n view: input.viewName,\n }) ??\n resolveRenderView({\n viewModel,\n mode: input.mode,\n view: input.viewName,\n })\n\n return {\n status: viewModel.fatal || resolved.fatal ? 'error' : 'ready',\n loading: false,\n mode: resolved.mode,\n viewName: resolved.viewName,\n tableReloadViewName: resolved.tableReloadViewName,\n tableReloadMode: resolved.tableReloadMode,\n tableReloadTree: resolved.tableReloadTree,\n autoLoadTable: resolved.autoLoadTable,\n resource: input.resource,\n payload: input.payload,\n filters: input.filters,\n hideFormFooter: input.hideFormFooter,\n schema: input.schema,\n viewModel,\n view: resolved.view,\n diagnostics: [...viewModel.diagnostics, ...resolved.diagnostics],\n fatal: viewModel.fatal || resolved.fatal,\n }\n}\n","import { createFrontendKernel } from '@sparqjs/frontend-core'\nimport { createSchemaRuntime } from '@sparqjs/schema-core'\nimport { builtInImageAssetPreview, createLiveSparqAssetPreviewRegistry } from '../asset/preview'\nimport {\n createDefaultIconRegistry,\n createDefaultRichTextRegistry,\n createSchemaComponentRegistry,\n createLiveSchemaComponentRegistry,\n createLiveSparqIconRegistry,\n createLiveSparqRichTextRegistry,\n installSchemaRendererContribution,\n} from '../registry'\nimport { loadSparqViewState, resolveSparqViewState } from './state'\nimport type { CreateSchemaRendererOptions, SchemaRenderer, SparqViewProps } from '../types'\n\n/**\n * 创建 Vue schema renderer。\n *\n * renderer 负责 runtime、UI adapter、UI kit 和前端贡献注册表的组装。\n */\nexport function createSchemaRenderer(options: CreateSchemaRendererOptions = {}): SchemaRenderer {\n const {\n runtime: providedRuntime,\n kernel: providedKernel,\n contributions,\n uiAdapter,\n uiKit,\n components,\n icons,\n richTextEditors,\n assetService,\n presentationHost,\n ...runtimeOptions\n } = options\n const runtime = providedRuntime ?? createSchemaRuntime(runtimeOptions)\n const kernel = providedKernel ?? createFrontendKernel()\n installSchemaRendererContribution(kernel, {\n owner: '@sparqjs/schema-vue',\n layer: 'builtin',\n components: Object.fromEntries(createSchemaComponentRegistry().entries()),\n icons: Object.fromEntries(createDefaultIconRegistry().entries()),\n richTextEditors: Object.fromEntries(createDefaultRichTextRegistry().entries()),\n assetPreviews: [builtInImageAssetPreview],\n })\n for (const contribution of contributions ?? []) {\n installSchemaRendererContribution(kernel, contribution)\n }\n installSchemaRendererContribution(kernel, {\n owner: '@sparqjs/schema-vue:host',\n layer: 'host',\n components: components ? Object.fromEntries(components.entries()) : undefined,\n icons: icons ? Object.fromEntries(icons.entries()) : undefined,\n richTextEditors: richTextEditors ? Object.fromEntries(richTextEditors.entries()) : undefined,\n })\n\n return {\n name: '@sparqjs/schema-vue',\n kernel,\n runtime,\n uiAdapter,\n uiKit,\n components: createLiveSchemaComponentRegistry(kernel),\n icons: createLiveSparqIconRegistry(kernel),\n richTextEditors: createLiveSparqRichTextRegistry(kernel),\n assetPreviews: createLiveSparqAssetPreviewRegistry(kernel),\n assetService,\n presentationHost,\n resolve(props: SparqViewProps) {\n return resolveSparqViewState(props, runtime)\n },\n load(props: SparqViewProps) {\n return loadSparqViewState(props, runtime)\n },\n }\n}\n","import type { RuntimeViewNode } from '@sparqjs/schema-core'\nimport type { WriteBackRule, WriteBackStrategy } from '@sparqjs/schema-protocol'\nimport type { SchemaFieldChangeContext, SchemaFormState } from '../types'\n\nexport interface ApplyWriteBackInput {\n props?: Record<string, unknown>\n form?: SchemaFormState\n node?: RuntimeViewNode\n sourceField?: string\n context?: SchemaFieldChangeContext\n}\n\nexport function applyFieldWriteBack(input: ApplyWriteBackInput): void {\n const rules = normalizeWriteBackRules(input.props?.writeBack)\n if (!rules.length || !input.form?.setValue) {\n return\n }\n\n const event = input.context?.event\n for (const rule of rules) {\n if (!shouldRunForEvent(rule, event)) {\n continue\n }\n if (!rule.to || !isTopLevelField(rule.to)) {\n console.warn('[sparq-write-back] writeBack.to must be a top-level field name.', rule)\n continue\n }\n if (rule.to === input.sourceField) {\n console.warn('[sparq-write-back] writeBack.to cannot target the source field.', rule)\n continue\n }\n if (!rule.from) {\n console.warn('[sparq-write-back] writeBack.from is required.', rule)\n continue\n }\n\n const nextValue = readPath(input.context, rule.from)\n if (!shouldWriteValue(input.form.values[rule.to], rule.strategy ?? 'always')) {\n continue\n }\n\n input.form.setValue(rule.to, nextValue, input.node)\n }\n}\n\nfunction normalizeWriteBackRules(value: unknown): WriteBackRule[] {\n if (!Array.isArray(value)) {\n return []\n }\n\n return value.filter(isWriteBackRule)\n}\n\nfunction isWriteBackRule(value: unknown): value is WriteBackRule {\n return typeof value === 'object' && value !== null\n}\n\nfunction shouldRunForEvent(rule: WriteBackRule, event: string | undefined): boolean {\n if (!Array.isArray(rule.events) || rule.events.length === 0) {\n return true\n }\n\n return event !== undefined && rule.events.includes(event)\n}\n\nfunction isTopLevelField(path: string): boolean {\n const normalized = path.trim()\n return normalized.length > 0 && !normalized.includes('.') && !normalized.includes('[') && !normalized.includes(']')\n}\n\nfunction shouldWriteValue(currentValue: unknown, strategy: WriteBackStrategy): boolean {\n if (strategy === 'empty') {\n return isEmptyValue(currentValue)\n }\n\n return true\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true\n }\n\n return Array.isArray(value) && value.length === 0\n}\n\nfunction readPath(source: unknown, path: string): unknown {\n let current = source\n for (const segment of path.split('.')) {\n if (!segment) {\n return undefined\n }\n if (Array.isArray(current) && /^\\d+$/.test(segment)) {\n current = current[Number(segment)]\n continue\n }\n if (!isRecord(current)) {\n return undefined\n }\n current = current[segment]\n }\n\n return current\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import {\n createActionRuntime,\n dispatchSchemaAction,\n resolveActionState as resolveCoreActionState,\n type ResolvedAction,\n} from '@sparqjs/schema-core'\nimport type { SchemaActionContext, SchemaActionPlacement, SchemaUiContext } from '../types'\nimport { createExpressionContext, getPrimaryKey, getRecordId, getTableReloadView } from './context'\n\n/**\n * 构建单个已解析动作节点的 renderer 动作上下文。\n *\n * `placement` 记录动作的渲染位置。\n * `record` 在表格行操作中承载当前行数据。\n */\nexport function createSchemaActionContext(\n context: SchemaUiContext,\n action: ResolvedAction,\n placement: SchemaActionPlacement,\n record?: Record<string, unknown>,\n): SchemaActionContext {\n const resolvedAction = resolveActionRuntimeState(context, action, record)\n\n return {\n ...context,\n action: resolvedAction,\n placement,\n record,\n execute: createActionExecutor(context, resolvedAction, placement, record),\n createChildContext(childAction) {\n return createSchemaActionContext(context, childAction, placement, record)\n },\n }\n}\n\n/**\n * 合并 schema 动作状态和当前 renderer 执行状态。\n *\n * `action.props.loading` 未显式设置时回退到 controller 的执行状态。\n */\nexport function resolveActionRuntimeState(\n context: SchemaUiContext,\n action: ResolvedAction,\n record?: Record<string, unknown>,\n): ResolvedAction {\n const actionState = resolveCoreActionState(action, createExpressionContext(context, record))\n const executing =\n context.controller?.action.executing === true && context.controller.action.current?.action === action.action\n\n return {\n ...action,\n props: {\n ...action.props,\n visible: actionState.visible,\n loading: action.props?.loading ?? executing,\n disabled: action.props?.disabled === true || actionState.disabled || executing,\n },\n }\n}\n\n/**\n * 创建渲染动作使用的异步执行器。\n *\n * 执行器会按需创建 action runtime,并将 renderer 上下文映射成\n * `dispatchSchemaAction` 需要的执行载荷。\n */\nfunction createActionExecutor(\n context: SchemaUiContext,\n action: ResolvedAction,\n placement: SchemaActionPlacement,\n record?: Record<string, unknown>,\n) {\n return async () => {\n const actionRuntime = createActionRuntime({\n dataAdapter: context.runtime.options.dataAdapter,\n hooks: context.runtime.options.hooks,\n resolveConfirm: context.runtime.options.confirmAction,\n })\n const activeRecord = record ?? context.controller?.page.record\n const runContext = {\n schema: context.state.schema?.schema,\n resourceMeta: context.state.schema?.resource,\n resource: context.resource,\n mode: context.state.mode,\n viewName: context.state.viewName,\n view: context.state.viewName,\n id: getRecordId(context, activeRecord),\n record: activeRecord,\n selection: context.controller?.table.state.selection,\n formValues: context.form?.values,\n payload: context.payload,\n }\n\n return dispatchSchemaAction({\n controller: context.controller,\n action,\n actionRuntime,\n runContext,\n placement,\n runtime: context.runtime,\n resource: context.resource,\n viewName: context.state.viewName,\n primaryKey: getPrimaryKey(context),\n form: context.form,\n record,\n formView:\n context.state.mode === 'form' && context.state.view && 'footer' in context.state.view\n ? context.state.view\n : context.pageCreateForm,\n editForm: context.pageUpdateForm,\n editFormViewName: context.pageUpdateFormName ?? context.state.viewName,\n tableReloadView: getTableReloadView(context),\n tableReloadMode: context.resolveTableReloadMode?.() ?? context.tableReloadMode,\n tableReloadTree: context.resolveTableReloadTree?.() ?? context.tableReloadTree,\n tableReloadFilters: context.resolveTableReloadFilters?.() ?? context.tableReloadFilters,\n onAction: context.onAction\n ? async (externalContext) =>\n context.onAction?.({\n ...externalContext,\n placement,\n })\n : undefined,\n })\n }\n}\n","export function formatDisplayValue(value: unknown): string {\n if (value === null || value === undefined || value === '') {\n return '-'\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => formatDisplayValue(item)).join(', ')\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n\n return String(value)\n}\n","import { h, type VNodeChild } from 'vue'\nimport { getErrorMessage } from '@sparqjs/schema-core'\nimport { formatDisplayValue } from '../display-format'\nimport type { SchemaAuditPanelContext } from '../types'\n\nexport interface AuditPanelContentRenderers {\n renderRefresh?: (context: SchemaAuditPanelContext) => VNodeChild\n renderError?: (context: SchemaAuditPanelContext, message: string) => VNodeChild\n renderLoadMore?: (context: SchemaAuditPanelContext) => VNodeChild\n}\n\nexport function renderAuditPanelContent(\n context: SchemaAuditPanelContext,\n renderers: AuditPanelContentRenderers = {},\n): VNodeChild {\n const state = context.auditState\n\n return h(\n 'section',\n {\n class: 'sparq-audit-panel',\n },\n [\n renderAuditSummary(context, renderers),\n state.error ? renderAuditError(context, renderers) : undefined,\n state.loading ? renderAuditLoading() : undefined,\n !state.loading && !state.error && state.items.length === 0 ? renderAuditEmpty() : undefined,\n h(\n 'div',\n {\n class: 'sparq-audit-timeline',\n 'data-sparq-audit-timeline': '',\n },\n state.items.map((item) => renderAuditItem(item)),\n ),\n renderAuditFooter(context, renderers),\n ],\n )\n}\n\nexport function resolveAuditRecordTitle(record: Record<string, unknown> | undefined): string | undefined {\n const value = record?.title ?? record?.name ?? record?.label ?? record?.code\n if (value === undefined || value === null || value === '') {\n return undefined\n }\n return String(value)\n}\n\nexport function auditTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n create: '创建',\n update: '更新',\n delete: '删除',\n restore: '恢复',\n system: '系统',\n }\n\n return labels[type] ?? type\n}\n\nexport function auditTone(type: string): string {\n if (type === 'create') {\n return 'success'\n }\n if (type === 'delete') {\n return 'danger'\n }\n if (type === 'restore') {\n return 'warning'\n }\n if (type === 'update') {\n return 'primary'\n }\n return 'info'\n}\n\nfunction renderAuditSummary(context: SchemaAuditPanelContext, renderers: AuditPanelContentRenderers): VNodeChild {\n const title = resolveAuditRecordTitle(context.record)\n const id = context.id ?? context.record?.[context.primaryKey]\n\n return h(\n 'header',\n {\n class: 'sparq-audit-summary',\n },\n [\n h('div', { class: 'sparq-audit-summary__main' }, [\n h('span', { class: 'sparq-audit-summary__label' }, '当前记录'),\n h('strong', { class: 'sparq-audit-summary__title' }, title ?? '-'),\n id !== undefined && id !== null\n ? h('small', { class: 'sparq-audit-summary__id' }, `#${String(id)}`)\n : undefined,\n ]),\n renderers.renderRefresh?.(context) ?? renderDefaultRefresh(context),\n ],\n )\n}\n\nfunction renderAuditError(context: SchemaAuditPanelContext, renderers: AuditPanelContentRenderers): VNodeChild {\n const message = getErrorMessage(context.auditState.error, '审计记录加载失败。')\n\n return renderers.renderError?.(context, message) ?? h('p', { class: 'sparq-audit-panel__error' }, message)\n}\n\nfunction renderAuditLoading(): VNodeChild {\n return h('div', { class: 'sparq-audit-state' }, '审计记录加载中...')\n}\n\nfunction renderAuditEmpty(): VNodeChild {\n return h('div', { class: 'sparq-audit-state sparq-audit-state--empty' }, '暂无审计记录。')\n}\n\nfunction renderAuditItem(item: SchemaAuditPanelContext['auditState']['items'][number]): VNodeChild {\n const tone = auditTone(item.type)\n\n return h(\n 'article',\n {\n key: item.id,\n class: ['sparq-audit-item', `sparq-audit-item--${tone}`],\n 'data-sparq-audit-item': item.type,\n },\n [\n h('span', { class: 'sparq-audit-item__dot' }),\n h('div', { class: 'sparq-audit-item__card' }, [\n h('header', { class: 'sparq-audit-item__header' }, [\n h('div', { class: 'sparq-audit-item__title-group' }, [\n h('strong', { class: 'sparq-audit-item__title' }, item.title ?? auditTypeLabel(item.type)),\n h('span', { class: ['sparq-audit-item__type', `is-${tone}`] }, auditTypeLabel(item.type)),\n ]),\n h('time', { class: 'sparq-audit-item__time' }, item.occurred_at),\n ]),\n h('div', { class: 'sparq-audit-item__meta' }, [\n item.actor?.avatar\n ? h('img', {\n class: 'sparq-audit-item__avatar',\n src: item.actor.avatar,\n alt: item.actor.name ?? 'actor',\n })\n : undefined,\n h('span', item.actor?.name ?? '系统'),\n ]),\n item.summary ? h('p', { class: 'sparq-audit-item__summary' }, item.summary) : undefined,\n item.changes?.length ? renderAuditChanges(item.changes) : undefined,\n ]),\n ],\n )\n}\n\nfunction renderAuditChanges(\n changes: NonNullable<SchemaAuditPanelContext['auditState']['items'][number]['changes']>,\n): VNodeChild {\n return h('details', { class: 'sparq-audit-changes' }, [\n h('summary', `查看变更 (${changes.length})`),\n h(\n 'div',\n { class: 'sparq-audit-changes__table' },\n changes.flatMap((change) => [\n h('div', { class: 'sparq-audit-changes__field' }, change.label ?? change.field),\n h('div', { class: 'sparq-audit-changes__before' }, formatDisplayValue(change.before)),\n h('div', { class: 'sparq-audit-changes__after' }, formatDisplayValue(change.after)),\n ]),\n ),\n ])\n}\n\nfunction renderAuditFooter(context: SchemaAuditPanelContext, renderers: AuditPanelContentRenderers): VNodeChild {\n if (!context.auditState.hasMore) {\n return undefined\n }\n\n return h('footer', { class: 'sparq-audit-footer' }, [\n renderers.renderLoadMore?.(context) ?? renderDefaultLoadMore(context),\n ])\n}\n\nfunction renderDefaultRefresh(context: SchemaAuditPanelContext): VNodeChild {\n return h(\n 'button',\n {\n type: 'button',\n disabled: context.auditState.loading,\n onClick() {\n void context.refresh?.()\n },\n },\n '刷新',\n )\n}\n\nfunction renderDefaultLoadMore(context: SchemaAuditPanelContext): VNodeChild {\n return h(\n 'button',\n {\n type: 'button',\n disabled: context.auditState.loadingMore,\n onClick() {\n void context.loadMore?.()\n },\n },\n context.auditState.loadingMore ? '加载中...' : '加载更多',\n )\n}\n","import { h, type VNodeChild } from 'vue'\nimport type { SchemaDetailShellContext } from '../types'\n\nexport function renderDefaultDetailPanelShell(context: SchemaDetailShellContext): VNodeChild {\n return h(\n 'article',\n {\n ...context.detail.wrapper?.props,\n class: ['sparq-detail-shell', context.detail.wrapper?.props?.class],\n 'data-sparq-detail-shell': 'panel',\n },\n [renderDefaultDetailPanelHeader(context), h('div', { class: 'sparq-detail-shell__body' }, [context.children])],\n )\n}\n\nfunction renderDefaultDetailPanelHeader(context: SchemaDetailShellContext): VNodeChild {\n return h(\n 'header',\n {\n class: 'sparq-detail-shell__header',\n },\n [\n h('div', { class: 'sparq-detail-shell__headline' }, [\n context.title ? h('h2', { class: 'sparq-detail-shell__title' }, context.title) : undefined,\n renderDefaultDetailShellMeta(context.meta),\n context.helpNode,\n ]),\n context.actions ? h('div', { class: 'sparq-detail-shell__actions' }, [context.actions]) : undefined,\n ],\n )\n}\n\nfunction renderDefaultDetailShellMeta(meta: SchemaDetailShellContext['meta']): VNodeChild {\n if (!meta?.updatedAt && !meta?.updatedBy) {\n return undefined\n }\n\n const parts = [\n meta.updatedBy ? `更新人:${String(meta.updatedBy)}` : undefined,\n meta.updatedAt ? `更新时间:${String(meta.updatedAt)}` : undefined,\n ].filter(Boolean)\n\n return h('p', { class: 'sparq-detail-shell__meta' }, parts.join(' · '))\n}\n","import { h, type VNodeChild } from 'vue'\nimport { renderAuditPanelContent } from '../shell'\nimport type { SchemaAuditPanelContext, SchemaAuditTriggerContext, SchemaUiAdapter, SchemaUiContext } from '../types'\n\nexport function renderAuditTrigger(context: SchemaUiContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n const target = resolveAuditTarget(context)\n if (!target) {\n return undefined\n }\n\n const triggerContext: SchemaAuditTriggerContext = {\n ...context,\n ...target,\n open() {\n context.controller?.openAudit(target.record)\n return context.controller?.loadAudit(createAuditLoadInput(context, target)) ?? Promise.resolve(undefined)\n },\n }\n\n return (\n uiAdapter?.renderAuditTrigger?.(triggerContext) ??\n h(\n 'button',\n {\n type: 'button',\n class: 'sparq-audit-trigger',\n onClick: () => {\n void triggerContext.open()\n },\n },\n '审计记录',\n )\n )\n}\n\nexport function renderAuditPanel(context: SchemaUiContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n const auditState = context.controller?.auditState\n if (!auditState?.open) {\n return undefined\n }\n\n const target = resolveAuditTarget(context, auditState.record)\n const panelContext: SchemaAuditPanelContext = {\n ...context,\n record: target?.record ?? auditState.record,\n id: target?.id,\n primaryKey: target?.primaryKey ?? resolvePrimaryKey(context),\n auditState,\n close: context.controller?.closeAudit,\n refresh() {\n return context.controller?.refreshAudit(createAuditLoadInput(context, target)) ?? Promise.resolve(undefined)\n },\n loadMore() {\n return (\n context.controller?.loadMoreAudit(createAuditLoadInput(context, target)) ?? Promise.resolve(undefined)\n )\n },\n }\n\n return uiAdapter?.renderAuditPanel?.(panelContext) ?? renderFallbackAuditPanel(panelContext)\n}\n\nfunction resolveAuditTarget(\n context: SchemaUiContext,\n fallbackRecord?: Record<string, unknown>,\n): { record: Record<string, unknown>; id: unknown; primaryKey: string } | undefined {\n const primaryKey = resolvePrimaryKey(context)\n const record =\n fallbackRecord ??\n context.controller?.page.detailRecord ??\n context.form?.values ??\n context.controller?.getValues()\n const id = record?.[primaryKey]\n\n if (!context.resource || !record || id === undefined || id === null || id === '') {\n return undefined\n }\n\n return {\n record,\n id,\n primaryKey,\n }\n}\n\nfunction resolvePrimaryKey(context: SchemaUiContext): string {\n return context.state.viewModel?.schema.primaryKey ?? context.state.schema?.schema.primaryKey ?? 'id'\n}\n\nfunction createAuditLoadInput(\n context: SchemaUiContext,\n target: { record: Record<string, unknown>; id: unknown; primaryKey: string } | undefined,\n) {\n return {\n runtime: context.runtime,\n resource: context.resource,\n view: context.state.viewName,\n payload: context.payload,\n primaryKey: target?.primaryKey ?? resolvePrimaryKey(context),\n id: target?.id,\n record: target?.record,\n }\n}\n\nfunction renderFallbackAuditPanel(context: SchemaAuditPanelContext): VNodeChild {\n return h(\n 'aside',\n {\n class: 'sparq-audit-panel',\n 'data-sparq-audit-panel': '',\n },\n [\n h('header', { class: 'sparq-audit-panel__header' }, [\n h('strong', '审计记录'),\n h(\n 'button',\n {\n type: 'button',\n onClick: () => context.close?.(),\n },\n '关闭',\n ),\n ]),\n renderAuditPanelContent(context),\n ],\n )\n}\n","import {\n evaluateCondition,\n evaluateValueExpression,\n interpolateTemplate,\n resolveFieldRuntimeState,\n type RuntimeFormFooter,\n type RuntimeTableView,\n} from '@sparqjs/schema-core'\nimport type { VNodeChild } from 'vue'\nimport { formatDisplayValue } from '../display-format'\nimport { createSchemaActionContext } from './action-context'\nimport { renderAuditPanel, renderAuditTrigger } from './audit'\nimport { createExpressionContext, createTableFilterContext } from './context'\nimport {\n renderAction,\n renderContainer,\n renderDetailShell,\n renderFormShell,\n renderMissingUiRenderer,\n renderSlot,\n renderStatusContainer,\n resolveDetailPresentation,\n resolveFormOpen,\n resolveFormPresentation,\n} from '../ui'\nimport { renderLayoutItemsChildren, renderOptionalSemanticHelp, renderViewItems } from './layout-node'\nimport type {\n SchemaLayoutItem,\n SchemaTableColumnContext,\n SchemaTableFilterContext,\n SchemaUiAdapter,\n SchemaUiContext,\n SparqViewState,\n} from '../types'\n\ninterface RenderFormStructureOptions {\n embeddedInPage?: boolean\n hideFooter?: boolean\n}\n\n/**\n * 渲染表单视图结构。\n */\nexport function renderFormStructure(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n options: RenderFormStructureOptions = {},\n): VNodeChild {\n const formView = state.mode === 'form' ? state.viewModel?.forms.get(state.viewName) : undefined\n const view = formView ?? (state.view && 'footer' in state.view ? state.view : undefined)\n if (!view) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n const presentation = resolveFormPresentation(context, options.embeddedInPage === true)\n const open = resolveFormOpen(context, options.embeddedInPage === true)\n if (!open) {\n return undefined\n }\n\n const shellOwnsHeader = presentation === 'dialog' || presentation === 'drawer'\n const shellOwnsFooter = shellOwnsHeader\n const formItems = renderViewItems(view.children, context, uiAdapter)\n // 外层操作栏仍通过 controller 执行,因此隐藏展示时也要先注册 footer action executor。\n const footer = renderFormFooter(view.footer, context, uiAdapter)\n const displayedFooter = options.hideFooter === true ? undefined : footer\n const formContent = renderContainer(\n {\n ...context,\n kind: 'form',\n title: shellOwnsHeader ? undefined : view.title,\n help: shellOwnsHeader ? undefined : view.help,\n helpNode: shellOwnsHeader ? undefined : renderOptionalSemanticHelp(view.help, 'form', context),\n props: view.props,\n layout: {\n span: view.span,\n gap: view.gap,\n },\n items: formItems,\n children: renderFormFields(formItems),\n footer: shellOwnsFooter ? undefined : displayedFooter,\n },\n uiAdapter,\n )\n\n return renderFormShell(\n {\n ...context,\n formView: view,\n title: shellOwnsHeader ? view.title : undefined,\n help: shellOwnsHeader ? view.help : undefined,\n helpNode: shellOwnsHeader ? renderOptionalSemanticHelp(view.help, 'form-shell', context) : undefined,\n children: formContent,\n footer: shellOwnsFooter ? displayedFooter : undefined,\n presentation,\n open,\n close: context.controller?.closeForm,\n },\n uiAdapter,\n )\n}\n\n/**\n * 渲染表格视图结构。\n */\nexport function renderTableStructure(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n const table = state.mode === 'table' ? state.viewModel?.tables.get(state.viewName) : undefined\n const view = table ?? (state.view && 'columns' in state.view ? state.view : undefined)\n if (!view) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n const toolbar = view.toolbar.visible\n ? renderSlot('toolbar', [\n renderSlot(\n 'toolbar-left',\n view.toolbar.left.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'toolbar-left'), uiAdapter),\n ),\n ),\n renderSlot(\n 'toolbar-right',\n view.toolbar.right.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'toolbar-right'), uiAdapter),\n ),\n ),\n renderSlot(\n 'toolbar-batch',\n view.toolbar.batch.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'batch'), uiAdapter),\n ),\n ),\n renderSlot(\n 'toolbar-filters',\n view.toolbar.filters.map((filter) =>\n renderTableFilter(createTableFilterContext(context, filter), uiAdapter),\n ),\n ),\n ])\n : undefined\n\n const columns = renderTableColumns(view, context, uiAdapter)\n const tableBody =\n uiAdapter?.renderTable?.({\n ...context,\n table: view,\n columns,\n tableState: context.controller?.table.state,\n }) ?? renderMissingUiRenderer('renderTable')\n const pagination = view.pagination.visible\n ? (uiAdapter?.renderTablePagination?.({\n ...context,\n pagination: view.pagination,\n tableState: context.controller?.table.state,\n }) ?? renderMissingUiRenderer('renderTablePagination'))\n : undefined\n\n return renderContainer(\n {\n ...context,\n kind: 'table',\n title: view.title,\n help: view.help,\n helpNode: renderOptionalSemanticHelp(view.help, 'table', context),\n props: view.props,\n children: [toolbar, tableBody, pagination ? renderSlot('pagination', pagination) : undefined],\n },\n uiAdapter,\n )\n}\n\n/**\n * 渲染搜索视图结构。\n */\nexport function renderSearchStructure(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n const search = state.mode === 'search' ? state.viewModel?.searches.get(state.viewName) : undefined\n const view = search ?? (state.view && 'operation' in state.view ? state.view : undefined)\n if (!view) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n const items = view.items\n .filter((item) => evaluateCondition(item.raw.show_when, createExpressionContext(context)))\n .map((item) => ({\n span: item.span,\n content:\n uiAdapter?.renderSearchItem?.({\n ...context,\n item,\n options: resolveRuntimeOptions(\n item.field,\n context,\n resolveFieldRuntimeState({\n field: item.fieldSchema,\n dataSource: item.dataSource,\n mode: context.state.mode,\n formMode: context.controller?.page.formMode,\n }).options,\n ),\n }) ?? renderMissingUiRenderer('renderSearchItem'),\n }))\n const actions = view.operation.actions.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'search-operation'), uiAdapter),\n )\n const operation = view.operation.visible ? renderSlot('operation', actions) : undefined\n\n return renderContainer(\n {\n ...context,\n kind: 'search',\n title: view.title,\n helpNode: undefined,\n props: view.props,\n layout: {\n span: view.span,\n gap: view.gap ?? view.layout?.gap,\n },\n items,\n children: [\n renderSlot(\n 'items',\n items.map((item) => item.content),\n ),\n operation,\n ],\n },\n uiAdapter,\n )\n}\n\n/**\n * 渲染详情视图结构。\n */\nexport function renderDetailStructure(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n options: RenderFormStructureOptions = {},\n): VNodeChild {\n const detail = state.mode === 'detail' ? state.viewModel?.details.get(state.viewName) : undefined\n const view = detail ?? (state.view && 'children' in state.view ? state.view : undefined)\n if (!view) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n if (options.embeddedInPage && !context.controller?.page.detailOpen) {\n return undefined\n }\n\n const embeddedInPage = options.embeddedInPage === true\n const presentation = resolveDetailPresentation(view, embeddedInPage)\n const shellOwnsHeader = presentation === 'dialog' || presentation === 'drawer'\n const detailItems = renderViewItems(view.children, context, uiAdapter)\n const detailLayoutItems = detailItems\n const detailContent = renderContainer(\n {\n ...context,\n kind: 'detail',\n title: shellOwnsHeader ? undefined : view.title,\n help: shellOwnsHeader ? undefined : view.help,\n helpNode: shellOwnsHeader ? undefined : renderOptionalSemanticHelp(view.help, 'detail', context),\n props: appendClassProp(view.props, 'sparq-detail'),\n layout: {\n span: view.span ?? 12,\n gap: view.gap ?? 16,\n },\n items: detailLayoutItems,\n children: renderSlot('fields', renderLayoutItemsChildren(detailLayoutItems)),\n },\n uiAdapter,\n )\n\n const detailShell = renderDetailShell(\n {\n ...context,\n detail: view,\n title: resolveDetailTitle(view.title, context),\n help: view.help,\n helpNode: renderOptionalSemanticHelp(view.help, 'detail-shell', context),\n children: detailContent,\n actions: renderAuditTrigger(context, uiAdapter),\n meta: resolveDetailShellMeta(context),\n presentation,\n open: embeddedInPage ? (context.controller?.page.detailOpen ?? false) : true,\n close: embeddedInPage ? context.controller?.closeDetail : undefined,\n },\n uiAdapter,\n )\n\n return [detailShell, renderAuditPanel(context, uiAdapter)]\n}\n\nfunction resolveDetailTitle(title: string | undefined, context: SchemaUiContext): string | undefined {\n return (\n title ??\n context.state.viewModel?.schema.title ??\n context.state.schema?.schema.title ??\n context.state.schema?.resource?.title\n )\n}\n\nfunction resolveDetailShellMeta(context: SchemaUiContext): { updatedAt?: unknown; updatedBy?: unknown } | undefined {\n const record = context.controller?.page.detailRecord ?? context.form?.values ?? context.controller?.getValues()\n const updatedAt = firstRecordValue(record, ['updated_at', 'updatedAt', 'modified_at', 'modifiedAt'])\n const updatedBy = firstRecordValue(record, [\n '_updated_by_label',\n 'updated_by_name',\n 'updatedByName',\n 'updated_by_label',\n 'updatedByLabel',\n 'updated_by',\n 'updatedBy',\n ])\n\n return updatedAt || updatedBy\n ? {\n updatedAt,\n updatedBy,\n }\n : undefined\n}\n\nfunction firstRecordValue(record: Record<string, unknown> | undefined, keys: string[]): unknown {\n if (!record) {\n return undefined\n }\n\n for (const key of keys) {\n const value = record[key]\n if (value !== undefined && value !== null && value !== '') {\n return value\n }\n }\n\n return undefined\n}\n\nfunction renderFormFields(items: SchemaLayoutItem[]): VNodeChild {\n return renderSlot('fields', renderLayoutItemsChildren(items))\n}\n\nfunction renderFormFooter(\n footer: RuntimeFormFooter,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n if (!footer.visible) {\n return undefined\n }\n\n return renderSlot(\n 'footer',\n footer.actions.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'form-footer'), uiAdapter),\n ),\n footer.props,\n )\n}\n\nfunction renderTableColumns(\n view: RuntimeTableView,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild[] {\n const columns: VNodeChild[] = []\n\n if (view.selection.visible) {\n columns.push(\n renderTableColumn(\n {\n ...context,\n kind: 'selection',\n selection: view.selection,\n },\n uiAdapter,\n ),\n )\n }\n\n if (view.index.visible) {\n columns.push(\n renderTableColumn(\n {\n ...context,\n kind: 'index',\n index: view.index,\n },\n uiAdapter,\n ),\n )\n }\n\n columns.push(\n ...view.columns\n .filter((column) => evaluateCondition(column.raw.show_when, createExpressionContext(context)))\n .map((column) =>\n renderTableColumn(\n {\n ...context,\n kind: 'data',\n column,\n renderCell(record) {\n return renderTableCell(column, record, context)\n },\n },\n uiAdapter,\n ),\n ),\n )\n\n if (view.operate.visible) {\n columns.push(\n renderTableColumn(\n {\n ...context,\n kind: 'operate',\n operate: view.operate,\n actions: view.operate.actions.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'operate'), uiAdapter),\n ),\n renderActions(record) {\n return view.operate.actions.map((action) =>\n renderAction(createSchemaActionContext(context, action, 'operate', record), uiAdapter),\n )\n },\n },\n uiAdapter,\n ),\n )\n }\n\n return columns\n}\n\nfunction renderTableColumn(context: SchemaTableColumnContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n return uiAdapter?.renderTableColumn?.(context) ?? renderMissingUiRenderer('renderTableColumn')\n}\n\nfunction renderTableFilter(context: SchemaTableFilterContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n return uiAdapter?.renderTableFilter?.(context) ?? renderMissingUiRenderer('renderTableFilter')\n}\n\nfunction renderTableCell(\n column: RuntimeTableView['columns'][number],\n record: Record<string, unknown>,\n context: SchemaUiContext,\n): VNodeChild {\n const value = resolveTableCellValue(column, record, context)\n const options = resolveRuntimeOptions(\n column.field,\n context,\n column.fieldSchema\n ? resolveFieldRuntimeState({\n field: column.fieldSchema,\n dataSource: undefined,\n mode: context.state.mode,\n formMode: context.controller?.page.formMode,\n }).options\n : [],\n )\n const custom = column.componentKey\n ? context.components?.render(\n column.componentKey,\n {\n field: column.fieldSchema,\n componentKey: column.componentKey,\n props: column.props,\n value,\n record,\n text: formatDisplayValue(value),\n options,\n column,\n },\n undefined,\n {\n ui: context.ui,\n runtime: context.runtime,\n icons: context.icons,\n richTextEditors: context.richTextEditors,\n assetService: context.assetService,\n mode: context.state.mode,\n viewName: context.state.viewName,\n resource: context.resource,\n diagnostics: context.diagnostics,\n field: column.fieldSchema,\n },\n )\n : undefined\n\n return custom ?? formatDisplayValue(value)\n}\n\nfunction resolveTableCellValue(\n column: RuntimeTableView['columns'][number],\n record: Record<string, unknown>,\n context: SchemaUiContext,\n): unknown {\n const expressionContext = createExpressionContext(context, record)\n if (column.value) {\n return evaluateValueExpression(column.value, expressionContext)\n }\n\n if (column.template) {\n return interpolateTemplate(column.template, expressionContext)\n }\n\n return column.field ? record[column.field] : undefined\n}\n\nfunction resolveRuntimeOptions(\n field: string | undefined,\n context: SchemaUiContext,\n fallback: ReturnType<typeof resolveFieldRuntimeState>['options'],\n) {\n if (!field) {\n return fallback\n }\n\n return context.form?.options && Object.prototype.hasOwnProperty.call(context.form.options, field)\n ? (context.form.options[field] ?? [])\n : fallback\n}\n\nfunction appendClassProp(props: Record<string, unknown> | undefined, className: string): Record<string, unknown> {\n return {\n ...props,\n class: [className, props?.class],\n }\n}\n","import {\n BUILTIN_ACTION_ATTACH,\n BUILTIN_ACTION_CREATE,\n BUILTIN_ACTION_DELETE,\n BUILTIN_ACTION_DETACH,\n BUILTIN_ACTION_SUBMIT,\n BUILTIN_ACTION_UPDATE,\n SCHEMA_UI_ALERT,\n createDefaultInitialValues,\n createRelationListFilters,\n createRelationListPayload,\n createRelationListSelectionFilters,\n executeRelationListOperation,\n inferTableOperateColumnWidth,\n isRelationListOperationEnabled,\n isRelationListParentMissing,\n RELATION_LIST_DIRECT_ACTION_HANDLER,\n resolveAction,\n resolveRelationListOperationConfig,\n resolveRelationListOperationForm,\n resolveRelationListOperationInteraction,\n resolveRelationListOperationPlacement,\n resolveRelationListRefreshMode,\n resolveRelationListResource,\n resolveRelationListSelectionTable,\n type RelationListOperation,\n type ResolvedAction,\n type ResourceViewModel,\n type RuntimeFormView,\n type RuntimeTableView,\n type RuntimeViewNode,\n} from '@sparqjs/schema-core'\nimport type { ActionRef, RelationListBinding, SchemaResource } from '@sparqjs/schema-protocol'\nimport { h, reactive, type VNodeChild } from 'vue'\nimport { createSparqViewController } from '../runtime'\nimport { createSchemaActionContext } from './action-context'\nimport { renderFormStructure } from './view-structures'\nimport { renderAction, renderContainer, renderFormShell, renderMissingUiRenderer, renderSlot } from '../ui'\nimport type {\n SchemaActionContext,\n SchemaActionExecuteContext,\n SchemaTableColumnContext,\n SchemaUiAdapter,\n SchemaUiContext,\n SparqViewController,\n SparqViewState,\n} from '../types'\n\ntype EmbeddedRelationStatus = 'loading' | 'ready' | 'error'\n\ninterface EmbeddedRelationState {\n status: EmbeddedRelationStatus\n error?: unknown\n schema?: SchemaResource\n viewModel?: ResourceViewModel\n table?: RuntimeTableView\n pickerTable?: RuntimeTableView\n operationForms?: Partial<Record<RelationListOperation, RuntimeFormView>>\n operationFormNames?: Partial<Record<RelationListOperation, string>>\n activeOperation?: RelationListOperation\n activeRecord?: Record<string, unknown>\n pickerOperation?: RelationListOperation\n pickerAction?: ResolvedAction\n pickerRecord?: Record<string, unknown>\n controller?: SparqViewController\n pickerController?: SparqViewController\n pickerOpen: boolean\n selectionExecuting: boolean\n initialization?: Promise<void>\n}\n\nconst relationStateCache = new WeakMap<object, Map<string, EmbeddedRelationState>>()\nconst relationSchemaCache = new WeakMap<object, Map<string, Promise<SchemaResource>>>()\n\nexport function renderEmbeddedViewBinding(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild | undefined {\n const binding = node.binding\n if (node.type !== 'view' || binding?.type !== 'relation-list') {\n return undefined\n }\n\n const parentValue = resolveRelationParentValue(binding, context)\n if (isRelationListParentMissing(binding, parentValue) && binding.whenParentMissing === 'hidden') {\n return undefined\n }\n\n const relation = resolveEmbeddedRelationState(node, binding, parentValue, context)\n if (relation.status === 'loading') {\n return renderRelationStatus(node, context, '正在加载关联数据...', 'info', uiAdapter)\n }\n if (relation.status === 'error' || !relation.controller || !relation.table) {\n return renderRelationStatus(node, context, relationErrorMessage(relation.error), 'error', uiAdapter)\n }\n\n const embeddedContext = createEmbeddedTableContext(node, binding, parentValue, relation, context)\n const parentMissing = isRelationListParentMissing(binding, parentValue)\n const notice = parentMissing\n ? renderRelationNotice(embeddedContext, '请先保存主记录,再管理关联资源。', 'warning')\n : undefined\n const table = renderEmbeddedTable(node, relation.table, relation.controller, embeddedContext, uiAdapter, true)\n const picker = renderRelationPicker(node, binding, parentValue, relation, context, uiAdapter)\n\n return [notice, table, picker]\n}\n\nfunction resolveEmbeddedRelationState(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n context: SchemaUiContext,\n): EmbeddedRelationState {\n const owner = context.controller ?? context.state\n let states = relationStateCache.get(owner)\n if (!states) {\n states = new Map()\n relationStateCache.set(owner, states)\n }\n\n const resource = resolveRelationListResource(binding, node.raw.resource, context.resource)\n const prefix = [node.id, resource, node.raw.view ?? 'default'].join(':')\n const key = [prefix, relationValueKey(binding), relationValueKey(parentValue)].join(':')\n const existing = states.get(key)\n if (existing) {\n return existing\n }\n\n for (const cachedKey of states.keys()) {\n if (cachedKey.startsWith(`${prefix}:`)) {\n states.delete(cachedKey)\n }\n }\n\n const state = reactive<EmbeddedRelationState>({\n status: 'loading',\n pickerOpen: false,\n selectionExecuting: false,\n })\n states.set(key, state)\n state.initialization = initializeEmbeddedRelationState(state, node, binding, parentValue, resource, context)\n return state\n}\n\nasync function initializeEmbeddedRelationState(\n state: EmbeddedRelationState,\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n resource: string,\n context: SchemaUiContext,\n): Promise<void> {\n try {\n const schema = await loadEmbeddedResourceSchema(resource, binding, parentValue, context)\n const viewModel =\n schema === context.state.schema ? context.state.viewModel : context.runtime.buildViewModel(schema)\n if (!viewModel) {\n throw new Error(`目标资源 \"${resource}\" 无法构建视图模型。`)\n }\n\n const tableName = node.raw.view ?? 'default'\n const resolvedTable = viewModel.tables.get(tableName) ?? context.state.viewModel?.tables.get(tableName)\n if (!resolvedTable) {\n throw new Error(`目标资源 \"${resource}\" 未配置表格视图 \"${tableName}\"。`)\n }\n const table = applyRelationOperationActions(applyRelationPagination(resolvedTable, binding), binding)\n\n const targetSchemaAvailable =\n resource === context.resource || Boolean(context.runtime.options.dataAdapter?.loadSchema)\n const operationForms: Partial<Record<RelationListOperation, RuntimeFormView>> = {}\n const operationFormNames: Partial<Record<RelationListOperation, string>> = {}\n if (targetSchemaAvailable) {\n for (const operation of RELATION_OPERATIONS) {\n const interaction = resolveRelationListOperationInteraction(binding, operation)\n if (interaction.type !== 'form') {\n continue\n }\n const formName = resolveRelationListOperationForm(binding, operation, 'default')\n const form = viewModel.forms.get(formName)\n if (form) {\n operationForms[operation] = form\n operationFormNames[operation] = formName\n }\n }\n }\n const initialPageSize = binding.pagination?.pageSize ?? table.pagination.pageSize\n const controller = createSparqViewController({\n schema: viewModel.schema,\n initialPageSize,\n })\n const pickerController = createSparqViewController({\n schema: viewModel.schema,\n initialPageSize,\n })\n\n state.schema = schema\n state.viewModel = viewModel\n state.table = table\n state.operationForms = operationForms\n state.operationFormNames = operationFormNames\n state.controller = controller\n state.pickerController = pickerController\n state.status = 'ready'\n\n if (binding.query?.sorts?.length) {\n controller.table.setSort(binding.query.sorts)\n pickerController.table.setSort(binding.query.sorts)\n }\n\n if (!isRelationListParentMissing(binding, parentValue) && context.runtime.options.dataAdapter?.list) {\n await reloadRelationTable(node, binding, parentValue, state, context)\n }\n } catch (error) {\n state.error = error\n state.status = 'error'\n }\n}\n\nasync function loadEmbeddedResourceSchema(\n resource: string,\n binding: RelationListBinding,\n parentValue: unknown,\n context: SchemaUiContext,\n): Promise<SchemaResource> {\n if (resource === context.resource || !context.runtime.options.dataAdapter?.loadSchema) {\n if (!context.state.schema) {\n throw new Error(`目标资源 \"${resource}\" 缺少 Schema。`)\n }\n return context.state.schema\n }\n\n let cache = relationSchemaCache.get(context.runtime)\n if (!cache) {\n cache = new Map()\n relationSchemaCache.set(context.runtime, cache)\n }\n const cached = cache.get(resource)\n if (cached) {\n return cached\n }\n\n const loading = context.runtime.loadSchema({\n resource,\n payload: createRelationListPayload(binding, parentValue, undefined, context.payload),\n })\n cache.set(resource, loading)\n try {\n return await loading\n } catch (error) {\n cache.delete(resource)\n throw error\n }\n}\n\nasync function reloadRelationTable(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n relation: EmbeddedRelationState,\n context: SchemaUiContext,\n): Promise<unknown> {\n if (!relation.controller || !relation.table) {\n return undefined\n }\n return relation.controller.table.reload({\n runtime: context.runtime,\n resource: resolveRelationListResource(binding, node.raw.resource, context.resource),\n view: node.raw.view ?? 'default',\n tableMode: relation.table.mode,\n tableTree: relation.table.tree,\n filters: createRelationListFilters(binding, parentValue),\n payload: createRelationListPayload(binding, parentValue, undefined, context.payload),\n })\n}\n\nfunction renderEmbeddedTable(\n node: RuntimeViewNode,\n table: RuntimeTableView,\n controller: SparqViewController,\n context: SchemaUiContext,\n uiAdapter: SchemaUiAdapter | undefined,\n includeForm: boolean,\n): VNodeChild {\n const toolbar = renderEmbeddedTableToolbar(node, table, context, uiAdapter)\n const columns = renderEmbeddedTableColumns(node, table, context, uiAdapter)\n const form = includeForm ? renderEmbeddedChildForm(context, uiAdapter) : undefined\n const tableBody =\n uiAdapter?.renderTable?.({\n ...context,\n table,\n columns,\n tableState: controller.table.state,\n }) ?? renderMissingUiRenderer('renderTable')\n const pagination = table.pagination.visible\n ? (uiAdapter?.renderTablePagination?.({\n ...context,\n pagination: table.pagination,\n tableState: controller.table.state,\n }) ?? renderMissingUiRenderer('renderTablePagination'))\n : undefined\n\n return renderContainer(\n {\n ...context,\n kind: 'table',\n title: table.title ?? node.raw.title,\n help: table.help ?? node.raw.help,\n props: {\n ...table.props,\n 'data-sparq-embedded-table': node.id,\n },\n children: [toolbar, form, tableBody, pagination ? renderSlot('pagination', pagination) : undefined],\n },\n uiAdapter,\n )\n}\n\nfunction renderEmbeddedChildForm(context: SchemaUiContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n const controller = context.controller\n const formView = controller?.page.formMode === 'edit' ? context.pageUpdateForm : context.pageCreateForm\n const formViewName = controller?.page.formMode === 'edit' ? context.pageUpdateFormName : context.pageCreateFormName\n if (!controller?.page.formOpen || !formView || !formViewName) {\n return undefined\n }\n\n const formState: SparqViewState = {\n ...context.state,\n mode: 'form',\n viewName: formViewName,\n view: formView,\n }\n const formContext: SchemaUiContext = {\n ...context,\n state: formState,\n form: controller.form,\n }\n return renderFormStructure(formState, formContext, uiAdapter, { embeddedInPage: true })\n}\n\nfunction renderEmbeddedTableToolbar(\n node: RuntimeViewNode,\n table: RuntimeTableView,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild | undefined {\n if (!table.toolbar.visible) {\n return undefined\n }\n\n return renderSlot('toolbar', [\n renderSlot(\n 'toolbar-left',\n table.toolbar.left.map((action) =>\n renderAction(createEmbeddedActionContext(node, context, action, 'toolbar-left'), uiAdapter),\n ),\n ),\n renderSlot(\n 'toolbar-right',\n table.toolbar.right.map((action) =>\n renderAction(createEmbeddedActionContext(node, context, action, 'toolbar-right'), uiAdapter),\n ),\n ),\n renderSlot(\n 'toolbar-batch',\n table.toolbar.batch.map((action) =>\n renderAction(createEmbeddedActionContext(node, context, action, 'batch'), uiAdapter),\n ),\n ),\n ])\n}\n\nfunction renderEmbeddedTableColumns(\n node: RuntimeViewNode,\n table: RuntimeTableView,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild[] {\n const columns: VNodeChild[] = []\n\n if (table.selection.visible) {\n columns.push(\n renderEmbeddedTableColumn({ ...context, kind: 'selection', selection: table.selection }, uiAdapter),\n )\n }\n if (table.index.visible) {\n columns.push(renderEmbeddedTableColumn({ ...context, kind: 'index', index: table.index }, uiAdapter))\n }\n columns.push(\n ...table.columns.map((column) =>\n renderEmbeddedTableColumn(\n {\n ...context,\n kind: 'data',\n column,\n renderCell(record) {\n return formatEmbeddedCellValue(column.field ? record[column.field] : undefined)\n },\n },\n uiAdapter,\n ),\n ),\n )\n if (table.operate.visible) {\n columns.push(\n renderEmbeddedTableColumn(\n {\n ...context,\n kind: 'operate',\n operate: table.operate,\n actions: table.operate.actions.map((action) =>\n renderAction(createEmbeddedActionContext(node, context, action, 'operate'), uiAdapter),\n ),\n renderActions(record) {\n return table.operate.actions.map((action) =>\n renderAction(\n createEmbeddedActionContext(node, context, action, 'operate', record),\n uiAdapter,\n ),\n )\n },\n },\n uiAdapter,\n ),\n )\n }\n return columns\n}\n\nfunction renderEmbeddedTableColumn(context: SchemaTableColumnContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n return uiAdapter?.renderTableColumn?.(context) ?? renderMissingUiRenderer('renderTableColumn')\n}\n\nfunction createEmbeddedActionContext(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n action: ResolvedAction,\n placement: SchemaActionContext['placement'],\n record?: Record<string, unknown>,\n): SchemaActionContext {\n const binding = node.binding\n const operation = relationOperationForAction(action.action)\n const parentMissing =\n binding?.type === 'relation-list' &&\n isRelationListParentMissing(binding, resolveRelationParentValue(binding, context))\n const enabled =\n !operation || binding?.type !== 'relation-list' || isRelationListOperationEnabled(binding, operation)\n const resolvedAction: ResolvedAction = {\n ...action,\n props: {\n ...action.props,\n visible: action.props?.visible === false || !enabled ? false : action.props?.visible,\n disabled: action.props?.disabled === true || parentMissing,\n },\n }\n return createSchemaActionContext(context, resolvedAction, placement, record)\n}\n\nfunction createEmbeddedTableContext(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n relation: EmbeddedRelationState,\n context: SchemaUiContext,\n): SchemaUiContext {\n const resource = resolveRelationListResource(binding, node.raw.resource, context.resource)\n const table = relation.table!\n const filters = isRelationListParentMissing(binding, parentValue)\n ? undefined\n : createRelationListFilters(binding, parentValue)\n const activeForm = relation.activeOperation ? relation.operationForms?.[relation.activeOperation] : undefined\n const activeFormName = relation.activeOperation\n ? relation.operationFormNames?.[relation.activeOperation]\n : undefined\n return {\n ...context,\n state: {\n ...context.state,\n mode: 'table',\n viewName: node.raw.view ?? 'default',\n resource,\n schema: relation.schema,\n viewModel: relation.viewModel,\n view: table,\n tableReloadViewName: node.raw.view ?? 'default',\n tableReloadMode: table.mode,\n tableReloadTree: table.tree,\n },\n resource,\n payload: createRelationListPayload(binding, parentValue, undefined, context.payload),\n controller: relation.controller,\n form: relation.controller?.form,\n pageCreateForm: activeForm ?? relation.operationForms?.create,\n pageCreateFormName: activeFormName ?? relation.operationFormNames?.create,\n pageUpdateForm: activeForm ?? relation.operationForms?.update,\n pageUpdateFormName: activeFormName ?? relation.operationFormNames?.update,\n onAction: createRelationActionInterceptor(node, binding, parentValue, relation, context),\n tableReloadFilters: filters,\n resolveTableReloadView() {\n return node.raw.view ?? 'default'\n },\n resolveTableReloadMode() {\n return table.mode\n },\n resolveTableReloadTree() {\n return table.tree\n },\n resolveTableReloadFilters() {\n return filters\n },\n }\n}\n\nfunction createRelationActionInterceptor(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n relation: EmbeddedRelationState,\n parentContext: SchemaUiContext,\n) {\n return async (actionContext: SchemaActionExecuteContext) => {\n const actionOperation = relationOperationForAction(actionContext.action.action)\n const operation =\n actionOperation ??\n (actionContext.action.action === BUILTIN_ACTION_SUBMIT ? relation.activeOperation : undefined)\n const operationRecord = actionOperation ? actionContext.record : relation.activeRecord\n const parentResult = await parentContext.onAction?.({\n ...actionContext,\n payload: createEmbeddedRelationPayload(\n binding,\n parentValue,\n operation,\n parentContext.payload,\n operationRecord,\n ),\n })\n if (parentResult === false || isHandledExternalResult(parentResult)) {\n return parentResult\n }\n\n if (actionOperation) {\n const interaction = resolveRelationListOperationInteraction(binding, actionOperation)\n if (interaction.type === 'form') {\n await openRelationForm(\n node,\n binding,\n parentValue,\n actionOperation,\n actionContext.record,\n relation,\n parentContext,\n )\n return { handled: true }\n }\n if (interaction.type === 'selection') {\n await openRelationPicker(\n node,\n binding,\n parentValue,\n actionOperation,\n actionContext.action,\n actionContext.record,\n relation,\n parentContext,\n )\n return { handled: true }\n }\n if (interaction.type === 'handler') {\n if (!parentContext.runtime.options.registries?.actionHandlers.has(interaction.handler)) {\n await notifyRelationError(\n parentContext,\n `关系操作交互处理器 \"${interaction.handler}\" 未注册或未由宿主处理。`,\n )\n return { handled: true }\n }\n }\n }\n\n if (\n actionContext.action.action === BUILTIN_ACTION_SUBMIT &&\n binding.foreignKey &&\n !binding.through &&\n (binding.relationType === undefined || binding.relationType === 'has-many')\n ) {\n relation.controller?.setValue(binding.foreignKey, parentValue)\n }\n\n return {\n payload: createEmbeddedRelationPayload(\n binding,\n parentValue,\n operation ?? resolveSubmitOperation(relation.controller),\n externalPayload(parentResult) ?? parentContext.payload,\n operationRecord,\n ),\n }\n }\n}\n\nasync function openRelationForm(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n operation: RelationListOperation,\n record: Record<string, unknown> | undefined,\n relation: EmbeddedRelationState,\n context: SchemaUiContext,\n): Promise<void> {\n const controller = relation.controller\n const form = relation.operationForms?.[operation]\n if (!controller || !form) {\n await notifyRelationError(context, `目标资源未配置 ${operation} 操作使用的表单。`)\n return\n }\n\n const interaction = resolveRelationListOperationInteraction(binding, operation)\n if (interaction.type !== 'form') {\n return\n }\n\n const mode = interaction.mode ?? (operation === 'create' ? 'create' : 'edit')\n if (mode === 'edit') {\n if (!record) {\n await notifyRelationError(context, `${operation} 操作需要当前行记录。`)\n return\n }\n relation.activeOperation = operation\n relation.activeRecord = record\n controller.openEditForm(record)\n await controller.loadEditForm({\n runtime: context.runtime,\n resource: resolveRelationListResource(binding, node.raw.resource, context.resource),\n viewName: relation.operationFormNames?.[operation] ?? 'default',\n form,\n primaryKey: relation.viewModel?.schema.primaryKey ?? 'id',\n record,\n payload: createRelationListPayload(binding, parentValue, operation, context.payload),\n })\n return\n }\n\n relation.activeOperation = operation\n relation.activeRecord = record\n controller.openCreateForm()\n const initialValues = createDefaultInitialValues({\n schema: relation.schema?.schema,\n nodes: form.children,\n })\n if (\n binding.foreignKey &&\n !binding.through &&\n (binding.relationType === undefined || binding.relationType === 'has-many')\n ) {\n initialValues[binding.foreignKey] = parentValue\n }\n controller.setValues(initialValues)\n}\n\nasync function openRelationPicker(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n operation: RelationListOperation,\n action: ResolvedAction,\n record: Record<string, unknown> | undefined,\n relation: EmbeddedRelationState,\n context: SchemaUiContext,\n): Promise<void> {\n const interaction = resolveRelationListOperationInteraction(binding, operation)\n const tableName = resolveRelationListSelectionTable(binding, operation, node.raw.view ?? 'default')\n const table = relation.viewModel?.tables.get(tableName) ?? relation.table\n if (!relation.pickerController || !table || interaction.type !== 'selection') {\n await notifyRelationError(context, '目标资源未配置选择视图。')\n return\n }\n relation.pickerTable = createPickerTableView(table, interaction.multiple !== false)\n relation.pickerOperation = operation\n relation.pickerAction = action\n relation.pickerRecord = record\n relation.pickerOpen = true\n relation.pickerController.table.changeSelection([])\n await relation.pickerController.table.reload({\n runtime: context.runtime,\n resource: resolveRelationListResource(binding, node.raw.resource, context.resource),\n view: tableName,\n tableMode: relation.pickerTable.mode,\n tableTree: relation.pickerTable.tree,\n filters: createRelationListSelectionFilters(binding, parentValue, operation),\n payload: createRelationListPayload(binding, parentValue, operation, context.payload),\n })\n}\n\nfunction renderRelationPicker(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n relation: EmbeddedRelationState,\n parentContext: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n if (!relation.pickerOpen || !relation.pickerController || !relation.pickerTable || !relation.pickerOperation) {\n return undefined\n }\n\n const operation = relation.pickerOperation\n const interaction = resolveRelationListOperationInteraction(binding, operation)\n if (interaction.type !== 'selection') {\n return undefined\n }\n const resource = resolveRelationListResource(binding, node.raw.resource, parentContext.resource)\n const tableName = resolveRelationListSelectionTable(binding, operation, node.raw.view ?? 'default')\n const filters = createRelationListSelectionFilters(binding, parentValue, operation)\n const pickerContext: SchemaUiContext = {\n ...parentContext,\n state: {\n ...parentContext.state,\n mode: 'table',\n resource,\n viewName: tableName,\n schema: relation.schema,\n viewModel: relation.viewModel,\n view: relation.pickerTable,\n },\n resource,\n controller: relation.pickerController,\n form: relation.pickerController.form,\n payload: createRelationListPayload(binding, parentValue, operation, parentContext.payload),\n tableReloadFilters: filters,\n resolveTableReloadView() {\n return tableName\n },\n resolveTableReloadMode() {\n return relation.pickerTable?.mode\n },\n resolveTableReloadTree() {\n return relation.pickerTable?.tree\n },\n resolveTableReloadFilters() {\n return filters\n },\n }\n const table = renderEmbeddedTable(\n node,\n relation.pickerTable,\n relation.pickerController,\n pickerContext,\n uiAdapter,\n false,\n )\n const multiple = interaction.multiple !== false\n const selected = relation.pickerController.table.state.selection.filter(isRecord)\n const attachRecords = multiple ? selected : selected.slice(-1)\n const footer = [\n renderAction(\n createPickerActionContext(pickerContext, createPickerAction('relation.selection.cancel', '取消'), () => {\n relation.pickerOpen = false\n return undefined\n }),\n uiAdapter,\n ),\n renderAction(\n createPickerActionContext(\n pickerContext,\n createPickerAction(\n 'relation.selection.confirm',\n relationSelectionConfirmTitle(operation, relation.pickerAction?.title),\n 'primary',\n attachRecords.length === 0,\n relation.selectionExecuting,\n ),\n () =>\n executeSelectedResources(\n node,\n binding,\n parentValue,\n operation,\n attachRecords,\n relation,\n parentContext,\n ),\n ),\n uiAdapter,\n ),\n ]\n const shell = createPickerFormShell(\n relation.pickerTable.title ?? relation.pickerAction?.title ?? node.raw.title ?? '选择资源',\n )\n\n return renderFormShell(\n {\n ...pickerContext,\n formView: shell,\n children: table,\n footer,\n title: shell.title,\n presentation: 'dialog',\n open: true,\n close() {\n relation.pickerOpen = false\n },\n },\n uiAdapter,\n )\n}\n\nasync function executeSelectedResources(\n node: RuntimeViewNode,\n binding: RelationListBinding,\n parentValue: unknown,\n operation: RelationListOperation,\n records: Record<string, unknown>[],\n relation: EmbeddedRelationState,\n context: SchemaUiContext,\n): Promise<unknown> {\n if (records.length === 0 || relation.selectionExecuting) {\n return undefined\n }\n\n const resource = resolveRelationListResource(binding, node.raw.resource, context.resource)\n const action = relation.pickerAction\n if (action?.confirm && context.runtime.options.confirmAction) {\n const confirmed = await context.runtime.options.confirmAction({\n action,\n confirm: action.confirm,\n context: {\n schema: relation.schema?.schema,\n resource,\n mode: 'table',\n viewName: resolveRelationListSelectionTable(binding, operation, node.raw.view ?? 'default'),\n view: resolveRelationListSelectionTable(binding, operation, node.raw.view ?? 'default'),\n selection: records,\n payload: createRelationListPayload(binding, parentValue, operation, context.payload),\n },\n })\n if (!confirmed) {\n return undefined\n }\n }\n\n relation.selectionExecuting = true\n try {\n const primaryKey = relation.viewModel?.schema.primaryKey ?? 'id'\n await executeRelationListOperation({\n operation,\n binding,\n runtime: context.runtime,\n resource,\n view: resolveRelationListSelectionTable(binding, operation, node.raw.view ?? 'default'),\n primaryKey,\n parentValue,\n record: relation.pickerRecord,\n selection: records,\n payload: context.payload,\n })\n relation.pickerOpen = false\n relation.pickerController?.table.changeSelection([])\n const refresh = resolveRelationListRefreshMode(binding, operation)\n if (refresh === 'none') {\n return undefined\n }\n if (refresh === 'reload-first') {\n relation.controller?.table.setPagination({ page: 1 })\n }\n return reloadRelationTable(node, binding, parentValue, relation, context)\n } catch (error) {\n relation.error = error\n await notifyRelationError(context, relationErrorMessage(error), error)\n return undefined\n } finally {\n relation.selectionExecuting = false\n }\n}\n\nfunction createEmbeddedRelationPayload(\n binding: RelationListBinding,\n parentValue: unknown,\n operation: RelationListOperation | undefined,\n parentPayload: unknown,\n operationRecord: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return {\n ...createRelationListPayload(binding, parentValue, operation, parentPayload),\n operationRecord,\n }\n}\n\nfunction createPickerTableView(table: RuntimeTableView, multiple: boolean): RuntimeTableView {\n return {\n ...table,\n selection: {\n ...table.selection,\n visible: true,\n type: multiple ? 'checkbox' : 'radio',\n },\n toolbar: {\n ...table.toolbar,\n visible: false,\n left: [],\n right: [],\n batch: [],\n },\n operate: {\n ...table.operate,\n visible: false,\n actions: [],\n },\n }\n}\n\nfunction relationSelectionConfirmTitle(operation: RelationListOperation, actionTitle: string | undefined): string {\n if (operation === 'attach') return '确认关联'\n if (operation === 'detach') return '确认解除关联'\n if (operation === 'delete') return '确认删除'\n return `确认${actionTitle ?? '执行'}`\n}\n\nfunction applyRelationPagination(table: RuntimeTableView, binding: RelationListBinding): RuntimeTableView {\n return {\n ...table,\n toolbar: {\n ...table.toolbar,\n batch: [],\n },\n pagination: {\n ...table.pagination,\n visible: binding.pagination ? binding.pagination.enabled !== false : table.pagination.visible,\n pageSize: binding.pagination?.pageSize ?? table.pagination.pageSize,\n },\n }\n}\n\nconst RELATION_OPERATIONS: RelationListOperation[] = ['create', 'attach', 'update', 'detach', 'delete']\nconst RELATION_OPERATION_ACTIONS = new Set<RelationListOperation>(RELATION_OPERATIONS)\n\nfunction applyRelationOperationActions(table: RuntimeTableView, binding: RelationListBinding): RuntimeTableView {\n const toolbarActions = resolveRelationOperationActions(binding, 'toolbar')\n const recordActions = resolveRelationOperationActions(binding, 'row')\n const left = [...toolbarActions, ...filterTargetTableRelationActions(table.toolbar.left)]\n const right = filterTargetTableRelationActions(table.toolbar.right)\n const operateActions = [...recordActions, ...filterTargetTableRelationActions(table.operate.actions)]\n\n return {\n ...table,\n toolbar: {\n ...table.toolbar,\n visible: left.length > 0 || right.length > 0,\n left,\n right,\n batch: [],\n },\n operate: {\n ...table.operate,\n visible: operateActions.length > 0,\n width: table.operate.width ?? inferTableOperateColumnWidth(operateActions),\n actions: operateActions,\n },\n }\n}\n\nfunction resolveRelationOperationActions(binding: RelationListBinding, placement: 'toolbar' | 'row'): ResolvedAction[] {\n return RELATION_OPERATIONS.map((operation) => {\n const config = resolveRelationListOperationConfig(binding, operation)\n if (\n !config ||\n config.enabled === false ||\n resolveRelationListOperationPlacement(binding, operation) !== placement\n ) {\n return undefined\n }\n const ref: ActionRef = {\n action: operation,\n title: config.title,\n icon: config.icon,\n type: config.type,\n confirm: config.confirm,\n props: config.props,\n }\n const action = resolveAction({ ref, defaultScope: placement === 'toolbar' ? 'collection' : 'record' }).action\n if (!action) {\n return undefined\n }\n const interaction = resolveRelationListOperationInteraction(binding, operation)\n const resolved: ResolvedAction = {\n ...action,\n handler:\n interaction.type === 'handler'\n ? interaction.handler\n : interaction.type === 'direct'\n ? RELATION_LIST_DIRECT_ACTION_HANDLER\n : action.handler,\n }\n return resolved\n }).filter((action): action is ResolvedAction => Boolean(action))\n}\n\nfunction filterTargetTableRelationActions(actions: ResolvedAction[]): ResolvedAction[] {\n return actions.filter((action) => !RELATION_OPERATION_ACTIONS.has(action.action as RelationListOperation))\n}\n\nfunction createPickerFormShell(title: string): RuntimeFormView {\n return {\n raw: {\n title,\n wrapper: { type: 'dialog' },\n footer: false,\n children: [],\n },\n title,\n wrapper: { type: 'dialog' },\n footer: { visible: false, actions: [] },\n children: [],\n diagnostics: [],\n }\n}\n\nfunction createPickerAction(\n action: string,\n title: string,\n type?: string,\n disabled = false,\n loading = false,\n): ResolvedAction {\n return {\n action,\n title,\n kind: 'builtin',\n scope: 'collection',\n type,\n props: { disabled, loading },\n source: { builtin: true, custom: false },\n }\n}\n\nfunction createPickerActionContext(\n context: SchemaUiContext,\n action: ResolvedAction,\n execute: () => unknown,\n): SchemaActionContext {\n return {\n ...context,\n action,\n placement: 'toolbar-right',\n execute: async () => execute(),\n }\n}\n\nfunction relationOperationForAction(action: string): RelationListOperation | undefined {\n if (action === BUILTIN_ACTION_CREATE) return 'create'\n if (action === BUILTIN_ACTION_ATTACH) return 'attach'\n if (action === BUILTIN_ACTION_UPDATE) return 'update'\n if (action === BUILTIN_ACTION_DETACH) return 'detach'\n if (action === BUILTIN_ACTION_DELETE) return 'delete'\n return undefined\n}\n\nfunction resolveSubmitOperation(controller: SparqViewController | undefined): RelationListOperation | undefined {\n if (controller?.page.formMode === 'create') return 'create'\n if (controller?.page.formMode === 'edit') return 'update'\n return undefined\n}\n\nfunction resolveRelationParentValue(binding: RelationListBinding, context: SchemaUiContext): unknown {\n if (isRecord(context.payload) && 'parentValue' in context.payload) {\n return context.payload.parentValue\n }\n const parentKey = binding.parentKey ?? context.state.schema?.schema.primaryKey ?? 'id'\n return context.form?.values[parentKey]\n}\n\nfunction renderRelationStatus(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n message: string,\n type: 'info' | 'error',\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n return renderContainer(\n {\n ...context,\n kind: 'section',\n title: node.raw.title,\n children: renderRelationNotice(context, message, type),\n },\n uiAdapter,\n )\n}\n\nfunction renderRelationNotice(\n context: SchemaUiContext,\n message: string,\n type: 'info' | 'warning' | 'error',\n): VNodeChild {\n return (\n context.ui.render(\n SCHEMA_UI_ALERT,\n {\n title: message,\n type,\n closable: false,\n showIcon: true,\n },\n undefined,\n ) ?? h('p', { class: `sparq-relation-notice is-${type}` }, message)\n )\n}\n\nasync function notifyRelationError(context: SchemaUiContext, message: string, error?: unknown): Promise<void> {\n await context.runtime.options.notify?.({\n type: 'error',\n message,\n error,\n })\n}\n\nfunction relationErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '关联资源加载失败。'\n}\n\nfunction externalPayload(result: unknown): unknown {\n return isRecord(result) && 'payload' in result ? result.payload : undefined\n}\n\nfunction isHandledExternalResult(result: unknown): boolean {\n return isRecord(result) && result.handled === true\n}\n\nfunction relationValueKey(value: unknown): string {\n return value === undefined ? 'undefined' : JSON.stringify(value)\n}\n\nfunction formatEmbeddedCellValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return '-'\n }\n if (Array.isArray(value)) {\n return value.map((item) => formatEmbeddedCellValue(item)).join(', ')\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import { resolveFieldRuntimeState, type RuntimeViewNode } from '@sparqjs/schema-core'\nimport type { VNodeChild } from 'vue'\nimport type { SchemaFieldComponentProps } from '../registry'\nimport { renderMissingUiRenderer } from '../ui'\nimport { renderOptionalSemanticHelp } from './view-node'\nimport type { SchemaFieldBinding, SchemaFieldChangeContext, SchemaUiAdapter, SchemaUiContext } from '../types'\nimport { applyFieldWriteBack } from '../runtime'\n\n/**\n * 渲染单个字段节点,并支持业务组件注册表覆盖。\n */\nexport function renderFieldNode(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n state: { disabled: boolean; readonly: boolean } = { disabled: false, readonly: false },\n): VNodeChild {\n const binding = createFieldBinding(node, context)\n const activate = createFieldActivate(node, context)\n const runtimeState = resolveFieldRuntimeState({\n field: node.fieldSchema,\n dataSource: node.raw.dataSource,\n mode: context.state.mode,\n formMode: context.controller?.page.formMode,\n disabled: state.disabled,\n readonly: state.readonly,\n })\n const options = resolveFieldOptions(node.field, context, runtimeState.options)\n const componentProps = createFieldComponentProps(node, binding, {\n ...runtimeState,\n options,\n }, context.form?.values)\n const helpNode = renderOptionalSemanticHelp(node.raw.help ?? runtimeState.help, 'field', context)\n const custom = node.componentKey\n ? context.components?.render(node.componentKey, componentProps, undefined, {\n ui: context.ui,\n runtime: context.runtime,\n icons: context.icons,\n richTextEditors: context.richTextEditors,\n assetService: context.assetService,\n mode: context.state.mode,\n viewName: context.state.viewName,\n resource: context.resource,\n diagnostics: context.diagnostics,\n node,\n field: node.fieldSchema,\n })\n : undefined\n\n if (custom !== undefined) {\n return (\n uiAdapter?.renderField?.({\n ...context,\n node,\n activate,\n binding,\n disabled: componentProps.disabled,\n readonly: componentProps.readonly,\n placeholder: componentProps.placeholder,\n options,\n tip: node.raw.tip,\n helpNode,\n contentNode: custom,\n }) ?? renderMissingUiRenderer('renderField')\n )\n }\n\n return (\n uiAdapter?.renderField?.({\n ...context,\n node,\n activate,\n binding,\n disabled: componentProps.disabled,\n readonly: componentProps.readonly,\n placeholder: componentProps.placeholder,\n options,\n tip: node.raw.tip,\n helpNode,\n }) ?? renderMissingUiRenderer('renderField')\n )\n}\n\nfunction createFieldActivate(node: RuntimeViewNode, context: SchemaUiContext): (() => void) | undefined {\n if (!node.fieldSchema || !context.onFieldActivate) {\n return undefined\n }\n return () => {\n context.onFieldActivate?.({\n field: node.fieldSchema as NonNullable<RuntimeViewNode['fieldSchema']>,\n nodeId: node.id,\n mode: context.state.mode,\n view: context.state.viewName,\n resource: context.resource ?? context.state.schema?.resource?.name ?? context.state.schema?.schema.name,\n })\n }\n}\n\nfunction createFieldComponentProps(\n node: RuntimeViewNode,\n binding?: SchemaFieldBinding,\n state: ReturnType<typeof resolveFieldRuntimeState> = {\n disabled: false,\n readonly: false,\n options: [],\n },\n formValues?: Record<string, unknown>,\n): SchemaFieldComponentProps {\n return {\n node,\n field: node.fieldSchema,\n componentKey: node.componentKey,\n props: node.props ?? node.raw.props,\n disabled: state.disabled,\n readonly: state.readonly,\n placeholder: state.placeholder ?? node.placeholder,\n value: binding?.value,\n onChange: binding?.onChange,\n onBlur: binding?.onBlur,\n errors: binding?.errors,\n loading: binding?.loading,\n options: state.options,\n formValues,\n }\n}\n\nfunction createFieldBinding(node: RuntimeViewNode, context: SchemaUiContext): SchemaFieldBinding | undefined {\n if (!node.field) {\n return undefined\n }\n const options = resolveFieldOptions(node.field, context, [])\n const optionLoading = context.form?.optionLoading?.[node.field] ?? false\n const value = context.form?.values[node.field]\n const loadOptions = node.fieldSchema\n ? (input: Parameters<NonNullable<SchemaFieldBinding['loadOptions']>>[0]) => {\n const optionInput = normalizeOptionsLoadInput(input)\n return (\n context.form?.loadOptions?.({\n runtime: context.runtime,\n field: node.fieldSchema as NonNullable<RuntimeViewNode['fieldSchema']>,\n fieldName: node.field,\n dataSource: node.raw.dataSource,\n resource: context.resource,\n view: context.state.viewName,\n payload: context.payload,\n keyword: optionInput.keyword,\n values: optionInput.values,\n parentValue: optionInput.parentValue,\n }) ?? Promise.resolve([])\n )\n }\n : undefined\n\n ensureSelectedRelationOptions(node, value, options, optionLoading, loadOptions)\n\n return {\n value,\n onChange(value, changeContext?: SchemaFieldChangeContext) {\n context.form?.setValue?.(node.field as string, value, node)\n applyFieldWriteBack({\n props: node.raw.props,\n form: context.form,\n node,\n sourceField: node.field,\n context: {\n ...changeContext,\n value,\n },\n })\n },\n onBlur() {\n context.form?.setTouched?.(node.field as string, node)\n },\n errors: context.form?.errors?.[node.field] ?? [],\n loading: context.form?.loading?.[node.field] ?? false,\n options,\n optionLoading,\n optionError: context.form?.optionErrors?.[node.field],\n loadOptions,\n }\n}\n\nfunction ensureSelectedRelationOptions(\n node: RuntimeViewNode,\n value: unknown,\n options: SchemaFieldBinding['options'],\n optionLoading: boolean,\n loadOptions: SchemaFieldBinding['loadOptions'] | undefined,\n): void {\n if (!loadOptions || optionLoading || !isRelationField(node) || isEmptySelectedValue(value)) {\n return\n }\n\n const values = Array.isArray(value) ? value : [value]\n const missing = values.filter((item) => !hasOptionValue(options, item))\n if (missing.length === 0) {\n return\n }\n\n void loadOptions({ values: missing }).catch(() => undefined)\n}\n\nfunction isRelationField(node: RuntimeViewNode): boolean {\n return node.raw.dataSource?.type === 'reference' || Boolean(node.fieldSchema?.reference)\n}\n\nfunction isEmptySelectedValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true\n }\n return Array.isArray(value) && value.length === 0\n}\n\nfunction hasOptionValue(options: SchemaFieldBinding['options'], value: unknown): boolean {\n for (const option of options) {\n if (optionValuesEqual(option.value, value)) {\n return true\n }\n if (option.children && hasOptionValue(option.children, value)) {\n return true\n }\n }\n return false\n}\n\nfunction optionValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\nfunction normalizeOptionsLoadInput(input: Parameters<NonNullable<SchemaFieldBinding['loadOptions']>>[0]) {\n if (typeof input === 'string' || input === undefined) {\n return {\n keyword: input,\n }\n }\n return input\n}\n\nfunction resolveFieldOptions(\n field: string | undefined,\n context: SchemaUiContext,\n fallback: NonNullable<ReturnType<typeof resolveFieldRuntimeState>['options']>,\n) {\n if (!field) {\n return fallback\n }\n\n return context.form?.options && Object.prototype.hasOwnProperty.call(context.form.options, field)\n ? (context.form.options[field] ?? [])\n : fallback\n}\n","import {\n SCHEMA_COMPONENT_HELP,\n SCHEMA_COMPONENT_SECTION,\n resolveNodeState,\n type RuntimeFormView,\n type RuntimeViewNode,\n} from '@sparqjs/schema-core'\nimport { h, isVNode, type VNodeChild } from 'vue'\nimport { createExpressionContext } from './context'\nimport { renderEmbeddedViewBinding } from './embedded-view'\nimport { normalizeChildren } from '../ui'\nimport { renderFieldNode } from './field-node'\nimport type { SchemaFormState, SchemaLayoutConfig, SchemaLayoutItem, SchemaUiAdapter, SchemaUiContext } from '../types'\n\n/**\n * 将可见子节点渲染为布局项。\n */\nexport function renderViewItems(\n nodes: RuntimeViewNode[],\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): SchemaLayoutItem[] {\n return nodes\n .map((node) => renderViewItem(node, context, uiAdapter))\n .filter(\n (item): item is SchemaLayoutItem =>\n item !== undefined && item.content !== undefined && item.content !== null && item.content !== false,\n )\n}\n\n/**\n * 渲染布局项列表中的可见内容节点。\n */\nexport function renderLayoutItemsChildren(items: SchemaLayoutItem[]): VNodeChild[] {\n return items\n .map((item) => item.content)\n .filter(\n (node): node is Exclude<VNodeChild, null | undefined | boolean> =>\n node !== undefined && node !== null && node !== false,\n )\n}\n\n/**\n * 存在 help 文案时渲染语义帮助节点。\n */\nexport function renderOptionalSemanticHelp(\n text: string | undefined,\n placement: string,\n context: SchemaUiContext,\n): VNodeChild | undefined {\n return text ? renderSemanticHelp(text, placement, context) : undefined\n}\n\n/**\n * 根据记录构建详情渲染使用的只读表单状态。\n */\nexport function createReadonlyRecordFormState(\n record: Record<string, unknown> | undefined,\n optionState?: Pick<SchemaFormState, 'options' | 'optionLoading' | 'optionErrors'>,\n): SchemaFormState {\n return {\n values: record ?? {},\n options: optionState?.options,\n optionLoading: optionState?.optionLoading,\n optionErrors: optionState?.optionErrors,\n }\n}\n\nfunction renderViewItem(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): SchemaLayoutItem | undefined {\n const nodeState = resolveNodeState(node, createExpressionContext(context))\n if (!nodeState.visible) {\n return undefined\n }\n\n const content =\n node.type === 'field'\n ? renderFieldNode(node, context, uiAdapter, {\n disabled: nodeState.disabled,\n readonly: nodeState.readonly,\n })\n : renderLayoutNode(node, context, uiAdapter)\n\n return {\n node,\n span: resolveLayoutItemSpan(node),\n content,\n }\n}\n\nfunction renderLayoutNode(node: RuntimeViewNode, context: SchemaUiContext, uiAdapter?: SchemaUiAdapter): VNodeChild {\n const items = renderViewItems(node.children, context, uiAdapter)\n const embeddedView = renderEmbeddedViewBinding(node, context, uiAdapter)\n const children =\n node.type === 'group'\n ? renderLayoutItemsChildren(items)\n : [renderLayoutNodeHeader(node, context), embeddedView, ...renderLayoutItemsChildren(items)]\n const semantic = renderSemanticLayoutNode(node, context, children, items, uiAdapter)\n\n if (semantic !== undefined) {\n return semantic\n }\n\n return (\n uiAdapter?.renderLayoutNode?.({\n ...context,\n node,\n layout: createNodeLayout(node, context),\n items,\n helpNode: renderOptionalSemanticHelp(node.raw.help, resolveLayoutNodeHelpPlacement(node), context),\n children,\n }) ?? renderHtmlLayoutNode(node, children)\n )\n}\n\nfunction resolveLayoutNodeHelpPlacement(node: RuntimeViewNode): string {\n if (node.type === 'card' || node.type === 'tab') {\n return node.type\n }\n\n return 'layout-node'\n}\n\nfunction renderSemanticLayoutNode(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n children: VNodeChild,\n items: SchemaLayoutItem[],\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild | undefined {\n if (node.type !== 'section') {\n return undefined\n }\n\n const body = renderLayoutNodeBody(node, context, children, items, uiAdapter)\n\n return context.components?.render(\n SCHEMA_COMPONENT_SECTION,\n {\n node,\n title: node.raw.title,\n help: node.raw.help,\n props: node.raw.props,\n },\n {\n default: () => body,\n },\n {\n ui: context.ui,\n runtime: context.runtime,\n icons: context.icons,\n richTextEditors: context.richTextEditors,\n assetService: context.assetService,\n mode: context.state.mode,\n viewName: context.state.viewName,\n resource: context.resource,\n diagnostics: context.diagnostics,\n node,\n },\n )\n}\n\nfunction renderLayoutNodeBody(\n node: RuntimeViewNode,\n context: SchemaUiContext,\n children: VNodeChild,\n items: SchemaLayoutItem[],\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n const body = withoutLayoutNodeHeader(children)\n const layout = createNodeLayout(node, context)\n if (!layout || !uiAdapter?.renderLayoutNode) {\n return body\n }\n\n return uiAdapter.renderLayoutNode({\n ...context,\n node: {\n ...node,\n type: 'group',\n raw: {\n ...node.raw,\n type: 'group',\n title: undefined,\n help: undefined,\n },\n },\n layout,\n items,\n children: body,\n })\n}\n\nfunction withoutLayoutNodeHeader(children: VNodeChild): VNodeChild {\n if (!Array.isArray(children)) {\n return children\n }\n\n return children.filter((child) => !(isVNode(child) && child.props?.['data-slot'] === 'node-header'))\n}\n\nfunction renderHtmlLayoutNode(node: RuntimeViewNode, children: VNodeChild): VNodeChild {\n return h(\n resolveLayoutNodeTag(node),\n {\n ...node.raw.props,\n class: normalizeLayoutNodeClass(node),\n style: node.raw.style,\n 'data-sparq-view-node': '',\n 'data-node-id': node.id,\n 'data-node-type': node.type,\n 'data-node-span': String(node.raw.props?.span ?? ''),\n },\n normalizeChildren(children),\n )\n}\n\nfunction renderLayoutNodeHeader(node: RuntimeViewNode, context: SchemaUiContext): VNodeChild {\n if (node.type === 'tabs') {\n return undefined\n }\n\n if (!node.raw.title && !node.raw.help) {\n return undefined\n }\n\n return h(\n 'div',\n {\n 'data-slot': 'node-header',\n },\n [\n node.raw.title\n ? h(\n 'div',\n {\n 'data-slot': 'node-title',\n },\n node.raw.title,\n )\n : undefined,\n node.raw.help ? renderSemanticHelp(node.raw.help, 'layout-node', context) : undefined,\n ],\n )\n}\n\nfunction renderSemanticHelp(text: string, placement: string, context: SchemaUiContext): VNodeChild {\n return (\n context.components?.render(\n SCHEMA_COMPONENT_HELP,\n {\n text,\n placement,\n },\n undefined,\n {\n ui: context.ui,\n runtime: context.runtime,\n icons: context.icons,\n richTextEditors: context.richTextEditors,\n assetService: context.assetService,\n mode: context.state.mode,\n viewName: context.state.viewName,\n resource: context.resource,\n diagnostics: context.diagnostics,\n },\n ) ?? text\n )\n}\n\nfunction resolveLayoutNodeTag(node: RuntimeViewNode): 'section' | 'div' {\n if (node.type === 'section' || node.type === 'card' || node.type === 'tab') {\n return 'section'\n }\n\n return 'div'\n}\n\nfunction normalizeLayoutNodeClass(node: RuntimeViewNode): Array<string | undefined> {\n return ['sparq-view-node', `sparq-view-node-${node.type}`, node.raw.className]\n}\n\nfunction createNodeLayout(node: RuntimeViewNode, context: SchemaUiContext): SchemaLayoutConfig | undefined {\n const formView =\n context.state.mode === 'form' ? context.state.viewModel?.forms.get(context.state.viewName) : undefined\n return resolveFormChildLayout(formView, node)\n}\n\n/** 普通容器继承表单默认布局;标签页和手风琴的语义项目及内容默认保持整行。 */\nexport function resolveFormChildLayout(\n formView: Pick<RuntimeFormView, 'span' | 'gap'> | undefined,\n node: Pick<RuntimeViewNode, 'type' | 'gap'>,\n): SchemaLayoutConfig | undefined {\n const span = usesFullWidthChildLayout(node.type) ? 24 : formView?.span\n const gap = node.gap ?? formView?.gap\n if (span === undefined && gap === undefined) {\n return undefined\n }\n\n return {\n span,\n gap,\n }\n}\n\nfunction resolveLayoutItemSpan(node: Pick<RuntimeViewNode, 'type' | 'span'>): number | undefined {\n return node.span ?? (usesFullWidthChildLayout(node.type) ? 24 : undefined)\n}\n\nfunction usesFullWidthChildLayout(type: RuntimeViewNode['type']): boolean {\n return type === 'tabs' || type === 'tab' || type === 'collapse' || type === 'collapse-item'\n}\n","import type { RuntimeFormView, RuntimePageView } from '@sparqjs/schema-core'\nimport type { VNodeChild } from 'vue'\nimport { resolveContextForm, resolveReloadTableViewName } from './context'\nimport { renderContainer, renderStatusContainer, renderViewSlot } from '../ui'\nimport { createReadonlyRecordFormState } from './layout-node'\nimport { renderDetailStructure, renderFormStructure, renderSearchStructure, renderTableStructure } from './view-structures'\nimport type { SchemaUiAdapter, SchemaUiContext, SparqViewController, SparqViewState } from '../types'\n\n/**\n * 渲染 page 视图结构及内部 search、table、form、detail 区域。\n */\nexport function renderPageStructure(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n const page = state.viewModel?.pages.get(state.viewName)\n if (!page) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n const searchState: SparqViewState = {\n ...state,\n mode: 'search',\n viewName: page.searchName ?? 'default',\n view: page.search,\n }\n const tableState: SparqViewState = {\n ...state,\n mode: 'table',\n viewName: page.tableName ?? 'default',\n view: page.table,\n }\n const pageFormView = resolvePageFormView(page, context.controller)\n const formState: SparqViewState = {\n ...state,\n mode: 'form',\n viewName: resolvePageFormViewName(page, context.controller),\n view: pageFormView,\n }\n const detailState: SparqViewState = {\n ...state,\n mode: 'detail',\n viewName: page.detailName ?? 'default',\n view: page.detail,\n }\n\n return renderContainer(\n {\n ...context,\n kind: 'page',\n children: [\n page.search\n ? renderViewSlot(\n 'search',\n renderSearchStructure(searchState, withState(context, searchState, page), uiAdapter),\n )\n : undefined,\n resourceTreeEnabled(state, page)\n ? renderViewSlot(\n 'tree',\n uiAdapter?.renderResourceTree?.({\n ...context,\n state,\n treeState: context.controller?.treeState,\n loadChildren(parentId?: number) {\n if (parentId === undefined) {\n return (\n context.controller?.loadTreeRoots({\n runtime: context.runtime,\n resource: context.resource,\n filters:\n context.resolveTableReloadFilters?.() ?? context.tableReloadFilters,\n payload: context.payload,\n }) ?? Promise.resolve([])\n )\n }\n\n return (\n context.controller?.loadTreeChildren({\n runtime: context.runtime,\n resource: context.resource,\n filters: context.resolveTableReloadFilters?.() ?? context.tableReloadFilters,\n payload: context.payload,\n parentId,\n }) ?? Promise.resolve([])\n )\n },\n }),\n )\n : undefined,\n page.table\n ? renderViewSlot(\n 'table',\n renderTableStructure(tableState, withState(context, tableState, page), uiAdapter),\n )\n : undefined,\n formState.view\n ? renderViewSlot(\n 'form',\n renderFormStructure(formState, withState(context, formState, page), uiAdapter, {\n embeddedInPage: true,\n }),\n )\n : undefined,\n page.detail\n ? renderViewSlot(\n 'detail',\n renderDetailStructure(\n detailState,\n {\n ...context,\n state: detailState,\n tableReloadView: page.tableName,\n pageCreateForm: page.createForm,\n pageCreateFormName: page.createFormName,\n pageUpdateForm: page.updateForm ?? page.createForm,\n pageUpdateFormName: page.updateFormName ?? page.createFormName,\n form: createReadonlyRecordFormState(\n context.controller?.page.detailRecord,\n context.form,\n ),\n },\n uiAdapter,\n {\n embeddedInPage: true,\n },\n ),\n )\n : undefined,\n ],\n },\n uiAdapter,\n )\n}\n\nfunction resourceTreeEnabled(state: SparqViewState, page: RuntimePageView): boolean {\n // tree table 已经承担资源树的展示和加载,避免在同一页面再插入一棵独立资源树。\n if (page.table?.mode === 'tree') {\n return false\n }\n\n const tree = state.viewModel?.schema.tree ?? state.schema?.schema.tree\n if (!tree) {\n return false\n }\n return tree.enabled !== false\n}\n\nfunction resolvePageFormView(\n page: RuntimePageView,\n controller: SparqViewController | undefined,\n): RuntimeFormView | undefined {\n if (controller?.page.formMode === 'edit') {\n return page.updateForm ?? page.createForm\n }\n\n return page.createForm\n}\n\nfunction resolvePageFormViewName(page: RuntimePageView, controller: SparqViewController | undefined): string {\n if (controller?.page.formMode === 'edit') {\n return page.updateFormName ?? page.createFormName ?? 'default'\n }\n\n return page.createFormName ?? 'default'\n}\n\nfunction withState(context: SchemaUiContext, state: SparqViewState, page?: RuntimePageView): SchemaUiContext {\n return {\n ...context,\n state,\n form: resolveContextForm(state, context.controller, context.form),\n tableReloadView: page?.tableName ?? context.tableReloadView,\n tableReloadMode: page?.table?.mode ?? context.tableReloadMode,\n tableReloadTree: page?.table?.tree ?? context.tableReloadTree,\n pageCreateForm: page?.createForm ?? context.pageCreateForm,\n pageCreateFormName: page?.createFormName ?? context.pageCreateFormName,\n pageUpdateForm: page?.updateForm ?? page?.createForm ?? context.pageUpdateForm,\n pageUpdateFormName: page?.updateFormName ?? page?.createFormName ?? context.pageUpdateFormName,\n resolveTableReloadView() {\n return page?.tableName ?? context.tableReloadView ?? resolveReloadTableViewName({ state })\n },\n resolveTableReloadMode() {\n return page?.table?.mode ?? context.tableReloadMode\n },\n resolveTableReloadTree() {\n return page?.table?.tree ?? context.tableReloadTree\n },\n }\n}\n","import type { VNodeChild } from 'vue'\nimport { renderPageStructure } from './page-structure'\nimport { renderDetailStructure, renderFormStructure, renderSearchStructure, renderTableStructure } from './view-structures'\nimport type { SchemaUiAdapter, SchemaUiContext, SparqViewState } from '../types'\n\n/**\n * 按当前渲染模式渲染 ready 状态的视图。\n */\nexport function renderResolvedViewState(\n state: SparqViewState,\n context: SchemaUiContext,\n uiAdapter?: SchemaUiAdapter,\n): VNodeChild {\n switch (state.mode) {\n case 'page':\n return renderPageStructure(state, context, uiAdapter)\n case 'form':\n return renderFormStructure(state, context, uiAdapter, { hideFooter: state.hideFormFooter })\n case 'table':\n return renderTableStructure(state, context, uiAdapter)\n case 'search':\n return renderSearchStructure(state, context, uiAdapter)\n case 'detail':\n return renderDetailStructure(state, context, uiAdapter)\n }\n}\n","import { SCHEMA_UI_BUTTON_GROUP } from '@sparqjs/schema-core'\nimport { h, isVNode, type VNodeChild } from 'vue'\nimport type { UiKit } from '../ui'\n\n/**\n * 渲染表格容器的通用结构。\n *\n * 这里负责表格工具栏、主体和分页区域的稳定 DOM 结构。\n * 具体按钮、筛选控件、表格和分页组件仍由 UI 适配器负责渲染。\n */\nexport function renderTableContainerStructure(children: VNodeChild, ui: UiKit): VNodeChild {\n const slots = resolveTableContainerSlots(children)\n\n return [\n renderTableToolbarStructure(slots.toolbar, ui),\n h(\n 'div',\n {\n class: 'sparq-table-body',\n 'data-slot': 'table-body',\n },\n normalizeStructureChildren(slots.table),\n ),\n slots.pagination\n ? h(\n 'div',\n {\n class: 'sparq-table-footer',\n 'data-slot': 'table-footer',\n },\n [readPaginationChildren(slots.pagination)],\n )\n : undefined,\n ]\n}\n\n/**\n * 渲染搜索操作区的通用结构。\n *\n * 操作按钮本身由 UI 适配器渲染,这里只处理操作区在搜索栅格中的结构包装。\n */\nexport function renderSearchOperationStructure(children: VNodeChild): VNodeChild | undefined {\n if (!Array.isArray(children)) {\n return undefined\n }\n\n const operation = children.find((child) => isVNode(child) && child.props?.['data-slot'] === 'operation')\n if (!operation) {\n return undefined\n }\n\n return h(\n 'div',\n {\n class: 'sparq-search-operation',\n 'data-slot': 'search-operation',\n },\n normalizeStructureChildren(operation),\n )\n}\n\n/**\n * 从搜索容器 children 中取出搜索项区域。\n */\nexport function resolveSearchItemsStructure(children: VNodeChild): VNodeChild {\n if (!Array.isArray(children)) {\n return children\n }\n\n return children.find((child) => isVNode(child) && child.props?.['data-slot'] === 'items') ?? children\n}\n\nfunction renderTableToolbarStructure(toolbar: VNodeChild | undefined, ui: UiKit): VNodeChild {\n if (!toolbar || !isVNode(toolbar)) {\n return undefined\n }\n\n const slots = resolveToolbarSlots(toolbar.children)\n if (!slots.left && !slots.filters && !slots.batch && !slots.right) {\n return undefined\n }\n\n return h(\n 'div',\n {\n class: 'sparq-table-toolbar',\n 'data-slot': 'table-toolbar',\n },\n [\n h(\n 'div',\n {\n class: 'sparq-table-toolbar-main',\n 'data-slot': 'table-toolbar-main',\n },\n [\n renderToolbarButtonGroup(slots.left, 'toolbar-left', ui),\n renderToolbarSlot(slots.filters, 'toolbar-filters'),\n renderToolbarButtonGroup(slots.batch, 'toolbar-batch', ui),\n ],\n ),\n renderToolbarButtonGroup(slots.right, 'toolbar-right', ui),\n ],\n )\n}\n\nfunction renderToolbarButtonGroup(slot: VNodeChild | undefined, placement: string, ui: UiKit): VNodeChild {\n if (!slot) {\n return undefined\n }\n const children = readToolbarButtonChildren(slot)\n if (children.length === 0) {\n return undefined\n }\n\n return h(\n 'div',\n {\n class: ['sparq-table-toolbar-section', `sparq-table-${placement}`],\n 'data-slot': placement,\n },\n children.length === 1\n ? children\n : normalizeStructureChildren(\n ui.render(\n SCHEMA_UI_BUTTON_GROUP,\n { 'data-sparq-button-group': placement },\n {\n default: () => children,\n },\n ),\n ),\n )\n}\n\nfunction renderToolbarSlot(slot: VNodeChild | undefined, name: string): VNodeChild {\n if (!slot) {\n return undefined\n }\n\n return h(\n 'div',\n {\n class: ['sparq-table-toolbar-section', `sparq-table-${name}`],\n 'data-slot': name,\n },\n normalizeStructureChildren(readVNodeChildren(slot)),\n )\n}\n\nfunction resolveTableContainerSlots(children: VNodeChild): {\n toolbar?: VNodeChild\n table?: VNodeChild\n pagination?: VNodeChild\n} {\n if (!Array.isArray(children)) {\n return {\n table: children,\n }\n }\n\n const normalized = children.filter((child) => child !== undefined && child !== null && child !== false)\n\n return {\n toolbar: normalized.find((child) => isVNode(child) && child.props?.['data-slot'] === 'toolbar'),\n table: normalized.filter((child) => isTableBodyChild(child)),\n pagination: normalized.find((child) => isPaginationChild(child)),\n }\n}\n\nfunction resolveToolbarSlots(children: unknown): {\n left?: VNodeChild\n right?: VNodeChild\n batch?: VNodeChild\n filters?: VNodeChild\n} {\n const normalized = Array.isArray(children) ? children : [children]\n\n return {\n left: normalized.find((child) => isVNode(child) && child.props?.['data-slot'] === 'toolbar-left'),\n right: normalized.find((child) => isVNode(child) && child.props?.['data-slot'] === 'toolbar-right'),\n batch: normalized.find((child) => isVNode(child) && child.props?.['data-slot'] === 'toolbar-batch'),\n filters: normalized.find((child) => isVNode(child) && child.props?.['data-slot'] === 'toolbar-filters'),\n }\n}\n\nfunction isTableBodyChild(child: unknown): boolean {\n return !(\n isVNode(child) &&\n (child.props?.['data-slot'] === 'toolbar' ||\n child.props?.['data-slot'] === 'pagination' ||\n child.props?.['data-sparq-table-pagination'] !== undefined)\n )\n}\n\nfunction isPaginationChild(child: unknown): boolean {\n return (\n isVNode(child) &&\n (child.props?.['data-slot'] === 'pagination' ||\n child.props?.['data-sparq-table-pagination'] !== undefined)\n )\n}\n\nfunction readVNodeChildren(node: VNodeChild): VNodeChild {\n return isVNode(node) ? (node.children as VNodeChild) : node\n}\n\nfunction readToolbarButtonChildren(node: VNodeChild): Exclude<VNodeChild, null | boolean | void>[] {\n const children = readVNodeChildren(node)\n const normalized = Array.isArray(children) ? children : [children]\n return normalized.filter((child) => child !== undefined && child !== null && child !== false) as Exclude<\n VNodeChild,\n null | boolean | void\n >[]\n}\n\nfunction readPaginationChildren(node: VNodeChild): VNodeChild {\n if (isVNode(node) && node.props?.['data-slot'] === 'pagination') {\n return node.children as VNodeChild\n }\n\n return node\n}\n\nfunction normalizeStructureChildren(children: VNodeChild): Exclude<VNodeChild, null | boolean | void> | undefined {\n if (children === null || children === undefined || typeof children === 'boolean') {\n return undefined\n }\n\n return children as Exclude<VNodeChild, null | boolean | void>\n}\n","import type { SchemaRuntime } from '@sparqjs/schema-core'\nimport type { VNodeChild } from 'vue'\nimport {\n createSchemaComponentRegistry,\n mergeSchemaComponentRegistry,\n type SchemaComponentRegistry,\n type SparqIconRegistry,\n type SparqRichTextRegistry,\n} from '../registry'\nimport { createSchemaUiContext } from './context'\nimport { renderResolvedViewState } from './structure'\nimport type { SparqAssetService } from '../asset'\nimport type {\n SchemaActionHandler,\n SchemaFieldActivateHandler,\n SchemaFormState,\n SchemaUiAdapter,\n SparqViewController,\n SparqViewState,\n} from '../types'\nimport { createUiKit, renderStatusContainer, type UiKit } from '../ui'\n\nexport * from './action-context'\nexport * from './audit'\nexport * from './container-structure'\nexport * from './context'\nexport * from './embedded-view'\nexport * from './field-node'\nexport * from './layout-node'\nexport * from './page-structure'\nexport * from './structure'\nexport * from './view-node'\nexport * from './view-structures'\n\nconst DEFAULT_UI_KIT = createUiKit()\n\n/**\n * 使用当前 runtime、UI 适配器和组件注册表渲染 Sparq view 状态。\n */\nexport function renderSparqViewState(\n state: SparqViewState,\n runtime: SchemaRuntime,\n uiAdapter?: SchemaUiAdapter,\n uiKit?: UiKit,\n components?: SchemaComponentRegistry,\n form?: SchemaFormState,\n onAction?: SchemaActionHandler,\n controller?: SparqViewController,\n icons?: SparqIconRegistry,\n richTextEditors?: SparqRichTextRegistry,\n assetService?: SparqAssetService,\n retry?: () => void,\n onFieldActivate?: SchemaFieldActivateHandler,\n): VNodeChild {\n const context = createSchemaUiContext(\n state,\n runtime,\n DEFAULT_UI_KIT,\n uiKit,\n mergeSchemaComponentRegistry(createSchemaComponentRegistry(), components),\n icons,\n richTextEditors,\n assetService,\n form,\n onAction,\n controller,\n retry,\n onFieldActivate,\n )\n\n if (state.status !== 'ready' || !state.view || !state.viewModel) {\n return renderStatusContainer(state, context, uiAdapter)\n }\n\n return renderResolvedViewState(state, context, uiAdapter)\n}\n","import { BUILTIN_ACTION_CREATE, BUILTIN_ACTION_UPDATE, type SessionExternalActionResult } from '@sparqjs/schema-core'\nimport type { SchemaActionExecuteContext, SchemaActionHandler } from '../types'\n\nexport type SchemaHostPresentationMount = 'parent' | 'root'\nexport type SchemaHostPresentationType = 'dialog' | 'drawer'\n\nexport interface SchemaHostPresentationInput {\n resource: string\n action: 'create' | 'update'\n mode: 'create' | 'edit'\n type: SchemaHostPresentationType\n mount: SchemaHostPresentationMount\n title?: string\n id?: unknown\n initialValues?: Record<string, unknown>\n size?: string\n props: Record<string, unknown>\n}\n\nexport interface SchemaHostPresentationResult {\n opened: boolean\n changed?: boolean\n id?: unknown\n result?: unknown\n}\n\nexport interface SchemaHostPresentation {\n open(input: SchemaHostPresentationInput): Promise<SchemaHostPresentationResult> | SchemaHostPresentationResult\n}\n\n/**\n * 将页面自己的动作处理器与宿主展示能力组合。\n * 页面处理器优先;只有它返回 undefined 时,renderer 才尝试把 root/parent 表单交给宿主。\n */\nexport function createSchemaPresentationActionHandler(\n presentation: SchemaHostPresentation | undefined,\n localHandler?: SchemaActionHandler,\n): SchemaActionHandler | undefined {\n if (!presentation) {\n return localHandler\n }\n\n return async (context) => {\n const localResult = await localHandler?.(context)\n if (localResult !== undefined) {\n return localResult\n }\n\n return presentSchemaAction(context, presentation)\n }\n}\n\nexport async function presentSchemaAction(\n context: SchemaActionExecuteContext,\n presentation: SchemaHostPresentation,\n): Promise<SessionExternalActionResult> {\n const input = resolveHostPresentationInput(context)\n if (!input) {\n return undefined\n }\n\n const result = await presentation.open(input)\n if (!result.opened) {\n return undefined\n }\n if (result.changed) {\n await context.reloadTable?.()\n }\n\n return {\n handled: true,\n result,\n }\n}\n\nexport function resolveHostPresentationInput(\n context: SchemaActionExecuteContext,\n): SchemaHostPresentationInput | undefined {\n const action = resolveFormAction(context.action.action)\n const mount = resolveMount(context.action.presentation?.mount)\n const type = resolvePresentationType(context.action.presentation?.type)\n if (!action || !mount || !type || !context.resource) {\n return undefined\n }\n\n const props = context.action.presentation?.props ?? {}\n const initialValues =\n action === BUILTIN_ACTION_CREATE && context.form && Object.keys(context.form.values).length > 0\n ? { ...context.form.values }\n : undefined\n return {\n resource: context.resource,\n action,\n mode: action === BUILTIN_ACTION_CREATE ? 'create' : 'edit',\n type,\n mount,\n title: context.action.title,\n id: context.id,\n ...(initialValues ? { initialValues } : {}),\n size: resolvePresentationSize(type, props),\n props,\n }\n}\n\nfunction resolveFormAction(action: string): 'create' | 'update' | undefined {\n if (action === BUILTIN_ACTION_CREATE || action === BUILTIN_ACTION_UPDATE) {\n return action\n }\n return undefined\n}\n\nfunction resolveMount(mount: string | undefined): SchemaHostPresentationMount | undefined {\n return mount === 'parent' || mount === 'root' ? mount : undefined\n}\n\nfunction resolvePresentationType(type: string | undefined): SchemaHostPresentationType | undefined {\n return type === 'dialog' || type === 'drawer' ? type : undefined\n}\n\nfunction resolvePresentationSize(type: SchemaHostPresentationType, props: Record<string, unknown>): string | undefined {\n const value = type === 'dialog' ? props.width : props.size\n return typeof value === 'string' ? value : undefined\n}\n","import { createSchemaRuntime, type SchemaRuntime } from '@sparqjs/schema-core'\nimport type { FieldOptionFilterConfig, RenderMode, SchemaResource } from '@sparqjs/schema-protocol'\nimport { defineComponent, h, inject, ref, shallowRef, watch, type PropType } from 'vue'\nimport {\n SPARQ_ASSET_SERVICE_KEY,\n SPARQ_COMPONENT_REGISTRY_KEY,\n SPARQ_ICON_REGISTRY_KEY,\n SPARQ_RICH_TEXT_REGISTRY_KEY,\n SPARQ_SCHEMA_RENDERER_KEY,\n SPARQ_SCHEMA_PRESENTATION_KEY,\n SPARQ_SCHEMA_RUNTIME_KEY,\n SPARQ_SCHEMA_UI_ADAPTER_KEY,\n SPARQ_UI_KIT_KEY,\n} from '../keys'\nimport { renderSparqViewState } from '../render'\nimport { createSchemaPresentationActionHandler } from '../presentation'\nimport {\n createSparqViewController,\n createSparqViewLoadingState,\n loadSparqViewState,\n resolveSparqViewState,\n} from '../runtime'\nimport type { SchemaComponentRegistry, SparqIconRegistry, SparqRichTextRegistry } from '../registry'\nimport type {\n SchemaFieldActivateContext,\n SchemaUiAdapter,\n SparqViewController,\n SparqViewProps,\n SparqViewState,\n} from '../types'\nimport type { UiKit } from '../ui'\nimport type { SparqAssetService } from '../asset'\n\nexport const SparqView = defineComponent({\n name: 'SparqView',\n inheritAttrs: false,\n props: {\n mode: String as PropType<RenderMode>,\n modelValue: Object as PropType<Record<string, unknown>>,\n applyDefaults: Boolean,\n schema: Object as PropType<SchemaResource>,\n resource: String,\n source: String,\n payload: null as unknown as PropType<unknown>,\n filters: Array as PropType<FieldOptionFilterConfig[]>,\n view: String,\n runtime: Object as PropType<SchemaRuntime>,\n uiAdapter: Object as PropType<SchemaUiAdapter>,\n uiKit: Object as PropType<UiKit>,\n components: Object as PropType<SchemaComponentRegistry>,\n icons: Object as PropType<SparqIconRegistry>,\n richTextEditors: Object as PropType<SparqRichTextRegistry>,\n assetService: Object as PropType<SparqAssetService>,\n controller: Object as PropType<SparqViewController>,\n onAction: Function as PropType<SparqViewProps['onAction']>,\n fit: Boolean,\n scrollMode: String as PropType<SparqViewProps['scrollMode']>,\n hideFormFooter: Boolean,\n },\n emits: {\n 'update:modelValue': (_values: Record<string, unknown>) => true,\n 'field-activate': (_context: SchemaFieldActivateContext) => true,\n },\n setup(props, { attrs, emit, expose }) {\n const injectedRenderer = inject(SPARQ_SCHEMA_RENDERER_KEY, undefined)\n const injectedRuntime = inject(SPARQ_SCHEMA_RUNTIME_KEY, undefined)\n const injectedPresentationHost = inject(SPARQ_SCHEMA_PRESENTATION_KEY, undefined)\n const injectedUiAdapter = inject(SPARQ_SCHEMA_UI_ADAPTER_KEY, undefined)\n const injectedUiKit = inject(SPARQ_UI_KIT_KEY, undefined)\n const injectedComponents = inject(SPARQ_COMPONENT_REGISTRY_KEY, undefined)\n const injectedIcons = inject(SPARQ_ICON_REGISTRY_KEY, undefined)\n const injectedRichTextEditors = inject(SPARQ_RICH_TEXT_REGISTRY_KEY, undefined)\n const injectedAssetService = inject(SPARQ_ASSET_SERVICE_KEY, undefined)\n const defaultRuntime = createSchemaRuntime()\n const internalController = shallowRef(\n createInternalController(props, (values) => emit('update:modelValue', values)),\n )\n const controller = () => props.controller ?? internalController.value\n const state = shallowRef<SparqViewState>(\n resolveSparqViewState(\n createLoadPropsSnapshot(props),\n injectedRuntime ?? injectedRenderer?.runtime ?? defaultRuntime,\n ),\n )\n let requestVersion = 0\n const reloadTrigger = ref(0)\n let loadedTableKey = ''\n let loadedTableSchema: SchemaResource | undefined\n let loadedTableSource: string | undefined\n let loadedTablePayload: unknown\n let fieldChangeVersion = 0\n\n expose({\n getValues() {\n return controller().getValues()\n },\n setValues(values: Record<string, unknown>) {\n controller().setValues(values)\n },\n reset() {\n controller().reset()\n },\n submit() {\n return controller().submit()\n },\n execute(action: string) {\n return controller().execute(action)\n },\n })\n\n watch(\n () => props.modelValue,\n (value) => {\n if (value && props.controller === undefined) {\n internalController.value.setValues(value)\n }\n },\n {\n deep: true,\n },\n )\n\n watch(\n () => ({ ...controller().form.values }),\n async (values, previousValues) => {\n const currentVersion = ++fieldChangeVersion\n const currentState = state.value\n const runtime = props.runtime ?? injectedRuntime ?? injectedRenderer?.runtime ?? defaultRuntime\n const hook = runtime.options.hooks?.onFormFieldChange\n const schema = currentState.schema?.schema\n const resource = currentState.resource\n if (!hook || !schema || !resource) return\n\n let nextValues = values\n for (const field of changedFields(values, previousValues)) {\n const patch = await hook({\n schema,\n resource: currentState.schema?.resource,\n resourceKey: resource,\n mode: 'form',\n viewName: currentState.viewName,\n scope: currentState.payload,\n values: { ...nextValues },\n record: controller().page.record,\n field,\n value: nextValues[field],\n previousValue: previousValues[field],\n })\n if (currentVersion !== fieldChangeVersion) return\n if (patch) nextValues = { ...nextValues, ...patch }\n }\n for (const field of changedFields(nextValues, values)) {\n controller().setValue(field, nextValues[field])\n }\n },\n )\n\n watch(\n () => [createLoadPropsSnapshot(props), reloadTrigger.value] as const,\n async ([nextProps]) => {\n const currentVersion = ++requestVersion\n const activeRuntime =\n nextProps.runtime ?? injectedRuntime ?? injectedRenderer?.runtime ?? defaultRuntime\n\n if (!nextProps.schema && nextProps.resource) {\n state.value = createSparqViewLoadingState(nextProps)\n }\n\n const nextState = await loadSparqViewState(nextProps, activeRuntime)\n if (currentVersion === requestVersion) {\n state.value = nextState\n if (props.controller === undefined) {\n internalController.value = createInternalController(\n { ...props, schema: nextState.schema ?? nextProps.schema },\n (values) => emit('update:modelValue', values),\n )\n } else {\n controller().reset()\n }\n void preloadDictionaryOptions(controller(), nextState, activeRuntime)\n if (nextState.autoLoadTable && nextState.tableReloadViewName) {\n const tableViewName = nextState.tableReloadViewName\n const tableReloadMode = nextState.tableReloadMode\n const tableReloadTree = nextState.tableReloadTree\n const tableKey = `${nextState.resource ?? ''}:${nextState.mode}:${tableViewName}:${tableReloadMode ?? ''}:${JSON.stringify(tableReloadTree ?? {})}:${JSON.stringify(nextState.filters ?? [])}`\n if (\n loadedTableKey !== tableKey ||\n loadedTableSchema !== nextProps.schema ||\n loadedTableSource !== nextProps.source ||\n loadedTablePayload !== nextProps.payload\n ) {\n loadedTableKey = tableKey\n loadedTableSchema = nextProps.schema\n loadedTableSource = nextProps.source\n loadedTablePayload = nextProps.payload\n void controller()\n .reloadTable({\n runtime: activeRuntime,\n resource: nextState.resource,\n view: tableViewName,\n tableMode: tableReloadMode,\n tableTree: tableReloadTree,\n filters: nextState.filters,\n payload: nextProps.payload,\n })\n .catch(() => undefined)\n }\n }\n }\n },\n {\n immediate: true,\n deep: true,\n },\n )\n\n return () => {\n const children = renderSparqViewState(\n state.value,\n props.runtime ?? injectedRuntime ?? injectedRenderer?.runtime ?? defaultRuntime,\n props.uiAdapter ?? injectedUiAdapter ?? injectedRenderer?.uiAdapter,\n props.uiKit ?? injectedUiKit ?? injectedRenderer?.uiKit,\n props.components ?? injectedComponents ?? injectedRenderer?.components,\n controller().form,\n createSchemaPresentationActionHandler(\n injectedPresentationHost ?? injectedRenderer?.presentationHost,\n props.onAction,\n ),\n controller(),\n props.icons ?? injectedIcons ?? injectedRenderer?.icons,\n props.richTextEditors ?? injectedRichTextEditors ?? injectedRenderer?.richTextEditors,\n props.assetService ?? injectedAssetService ?? injectedRenderer?.assetService,\n () => {\n reloadTrigger.value += 1\n },\n (context) => emit('field-activate', context),\n )\n\n return h(\n 'section',\n {\n ...attrs,\n class: [\n 'sparq-view',\n props.fit ? 'sparq-view--fit' : undefined,\n props.scrollMode ? `sparq-view--scroll-${props.scrollMode}` : undefined,\n attrs.class,\n ],\n 'data-sparq-view': '',\n 'data-scroll-mode': props.scrollMode,\n },\n children ?? undefined,\n )\n }\n },\n})\n\nfunction changedFields(\n values: Record<string, unknown>,\n previousValues: Record<string, unknown>,\n): string[] {\n const fields = new Set([...Object.keys(values), ...Object.keys(previousValues)])\n return [...fields].filter((field) => !Object.is(values[field], previousValues[field]))\n}\n\nfunction createLoadPropsSnapshot(props: Readonly<SparqViewProps>): SparqViewProps {\n return {\n mode: props.mode,\n applyDefaults: props.applyDefaults,\n schema: props.schema,\n resource: props.resource,\n source: props.source,\n payload: props.payload,\n filters: props.filters,\n view: props.view,\n runtime: props.runtime,\n hideFormFooter: props.hideFormFooter,\n }\n}\n\nfunction createInternalController(\n props: Readonly<Pick<SparqViewProps, 'modelValue' | 'applyDefaults' | 'schema'>>,\n onValuesChange: (values: Record<string, unknown>) => void,\n): SparqViewController {\n return createSparqViewController({\n initialValues: props.modelValue,\n applyDefaults: props.applyDefaults,\n schema: props.schema?.schema,\n onValuesChange,\n })\n}\n\nasync function preloadDictionaryOptions(\n controller: SparqViewController,\n state: SparqViewState,\n runtime: SchemaRuntime,\n): Promise<void> {\n const loadOptions = controller.form.loadOptions\n if (!loadOptions) {\n return\n }\n const dictionaryFields = (state.schema?.schema.fields ?? []).filter((field) => field.options?.mode === 'dictionary')\n await Promise.all(\n dictionaryFields.map((field) =>\n loadOptions({\n runtime,\n field,\n fieldName: field.name,\n resource: state.resource,\n view: state.viewName,\n payload: state.payload,\n }).catch(() => undefined),\n ),\n )\n}\n","import { SCHEMA_UI_BUTTON, SCHEMA_UI_TEXT } from '@sparqjs/schema-core'\nimport { h, type VNode } from 'vue'\nimport type { SparqAsset, SparqAssetType } from '../service'\nimport {\n formatAssetSize,\n renderAssetPreviewThumb,\n resolveAssetLabel,\n resolveAssetSummary,\n resolveAssetType,\n resolveAssetTypeLabel,\n type SparqAssetPreviewRegistry,\n} from '../preview'\nimport type { UiKit } from '../../ui'\nimport type { AssetPickerRequest, SparqAssetListPayload } from './types'\n\nexport type AssetPickerTab = 'server' | 'upload' | 'remote'\n\nexport interface AssetPickerToolbarState {\n ui: UiKit\n request: AssetPickerRequest\n tab: AssetPickerTab\n selectedCount: number\n limit: number\n canConfirm: boolean\n setTab: (tab: AssetPickerTab) => void\n confirm: () => void\n}\n\nexport interface AssetPickerListState {\n ui: UiKit\n assetPreviews?: SparqAssetPreviewRegistry\n request: AssetPickerRequest\n payload: SparqAssetListPayload\n search: {\n page: number\n }\n totalPages: number\n pickerType: SparqAssetType | undefined\n selected: SparqAsset[]\n toggleAsset: (asset: SparqAsset) => void\n confirmAsset: (asset: SparqAsset) => void\n openPreview: (asset: SparqAsset) => void\n isSameAsset: (left: SparqAsset, right: SparqAsset) => boolean\n canSelectAsset: (asset: SparqAsset, pickerType: SparqAssetType | undefined) => boolean\n resolveLimit: (request: AssetPickerRequest | undefined) => number\n}\n\nexport function renderHeader(close: () => void, ui: UiKit): VNode {\n return (\n <header class='sparq-asset-picker__header'>\n <div class='sparq-asset-picker__title-group'>\n <div class='sparq-asset-picker__title'>资源选择器</div>\n <div class='sparq-asset-picker__subtitle'>选择、上传或添加远程资源。</div>\n </div>\n {renderUiButton(ui, '关闭', { class: 'sparq-asset-picker__button', icon: 'close', onClick: close })}\n </header>\n ) as VNode\n}\n\nexport function renderToolbar(state: AssetPickerToolbarState): VNode {\n const tabs: Array<{ name: AssetPickerTab; title: string; disabled?: boolean }> = [\n { name: 'server', title: '服务端资源', disabled: !state.request.config.list },\n { name: 'upload', title: '在线上传' },\n { name: 'remote', title: '远程 URL', disabled: !state.request.config.addRemote },\n ]\n\n return (\n <div class='sparq-asset-picker__toolbar'>\n <div class='sparq-asset-picker__tabs'>\n {tabs.map((item) => (\n <button\n type='button'\n class={['sparq-asset-picker__tab', item.name === state.tab ? 'is-active' : undefined]}\n disabled={item.disabled}\n onClick={() => state.setTab(item.name)}\n >\n {item.title}\n </button>\n ))}\n </div>\n <div class='sparq-asset-picker__toolbar-actions'>\n <span class='sparq-asset-picker__summary'>{`已选 ${state.selectedCount} / ${state.limit === 0 ? '∞' : state.limit}`}</span>\n {renderUiButton(state.ui, '确认选择', {\n class: 'sparq-asset-picker__button is-primary',\n type: 'primary',\n icon: 'check',\n disabled: !state.canConfirm,\n onClick: state.confirm,\n })}\n </div>\n </div>\n ) as VNode\n}\n\nexport function renderSelectedPanel(\n selected: SparqAsset[],\n removeSelected: (asset: SparqAsset) => void,\n ui: UiKit,\n assetPreviews?: SparqAssetPreviewRegistry,\n): VNode {\n return (\n <aside class='sparq-asset-picker__selected'>\n <div class='sparq-asset-picker__selected-title'>已选资源</div>\n {selected.length === 0 ? (\n <div class='sparq-asset-picker__selected-empty'>暂未选择资源</div>\n ) : (\n <div class='sparq-asset-picker__selected-list'>\n {selected.map((asset) => (\n <div key={asset.id ?? asset.url} class='sparq-asset-picker__selected-item'>\n {renderAssetPreviewThumb(asset, 'thumb', undefined, assetPreviews)}\n <span class='sparq-asset-picker__selected-name'>\n {asset.title ?? asset.name ?? asset.url}\n </span>\n {renderUiButton(ui, '移除', {\n class: 'sparq-asset-picker__button is-danger',\n type: 'danger',\n icon: 'delete',\n size: 'small',\n onClick: () => removeSelected(asset),\n })}\n </div>\n ))}\n </div>\n )}\n </aside>\n ) as VNode\n}\n\nexport function renderAssetCard(asset: SparqAsset, state: AssetPickerListState, index: number): VNode {\n const active = state.selected.some((item) => state.isSameAsset(item, asset))\n const disabled = !active && !state.canSelectAsset(asset, state.pickerType)\n const limit = state.resolveLimit(state.request)\n const limitReached = !active && !disabled && limit > 0 && state.selected.length >= limit\n const label = resolveAssetLabel(asset)\n\n return (\n <button\n type='button'\n class={[\n 'sparq-asset-picker__card',\n active ? 'is-active' : undefined,\n disabled ? 'is-disabled' : undefined,\n limitReached ? 'is-limit-reached' : undefined,\n ]}\n disabled={disabled}\n tabindex={0}\n role='option'\n aria-label={`${label},${active ? '已选择' : limitReached ? '已达到选择上限' : '未选择'},${resolveAssetSummary(asset)}`}\n aria-selected={active ? 'true' : 'false'}\n aria-pressed={active ? 'true' : 'false'}\n data-asset-index={String(index)}\n onClick={() => state.toggleAsset(asset)}\n onDblclick={() => state.confirmAsset(asset)}\n onKeydown={(event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n state.toggleAsset(asset)\n }\n }}\n >\n <span class='sparq-asset-picker__checkmark'>✓</span>\n {renderAssetPreviewThumb(asset, 'card', state.openPreview, state.assetPreviews)}\n <span class='sparq-asset-picker__asset-title'>{label}</span>\n <span class='sparq-asset-picker__asset-meta'>{resolveAssetSummary(asset)}</span>\n </button>\n ) as VNode\n}\n\nexport function renderAssetTable(state: AssetPickerListState): VNode {\n return (\n <div class='sparq-asset-picker__table-wrap'>\n <table class='sparq-asset-picker__table'>\n <thead>\n <tr>\n <th>预览</th>\n <th>标题</th>\n <th>大小</th>\n <th>类型</th>\n <th>操作</th>\n </tr>\n </thead>\n <tbody>\n {state.payload.results.map((asset) => {\n const active = state.selected.some((item) => state.isSameAsset(item, asset))\n const disabled = !active && !state.canSelectAsset(asset, state.pickerType)\n\n return (\n <tr key={asset.id ?? asset.url} onDblclick={() => state.confirmAsset(asset)}>\n <td>{renderAssetPreviewThumb(asset, 'thumb', undefined, state.assetPreviews)}</td>\n <td>{resolveAssetLabel(asset)}</td>\n <td>{formatAssetSize(asset.size)}</td>\n <td>{resolveAssetTypeLabel(resolveAssetType(asset))}</td>\n <td>\n {renderUiButton(state.ui, active ? '取消' : '选择', {\n class: ['sparq-asset-picker__button', active ? undefined : 'is-primary'],\n type: active ? 'default' : 'primary',\n size: 'small',\n disabled,\n onClick() {\n state.toggleAsset(asset)\n },\n })}\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n ) as VNode\n}\n\nexport function renderPagination(state: AssetPickerListState): VNode {\n return (\n <footer class='sparq-asset-picker__pagination'>\n <span>{`共 ${state.payload.total} 条,第 ${state.search.page} / ${state.totalPages} 页`}</span>\n <div class='sparq-asset-picker__pagination-actions'>\n {renderUiButton(state.ui, '上一页', {\n class: 'sparq-asset-picker__button',\n size: 'small',\n disabled: state.search.page <= 1,\n onClick() {\n state.search.page -= 1\n },\n })}\n {renderUiButton(state.ui, '下一页', {\n class: 'sparq-asset-picker__button',\n size: 'small',\n disabled: state.search.page >= state.totalPages,\n onClick() {\n state.search.page += 1\n },\n })}\n </div>\n </footer>\n ) as VNode\n}\n\nexport function renderUiButton(ui: UiKit, label: string, props: Record<string, unknown>): VNode {\n const rendered = ui.render(\n SCHEMA_UI_BUTTON,\n {\n nativeType: 'button',\n ...props,\n },\n {\n default: () => label,\n },\n )\n\n if (rendered) {\n return rendered as VNode\n }\n\n throw new Error('Sparq UI button is required to render asset picker.')\n}\n\nexport function renderUiInput(ui: UiKit, value: string, props: Record<string, unknown>): VNode {\n const rendered = ui.render(SCHEMA_UI_TEXT, {\n ...props,\n value,\n })\n\n if (rendered) {\n return rendered as VNode\n }\n\n throw new Error('Sparq UI text input is required to render asset picker.')\n}\n","import { SCHEMA_UI_OPTION, SCHEMA_UI_SELECT } from '@sparqjs/schema-core'\nimport { h, type VNode } from 'vue'\nimport type { SparqAsset, SparqAssetType } from '../service'\nimport type { SparqAssetPreviewRegistry } from '../preview'\nimport type { UiKit } from '../../ui'\nimport { renderAssetCard, renderAssetTable, renderPagination, renderUiButton, renderUiInput } from './AssetPickerParts'\nimport type { AssetPickerRequest, SparqAssetListPayload, SparqAssetOption } from './types'\n\nexport type AssetPickerView = 'grid' | 'list'\n\nexport interface AssetPickerServerState {\n ui: UiKit\n assetPreviews?: SparqAssetPreviewRegistry\n request: AssetPickerRequest\n view: AssetPickerView\n search: {\n title: string\n type: string\n page: number\n limit: number\n group: string\n }\n payload: SparqAssetListPayload\n loading: boolean\n totalPages: number\n typeOptions: SparqAssetOption[]\n groupOptions: SparqAssetOption[]\n pickerType: SparqAssetType | undefined\n selected: SparqAsset[]\n setView: (view: AssetPickerView) => void\n submitSearch: () => void\n loadAssets: () => void\n toggleAsset: (asset: SparqAsset) => void\n confirmAsset: (asset: SparqAsset) => void\n openPreview: (asset: SparqAsset) => void\n isSameAsset: (left: SparqAsset, right: SparqAsset) => boolean\n canSelectAsset: (asset: SparqAsset, pickerType: SparqAssetType | undefined) => boolean\n resolveLimit: (request: AssetPickerRequest | undefined) => number\n handleAssetGridKeydown: (event: KeyboardEvent) => void\n}\n\nexport function renderServerPanel(state: AssetPickerServerState): VNode {\n if (!state.request.config.list) {\n return (<div class='sparq-asset-picker__empty'>未配置服务端资源列表。</div>) as VNode\n }\n\n return (\n <section class='sparq-asset-picker__server'>\n <aside class='sparq-asset-picker__groups' aria-label='资源分组'>\n {[{ label: '全部分组', value: '' }, ...state.groupOptions].map((item) => (\n <button\n type='button'\n class={[\n 'sparq-asset-picker__group',\n state.search.group === item.value ? 'is-active' : undefined,\n ]}\n aria-pressed={state.search.group === item.value ? 'true' : 'false'}\n onClick={() => {\n state.search.group = item.value\n }}\n >\n {item.label}\n </button>\n ))}\n </aside>\n <section class='sparq-asset-picker__panel'>\n <div class='sparq-asset-picker__filters'>\n {renderUiInput(state.ui, state.search.title, {\n class: 'sparq-asset-picker__input',\n placeholder: '输入标题或资源名称',\n onChange(value: unknown) {\n state.search.title = String(value ?? '')\n },\n onKeyup(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n state.submitSearch()\n }\n },\n })}\n {renderUiSelect(\n state.ui,\n state.typeOptions,\n state.search.type,\n state.pickerType === 'image',\n (value) => {\n state.search.type = value\n },\n )}\n {renderUiButton(state.ui, '搜索', {\n class: 'sparq-asset-picker__button is-primary',\n type: 'primary',\n icon: 'search',\n onClick: state.submitSearch,\n })}\n <div class='sparq-asset-picker__segment'>\n {renderSegmentButton('卡片', state.view === 'grid', () => state.setView('grid'))}\n {renderSegmentButton('列表', state.view === 'list', () => state.setView('list'))}\n </div>\n </div>\n {state.loading ? (\n <div class='sparq-asset-picker__empty'>资源加载中...</div>\n ) : state.payload.results.length === 0 ? (\n <div class='sparq-asset-picker__empty'>当前筛选下暂无资源</div>\n ) : state.view === 'grid' ? (\n <div\n class='sparq-asset-picker__grid'\n role='listbox'\n aria-label='资源列表'\n onKeydown={state.handleAssetGridKeydown}\n >\n {state.payload.results.map((asset, index) => renderAssetCard(asset, state, index))}\n </div>\n ) : (\n renderAssetTable(state)\n )}\n {renderPagination(state)}\n </section>\n </section>\n ) as VNode\n}\n\nfunction renderUiSelect(\n ui: UiKit,\n options: SparqAssetOption[],\n value: string,\n disabled: boolean,\n onChange: (value: string) => void,\n): VNode {\n const rendered = ui.render(\n SCHEMA_UI_SELECT,\n {\n class: 'sparq-asset-picker__select',\n value,\n disabled,\n onChange(value: unknown) {\n onChange(String(value ?? ''))\n },\n },\n {\n default: () => options.map((option) => renderUiOption(ui, option)),\n },\n )\n\n if (rendered) {\n return rendered as VNode\n }\n\n throw new Error('Sparq UI select is required to render asset picker.')\n}\n\nfunction renderUiOption(ui: UiKit, option: SparqAssetOption): VNode {\n const rendered = ui.render(\n SCHEMA_UI_OPTION,\n {\n label: option.label,\n value: option.value,\n },\n {\n default: () => option.label,\n },\n )\n\n if (rendered) {\n return rendered as VNode\n }\n\n throw new Error('Sparq UI option is required to render asset picker.')\n}\n\nfunction renderSegmentButton(label: string, active: boolean, onClick: () => void): VNode {\n return (\n <button\n type='button'\n class={['sparq-asset-picker__segment-button', active ? 'is-active' : undefined]}\n aria-pressed={active ? 'true' : 'false'}\n onClick={onClick}\n >\n {label}\n </button>\n ) as VNode\n}\n","import { computed, defineComponent, h, inject, reactive, ref, watch, type PropType } from 'vue'\nimport { getErrorMessage, SCHEMA_UI_ALERT } from '@sparqjs/schema-core'\nimport type { SparqAsset, SparqAssetType, SparqUploadTask } from '../service'\nimport { createSparqUploadQueue, filterSparqUploadFiles, SparqAssetUploadPanel } from '../upload'\nimport {\n createAssetPreviewState,\n isPreviewableAsset,\n renderAssetPreviewDialog,\n resolveAssetType,\n useSparqAssetPreviewRegistry,\n} from '../preview'\nimport { SPARQ_UI_KIT_KEY } from '../../keys'\nimport type { UiKit } from '../../ui'\nimport { renderHeader, renderSelectedPanel, renderToolbar, renderUiButton, renderUiInput } from './AssetPickerParts'\nimport { renderServerPanel } from './AssetPickerServerPanel'\nimport type {\n AssetPickerRequest,\n AssetPickerRequestRef,\n SparqAssetListPayload,\n SparqAssetOption,\n SparqAssetPickerView,\n SparqAssetPickerViewPreference,\n} from './types'\n\ntype PickerTab = 'server' | 'upload' | 'remote'\ntype PickerView = SparqAssetPickerView\n\nconst VIEW_STORAGE_KEY = 'sparq.asset-picker.view'\n\nconst EMPTY_PAYLOAD: SparqAssetListPayload = {\n results: [],\n total: 0,\n groups: [],\n types: [],\n}\n\nexport const AssetPickerRoot = defineComponent({\n name: 'SparqAssetPickerRoot',\n props: {\n request: {\n type: Object as PropType<AssetPickerRequestRef>,\n required: true,\n },\n uiKit: {\n type: Object as PropType<UiKit>,\n default: undefined,\n },\n viewPreference: {\n type: Object as PropType<SparqAssetPickerViewPreference>,\n default: undefined,\n },\n },\n setup(props) {\n const injectedUi = props.uiKit ? undefined : inject(SPARQ_UI_KIT_KEY, undefined)\n const ui = props.uiKit ?? injectedUi\n if (!ui) {\n throw new Error('Sparq UI kit is required to render asset picker.')\n }\n const assetPreviews = useSparqAssetPreviewRegistry()\n const tab = ref<PickerTab>('server')\n const view = ref<PickerView>(readPreferredView(props.viewPreference))\n const selected = ref<SparqAsset[]>([])\n const payload = ref<SparqAssetListPayload>(EMPTY_PAYLOAD)\n const loading = ref(false)\n const loadError = ref<unknown>()\n const notice = ref('')\n let loadVersion = 0\n const preview = createAssetPreviewState()\n const remoteUrl = ref('')\n const remoteLocal = ref(false)\n const remoteLoading = ref(false)\n const search = reactive({\n title: '',\n type: '',\n page: 1,\n limit: 12,\n group: '',\n })\n\n const currentRequest = computed(() => props.request.value)\n const uploadQueue = createSparqUploadQueue({\n upload(file, options, execution) {\n const request = currentRequest.value\n if (!request) return Promise.reject(new Error('资源选择器已经关闭。'))\n return request.config.upload(file, options, execution)\n },\n onSuccess(asset) {\n handleUploadedAsset(asset)\n },\n onError(_error, task) {\n setNotice(`${task.file.name} 上传失败。`)\n },\n })\n const uploadTasks = uploadQueue.tasks\n const visible = computed(() => currentRequest.value !== undefined)\n const pickerType = computed(() => currentRequest.value?.options.type)\n const limit = computed(() => resolveLimit(currentRequest.value))\n const totalPages = computed(() => Math.max(1, Math.ceil((payload.value.total || 0) / search.limit)))\n const canConfirm = computed(() => selected.value.length > 0)\n const canSelectMore = computed(() => limit.value === 0 || selected.value.length < limit.value)\n const typeOptions = computed(() => [{ label: '全部类型', value: '' }, ...(payload.value.types ?? [])])\n const groupOptions = computed(() => payload.value.groups ?? [])\n\n watch(\n currentRequest,\n (request) => {\n if (!request) {\n return\n }\n\n tab.value = request.config.list ? 'server' : 'upload'\n selected.value = []\n uploadQueue.reset()\n remoteUrl.value = ''\n remoteLocal.value = false\n loadError.value = undefined\n search.title = ''\n search.type = request.options.type === 'image' ? 'image' : ''\n search.page = 1\n search.group = ''\n void loadAssets()\n },\n { immediate: true },\n )\n\n watch(\n () => [search.page, search.limit, search.group],\n () => {\n void loadAssets()\n },\n )\n\n const close = () => {\n loadVersion += 1\n loading.value = false\n uploadQueue.reset()\n currentRequest.value?.resolve([])\n props.request.value = undefined\n }\n const confirm = () => {\n uploadQueue.reset()\n currentRequest.value?.resolve(selected.value.map((asset) => ({ ...asset })))\n props.request.value = undefined\n }\n async function loadAssets() {\n const request = currentRequest.value\n const currentVersion = ++loadVersion\n if (!request?.config.list) {\n payload.value = EMPTY_PAYLOAD\n loadError.value = undefined\n return\n }\n\n loading.value = true\n loadError.value = undefined\n try {\n const nextPayload = await request.config.list({\n title: search.title,\n type: pickerType.value === 'image' ? 'image' : search.type,\n page: search.page,\n limit: search.limit,\n group: search.group,\n field: request.options.field,\n props: request.options.props,\n })\n if (currentVersion === loadVersion && request === currentRequest.value) {\n payload.value = normalizePayload(nextPayload, pickerType.value)\n }\n } catch (error) {\n if (currentVersion === loadVersion && request === currentRequest.value) {\n loadError.value = error\n }\n } finally {\n if (currentVersion === loadVersion) {\n loading.value = false\n }\n }\n }\n const submitSearch = () => {\n search.page = 1\n void loadAssets()\n }\n const setNotice = (message: string) => {\n notice.value = notice.value && notice.value !== message ? `${notice.value} ${message}` : message\n }\n const setView = (value: PickerView) => {\n view.value = value\n writePreferredView(value, props.viewPreference)\n }\n const toggleAsset = (asset: SparqAsset) => {\n if (!canSelectAsset(asset, pickerType.value)) {\n setNotice(resolveTypeMismatchMessage(pickerType.value))\n return\n }\n\n const index = selected.value.findIndex((item) => isSameAsset(item, asset))\n if (index >= 0) {\n selected.value.splice(index, 1)\n notice.value = ''\n return\n }\n if (!canSelectMore.value) {\n setNotice(resolveLimitMessage(limit.value))\n return\n }\n\n selected.value.push({ ...asset })\n notice.value = ''\n }\n const confirmAsset = (asset: SparqAsset) => {\n if (!canSelectAsset(asset, pickerType.value)) {\n setNotice(resolveTypeMismatchMessage(pickerType.value))\n return\n }\n if (limit.value !== 1) {\n toggleAsset(asset)\n return\n }\n\n currentRequest.value?.resolve([{ ...asset }])\n props.request.value = undefined\n }\n const removeSelected = (asset: SparqAsset) => {\n selected.value = selected.value.filter((item) => !isSameAsset(item, asset))\n }\n const uploadFiles = async (files: File[]) => {\n const request = currentRequest.value\n if (!request || files.length === 0) {\n return\n }\n\n const { accepted, rejected } = filterSparqUploadFiles(files, {\n accept: request.options.accept,\n maxSize: request.options.maxSize,\n type: pickerType.value,\n })\n if (rejected.length > 0) {\n setNotice(`${rejected.length} 个文件类型不符合要求,已跳过。`)\n }\n if (accepted.length === 0) {\n return\n }\n\n uploadQueue.add(accepted, {\n type: pickerType.value,\n accept: request.options.accept,\n maxSize: request.options.maxSize,\n multiple: request.options.multiple,\n field: request.options.field,\n props: request.options.props,\n })\n }\n const retryUpload = (task: SparqUploadTask) => {\n uploadQueue.retry(task)\n }\n const cancelUpload = (task: SparqUploadTask) => {\n uploadQueue.cancel(task)\n }\n const handleUploadedAsset = (asset: SparqAsset) => {\n if (!canSelectAsset(asset, pickerType.value)) {\n setNotice(resolveTypeMismatchMessage(pickerType.value))\n return\n }\n if (!selected.value.some((item) => isSameAsset(item, asset)) && canSelectMore.value) {\n selected.value.push({ ...asset })\n } else if (!selected.value.some((item) => isSameAsset(item, asset)) && !canSelectMore.value) {\n setNotice(resolveLimitMessage(limit.value))\n }\n payload.value = {\n ...payload.value,\n results: [asset, ...payload.value.results.filter((item) => !isSameAsset(item, asset))],\n total: payload.value.total + 1,\n }\n }\n const openPreview = (asset: SparqAsset) => {\n if (isPreviewableAsset(asset, assetPreviews)) {\n preview.open(asset)\n }\n }\n const addRemote = async () => {\n const request = currentRequest.value\n if (!request?.config.addRemote || !remoteUrl.value || remoteLoading.value) {\n return\n }\n\n remoteLoading.value = true\n try {\n const asset = await request.config.addRemote({\n url: remoteUrl.value,\n local: remoteLocal.value,\n type: pickerType.value,\n field: request.options.field,\n props: request.options.props,\n })\n if (asset) {\n handleUploadedAsset(asset)\n remoteUrl.value = ''\n }\n } catch (error) {\n setNotice(error instanceof Error ? error.message : '远程资源添加失败。')\n } finally {\n remoteLoading.value = false\n }\n }\n const handleDialogKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return\n }\n if (preview.asset.value) {\n preview.close()\n return\n }\n close()\n }\n\n return () => {\n const request = currentRequest.value\n if (!visible.value || !request) {\n return undefined\n }\n\n return h('div', { class: 'sparq-asset-picker' }, [\n h('div', { class: 'sparq-asset-picker__mask', onClick: close }),\n h(\n 'section',\n {\n class: 'sparq-asset-picker__dialog',\n role: 'dialog',\n 'aria-modal': 'true',\n tabindex: -1,\n onKeydown: handleDialogKeydown,\n },\n [\n renderHeader(close, ui),\n renderToolbar({\n ui,\n request,\n tab: tab.value,\n selectedCount: selected.value.length,\n limit: limit.value,\n canConfirm: canConfirm.value,\n setTab(value) {\n tab.value = value\n },\n confirm,\n }),\n notice.value\n ? h(\n 'div',\n { class: 'sparq-asset-picker__notice', role: 'status', 'aria-live': 'polite' },\n notice.value,\n )\n : undefined,\n loadError.value\n ? ui.render(\n SCHEMA_UI_ALERT,\n {\n type: 'error',\n title: getErrorMessage(loadError.value, '资源加载失败。'),\n showIcon: true,\n closable: false,\n 'data-sparq-asset-load-error': '',\n },\n {\n default: () =>\n renderUiButton(ui, '重试', {\n size: 'small',\n onClick() {\n void loadAssets()\n },\n 'data-sparq-asset-load-retry': '',\n }),\n },\n )\n : undefined,\n h('main', { class: 'sparq-asset-picker__body' }, [\n tab.value === 'server'\n ? renderServerPanel({\n request,\n view: view.value,\n search,\n payload: payload.value,\n loading: loading.value,\n totalPages: totalPages.value,\n typeOptions: typeOptions.value,\n groupOptions: groupOptions.value,\n pickerType: pickerType.value,\n selected: selected.value,\n ui,\n assetPreviews,\n setView(value) {\n setView(value)\n },\n submitSearch,\n loadAssets,\n toggleAsset,\n confirmAsset,\n openPreview,\n isSameAsset,\n canSelectAsset,\n resolveLimit,\n handleAssetGridKeydown,\n })\n : undefined,\n tab.value === 'upload'\n ? h('section', { class: 'sparq-asset-picker__panel' }, [\n h(SparqAssetUploadPanel, {\n tasks: uploadTasks.value,\n accept: request.options.accept,\n emptyText: '上传成功的资源会自动加入已选。',\n onAddFiles(files: File[]) {\n void uploadFiles(files)\n },\n onRetry: retryUpload,\n onCancel: cancelUpload,\n }),\n ])\n : undefined,\n tab.value === 'remote'\n ? renderRemotePanel({\n enabled: Boolean(request.config.addRemote),\n url: remoteUrl.value,\n local: remoteLocal.value,\n loading: remoteLoading.value,\n ui,\n setUrl(value) {\n remoteUrl.value = value\n },\n setLocal(value) {\n remoteLocal.value = value\n },\n addRemote,\n })\n : undefined,\n renderSelectedPanel(selected.value, removeSelected, ui, assetPreviews),\n ]),\n preview.asset.value\n ? renderAssetPreviewDialog(\n preview.asset.value,\n {\n close: preview.close,\n scale: preview.scale.value,\n rotate: preview.rotate.value,\n loading: preview.loading.value,\n failed: preview.failed.value,\n onLoad: preview.markLoaded,\n onError: preview.markFailed,\n zoomIn: preview.zoomIn,\n zoomOut: preview.zoomOut,\n rotateLeft: preview.rotateLeft,\n rotateRight: preview.rotateRight,\n reset: preview.reset,\n },\n assetPreviews,\n )\n : undefined,\n ],\n ),\n ])\n }\n },\n})\n\nfunction renderRemotePanel(state: {\n enabled: boolean\n url: string\n local: boolean\n loading: boolean\n ui: UiKit\n setUrl: (url: string) => void\n setLocal: (value: boolean) => void\n addRemote: () => Promise<void>\n}) {\n if (!state.enabled) {\n return h('div', { class: 'sparq-asset-picker__empty' }, '未配置远程资源添加接口。')\n }\n\n return h('section', { class: 'sparq-asset-picker__panel' }, [\n h('div', { class: 'sparq-asset-picker__remote-form' }, [\n renderUiInput(state.ui, state.url, {\n class: 'sparq-asset-picker__input',\n type: 'url',\n inputmode: 'url',\n placeholder: '请输入资源地址,例如 https://...',\n onChange(value: unknown) {\n state.setUrl(String(value ?? ''))\n },\n onKeyup(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n void state.addRemote()\n }\n },\n }),\n h('label', { class: 'sparq-asset-picker__check' }, [\n h('input', {\n type: 'checkbox',\n checked: state.local,\n onChange(event: Event) {\n state.setLocal((event.target as HTMLInputElement).checked)\n },\n }),\n h('span', null, '本地存储'),\n ]),\n renderUiButton(state.ui, state.loading ? '处理中...' : '添加资源', {\n class: 'sparq-asset-picker__button is-primary',\n type: 'primary',\n icon: 'plus',\n disabled: state.loading || !state.url,\n onClick() {\n void state.addRemote()\n },\n }),\n ]),\n h('div', { class: 'sparq-asset-picker__empty' }, '添加成功的资源会自动加入已选。'),\n ])\n}\n\nfunction handleAssetGridKeydown(event: KeyboardEvent) {\n if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {\n return\n }\n\n const current = (event.target as HTMLElement | null)?.closest?.<HTMLButtonElement>('.sparq-asset-picker__card')\n const grid = event.currentTarget as HTMLElement | null\n if (!current || !grid) {\n return\n }\n\n const cards = Array.from(grid.querySelectorAll<HTMLButtonElement>('.sparq-asset-picker__card:not(:disabled)'))\n const index = cards.indexOf(current)\n if (index < 0) {\n return\n }\n\n const columns = resolveGridColumnCount(grid, cards[0])\n const nextIndex =\n event.key === 'ArrowLeft'\n ? index - 1\n : event.key === 'ArrowRight'\n ? index + 1\n : event.key === 'ArrowUp'\n ? index - columns\n : index + columns\n\n const next = cards[Math.max(0, Math.min(cards.length - 1, nextIndex))]\n if (next && next !== current) {\n event.preventDefault()\n next.focus()\n }\n}\n\nfunction resolveGridColumnCount(grid: HTMLElement, firstCard: HTMLElement | undefined): number {\n const cardWidth = firstCard?.offsetWidth ?? 0\n if (cardWidth <= 0 || grid.clientWidth <= 0) {\n return 4\n }\n\n return Math.max(1, Math.floor(grid.clientWidth / cardWidth))\n}\n\nfunction normalizePayload(\n payload: SparqAssetListPayload,\n pickerType: SparqAssetType | undefined,\n): SparqAssetListPayload {\n const results = Array.isArray(payload.results)\n ? payload.results.filter((asset) => canSelectAsset(asset, pickerType))\n : []\n return {\n results,\n total: Number(payload.total ?? results.length),\n groups: normalizeOptions(payload.groups),\n types: normalizeOptions(payload.types),\n }\n}\n\nfunction normalizeOptions(options: SparqAssetOption[] | undefined): SparqAssetOption[] {\n return Array.isArray(options)\n ? options\n .filter((option) => option && option.value !== undefined)\n .map((option) => ({ label: String(option.label ?? option.value), value: String(option.value) }))\n : []\n}\n\nfunction resolveLimit(request: AssetPickerRequest | undefined): number {\n if (!request) {\n return 1\n }\n if (typeof request.options.limit === 'number' && request.options.limit >= 0) {\n return request.options.limit\n }\n return request.options.multiple ? 0 : 1\n}\n\nfunction canSelectAsset(asset: SparqAsset, pickerType: SparqAssetType | undefined): boolean {\n if (pickerType === 'image') {\n return resolveAssetType(asset) === 'image'\n }\n\n return true\n}\n\nfunction resolveLimitMessage(limit: number): string {\n return limit > 0 ? `最多只能选择 ${limit} 个资源。` : '当前选择数量已达到上限。'\n}\n\nfunction resolveTypeMismatchMessage(pickerType: SparqAssetType | undefined): string {\n return pickerType === 'image' ? '当前字段只允许选择图片资源。' : '当前资源类型不符合要求。'\n}\n\nfunction readPreferredView(preference: SparqAssetPickerViewPreference | undefined): PickerView {\n const injected = preference?.read?.()\n if (injected === 'list' || injected === 'grid') {\n return injected\n }\n if (typeof window === 'undefined') {\n return 'grid'\n }\n\n const value = window.localStorage?.getItem(VIEW_STORAGE_KEY)\n return value === 'list' || value === 'grid' ? value : 'grid'\n}\n\nfunction writePreferredView(view: PickerView, preference: SparqAssetPickerViewPreference | undefined): void {\n if (preference?.write) {\n preference.write(view)\n return\n }\n if (typeof window === 'undefined') {\n return\n }\n\n window.localStorage?.setItem(VIEW_STORAGE_KEY, view)\n}\n\nfunction isSameAsset(left: SparqAsset, right: SparqAsset): boolean {\n if (left.id !== undefined && right.id !== undefined) {\n return left.id === right.id\n }\n\n return left.url === right.url\n}\n","import { h, render, ref, type Ref } from 'vue'\nimport type { SparqAsset, SparqAssetService } from '../service'\nimport { AssetPickerRoot } from './AssetPickerRoot'\nimport type { AssetPickerRequest, CreateAssetPickerServiceOptions } from './types'\n\nexport function createAssetPickerService(options: CreateAssetPickerServiceOptions): SparqAssetService {\n const request = createPickerRequestRef()\n let uiKit = options.uiKit\n let mounted = false\n\n return {\n upload: options.upload,\n pick(pickOptions) {\n ensurePickerRoot()\n return new Promise<SparqAsset[]>((resolve, reject) => {\n request.value = {\n config: options,\n options: pickOptions,\n resolve,\n reject,\n }\n })\n },\n setUiKit(nextUiKit) {\n uiKit = nextUiKit\n ensurePickerRoot()\n },\n }\n\n function ensurePickerRoot() {\n if (typeof document === 'undefined' || mounted) {\n return\n }\n if (!uiKit) {\n throw new Error('Sparq UI kit is required to render asset picker.')\n }\n\n const target = resolveMountTarget(options)\n if (!target) {\n return\n }\n\n const container = document.createElement('div')\n container.className = 'sparq-asset-picker-root'\n target.appendChild(container)\n render(h(AssetPickerRoot, { request, uiKit, viewPreference: options.viewPreference }), container)\n mounted = true\n }\n}\n\nfunction createPickerRequestRef(): Ref<AssetPickerRequest | undefined> {\n return ref<AssetPickerRequest>()\n}\n\nfunction resolveMountTarget(options: CreateAssetPickerServiceOptions): HTMLElement | undefined {\n if (typeof options.mountTarget === 'function') {\n return options.mountTarget()\n }\n if (options.mountTarget) {\n return options.mountTarget\n }\n return document.body\n}\n","import type { App } from 'vue'\nimport { SparqView } from './components/SparqView'\nimport { DEFAULT_CUSTOM_COMPONENTS } from './custom-components'\nimport { SqRender } from './ui'\nimport {\n SPARQ_ASSET_SERVICE_KEY,\n SPARQ_ASSET_PREVIEW_REGISTRY_KEY,\n SPARQ_COMPONENT_REGISTRY_KEY,\n SPARQ_FRONTEND_KERNEL_KEY,\n SPARQ_ICON_REGISTRY_KEY,\n SPARQ_RICH_TEXT_REGISTRY_KEY,\n SPARQ_SCHEMA_RENDERER_KEY,\n SPARQ_SCHEMA_PRESENTATION_KEY,\n SPARQ_SCHEMA_RUNTIME_KEY,\n SPARQ_SCHEMA_UI_ADAPTER_KEY,\n SPARQ_UI_KIT_KEY,\n} from './keys'\nimport type { SchemaRenderer } from './types'\n\n/**\n * 安装 Vue 渲染器。\n *\n * 该方法只注册组件并 provide 渲染器和 runtime,不包含任何 UI 组件库注册。\n */\nexport function installSchemaRenderer(app: App, renderer: SchemaRenderer): void {\n app.provide(SPARQ_FRONTEND_KERNEL_KEY, renderer.kernel)\n app.provide(SPARQ_SCHEMA_RUNTIME_KEY, renderer.runtime)\n app.provide(SPARQ_SCHEMA_RENDERER_KEY, renderer)\n app.provide(SPARQ_ASSET_PREVIEW_REGISTRY_KEY, renderer.assetPreviews)\n if (renderer.uiAdapter) {\n app.provide(SPARQ_SCHEMA_UI_ADAPTER_KEY, renderer.uiAdapter)\n }\n if (renderer.uiKit) {\n app.provide(SPARQ_UI_KIT_KEY, renderer.uiKit)\n }\n if (renderer.components) {\n app.provide(SPARQ_COMPONENT_REGISTRY_KEY, renderer.components)\n }\n if (renderer.icons) {\n app.provide(SPARQ_ICON_REGISTRY_KEY, renderer.icons)\n }\n if (renderer.richTextEditors) {\n app.provide(SPARQ_RICH_TEXT_REGISTRY_KEY, renderer.richTextEditors)\n }\n if (renderer.assetService) {\n if (renderer.uiKit) {\n renderer.assetService.setUiKit?.(renderer.uiKit)\n }\n app.provide(SPARQ_ASSET_SERVICE_KEY, renderer.assetService)\n }\n if (renderer.presentationHost) {\n app.provide(SPARQ_SCHEMA_PRESENTATION_KEY, renderer.presentationHost)\n }\n app.component('SparqView', SparqView)\n app.component('SqRender', SqRender)\n for (const [name, component] of Object.entries(DEFAULT_CUSTOM_COMPONENTS)) {\n app.component(name, component)\n }\n}\n"],"mappings":"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"}