@fses/workbench-app 0.2.0 → 0.2.2
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.
- package/WORKBENCH-CLOSURE.json +80 -0
- package/dist/Workspace-fYH2XNdb.js +22699 -0
- package/dist/fses-workbench-app.js +2 -2
- package/dist/{index-DbH6tMQy.js → index-CbIJlts1.js} +8 -8
- package/dist/internal/personal-workbench/components/workbench/WorkbenchStudio.vue.d.ts +2 -2
- package/dist/internal/personal-workbench/lib/deepAgentApi.d.ts +41 -2
- package/dist/internal/personal-workbench/lib/deepAgentQueueState.d.ts +111 -0
- package/dist/internal/personal-workbench/lib/vueRuntimeAdapters.d.ts +72 -0
- package/dist/internal/personal-workbench/lib/workbenchSocketClient.d.ts +1 -1
- package/dist/internal/personal-workbench/lib/workbenchStorage.d.ts +2 -0
- package/dist/runtime/index.js +1 -1
- package/dist/style.css +1 -1
- package/dist/{useWorkbenchRuntime-XpOzwm56.js → useWorkbenchRuntime-Ch8lqkjO.js} +6707 -6315
- package/node_modules/@byteluck/agentic-protocol/LICENSE +9 -0
- package/node_modules/@byteluck/agentic-protocol/README.md +74 -0
- package/node_modules/@byteluck/agentic-protocol/dist/index.d.ts +1623 -0
- package/node_modules/@byteluck/agentic-protocol/dist/index.mjs +3380 -0
- package/node_modules/@byteluck/agentic-protocol/package.json +37 -0
- package/node_modules/@byteluck/workbench-skill-contracts/LICENSE +9 -0
- package/node_modules/@byteluck/workbench-skill-contracts/dist/index.d.ts +234 -0
- package/node_modules/@byteluck/workbench-skill-contracts/dist/index.mjs +394 -0
- package/node_modules/@byteluck/workbench-skill-contracts/package.json +37 -0
- package/node_modules/@fses/ai-chat/LICENSE +9 -0
- package/node_modules/@fses/ai-chat/README.md +320 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/data.d.ts +12 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/from-markdown.d.ts +11 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/from-tool.d.ts +8 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/options.d.ts +4 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/trace.d.ts +19 -0
- package/node_modules/@fses/ai-chat/dist/chart-card/types.d.ts +133 -0
- package/node_modules/@fses/ai-chat/dist/components/CardRecommendationDeferredDraft.vue.d.ts +13 -0
- package/node_modules/@fses/ai-chat/dist/components/CardRecommendationDraft.vue.d.ts +18 -0
- package/node_modules/@fses/ai-chat/dist/components/ChartCardRenderer.vue.d.ts +11 -0
- package/node_modules/@fses/ai-chat/dist/components/ChatMessageItem.vue.d.ts +76 -0
- package/node_modules/@fses/ai-chat/dist/components/ChatMessageList.vue.d.ts +79 -0
- package/node_modules/@fses/ai-chat/dist/components/ChatSender.vue.d.ts +98 -0
- package/node_modules/@fses/ai-chat/dist/components/CollapsedToolActivity.vue.d.ts +9 -0
- package/node_modules/@fses/ai-chat/dist/components/ContextUsageRing.vue.d.ts +12 -0
- package/node_modules/@fses/ai-chat/dist/components/EChartsView.vue.d.ts +6 -0
- package/node_modules/@fses/ai-chat/dist/components/FsesAiChat.vue.d.ts +306 -0
- package/node_modules/@fses/ai-chat/dist/components/PlanDraftCard.vue.d.ts +19 -0
- package/node_modules/@fses/ai-chat/dist/components/ShellExecPanel.vue.d.ts +6 -0
- package/node_modules/@fses/ai-chat/dist/components/TaskTodoPlanBar.vue.d.ts +6 -0
- package/node_modules/@fses/ai-chat/dist/components/ThinkingShimmer.vue.d.ts +6 -0
- package/node_modules/@fses/ai-chat/dist/composables/context-usage.d.ts +11 -0
- package/node_modules/@fses/ai-chat/dist/composables/types.d.ts +465 -0
- package/node_modules/@fses/ai-chat/dist/composables/useChat.d.ts +2 -0
- package/node_modules/@fses/ai-chat/dist/composables/useSystemEChartsIcon.d.ts +11 -0
- package/node_modules/@fses/ai-chat/dist/fses-ai-chat.js +11408 -0
- package/node_modules/@fses/ai-chat/dist/fses-ai-chat.umd.cjs +25 -0
- package/node_modules/@fses/ai-chat/dist/index.d.ts +17 -0
- package/node_modules/@fses/ai-chat/dist/plugin.d.ts +8 -0
- package/node_modules/@fses/ai-chat/dist/style.css +1 -0
- package/node_modules/@fses/ai-chat/dist/utils/assistant-markdown.d.ts +11 -0
- package/node_modules/@fses/ai-chat/dist/utils/attachment-upload.d.ts +22 -0
- package/node_modules/@fses/ai-chat/dist/utils/card-recommendation-config-summary.d.ts +86 -0
- package/node_modules/@fses/ai-chat/dist/utils/card-recommendation-field-label.d.ts +24 -0
- package/node_modules/@fses/ai-chat/dist/utils/card-recommendation-source.d.ts +18 -0
- package/node_modules/@fses/ai-chat/dist/utils/card-recommendation-title-source.d.ts +12 -0
- package/node_modules/@fses/ai-chat/dist/utils/chart-card-visibility.d.ts +24 -0
- package/node_modules/@fses/ai-chat/dist/utils/derived-process-labels.d.ts +13 -0
- package/node_modules/@fses/ai-chat/dist/utils/echarts-recommendation-icon.d.ts +36 -0
- package/node_modules/@fses/ai-chat/dist/utils/group-messages.d.ts +30 -0
- package/node_modules/@fses/ai-chat/dist/utils/status-activity.d.ts +48 -0
- package/node_modules/@fses/ai-chat/dist/utils/system-echarts-template-icons.generated.d.ts +305 -0
- package/node_modules/@fses/ai-chat/dist/utils/system-echarts-template.d.ts +20 -0
- package/node_modules/@fses/ai-chat/dist/utils/task-todo-plan.d.ts +40 -0
- package/node_modules/@fses/ai-chat/dist/utils/workbench-echarts-theme.d.ts +35 -0
- package/node_modules/@fses/ai-chat/package.json +81 -0
- package/node_modules/@fses/workbench-card/LICENSE +9 -0
- package/node_modules/@fses/workbench-card/README.md +81 -0
- package/node_modules/@fses/workbench-card/dist/chart/index.d.ts +8 -0
- package/node_modules/@fses/workbench-card/dist/fses-workbench-card-echarts-protocol.js +2230 -0
- package/node_modules/@fses/workbench-card/dist/fses-workbench-card-renderers.js +33742 -0
- package/node_modules/@fses/workbench-card/dist/fses-workbench-card.js +21238 -0
- package/node_modules/@fses/workbench-card/dist/fses-workbench-card.umd.cjs +1 -0
- package/node_modules/@fses/workbench-card/dist/index.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/registry/cardRegistry.d.ts +50 -0
- package/node_modules/@fses/workbench-card/dist/registry/compositeCardPatterns.d.ts +39 -0
- package/node_modules/@fses/workbench-card/dist/registry/echartsTemplateCategories.d.ts +20 -0
- package/node_modules/@fses/workbench-card/dist/registry/echartsTemplateRegistry.d.ts +1158 -0
- package/node_modules/@fses/workbench-card/dist/registry/echartsTemplateRegistry.generated.d.ts +1141 -0
- package/node_modules/@fses/workbench-card/dist/registry/echartsTemplateTypes.d.ts +76 -0
- package/node_modules/@fses/workbench-card/dist/registry/index.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/WorkbenchBlockRenderer.vue.d.ts +55 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/ChartRegistry.vue.d.ts +22 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/EChartsProtocolRenderer.vue.d.ts +34 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/chartRendererRegistry.d.ts +219 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/chartResponsiveLayout.d.ts +47 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/dynamicEchartOption.d.ts +30 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/adapter.d.ts +73 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/composite.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/configOnly.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/geo.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/graphic.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/layout.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/network.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/scene3D.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/series.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/table.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/timeline.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/transition.converter.d.ts +11 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/tree.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/converters/tuple.converter.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/index.d.ts +9 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/merger.d.ts +16 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echarts-protocol/types.d.ts +447 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echartsRuntimeInteractions.d.ts +30 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echartsTitle.d.ts +13 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/echartsTooltipPortal.d.ts +12 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/types.d.ts +47 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/useEchart.d.ts +29 -0
- package/node_modules/@fses/workbench-card/dist/renderers/chart/workbenchChartTheme.d.ts +36 -0
- package/node_modules/@fses/workbench-card/dist/renderers/custom-canvas/canvasLayoutBindings.d.ts +86 -0
- package/node_modules/@fses/workbench-card/dist/renderers/hostBridge.d.ts +61 -0
- package/node_modules/@fses/workbench-card/dist/renderers/index.d.ts +17 -0
- package/node_modules/@fses/workbench-card/dist/renderers/native/nativeBindings.d.ts +145 -0
- package/node_modules/@fses/workbench-card/dist/renderers/nested/nestedBlockBindings.d.ts +107 -0
- package/node_modules/@fses/workbench-card/dist/renderers/quickLinkDisplay.d.ts +24 -0
- package/node_modules/@fses/workbench-card/dist/renderers/reference-composite/referenceCompositeBindings.d.ts +171 -0
- package/node_modules/@fses/workbench-card/dist/renderers/reference-composite/referenceRiskAndStrategyBindings.d.ts +91 -0
- package/node_modules/@fses/workbench-card/dist/renderers/resizableTable.d.ts +51 -0
- package/node_modules/@fses/workbench-card/dist/renderers/style.css +1 -0
- package/node_modules/@fses/workbench-card/dist/renderers/tableDisplay.d.ts +25 -0
- package/node_modules/@fses/workbench-card/dist/renderers/useWorkbenchBlockRendererBindings.d.ts +580 -0
- package/node_modules/@fses/workbench-card/dist/shell/workbenchVisualShell.d.ts +48 -0
- package/node_modules/@fses/workbench-card/dist/style.css +1 -0
- package/node_modules/@fses/workbench-card/dist/types/block.d.ts +2011 -0
- package/node_modules/@fses/workbench-card/dist/types/canvas.d.ts +25 -0
- package/node_modules/@fses/workbench-card/dist/types/echartsProtocol.d.ts +445 -0
- package/node_modules/@fses/workbench-card/dist/types/index.d.ts +10 -0
- package/node_modules/@fses/workbench-card/dist/types/registry.d.ts +7 -0
- package/node_modules/@fses/workbench-card/dist/types/runtime.d.ts +34 -0
- package/node_modules/@fses/workbench-card/package.json +83 -0
- package/node_modules/@fses/workbench-card/src/chart/index.ts +8 -0
- package/node_modules/@fses/workbench-card/src/index.ts +13 -0
- package/node_modules/@fses/workbench-card/src/registry/cardRegistry.ts +476 -0
- package/node_modules/@fses/workbench-card/src/registry/compositeCardPatterns.ts +206 -0
- package/node_modules/@fses/workbench-card/src/registry/echartsTemplateCategories.ts +74 -0
- package/node_modules/@fses/workbench-card/src/registry/echartsTemplateRegistry.generated.js +19950 -0
- package/node_modules/@fses/workbench-card/src/registry/echartsTemplateRegistry.generated.ts +19951 -0
- package/node_modules/@fses/workbench-card/src/registry/echartsTemplateRegistry.ts +32 -0
- package/node_modules/@fses/workbench-card/src/registry/echartsTemplateTypes.ts +83 -0
- package/node_modules/@fses/workbench-card/src/registry/index.ts +10 -0
- package/node_modules/@fses/workbench-card/src/renderers/WorkbenchBlockRenderer.vue +2728 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/ChartRegistry.vue +221 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/EChartsProtocolRenderer.vue +304 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/chartRendererRegistry.ts +311 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/chartResponsiveLayout.ts +172 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/dynamicEchartOption.ts +127 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/adapter.ts +1349 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/composite.converter.ts +71 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/configOnly.converter.ts +45 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/geo.converter.ts +97 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/graphic.converter.ts +59 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/layout.converter.ts +53 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/network.converter.ts +82 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/scene3D.converter.ts +73 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/series.converter.ts +795 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/table.converter.ts +195 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/timeline.converter.ts +62 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/transition.converter.ts +58 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/tree.converter.ts +75 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/converters/tuple.converter.ts +112 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/index.ts +10 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/merger.ts +109 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echarts-protocol/types.ts +515 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echartsRuntimeInteractions.ts +450 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echartsTitle.ts +94 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/echartsTooltipPortal.ts +140 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/types.ts +53 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/useEchart.ts +1820 -0
- package/node_modules/@fses/workbench-card/src/renderers/chart/workbenchChartTheme.ts +240 -0
- package/node_modules/@fses/workbench-card/src/renderers/custom-canvas/canvasLayoutBindings.ts +660 -0
- package/node_modules/@fses/workbench-card/src/renderers/hostBridge.ts +74 -0
- package/node_modules/@fses/workbench-card/src/renderers/index.ts +25 -0
- package/node_modules/@fses/workbench-card/src/renderers/native/nativeBindings.ts +1096 -0
- package/node_modules/@fses/workbench-card/src/renderers/nested/nestedBlockBindings.ts +1349 -0
- package/node_modules/@fses/workbench-card/src/renderers/quickLinkDisplay.ts +53 -0
- package/node_modules/@fses/workbench-card/src/renderers/reference-composite/referenceCompositeBindings.ts +3209 -0
- package/node_modules/@fses/workbench-card/src/renderers/reference-composite/referenceRiskAndStrategyBindings.ts +1004 -0
- package/node_modules/@fses/workbench-card/src/renderers/resizableTable.ts +136 -0
- package/node_modules/@fses/workbench-card/src/renderers/tableDisplay.ts +140 -0
- package/node_modules/@fses/workbench-card/src/renderers/useWorkbenchBlockRendererBindings.ts +3192 -0
- package/node_modules/@fses/workbench-card/src/shell/workbenchVisualShell.ts +228 -0
- package/node_modules/@fses/workbench-card/src/styles/workbench-card.css +343 -0
- package/node_modules/@fses/workbench-card/src/types/block.ts +2496 -0
- package/node_modules/@fses/workbench-card/src/types/canvas.ts +30 -0
- package/node_modules/@fses/workbench-card/src/types/echartsProtocol.ts +513 -0
- package/node_modules/@fses/workbench-card/src/types/index.ts +10 -0
- package/node_modules/@fses/workbench-card/src/types/registry.ts +17 -0
- package/node_modules/@fses/workbench-card/src/types/runtime.ts +31 -0
- package/node_modules/dompurify/LICENSE +568 -0
- package/node_modules/dompurify/README.md +523 -0
- package/node_modules/dompurify/dist/purify.cjs.d.ts +451 -0
- package/node_modules/dompurify/dist/purify.cjs.js +1472 -0
- package/node_modules/dompurify/dist/purify.cjs.js.map +1 -0
- package/node_modules/dompurify/dist/purify.es.d.mts +448 -0
- package/node_modules/dompurify/dist/purify.es.mjs +1470 -0
- package/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
- package/node_modules/dompurify/dist/purify.js +1478 -0
- package/node_modules/dompurify/dist/purify.js.map +1 -0
- package/node_modules/dompurify/dist/purify.min.js +3 -0
- package/node_modules/dompurify/dist/purify.min.js.map +1 -0
- package/node_modules/dompurify/package.json +168 -0
- package/node_modules/zod/LICENSE +21 -0
- package/node_modules/zod/README.md +208 -0
- package/node_modules/zod/index.cjs +33 -0
- package/node_modules/zod/index.d.cts +4 -0
- package/node_modules/zod/index.d.ts +4 -0
- package/node_modules/zod/index.js +4 -0
- package/node_modules/zod/package.json +118 -0
- package/node_modules/zod/src/index.ts +4 -0
- package/node_modules/zod/src/v3/ZodError.ts +330 -0
- package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
- package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
- package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
- package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
- package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
- package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
- package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
- package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
- package/node_modules/zod/src/v3/errors.ts +13 -0
- package/node_modules/zod/src/v3/external.ts +6 -0
- package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
- package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
- package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
- package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
- package/node_modules/zod/src/v3/helpers/util.ts +224 -0
- package/node_modules/zod/src/v3/index.ts +4 -0
- package/node_modules/zod/src/v3/locales/en.ts +124 -0
- package/node_modules/zod/src/v3/standard-schema.ts +113 -0
- package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
- package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
- package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
- package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
- package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
- package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
- package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
- package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
- package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/complex.test.ts +56 -0
- package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
- package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
- package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
- package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
- package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
- package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
- package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/function.test.ts +257 -0
- package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
- package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
- package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
- package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
- package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
- package/node_modules/zod/src/v3/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
- package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
- package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
- package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
- package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
- package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
- package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
- package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
- package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
- package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
- package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
- package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
- package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
- package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
- package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
- package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
- package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
- package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
- package/node_modules/zod/src/v3/types.ts +5136 -0
- package/node_modules/zod/src/v4/classic/checks.ts +30 -0
- package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
- package/node_modules/zod/src/v4/classic/compat.ts +66 -0
- package/node_modules/zod/src/v4/classic/errors.ts +75 -0
- package/node_modules/zod/src/v4/classic/external.ts +50 -0
- package/node_modules/zod/src/v4/classic/index.ts +5 -0
- package/node_modules/zod/src/v4/classic/iso.ts +90 -0
- package/node_modules/zod/src/v4/classic/parse.ts +33 -0
- package/node_modules/zod/src/v4/classic/schemas.ts +2054 -0
- package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
- package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
- package/node_modules/zod/src/v4/classic/tests/brand.test.ts +63 -0
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +352 -0
- package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +31 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +296 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +313 -0
- package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +619 -0
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +527 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
- package/node_modules/zod/src/v4/classic/tests/file.test.ts +91 -0
- package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +268 -0
- package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +829 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +34 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +171 -0
- package/node_modules/zod/src/v4/classic/tests/json.test.ts +108 -0
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +92 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +196 -0
- package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +86 -0
- package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +247 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +563 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +123 -0
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +147 -0
- package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +127 -0
- package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +37 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +298 -0
- package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +342 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +356 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +532 -0
- package/node_modules/zod/src/v4/classic/tests/registries.test.ts +204 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +179 -0
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +57 -0
- package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +109 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +881 -0
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +66 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +758 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2314 -0
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +250 -0
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +163 -0
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +94 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
- package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
- package/node_modules/zod/src/v4/core/api.ts +1594 -0
- package/node_modules/zod/src/v4/core/checks.ts +1283 -0
- package/node_modules/zod/src/v4/core/config.ts +15 -0
- package/node_modules/zod/src/v4/core/core.ts +134 -0
- package/node_modules/zod/src/v4/core/doc.ts +44 -0
- package/node_modules/zod/src/v4/core/errors.ts +424 -0
- package/node_modules/zod/src/v4/core/function.ts +176 -0
- package/node_modules/zod/src/v4/core/index.ts +15 -0
- package/node_modules/zod/src/v4/core/json-schema.ts +143 -0
- package/node_modules/zod/src/v4/core/parse.ts +94 -0
- package/node_modules/zod/src/v4/core/regexes.ts +135 -0
- package/node_modules/zod/src/v4/core/registries.ts +96 -0
- package/node_modules/zod/src/v4/core/schemas.ts +3842 -0
- package/node_modules/zod/src/v4/core/standard-schema.ts +64 -0
- package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
- package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
- package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +977 -0
- package/node_modules/zod/src/v4/core/util.ts +775 -0
- package/node_modules/zod/src/v4/core/versions.ts +5 -0
- package/node_modules/zod/src/v4/core/zsf.ts +323 -0
- package/node_modules/zod/src/v4/index.ts +4 -0
- package/node_modules/zod/src/v4/locales/ar.ts +125 -0
- package/node_modules/zod/src/v4/locales/az.ts +121 -0
- package/node_modules/zod/src/v4/locales/be.ts +184 -0
- package/node_modules/zod/src/v4/locales/ca.ts +127 -0
- package/node_modules/zod/src/v4/locales/cs.ts +142 -0
- package/node_modules/zod/src/v4/locales/de.ts +124 -0
- package/node_modules/zod/src/v4/locales/en.ts +127 -0
- package/node_modules/zod/src/v4/locales/eo.ts +125 -0
- package/node_modules/zod/src/v4/locales/es.ts +125 -0
- package/node_modules/zod/src/v4/locales/fa.ts +134 -0
- package/node_modules/zod/src/v4/locales/fi.ts +131 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +126 -0
- package/node_modules/zod/src/v4/locales/fr.ts +124 -0
- package/node_modules/zod/src/v4/locales/he.ts +125 -0
- package/node_modules/zod/src/v4/locales/hu.ts +126 -0
- package/node_modules/zod/src/v4/locales/id.ts +125 -0
- package/node_modules/zod/src/v4/locales/index.ts +39 -0
- package/node_modules/zod/src/v4/locales/it.ts +125 -0
- package/node_modules/zod/src/v4/locales/ja.ts +122 -0
- package/node_modules/zod/src/v4/locales/kh.ts +126 -0
- package/node_modules/zod/src/v4/locales/ko.ts +131 -0
- package/node_modules/zod/src/v4/locales/mk.ts +127 -0
- package/node_modules/zod/src/v4/locales/ms.ts +124 -0
- package/node_modules/zod/src/v4/locales/nl.ts +126 -0
- package/node_modules/zod/src/v4/locales/no.ts +124 -0
- package/node_modules/zod/src/v4/locales/ota.ts +125 -0
- package/node_modules/zod/src/v4/locales/pl.ts +126 -0
- package/node_modules/zod/src/v4/locales/ps.ts +133 -0
- package/node_modules/zod/src/v4/locales/pt.ts +123 -0
- package/node_modules/zod/src/v4/locales/ru.ts +184 -0
- package/node_modules/zod/src/v4/locales/sl.ts +126 -0
- package/node_modules/zod/src/v4/locales/sv.ts +127 -0
- package/node_modules/zod/src/v4/locales/ta.ts +125 -0
- package/node_modules/zod/src/v4/locales/th.ts +126 -0
- package/node_modules/zod/src/v4/locales/tr.ts +121 -0
- package/node_modules/zod/src/v4/locales/ua.ts +126 -0
- package/node_modules/zod/src/v4/locales/ur.ts +126 -0
- package/node_modules/zod/src/v4/locales/vi.ts +125 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +123 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +125 -0
- package/node_modules/zod/src/v4/mini/checks.ts +32 -0
- package/node_modules/zod/src/v4/mini/coerce.ts +22 -0
- package/node_modules/zod/src/v4/mini/external.ts +40 -0
- package/node_modules/zod/src/v4/mini/index.ts +3 -0
- package/node_modules/zod/src/v4/mini/iso.ts +62 -0
- package/node_modules/zod/src/v4/mini/parse.ts +1 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +1579 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
- package/node_modules/zod/src/v4/mini/tests/brand.test.ts +51 -0
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +871 -0
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +185 -0
- package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +299 -0
- package/node_modules/zod/src/v4-mini/index.ts +1 -0
- package/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/zod/v3/external.js +6 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/zod/v3/index.js +4 -0
- package/node_modules/zod/v3/locales/en.cjs +111 -0
- package/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/zod/v3/types.cjs +3775 -0
- package/node_modules/zod/v3/types.d.cts +1031 -0
- package/node_modules/zod/v3/types.d.ts +1031 -0
- package/node_modules/zod/v3/types.js +3693 -0
- package/node_modules/zod/v4/classic/checks.cjs +32 -0
- package/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/zod/v4/classic/compat.cjs +57 -0
- package/node_modules/zod/v4/classic/compat.d.cts +46 -0
- package/node_modules/zod/v4/classic/compat.d.ts +46 -0
- package/node_modules/zod/v4/classic/compat.js +27 -0
- package/node_modules/zod/v4/classic/errors.cjs +67 -0
- package/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/zod/v4/classic/errors.js +41 -0
- package/node_modules/zod/v4/classic/external.cjs +70 -0
- package/node_modules/zod/v4/classic/external.d.cts +13 -0
- package/node_modules/zod/v4/classic/external.d.ts +13 -0
- package/node_modules/zod/v4/classic/external.js +18 -0
- package/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/zod/v4/classic/parse.cjs +32 -0
- package/node_modules/zod/v4/classic/parse.d.cts +23 -0
- package/node_modules/zod/v4/classic/parse.d.ts +23 -0
- package/node_modules/zod/v4/classic/parse.js +6 -0
- package/node_modules/zod/v4/classic/schemas.cjs +1109 -0
- package/node_modules/zod/v4/classic/schemas.d.cts +630 -0
- package/node_modules/zod/v4/classic/schemas.d.ts +630 -0
- package/node_modules/zod/v4/classic/schemas.js +1006 -0
- package/node_modules/zod/v4/core/api.cjs +1039 -0
- package/node_modules/zod/v4/core/api.d.cts +284 -0
- package/node_modules/zod/v4/core/api.d.ts +284 -0
- package/node_modules/zod/v4/core/api.js +906 -0
- package/node_modules/zod/v4/core/checks.cjs +591 -0
- package/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/zod/v4/core/checks.js +565 -0
- package/node_modules/zod/v4/core/core.cjs +67 -0
- package/node_modules/zod/v4/core/core.d.cts +49 -0
- package/node_modules/zod/v4/core/core.d.ts +49 -0
- package/node_modules/zod/v4/core/core.js +61 -0
- package/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/zod/v4/core/errors.cjs +226 -0
- package/node_modules/zod/v4/core/errors.d.cts +208 -0
- package/node_modules/zod/v4/core/errors.d.ts +208 -0
- package/node_modules/zod/v4/core/errors.js +195 -0
- package/node_modules/zod/v4/core/function.cjs +102 -0
- package/node_modules/zod/v4/core/function.d.cts +52 -0
- package/node_modules/zod/v4/core/function.d.ts +52 -0
- package/node_modules/zod/v4/core/function.js +75 -0
- package/node_modules/zod/v4/core/index.cjs +44 -0
- package/node_modules/zod/v4/core/index.d.cts +15 -0
- package/node_modules/zod/v4/core/index.d.ts +15 -0
- package/node_modules/zod/v4/core/index.js +15 -0
- package/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +87 -0
- package/node_modules/zod/v4/core/json-schema.d.ts +87 -0
- package/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/zod/v4/core/parse.cjs +87 -0
- package/node_modules/zod/v4/core/parse.d.cts +25 -0
- package/node_modules/zod/v4/core/parse.d.ts +25 -0
- package/node_modules/zod/v4/core/parse.js +57 -0
- package/node_modules/zod/v4/core/regexes.cjs +103 -0
- package/node_modules/zod/v4/core/regexes.d.cts +62 -0
- package/node_modules/zod/v4/core/regexes.d.ts +62 -0
- package/node_modules/zod/v4/core/regexes.js +95 -0
- package/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/zod/v4/core/schemas.cjs +1748 -0
- package/node_modules/zod/v4/core/schemas.d.cts +1041 -0
- package/node_modules/zod/v4/core/schemas.d.ts +1041 -0
- package/node_modules/zod/v4/core/schemas.js +1717 -0
- package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
- package/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
- package/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
- package/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
- package/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
- package/node_modules/zod/v4/core/to-json-schema.js +849 -0
- package/node_modules/zod/v4/core/util.cjs +539 -0
- package/node_modules/zod/v4/core/util.d.cts +183 -0
- package/node_modules/zod/v4/core/util.d.ts +183 -0
- package/node_modules/zod/v4/core/util.js +493 -0
- package/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/zod/v4/index.js +3 -0
- package/node_modules/zod/v4/locales/ar.cjs +142 -0
- package/node_modules/zod/v4/locales/ar.d.cts +4 -0
- package/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/zod/v4/locales/ar.js +116 -0
- package/node_modules/zod/v4/locales/az.cjs +141 -0
- package/node_modules/zod/v4/locales/az.d.cts +4 -0
- package/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/zod/v4/locales/az.js +115 -0
- package/node_modules/zod/v4/locales/be.cjs +190 -0
- package/node_modules/zod/v4/locales/be.d.cts +4 -0
- package/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/zod/v4/locales/be.js +164 -0
- package/node_modules/zod/v4/locales/ca.cjs +144 -0
- package/node_modules/zod/v4/locales/ca.d.cts +4 -0
- package/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/zod/v4/locales/ca.js +118 -0
- package/node_modules/zod/v4/locales/cs.cjs +161 -0
- package/node_modules/zod/v4/locales/cs.d.cts +4 -0
- package/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/zod/v4/locales/cs.js +135 -0
- package/node_modules/zod/v4/locales/de.cjs +142 -0
- package/node_modules/zod/v4/locales/de.d.cts +4 -0
- package/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/zod/v4/locales/de.js +116 -0
- package/node_modules/zod/v4/locales/en.cjs +145 -0
- package/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/zod/v4/locales/en.d.ts +5 -0
- package/node_modules/zod/v4/locales/en.js +117 -0
- package/node_modules/zod/v4/locales/eo.cjs +144 -0
- package/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/zod/v4/locales/eo.d.ts +5 -0
- package/node_modules/zod/v4/locales/eo.js +116 -0
- package/node_modules/zod/v4/locales/es.cjs +143 -0
- package/node_modules/zod/v4/locales/es.d.cts +4 -0
- package/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/zod/v4/locales/es.js +117 -0
- package/node_modules/zod/v4/locales/fa.cjs +148 -0
- package/node_modules/zod/v4/locales/fa.d.cts +4 -0
- package/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/zod/v4/locales/fa.js +122 -0
- package/node_modules/zod/v4/locales/fi.cjs +148 -0
- package/node_modules/zod/v4/locales/fi.d.cts +4 -0
- package/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/zod/v4/locales/fi.js +122 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
- package/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.js +117 -0
- package/node_modules/zod/v4/locales/fr.cjs +142 -0
- package/node_modules/zod/v4/locales/fr.d.cts +4 -0
- package/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr.js +116 -0
- package/node_modules/zod/v4/locales/he.cjs +143 -0
- package/node_modules/zod/v4/locales/he.d.cts +4 -0
- package/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/zod/v4/locales/he.js +117 -0
- package/node_modules/zod/v4/locales/hu.cjs +143 -0
- package/node_modules/zod/v4/locales/hu.d.cts +4 -0
- package/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/zod/v4/locales/hu.js +117 -0
- package/node_modules/zod/v4/locales/id.cjs +142 -0
- package/node_modules/zod/v4/locales/id.d.cts +4 -0
- package/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/zod/v4/locales/id.js +116 -0
- package/node_modules/zod/v4/locales/index.cjs +84 -0
- package/node_modules/zod/v4/locales/index.d.cts +39 -0
- package/node_modules/zod/v4/locales/index.d.ts +39 -0
- package/node_modules/zod/v4/locales/index.js +39 -0
- package/node_modules/zod/v4/locales/it.cjs +143 -0
- package/node_modules/zod/v4/locales/it.d.cts +4 -0
- package/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/zod/v4/locales/it.js +117 -0
- package/node_modules/zod/v4/locales/ja.cjs +141 -0
- package/node_modules/zod/v4/locales/ja.d.cts +4 -0
- package/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/zod/v4/locales/ja.js +115 -0
- package/node_modules/zod/v4/locales/kh.cjs +143 -0
- package/node_modules/zod/v4/locales/kh.d.cts +4 -0
- package/node_modules/zod/v4/locales/kh.d.ts +4 -0
- package/node_modules/zod/v4/locales/kh.js +117 -0
- package/node_modules/zod/v4/locales/ko.cjs +147 -0
- package/node_modules/zod/v4/locales/ko.d.cts +4 -0
- package/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/zod/v4/locales/ko.js +121 -0
- package/node_modules/zod/v4/locales/mk.cjs +144 -0
- package/node_modules/zod/v4/locales/mk.d.cts +4 -0
- package/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/zod/v4/locales/mk.js +118 -0
- package/node_modules/zod/v4/locales/ms.cjs +142 -0
- package/node_modules/zod/v4/locales/ms.d.cts +4 -0
- package/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/zod/v4/locales/ms.js +116 -0
- package/node_modules/zod/v4/locales/nl.cjs +143 -0
- package/node_modules/zod/v4/locales/nl.d.cts +4 -0
- package/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/zod/v4/locales/nl.js +117 -0
- package/node_modules/zod/v4/locales/no.cjs +142 -0
- package/node_modules/zod/v4/locales/no.d.cts +4 -0
- package/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/zod/v4/locales/no.js +116 -0
- package/node_modules/zod/v4/locales/ota.cjs +143 -0
- package/node_modules/zod/v4/locales/ota.d.cts +4 -0
- package/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/zod/v4/locales/ota.js +117 -0
- package/node_modules/zod/v4/locales/pl.cjs +143 -0
- package/node_modules/zod/v4/locales/pl.d.cts +4 -0
- package/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/zod/v4/locales/pl.js +117 -0
- package/node_modules/zod/v4/locales/ps.cjs +148 -0
- package/node_modules/zod/v4/locales/ps.d.cts +4 -0
- package/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/zod/v4/locales/ps.js +122 -0
- package/node_modules/zod/v4/locales/pt.cjs +142 -0
- package/node_modules/zod/v4/locales/pt.d.cts +4 -0
- package/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt.js +116 -0
- package/node_modules/zod/v4/locales/ru.cjs +190 -0
- package/node_modules/zod/v4/locales/ru.d.cts +4 -0
- package/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/zod/v4/locales/ru.js +164 -0
- package/node_modules/zod/v4/locales/sl.cjs +143 -0
- package/node_modules/zod/v4/locales/sl.d.cts +4 -0
- package/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/zod/v4/locales/sl.js +117 -0
- package/node_modules/zod/v4/locales/sv.cjs +144 -0
- package/node_modules/zod/v4/locales/sv.d.cts +4 -0
- package/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/zod/v4/locales/sv.js +118 -0
- package/node_modules/zod/v4/locales/ta.cjs +143 -0
- package/node_modules/zod/v4/locales/ta.d.cts +4 -0
- package/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/zod/v4/locales/ta.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +143 -0
- package/node_modules/zod/v4/locales/th.d.cts +4 -0
- package/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/zod/v4/locales/th.js +117 -0
- package/node_modules/zod/v4/locales/tr.cjs +143 -0
- package/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/zod/v4/locales/tr.d.ts +5 -0
- package/node_modules/zod/v4/locales/tr.js +115 -0
- package/node_modules/zod/v4/locales/ua.cjs +143 -0
- package/node_modules/zod/v4/locales/ua.d.cts +4 -0
- package/node_modules/zod/v4/locales/ua.d.ts +4 -0
- package/node_modules/zod/v4/locales/ua.js +117 -0
- package/node_modules/zod/v4/locales/ur.cjs +143 -0
- package/node_modules/zod/v4/locales/ur.d.cts +4 -0
- package/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/zod/v4/locales/ur.js +117 -0
- package/node_modules/zod/v4/locales/vi.cjs +142 -0
- package/node_modules/zod/v4/locales/vi.d.cts +4 -0
- package/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/zod/v4/locales/vi.js +116 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
- package/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.js +116 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
- package/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.js +117 -0
- package/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/zod/v4/mini/coerce.cjs +47 -0
- package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/zod/v4/mini/coerce.js +17 -0
- package/node_modules/zod/v4/mini/external.cjs +62 -0
- package/node_modules/zod/v4/mini/external.d.cts +11 -0
- package/node_modules/zod/v4/mini/external.d.ts +11 -0
- package/node_modules/zod/v4/mini/external.js +13 -0
- package/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/zod/v4/mini/iso.cjs +60 -0
- package/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/zod/v4/mini/iso.js +30 -0
- package/node_modules/zod/v4/mini/parse.cjs +8 -0
- package/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/zod/v4/mini/schemas.cjs +839 -0
- package/node_modules/zod/v4/mini/schemas.d.cts +356 -0
- package/node_modules/zod/v4/mini/schemas.d.ts +356 -0
- package/node_modules/zod/v4/mini/schemas.js +732 -0
- package/node_modules/zod/v4-mini/index.cjs +17 -0
- package/node_modules/zod/v4-mini/index.d.cts +1 -0
- package/node_modules/zod/v4-mini/index.d.ts +1 -0
- package/node_modules/zod/v4-mini/index.js +1 -0
- package/package.json +99 -104
- package/dist/Workspace-DMye5DU8.js +0 -43113
|
@@ -0,0 +1,3192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Workbench block renderer bindings - contains the state, watchers, and display helpers for the renderer SFC.
|
|
3
|
+
* @author seadon
|
|
4
|
+
* @created 2026-05-20
|
|
5
|
+
*/
|
|
6
|
+
import { computed, h, onBeforeUnmount, reactive, watch, type CSSProperties } from 'vue';
|
|
7
|
+
import type { TableColumnsType } from 'ant-design-vue';
|
|
8
|
+
import { Bot, CircleCheck, CloudRain, CloudSun, LayoutDashboard, UserRound } from 'lucide-vue-next';
|
|
9
|
+
import { workbenchCardShellStyle, workbenchShellDensityClasses } from '../shell/workbenchVisualShell';
|
|
10
|
+
import { implementedCardRegistryEntries } from '../registry';
|
|
11
|
+
import type { WorkbenchRendererHostBridge } from './hostBridge';
|
|
12
|
+
import { createCanvasLayoutBindings } from './custom-canvas/canvasLayoutBindings';
|
|
13
|
+
import { createNestedBlockBindings } from './nested/nestedBlockBindings';
|
|
14
|
+
import { createNativeBindings } from './native/nativeBindings';
|
|
15
|
+
import { createReferenceCompositeBindings } from './reference-composite/referenceCompositeBindings';
|
|
16
|
+
import {
|
|
17
|
+
applyWorkbenchResizableColumns,
|
|
18
|
+
setWorkbenchResizableColumnWidth,
|
|
19
|
+
workbenchStableResizableTableScrollX,
|
|
20
|
+
type WorkbenchResizableTableColumn,
|
|
21
|
+
} from './resizableTable';
|
|
22
|
+
import {
|
|
23
|
+
quickLinkLabelLooksLikeContainerChrome,
|
|
24
|
+
uniqueQuickLinkItems,
|
|
25
|
+
} from './quickLinkDisplay';
|
|
26
|
+
import {
|
|
27
|
+
IMAGE_TABLE_INTERNAL_COLUMN_KEYS,
|
|
28
|
+
imageTableColumnVisible,
|
|
29
|
+
structuredTableCellText,
|
|
30
|
+
visibleImageTableColumns,
|
|
31
|
+
} from './tableDisplay';
|
|
32
|
+
import type {
|
|
33
|
+
CategoryRankingData,
|
|
34
|
+
CustomCanvasData,
|
|
35
|
+
CustomCanvasNestedBlock,
|
|
36
|
+
DisplayBlockData,
|
|
37
|
+
FdeCustomComponentData,
|
|
38
|
+
MaterializedBlock,
|
|
39
|
+
MetricSummaryData,
|
|
40
|
+
RoleId,
|
|
41
|
+
TableRowsData,
|
|
42
|
+
WorkbenchBlock,
|
|
43
|
+
} from '../types';
|
|
44
|
+
|
|
45
|
+
type WorkbenchAntTableRow = Record<string, unknown> & { __rowKey: string };
|
|
46
|
+
|
|
47
|
+
export interface WorkbenchBlockRendererProps {
|
|
48
|
+
block: MaterializedBlock;
|
|
49
|
+
roleId?: RoleId | string;
|
|
50
|
+
userId?: string;
|
|
51
|
+
density?: 'thumbnail' | 'compact' | 'standard' | 'expanded';
|
|
52
|
+
hostBridge?: WorkbenchRendererHostBridge;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type WorkbenchBlockRendererEmit = (event: string, ...args: unknown[]) => void;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates all bindings consumed by WorkbenchBlockRenderer.vue.
|
|
59
|
+
* @param props - Renderer props from the SFC wrapper.
|
|
60
|
+
* @param emit - Vue emit function from the SFC wrapper.
|
|
61
|
+
* @returns Template bindings and renderer helpers.
|
|
62
|
+
*/
|
|
63
|
+
export function useWorkbenchBlockRendererBindings(
|
|
64
|
+
props: WorkbenchBlockRendererProps,
|
|
65
|
+
emit: WorkbenchBlockRendererEmit,
|
|
66
|
+
) {
|
|
67
|
+
const CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_HEIGHT_RATIO = 0.1;
|
|
68
|
+
const CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_WIDTH_RATIO = 0.24;
|
|
69
|
+
const CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_CHILDREN = 2;
|
|
70
|
+
const CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_OVERLAP_RATIO = 0.28;
|
|
71
|
+
const CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MIN_COVERAGE = 0.72;
|
|
72
|
+
const CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MAX_OVERLAP_RATIO = 0.15;
|
|
73
|
+
const CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MAX_Y_DELTA_RATIO = 0.55;
|
|
74
|
+
const CUSTOM_CANVAS_NESTED_STACK_OUTLIER_WEIGHT_RATIO = 0.5;
|
|
75
|
+
const CUSTOM_CANVAS_NATURAL_GRID_FILL_MIN_PARENT_ROWS = 18;
|
|
76
|
+
const CUSTOM_CANVAS_NATURAL_GRID_MAX_CHILDREN = 8;
|
|
77
|
+
const CUSTOM_CANVAS_NATURAL_GRID_FILL_MAX_CHILDREN = 3;
|
|
78
|
+
const NESTED_BLOCK_INTERNAL_SUMMARY_KEYS = new Set([
|
|
79
|
+
'shape',
|
|
80
|
+
'dataShape',
|
|
81
|
+
'chartType',
|
|
82
|
+
'rendererKey',
|
|
83
|
+
'primaryLabel',
|
|
84
|
+
'primaryFormat',
|
|
85
|
+
'metricFormat',
|
|
86
|
+
'valueFormat',
|
|
87
|
+
'dimensionLabel',
|
|
88
|
+
'source',
|
|
89
|
+
'rawValue',
|
|
90
|
+
'payload',
|
|
91
|
+
'sourceLabel',
|
|
92
|
+
'composeSource',
|
|
93
|
+
'snapshotSource',
|
|
94
|
+
'dataBinding',
|
|
95
|
+
'dataBindingId',
|
|
96
|
+
'dataBindingStatus',
|
|
97
|
+
'dataBindingError',
|
|
98
|
+
'dataBindingHumanIntervention',
|
|
99
|
+
'humanIntervention',
|
|
100
|
+
'queryIntent',
|
|
101
|
+
'refreshApi',
|
|
102
|
+
'items',
|
|
103
|
+
'rows',
|
|
104
|
+
'metrics',
|
|
105
|
+
'secondary',
|
|
106
|
+
'links',
|
|
107
|
+
'alerts',
|
|
108
|
+
'series',
|
|
109
|
+
'categories',
|
|
110
|
+
'columns',
|
|
111
|
+
'elements',
|
|
112
|
+
'backgroundColor',
|
|
113
|
+
'borderColor',
|
|
114
|
+
'textColor',
|
|
115
|
+
'baseCols',
|
|
116
|
+
'x',
|
|
117
|
+
'y',
|
|
118
|
+
'w',
|
|
119
|
+
'h',
|
|
120
|
+
]);
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
const formValuesByBlock = reactive<Record<string, Record<string, unknown>>>({});
|
|
124
|
+
const surveyAnswersByBlock = reactive<Record<string, Record<string, unknown>>>({});
|
|
125
|
+
const manualReplacementCapabilityDrafts = reactive<Record<string, string>>({});
|
|
126
|
+
const manualReplacementCapabilityTouched = reactive<Record<string, boolean>>({});
|
|
127
|
+
const tableRowsAntTableColumnWidths = reactive<Record<string, number>>({});
|
|
128
|
+
const tableRowsAntTableScrollFloors: Record<string, number> = {};
|
|
129
|
+
const chartRefreshRuntime = computed(() => props.hostBridge?.refreshRuntime);
|
|
130
|
+
let nativeRefreshSequence = 0;
|
|
131
|
+
let nestedRefreshSequence = 0;
|
|
132
|
+
|
|
133
|
+
const effectiveBlock = computed(() => applyResponsiveTier(props.block, props.density || 'expanded'));
|
|
134
|
+
const effectiveData = computed(() => normalizedEffectiveData(effectiveBlock.value));
|
|
135
|
+
const fdeCustomComponentRenderState = computed(() => {
|
|
136
|
+
const data = effectiveData.value;
|
|
137
|
+
if (!data || data.shape !== 'fdeCustomComponent') {
|
|
138
|
+
return {
|
|
139
|
+
component: null,
|
|
140
|
+
componentProps: {},
|
|
141
|
+
status: 'unregistered',
|
|
142
|
+
message: '',
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const componentData = data as FdeCustomComponentData;
|
|
146
|
+
const entry = props.hostBridge?.customComponentRegistry?.resolve(componentData) || null;
|
|
147
|
+
if (!entry || entry.enabled === false) {
|
|
148
|
+
return {
|
|
149
|
+
component: null,
|
|
150
|
+
componentProps: {},
|
|
151
|
+
status: 'unregistered',
|
|
152
|
+
message: componentData.fallbackText || '组件未在宿主注册,无法挂载。',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const validation = props.hostBridge?.customComponentRegistry?.validateProps?.(entry, componentData.props, componentData)
|
|
156
|
+
?? entry.validateProps?.(componentData.props, componentData)
|
|
157
|
+
?? true;
|
|
158
|
+
if (validation !== true) {
|
|
159
|
+
return {
|
|
160
|
+
component: null,
|
|
161
|
+
componentProps: {},
|
|
162
|
+
status: 'unregistered',
|
|
163
|
+
message: typeof validation === 'string' ? validation : '组件 props 未通过宿主校验。',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
component: entry.component,
|
|
168
|
+
componentProps: componentData.props,
|
|
169
|
+
status: 'ready',
|
|
170
|
+
message: componentData.sourceLabel,
|
|
171
|
+
};
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Returns the parent id that a nested preview explicitly belongs to.
|
|
176
|
+
* @param nestedBlock - Nested preview payload.
|
|
177
|
+
* @returns Parent id from layout/meta/data, or an empty string.
|
|
178
|
+
*/
|
|
179
|
+
function nestedBlockParentId(nestedBlock: CustomCanvasNestedBlock): string {
|
|
180
|
+
const layoutParentId = isRecord(nestedBlock.layout) && typeof nestedBlock.layout.parentId === 'string'
|
|
181
|
+
? nestedBlock.layout.parentId.trim()
|
|
182
|
+
: '';
|
|
183
|
+
const metaParentId = isRecord(nestedBlock.meta) && typeof nestedBlock.meta.parentBlockId === 'string'
|
|
184
|
+
? nestedBlock.meta.parentBlockId.trim()
|
|
185
|
+
: '';
|
|
186
|
+
const dataParentId = isRecord(nestedBlock.data) && typeof nestedBlock.data.parentBlockId === 'string'
|
|
187
|
+
? nestedBlock.data.parentBlockId.trim()
|
|
188
|
+
: '';
|
|
189
|
+
return layoutParentId || metaParentId || dataParentId;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Drops nested previews that were copied into another container but still point to their original parent.
|
|
194
|
+
* @param block - Current customCanvas parent card.
|
|
195
|
+
* @param data - Custom canvas data.
|
|
196
|
+
* @returns Data with nested previews owned by this parent only.
|
|
197
|
+
*/
|
|
198
|
+
function normalizeCustomCanvasNestedOwnership(
|
|
199
|
+
block: WorkbenchBlock,
|
|
200
|
+
data: Record<string, unknown>,
|
|
201
|
+
): Record<string, unknown> {
|
|
202
|
+
if (data.shape !== 'customCanvas' || !Array.isArray(data.nestedBlocks)) return data;
|
|
203
|
+
const parentId = typeof block.id === 'string' ? block.id.trim() : '';
|
|
204
|
+
if (!parentId) return data;
|
|
205
|
+
const nestedBlocks = data.nestedBlocks.filter((item): item is CustomCanvasNestedBlock => {
|
|
206
|
+
if (!isRecord(item)) return true;
|
|
207
|
+
const ownerParentId = nestedBlockParentId(item as unknown as CustomCanvasNestedBlock);
|
|
208
|
+
return !ownerParentId || ownerParentId === parentId;
|
|
209
|
+
});
|
|
210
|
+
if (nestedBlocks.length === data.nestedBlocks.length) return data;
|
|
211
|
+
const nestedBlockIds = new Set(nestedBlocks.map((nestedBlock) => nestedBlock.id));
|
|
212
|
+
const nestedLayoutStacks = Array.isArray(data.nestedLayoutStacks)
|
|
213
|
+
? data.nestedLayoutStacks
|
|
214
|
+
.map((stack) => {
|
|
215
|
+
if (!isRecord(stack) || !Array.isArray(stack.childIds)) return stack;
|
|
216
|
+
return {
|
|
217
|
+
...stack,
|
|
218
|
+
childIds: stack.childIds.filter((childId) => typeof childId === 'string' && nestedBlockIds.has(childId)),
|
|
219
|
+
};
|
|
220
|
+
})
|
|
221
|
+
.filter((stack) => !isRecord(stack) || !Array.isArray(stack.childIds) || stack.childIds.length > 0)
|
|
222
|
+
: data.nestedLayoutStacks;
|
|
223
|
+
const nestedLayoutItems = isRecord(data.nestedLayoutItems)
|
|
224
|
+
? Object.fromEntries(Object.entries(data.nestedLayoutItems).filter(([id]) => nestedBlockIds.has(id)))
|
|
225
|
+
: data.nestedLayoutItems;
|
|
226
|
+
return {
|
|
227
|
+
...data,
|
|
228
|
+
nestedBlocks,
|
|
229
|
+
nestedLayoutStacks,
|
|
230
|
+
nestedLayoutItems,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Recursively collects nested preview cards while preserving the first visible occurrence of each card.
|
|
236
|
+
* @param nestedBlocks - Direct nested cards carried by a custom canvas.
|
|
237
|
+
* @param seenIds - Card ids already emitted by an ancestor or sibling.
|
|
238
|
+
* @returns Direct cards followed by descendant cards that need their own preview entry.
|
|
239
|
+
*/
|
|
240
|
+
function flattenCustomCanvasNestedBlocks(
|
|
241
|
+
nestedBlocks: readonly CustomCanvasNestedBlock[] = [],
|
|
242
|
+
seenIds = new Set<string>(),
|
|
243
|
+
): CustomCanvasNestedBlock[] {
|
|
244
|
+
return nestedBlocks.flatMap((nestedBlock) => {
|
|
245
|
+
const id = typeof nestedBlock.id === 'string' ? nestedBlock.id.trim() : '';
|
|
246
|
+
const current = id && !seenIds.has(id) ? [nestedBlock] : [];
|
|
247
|
+
if (id) seenIds.add(id);
|
|
248
|
+
const childData = isRecord(nestedBlock.data) ? nestedBlock.data : {};
|
|
249
|
+
const childNestedBlocks = Array.isArray(childData.nestedBlocks)
|
|
250
|
+
? childData.nestedBlocks.filter(isRecord).map((item) => item as unknown as CustomCanvasNestedBlock)
|
|
251
|
+
: [];
|
|
252
|
+
return [...current, ...flattenCustomCanvasNestedBlocks(childNestedBlocks, seenIds)];
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Returns every nested card that should be visible and diagnosable for a custom canvas.
|
|
258
|
+
* @param data - Current custom canvas data.
|
|
259
|
+
* @returns De-duplicated nested cards including deeper descendants.
|
|
260
|
+
*/
|
|
261
|
+
function customCanvasVisibleNestedBlocks(data: CustomCanvasData): CustomCanvasNestedBlock[] {
|
|
262
|
+
const nestedBlocks = Array.isArray(data.nestedBlocks) ? data.nestedBlocks : [];
|
|
263
|
+
return flattenCustomCanvasNestedBlocks(nestedBlocks);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Formats metric values with a host override when available.
|
|
268
|
+
* @param value - Numeric metric value.
|
|
269
|
+
* @param format - Optional format key.
|
|
270
|
+
* @returns Display-ready metric value.
|
|
271
|
+
*/
|
|
272
|
+
function formatMetricValue(value: number, format = ''): string {
|
|
273
|
+
const hostFormatter = props.hostBridge?.formatMetricValue;
|
|
274
|
+
if (hostFormatter) return hostFormatter(value, format);
|
|
275
|
+
if (format === 'percent') return `${(value * 100).toFixed(1)}%`;
|
|
276
|
+
return Number.isFinite(value) ? new Intl.NumberFormat('zh-CN').format(value) : '-';
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Builds a business gap summary with a host override when available.
|
|
281
|
+
* @param input - Business gap diagnostic input.
|
|
282
|
+
* @returns User-facing fallback or host-provided diagnostic sentence.
|
|
283
|
+
*/
|
|
284
|
+
function businessGapDiagnosticSummary(input: { message?: unknown; fallback?: string; diagnostics?: unknown }): string {
|
|
285
|
+
return props.hostBridge?.businessGapDiagnosticSummary?.(input)
|
|
286
|
+
|| (typeof input.message === 'string' && input.message.trim() ? input.message.trim() : input.fallback || '需要补充业务口径后再问数');
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
onBeforeUnmount(() => {
|
|
290
|
+
nativeRefreshSequence += 1;
|
|
291
|
+
nestedRefreshSequence += 1;
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
295
|
+
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Restores renderer shape for persisted image cards that kept snapshot values but lost data.shape.
|
|
300
|
+
* @param block - Current renderer block.
|
|
301
|
+
* @returns Display data with a renderer shape when it can be safely inferred.
|
|
302
|
+
*/
|
|
303
|
+
function normalizedEffectiveData(block: WorkbenchBlock): DisplayBlockData | undefined {
|
|
304
|
+
const data = isRecord(block.data) ? block.data : undefined;
|
|
305
|
+
if (!data) return undefined;
|
|
306
|
+
const shape = typeof data.shape === 'string' ? data.shape.trim() : '';
|
|
307
|
+
if (imageComposeBidConclusionSnapshot(block, data)) {
|
|
308
|
+
return normalizeDisplayBlockData(normalizeImageComposeRankingData({ ...data, shape: 'ranking' }, 'ranking'));
|
|
309
|
+
}
|
|
310
|
+
if (shape) return normalizeDisplayBlockData(normalizeCustomCanvasNestedOwnership(block, normalizeImageComposeRankingData(data, shape)));
|
|
311
|
+
if (!imageComposeCompactCard(block)) return normalizeDisplayBlockData(data);
|
|
312
|
+
const metaShape = typeof block.meta?.dataShape === 'string' ? block.meta.dataShape.trim() : '';
|
|
313
|
+
const v2 = isRecord(block.meta?.v2) ? block.meta.v2 : {};
|
|
314
|
+
const v2Shape = typeof v2.dataShape === 'string' ? v2.dataShape.trim() : '';
|
|
315
|
+
const inferredShape = metaShape || v2Shape;
|
|
316
|
+
return inferredShape ? normalizeDisplayBlockData(normalizeImageComposeRankingData({ ...data, shape: inferredShape }, inferredShape)) : normalizeDisplayBlockData(data);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Casts dynamic renderer data after shape normalization has preserved the display-data contract.
|
|
321
|
+
* @param data - Renderer data record.
|
|
322
|
+
* @returns DisplayBlockData consumed by the Vue template.
|
|
323
|
+
*/
|
|
324
|
+
function normalizeDisplayBlockData(data: Record<string, unknown>): DisplayBlockData {
|
|
325
|
+
return data as unknown as DisplayBlockData;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Normalizes persisted V2 image list snapshots to the renderer protocol used by this package.
|
|
330
|
+
* @param data - Raw renderer data from the workbench document.
|
|
331
|
+
* @param shape - Existing or inferred data shape.
|
|
332
|
+
* @returns Data that can be consumed by the category ranking template.
|
|
333
|
+
*/
|
|
334
|
+
function normalizeImageComposeRankingData(
|
|
335
|
+
data: Record<string, unknown>,
|
|
336
|
+
shape: string,
|
|
337
|
+
): Record<string, unknown> {
|
|
338
|
+
if (shape !== 'ranking') return data;
|
|
339
|
+
const rawItems = Array.isArray(data.items)
|
|
340
|
+
? data.items
|
|
341
|
+
: Array.isArray(data.rows)
|
|
342
|
+
? data.rows
|
|
343
|
+
: [];
|
|
344
|
+
return {
|
|
345
|
+
...data,
|
|
346
|
+
shape: 'categoryRanking',
|
|
347
|
+
dimensionLabel: textValue(data.dimensionLabel, 'image snapshot'),
|
|
348
|
+
valueFormat: textValue(data.valueFormat, 'number'),
|
|
349
|
+
items: rawItems.map((item, index) => normalizeImageComposeRankingItem(item, index)).filter((item) => item.label),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Keeps OCR list rows readable while preserving alert fields such as severity and time.
|
|
355
|
+
* @param item - Raw image-recognition list row.
|
|
356
|
+
* @param index - Row index used for fallback numeric fields.
|
|
357
|
+
* @returns Category ranking row with extra alert metadata retained.
|
|
358
|
+
*/
|
|
359
|
+
function normalizeImageComposeRankingItem(item: unknown, index: number): Record<string, unknown> {
|
|
360
|
+
const record = isRecord(item) ? item : { label: item };
|
|
361
|
+
const label = textValue(record.label, textValue(record.title, textValue(record.name, String(index + 1))));
|
|
362
|
+
const valueText = textValue(record.value, textValue(record.amount, textValue(record.status, textValue(record.badge))));
|
|
363
|
+
const numericValue = numberValue(record.value, numberValue(record.amount, index + 1));
|
|
364
|
+
const value = Number.isFinite(numericValue) ? numericValue : index + 1;
|
|
365
|
+
return {
|
|
366
|
+
...record,
|
|
367
|
+
label,
|
|
368
|
+
value,
|
|
369
|
+
share: numberValue(record.share, Math.max(0.08, Math.min(1, value > 1 ? value / 100 : value))),
|
|
370
|
+
...(valueText ? { valueLabel: valueText } : {}),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Checks whether a persisted image-compose conclusion snapshot kept list items but lost renderer shape.
|
|
376
|
+
* @param block - Current renderer block.
|
|
377
|
+
* @param data - Raw renderer data from the workbench document.
|
|
378
|
+
* @returns True when the list should be restored to the category-ranking conclusion renderer.
|
|
379
|
+
*/
|
|
380
|
+
function imageComposeBidConclusionSnapshot(block: WorkbenchBlock, data: Record<string, unknown>): boolean {
|
|
381
|
+
if (textValue(data.visualKind) !== 'bidConclusion') return false;
|
|
382
|
+
if (!Array.isArray(data.items) || data.items.length === 0) return false;
|
|
383
|
+
return imageComposeNativeCapabilityId(block, data as unknown as DisplayBlockData) === 'card.table.list' && imageComposeCompactCard(block);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Reads a property from an object-shaped value.
|
|
388
|
+
* @param value - Unknown value that may be a record.
|
|
389
|
+
* @param key - Property name to read.
|
|
390
|
+
* @returns Property value when the input is a record.
|
|
391
|
+
*/
|
|
392
|
+
function objectValue(value: unknown, key: string) {
|
|
393
|
+
return isRecord(value) ? value[key] : undefined;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Extracts the refresh API from native renderer data.
|
|
398
|
+
* @param data - Current display renderer data.
|
|
399
|
+
* @returns Trimmed refresh API, or an empty string when absent.
|
|
400
|
+
*/
|
|
401
|
+
function nativeDataBindingRefreshApi(data: DisplayBlockData | undefined): string {
|
|
402
|
+
const dataBinding = objectValue(data, 'dataBinding');
|
|
403
|
+
return isRecord(dataBinding) ? props.hostBridge?.refreshRuntime?.refreshApi(dataBinding) || '' : '';
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Reads supplemental wording saved by the host after a successful business-gap query.
|
|
408
|
+
* @param dataBinding - Data-binding metadata.
|
|
409
|
+
* @returns Saved business wording when present.
|
|
410
|
+
*/
|
|
411
|
+
function dataBindingBusinessWording(dataBinding: unknown): string | undefined {
|
|
412
|
+
if (!isRecord(dataBinding)) return undefined;
|
|
413
|
+
const wording = dataBinding.supplementalBusinessWording;
|
|
414
|
+
if (typeof wording === 'string' && wording.trim()) return wording.trim();
|
|
415
|
+
const originalWording = dataBinding.originalSupplementalBusinessWording;
|
|
416
|
+
return typeof originalWording === 'string' && originalWording.trim() ? originalWording.trim() : undefined;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Extracts the normal data-binding id from native renderer data.
|
|
421
|
+
* @param data - Current display renderer data.
|
|
422
|
+
* @returns Binding id from direct or nested binding metadata.
|
|
423
|
+
*/
|
|
424
|
+
function nativeDataBindingId(data: DisplayBlockData | undefined): string {
|
|
425
|
+
const directId = objectValue(data, 'dataBindingId');
|
|
426
|
+
if (typeof directId === 'string' && directId.trim()) return directId.trim();
|
|
427
|
+
const bindingId = objectValue(objectValue(data, 'dataBinding'), 'bindingId');
|
|
428
|
+
if (typeof bindingId === 'string' && bindingId.trim()) return bindingId.trim();
|
|
429
|
+
const canonicalId = objectValue(objectValue(data, 'dataBinding'), 'id');
|
|
430
|
+
return typeof canonicalId === 'string' ? canonicalId.trim() : '';
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Extracts the refresh API from a nested preview data binding.
|
|
435
|
+
* @param block - Nested customCanvas child.
|
|
436
|
+
* @returns Trimmed refresh API, or an empty string when absent.
|
|
437
|
+
*/
|
|
438
|
+
function nestedDataBindingRefreshApi(block: CustomCanvasNestedBlock): string {
|
|
439
|
+
return props.hostBridge?.refreshRuntime?.refreshApi(block.dataBinding) || '';
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Extracts the stable data-binding id from a nested preview.
|
|
444
|
+
* @param block - Nested customCanvas child.
|
|
445
|
+
* @returns Binding id when present.
|
|
446
|
+
*/
|
|
447
|
+
function nestedDataBindingId(block: CustomCanvasNestedBlock): string {
|
|
448
|
+
if (typeof block.dataBindingId === 'string' && block.dataBindingId.trim()) return block.dataBindingId.trim();
|
|
449
|
+
if (typeof block.dataBinding?.bindingId === 'string' && block.dataBinding.bindingId.trim()) return block.dataBinding.bindingId.trim();
|
|
450
|
+
return typeof block.dataBinding?.id === 'string' ? block.dataBinding.id.trim() : '';
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Checks whether BlockRenderers should run a native data-binding refresh.
|
|
455
|
+
* @param data - Current display renderer data.
|
|
456
|
+
* @returns True for native renderer data with a refresh API.
|
|
457
|
+
*/
|
|
458
|
+
function shouldRefreshNativeDataBinding(data: DisplayBlockData | undefined): boolean {
|
|
459
|
+
if (!data || data.shape === 'protocolRender' || data.shape === 'echartsDynamic') return false;
|
|
460
|
+
const dataBinding = objectValue(data, 'dataBinding');
|
|
461
|
+
return isRecord(dataBinding) && Boolean(props.hostBridge?.refreshRuntime?.shouldAutoRefresh(dataBinding, {
|
|
462
|
+
data,
|
|
463
|
+
meta: effectiveBlock.value.meta,
|
|
464
|
+
source: effectiveBlock.value.source,
|
|
465
|
+
sourceType: effectiveBlock.value.source?.sourceType,
|
|
466
|
+
suppressImageComposeAutoRefresh: imageComposeBackfillIsActive(),
|
|
467
|
+
}));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Checks whether a nested preview should refresh through its query endpoint.
|
|
472
|
+
* @param block - Nested customCanvas child.
|
|
473
|
+
* @returns True when the nested binding should run one automatic query.
|
|
474
|
+
*/
|
|
475
|
+
function shouldRefreshNestedDataBinding(block: CustomCanvasNestedBlock): boolean {
|
|
476
|
+
return Boolean(props.hostBridge?.refreshRuntime?.shouldAutoRefresh(block.dataBinding, {
|
|
477
|
+
data: block.data,
|
|
478
|
+
meta: effectiveBlock.value.meta,
|
|
479
|
+
source: effectiveBlock.value.source,
|
|
480
|
+
sourceType: effectiveBlock.value.source?.sourceType,
|
|
481
|
+
suppressImageComposeAutoRefresh: imageComposeBackfillIsActive(),
|
|
482
|
+
}));
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Lists nested preview bindings that should query after a restored image workspace loads.
|
|
487
|
+
* @param data - Current renderer data.
|
|
488
|
+
* @returns Query targets for nested customCanvas children.
|
|
489
|
+
*/
|
|
490
|
+
function nestedDataBindingRefreshTargets(data: DisplayBlockData | undefined): Array<{ bindingId: string; refreshApi: string; dataBinding: unknown }> {
|
|
491
|
+
if (!data || data.shape !== 'customCanvas' || !Array.isArray(data.nestedBlocks)) return [];
|
|
492
|
+
return customCanvasVisibleNestedBlocks(data).flatMap((nestedBlock) => {
|
|
493
|
+
const bindingId = nestedDataBindingId(nestedBlock);
|
|
494
|
+
const refreshApi = nestedDataBindingRefreshApi(nestedBlock);
|
|
495
|
+
if (!bindingId || !refreshApi || !shouldRefreshNestedDataBinding(nestedBlock)) return [];
|
|
496
|
+
return [{ bindingId, refreshApi, dataBinding: nestedBlock.dataBinding }];
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* 生成原生卡片数据绑定刷新 watcher 的稳定 key,避免状态标记 running 时丢弃本次 query 结果。
|
|
502
|
+
* @returns 只包含真正影响刷新目标的稳定字符串。
|
|
503
|
+
*/
|
|
504
|
+
function nativeDataBindingRefreshWatchKey(): string {
|
|
505
|
+
const data = effectiveData.value;
|
|
506
|
+
return [
|
|
507
|
+
data?.shape || '',
|
|
508
|
+
nativeDataBindingId(data),
|
|
509
|
+
nativeDataBindingRefreshApi(data),
|
|
510
|
+
currentRoleId(),
|
|
511
|
+
props.hostBridge?.refreshRuntime?.conversationId || props.hostBridge?.refreshRuntime?.currentConversationId || '',
|
|
512
|
+
imageComposeBackfillIsActive() ? 'active-compose-backfill' : 'idle',
|
|
513
|
+
].join('\u001f');
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Builds the watcher key for nested preview data-binding refreshes.
|
|
518
|
+
* @returns Stable key for all nested bindings in the current customCanvas.
|
|
519
|
+
*/
|
|
520
|
+
function nestedDataBindingRefreshWatchKey(): string {
|
|
521
|
+
const targets = nestedDataBindingRefreshTargets(effectiveData.value);
|
|
522
|
+
return [
|
|
523
|
+
targets.map((target) => `${target.bindingId}:${target.refreshApi}`).sort().join('|'),
|
|
524
|
+
currentRoleId(),
|
|
525
|
+
props.hostBridge?.refreshRuntime?.conversationId || props.hostBridge?.refreshRuntime?.currentConversationId || '',
|
|
526
|
+
imageComposeBackfillIsActive() ? 'active-compose-backfill' : 'idle',
|
|
527
|
+
].join('\u001f');
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* 判断当前页面是否仍在图片编排 SSE 回填期间。
|
|
532
|
+
* @returns 处于接收、识别、文档生成、逐卡回填或本页刚完成阶段时返回 true。
|
|
533
|
+
*/
|
|
534
|
+
function imageComposeBackfillIsActive(): boolean {
|
|
535
|
+
return Boolean(props.hostBridge?.refreshRuntime?.isImageComposeBackfillActive?.());
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Returns the role scope used by native renderer data-binding refreshes.
|
|
540
|
+
* @returns Active card role with a stable fallback.
|
|
541
|
+
*/
|
|
542
|
+
function currentRoleId(): RoleId | '' {
|
|
543
|
+
return (props.roleId || props.hostBridge?.refreshRuntime?.roleId || props.hostBridge?.refreshRuntime?.currentRoleId || '') as RoleId | '';
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Returns the active user id supplied by the iframe entry context.
|
|
548
|
+
* @returns Current user id, or an empty string when the portal did not provide it.
|
|
549
|
+
*/
|
|
550
|
+
function currentUserId(): string {
|
|
551
|
+
return props.userId?.trim() || props.hostBridge?.refreshRuntime?.userId?.trim() || props.hostBridge?.refreshRuntime?.currentUserId?.trim() || '';
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
const {
|
|
555
|
+
isFormBlockData,
|
|
556
|
+
isSurveyBlockData,
|
|
557
|
+
isActionGroupData,
|
|
558
|
+
isWorkflowBlockData,
|
|
559
|
+
isReportBlockData,
|
|
560
|
+
textValue,
|
|
561
|
+
numberValue,
|
|
562
|
+
listValue,
|
|
563
|
+
metaRecord,
|
|
564
|
+
metaList,
|
|
565
|
+
welcomeBannerMetrics,
|
|
566
|
+
tierKeyForDensity,
|
|
567
|
+
applyResponsiveTier,
|
|
568
|
+
formValues,
|
|
569
|
+
surveyAnswers,
|
|
570
|
+
compactLimit,
|
|
571
|
+
toggleMultiValue,
|
|
572
|
+
formCompletedCount,
|
|
573
|
+
renderFieldType,
|
|
574
|
+
updateMatrixAnswer,
|
|
575
|
+
matrixAnswerValue,
|
|
576
|
+
multipleAnswerIncludes,
|
|
577
|
+
taskStatusClass,
|
|
578
|
+
taskTypeLabel,
|
|
579
|
+
taskStatusLabel,
|
|
580
|
+
tableRowsPreviewVisualKind,
|
|
581
|
+
tableRowsPreviewCard,
|
|
582
|
+
tableRowsPreviewRecords,
|
|
583
|
+
tableRowsPreviewCell,
|
|
584
|
+
tableRowsTimelinePrimaryCell,
|
|
585
|
+
tableRowsTimelineBadgeCell,
|
|
586
|
+
tableRowsPreviewGridStyle,
|
|
587
|
+
formatWeatherTemp,
|
|
588
|
+
weatherIcon,
|
|
589
|
+
isChartShape,
|
|
590
|
+
imageComposeEmptyChartPreview,
|
|
591
|
+
imageComposeChartPreview,
|
|
592
|
+
imageComposeMetricLeadingVisualKind,
|
|
593
|
+
imageComposeChartPreviewKind,
|
|
594
|
+
imageComposeChartPreviewLabel,
|
|
595
|
+
imageComposeChartPreviewMetric,
|
|
596
|
+
imageComposeChartPreviewStatus,
|
|
597
|
+
imageComposeChartPreviewHeader,
|
|
598
|
+
imageComposeChartPreviewBars,
|
|
599
|
+
imageComposeChartPreviewDonutStyle,
|
|
600
|
+
imageComposeEmptyRankingPreview,
|
|
601
|
+
imageComposeEmptyRankingStatus,
|
|
602
|
+
imageComposeEmptyRankingDetail,
|
|
603
|
+
imageComposeRankingPreviewItems,
|
|
604
|
+
imageComposeRankingPreviewLabel,
|
|
605
|
+
imageComposeRankingPreviewDetail,
|
|
606
|
+
imageComposeRankingPreviewValue,
|
|
607
|
+
imageComposeRankingPreviewAvatar,
|
|
608
|
+
imageComposeRankingPreviewAvatarClass,
|
|
609
|
+
imageComposeRankingPreviewValueClass,
|
|
610
|
+
activeTabFor,
|
|
611
|
+
tabsFor,
|
|
612
|
+
orgMetricValues,
|
|
613
|
+
visualFor,
|
|
614
|
+
visualForScene,
|
|
615
|
+
rowGrid,
|
|
616
|
+
tableColumnsFromRows,
|
|
617
|
+
tableRowCells,
|
|
618
|
+
metricSummaryDisplayValue,
|
|
619
|
+
metricSummaryUnitLabel,
|
|
620
|
+
imageComposeMetricSubText,
|
|
621
|
+
imageComposeMetricFooterStatus,
|
|
622
|
+
imageComposeMetricFooterMain,
|
|
623
|
+
imageComposeMetricFooterStatusClass,
|
|
624
|
+
imageComposeMetricStatusDotClass,
|
|
625
|
+
chartRendererKey,
|
|
626
|
+
} = createNativeBindings({
|
|
627
|
+
props,
|
|
628
|
+
formValuesByBlock,
|
|
629
|
+
surveyAnswersByBlock,
|
|
630
|
+
formatMetricValue,
|
|
631
|
+
isRecord,
|
|
632
|
+
dataBindingNeedsHumanIntervention: () => dataBindingNeedsHumanIntervention,
|
|
633
|
+
imageComposeAlertRankingCard: () => imageComposeAlertRankingCard,
|
|
634
|
+
imageComposeCompactCard: () => imageComposeCompactCard,
|
|
635
|
+
imageComposeBusinessGapBadgeLabel: () => imageComposeBusinessGapBadgeLabel,
|
|
636
|
+
referenceCompositeLooksLikeChairmanRiskDirectContext: () => referenceCompositeLooksLikeChairmanRiskDirectContext,
|
|
637
|
+
CircleCheck,
|
|
638
|
+
UserRound,
|
|
639
|
+
LayoutDashboard,
|
|
640
|
+
Bot,
|
|
641
|
+
CloudRain,
|
|
642
|
+
CloudSun,
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Stores a resized AntD table column width for rows cards.
|
|
647
|
+
* @param payload - Resize payload from the shared table header cell.
|
|
648
|
+
*/
|
|
649
|
+
function handleTableRowsAntTableColumnResize(width: number, column: unknown): void {
|
|
650
|
+
setWorkbenchResizableColumnWidth(tableRowsAntTableColumnWidths, width, column);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* Builds a stable table key for one rows card column set.
|
|
655
|
+
* @param blockId - Current card block id.
|
|
656
|
+
* @param columns - Visible table columns.
|
|
657
|
+
* @param variant - Table renderer variant.
|
|
658
|
+
* @returns Table key used by column width state.
|
|
659
|
+
*/
|
|
660
|
+
function tableRowsAntTableKey(blockId: string, columns: string[], variant: string): string {
|
|
661
|
+
return `${blockId || 'rows'}::${variant}::${columns.join('\u001f')}`;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/**
|
|
665
|
+
* Builds AntD columns for the rows preview table branch.
|
|
666
|
+
* @param blockId - Current card block id.
|
|
667
|
+
* @param columns - Visible table columns.
|
|
668
|
+
* @returns Resizable AntD table columns.
|
|
669
|
+
*/
|
|
670
|
+
function tableRowsPreviewAntTableColumns(
|
|
671
|
+
blockId: string,
|
|
672
|
+
columns: string[],
|
|
673
|
+
): TableColumnsType<WorkbenchAntTableRow> {
|
|
674
|
+
const visibleColumns = columns.length > 0 ? columns : ['字段'];
|
|
675
|
+
const tableKey = tableRowsAntTableKey(blockId, visibleColumns, 'preview');
|
|
676
|
+
return applyWorkbenchResizableColumns(visibleColumns.map((column, index) => ({
|
|
677
|
+
title: column,
|
|
678
|
+
dataIndex: `__col_${index}`,
|
|
679
|
+
key: `col_${index}_${column}`,
|
|
680
|
+
ellipsis: true,
|
|
681
|
+
width: 120,
|
|
682
|
+
customRender: ({ record }: { record: WorkbenchAntTableRow }) => {
|
|
683
|
+
const text = String(record[`__col_${index}`] ?? '');
|
|
684
|
+
return h('span', { title: text }, text);
|
|
685
|
+
},
|
|
686
|
+
})), {
|
|
687
|
+
tableKey,
|
|
688
|
+
widths: tableRowsAntTableColumnWidths,
|
|
689
|
+
defaultWidth: 120,
|
|
690
|
+
}) as TableColumnsType<WorkbenchAntTableRow>;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* Builds AntD rows for the rows preview table branch.
|
|
695
|
+
* @param data - Current table rows data.
|
|
696
|
+
* @param columns - Visible table columns.
|
|
697
|
+
* @returns AntD table data source.
|
|
698
|
+
*/
|
|
699
|
+
function tableRowsPreviewAntTableRows(
|
|
700
|
+
data: DisplayBlockData | undefined,
|
|
701
|
+
columns: string[],
|
|
702
|
+
): WorkbenchAntTableRow[] {
|
|
703
|
+
const visibleColumns = columns.length > 0 ? columns : ['字段'];
|
|
704
|
+
return tableRowsPreviewRecords(data).map((row, rowIndex) => ({
|
|
705
|
+
__rowKey: String(row.id || rowIndex),
|
|
706
|
+
...Object.fromEntries(visibleColumns.map((column, columnIndex) => [
|
|
707
|
+
`__col_${columnIndex}`,
|
|
708
|
+
tableRowsPreviewCell(row, column),
|
|
709
|
+
])),
|
|
710
|
+
}));
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* Builds AntD columns for the generic rows fallback table.
|
|
715
|
+
* @param blockId - Current card block id.
|
|
716
|
+
* @param data - Current table rows data.
|
|
717
|
+
* @returns Resizable AntD table columns.
|
|
718
|
+
*/
|
|
719
|
+
function tableRowsFallbackAntTableColumns(
|
|
720
|
+
blockId: string,
|
|
721
|
+
data: TableRowsData,
|
|
722
|
+
): TableColumnsType<WorkbenchAntTableRow> {
|
|
723
|
+
const visibleColumns = compactLimit(tableColumnsFromRows(data.columns, data.rows), 2, 3);
|
|
724
|
+
const tableKey = tableRowsAntTableKey(blockId, visibleColumns, 'fallback');
|
|
725
|
+
return applyWorkbenchResizableColumns(visibleColumns.map((column, index) => ({
|
|
726
|
+
title: column,
|
|
727
|
+
dataIndex: `__col_${index}`,
|
|
728
|
+
key: `col_${index}_${column}`,
|
|
729
|
+
ellipsis: true,
|
|
730
|
+
width: 120,
|
|
731
|
+
customRender: ({ record }: { record: WorkbenchAntTableRow }) => {
|
|
732
|
+
const text = String(record[`__col_${index}`] ?? '');
|
|
733
|
+
return h('span', { title: text }, text);
|
|
734
|
+
},
|
|
735
|
+
})), {
|
|
736
|
+
tableKey,
|
|
737
|
+
widths: tableRowsAntTableColumnWidths,
|
|
738
|
+
defaultWidth: 120,
|
|
739
|
+
}) as TableColumnsType<WorkbenchAntTableRow>;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* Builds AntD rows for the generic rows fallback table.
|
|
744
|
+
* @param data - Current table rows data.
|
|
745
|
+
* @returns AntD table data source.
|
|
746
|
+
*/
|
|
747
|
+
function tableRowsFallbackAntTableRows(data: TableRowsData): WorkbenchAntTableRow[] {
|
|
748
|
+
const visibleColumns = compactLimit(tableColumnsFromRows(data.columns, data.rows), 2, 3);
|
|
749
|
+
return data.rows.map((row, rowIndex) => ({
|
|
750
|
+
__rowKey: String(row.id || rowIndex),
|
|
751
|
+
...Object.fromEntries(tableRowCells(row, visibleColumns).map((cell, columnIndex) => [
|
|
752
|
+
`__col_${columnIndex}`,
|
|
753
|
+
cell,
|
|
754
|
+
])),
|
|
755
|
+
}));
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
/**
|
|
759
|
+
* Builds AntD scroll settings for card table previews.
|
|
760
|
+
* @param columns - Effective AntD columns.
|
|
761
|
+
* @returns Scroll settings for card table rendering.
|
|
762
|
+
*/
|
|
763
|
+
function tableRowsAntTableScroll(columns: TableColumnsType<WorkbenchAntTableRow>): { x: number; y: string } {
|
|
764
|
+
return {
|
|
765
|
+
x: workbenchStableResizableTableScrollX(
|
|
766
|
+
columns as unknown as WorkbenchResizableTableColumn[],
|
|
767
|
+
360,
|
|
768
|
+
120,
|
|
769
|
+
tableRowsAntTableScrollFloors,
|
|
770
|
+
),
|
|
771
|
+
y: '100%',
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
watch(() => props.block.form, () => {
|
|
776
|
+
if (isFormBlockData(props.block.form)) formValuesByBlock[props.block.id] = { ...(props.block.form.values || {}) };
|
|
777
|
+
}, { immediate: true, deep: true });
|
|
778
|
+
|
|
779
|
+
watch(() => props.block.survey, () => {
|
|
780
|
+
if (isSurveyBlockData(props.block.survey)) surveyAnswersByBlock[props.block.id] = { ...(props.block.survey.answers || {}) };
|
|
781
|
+
}, { immediate: true, deep: true });
|
|
782
|
+
|
|
783
|
+
function manualReplacementView(block: WorkbenchBlock) {
|
|
784
|
+
return props.hostBridge?.manualReplacementViewForBlock?.(block) || null;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/**
|
|
788
|
+
* Lists implemented card capabilities available for replacing an uncertain screenshot region.
|
|
789
|
+
* @returns User-selectable registry entries sorted by their existing registry order.
|
|
790
|
+
*/
|
|
791
|
+
const manualReplacementCapabilityOptions = computed(() =>
|
|
792
|
+
implementedCardRegistryEntries().map((entry) => ({
|
|
793
|
+
capabilityId: entry.capabilityId,
|
|
794
|
+
title: entry.title,
|
|
795
|
+
group: entry.category,
|
|
796
|
+
type: entry.type,
|
|
797
|
+
})),
|
|
798
|
+
);
|
|
799
|
+
|
|
800
|
+
type ManualReplacementCapabilityOption = typeof manualReplacementCapabilityOptions.value[number];
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* Reads the model-suggested capability id from a manual placeholder.
|
|
804
|
+
* @param block - Placeholder block from image compose.
|
|
805
|
+
* @returns Suggested capability id when present.
|
|
806
|
+
*/
|
|
807
|
+
function suggestedManualReplacementCapabilityId(block: WorkbenchBlock): string {
|
|
808
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
809
|
+
const manualReplacement = isRecord(data.manualReplacement) ? data.manualReplacement : {};
|
|
810
|
+
const capabilityId = manualReplacement.suggestedCapabilityId;
|
|
811
|
+
return typeof capabilityId === 'string' ? capabilityId : '';
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* Reads the model-suggested coarse card kind from a manual placeholder.
|
|
816
|
+
* @param block - Placeholder block from image compose.
|
|
817
|
+
* @returns Suggested coarse card kind when present.
|
|
818
|
+
*/
|
|
819
|
+
function suggestedManualReplacementKind(block: WorkbenchBlock): string {
|
|
820
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
821
|
+
const manualReplacement = isRecord(data.manualReplacement) ? data.manualReplacement : {};
|
|
822
|
+
const kind = manualReplacement.suggestedKind;
|
|
823
|
+
return typeof kind === 'string' ? kind : '';
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Checks whether a registry entry belongs to the same coarse kind as the recognition suggestion.
|
|
828
|
+
* @param option - Registry option.
|
|
829
|
+
* @param suggestedKind - Model-suggested coarse kind.
|
|
830
|
+
* @returns True when the option is in the same broad capability family.
|
|
831
|
+
*/
|
|
832
|
+
function manualReplacementOptionMatchesKind(
|
|
833
|
+
option: ManualReplacementCapabilityOption,
|
|
834
|
+
suggestedKind: string,
|
|
835
|
+
): boolean {
|
|
836
|
+
if (!suggestedKind) return false;
|
|
837
|
+
if (suggestedKind === 'analysis') return option.capabilityId.startsWith('card.analysis.');
|
|
838
|
+
if (['insight', 'report', 'summary', 'risk', 'suggestion'].includes(suggestedKind)) {
|
|
839
|
+
return option.capabilityId.startsWith('card.analysis.');
|
|
840
|
+
}
|
|
841
|
+
if (suggestedKind === 'metric') return option.capabilityId.startsWith('card.metric.');
|
|
842
|
+
if (suggestedKind === 'chart') return option.capabilityId.startsWith('card.chart.');
|
|
843
|
+
if (suggestedKind === 'table') return option.capabilityId.startsWith('card.table.');
|
|
844
|
+
if (suggestedKind === 'list') return option.capabilityId.startsWith('card.workflow.') || option.type.includes('list');
|
|
845
|
+
if (suggestedKind === 'container') return option.capabilityId.startsWith('card.dashboard.') || option.capabilityId.startsWith('card.custom.');
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* Sorts manual replacement options for the current placeholder.
|
|
851
|
+
* @param options - Implemented registry options.
|
|
852
|
+
* @param block - Placeholder block from image compose.
|
|
853
|
+
* @returns Options with exact suggestion first, same-kind options next, and registry order preserved otherwise.
|
|
854
|
+
*/
|
|
855
|
+
function sortManualReplacementCapabilityOptions(
|
|
856
|
+
options: ManualReplacementCapabilityOption[],
|
|
857
|
+
block: WorkbenchBlock,
|
|
858
|
+
): ManualReplacementCapabilityOption[] {
|
|
859
|
+
const suggestedCapabilityId = suggestedManualReplacementCapabilityId(block);
|
|
860
|
+
const suggestedKind = suggestedManualReplacementKind(block);
|
|
861
|
+
return options
|
|
862
|
+
.map((option, index) => ({
|
|
863
|
+
option,
|
|
864
|
+
index,
|
|
865
|
+
rank: option.capabilityId === suggestedCapabilityId
|
|
866
|
+
? 0
|
|
867
|
+
: manualReplacementOptionMatchesKind(option, suggestedKind)
|
|
868
|
+
? 1
|
|
869
|
+
: 2,
|
|
870
|
+
}))
|
|
871
|
+
.sort((left, right) => left.rank - right.rank || left.index - right.index)
|
|
872
|
+
.map((item) => item.option);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/**
|
|
876
|
+
* Lists replacement capability options ordered for one placeholder.
|
|
877
|
+
* @param block - Placeholder block from image compose.
|
|
878
|
+
* @returns Sorted replacement options.
|
|
879
|
+
*/
|
|
880
|
+
function manualReplacementCapabilityOptionsForBlock(block: WorkbenchBlock): ManualReplacementCapabilityOption[] {
|
|
881
|
+
return sortManualReplacementCapabilityOptions(manualReplacementCapabilityOptions.value, block);
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/**
|
|
885
|
+
* Returns the currently selected capability for a manual placeholder.
|
|
886
|
+
* @param block - Placeholder block from image compose.
|
|
887
|
+
* @returns Selected or suggested capability id.
|
|
888
|
+
*/
|
|
889
|
+
function manualReplacementCapabilityDraft(block: WorkbenchBlock): string {
|
|
890
|
+
const current = manualReplacementCapabilityDrafts[block.id];
|
|
891
|
+
if (current) return current;
|
|
892
|
+
const suggested = suggestedManualReplacementCapabilityId(block);
|
|
893
|
+
const options = manualReplacementCapabilityOptionsForBlock(block);
|
|
894
|
+
if (suggested && options.some((entry) => entry.capabilityId === suggested)) return suggested;
|
|
895
|
+
return options[0]?.capabilityId || '';
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Stores the user's selected replacement capability for a placeholder card.
|
|
900
|
+
* @param blockId - Placeholder card id.
|
|
901
|
+
* @param capabilityId - Selected registry capability id.
|
|
902
|
+
*/
|
|
903
|
+
function setManualReplacementCapabilityDraft(blockId: string, capabilityId: string) {
|
|
904
|
+
manualReplacementCapabilityDrafts[blockId] = capabilityId;
|
|
905
|
+
manualReplacementCapabilityTouched[blockId] = true;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* Emits a manual placeholder replacement request with the current capability override.
|
|
910
|
+
* @param block - Placeholder block from image compose.
|
|
911
|
+
*/
|
|
912
|
+
function replaceManualPlaceholder(block: MaterializedBlock) {
|
|
913
|
+
const selectedCapabilityId = manualReplacementCapabilityDraft(block);
|
|
914
|
+
const shouldOverride = manualReplacementCapabilityTouched[block.id] && Boolean(selectedCapabilityId);
|
|
915
|
+
emit('replaceManualPlaceholder', {
|
|
916
|
+
block,
|
|
917
|
+
overrideCapabilityId: shouldOverride ? selectedCapabilityId : undefined,
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
function nestedBlockDataSummary(block: CustomCanvasNestedBlock) {
|
|
922
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
923
|
+
if (block.kind === 'placeholder' || nestedBlockRendererKey(block) === 'placeholder') return '需手动补卡';
|
|
924
|
+
if (typeof data.value === 'number' || typeof data.value === 'string') return String(data.value);
|
|
925
|
+
if (typeof data.displayValue === 'string') return data.displayValue;
|
|
926
|
+
if (typeof data.primaryValue === 'number' || typeof data.primaryValue === 'string') return String(data.primaryValue);
|
|
927
|
+
if (Array.isArray(data.rows)) return `${data.rows.length} 行`;
|
|
928
|
+
const summaryEntries = Object.entries(data)
|
|
929
|
+
.map(([key, value]) => nestedBlockSummaryEntry(key, value))
|
|
930
|
+
.filter(Boolean);
|
|
931
|
+
return summaryEntries.length > 0 ? summaryEntries.slice(0, 2).join(' / ') : '预览';
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
/**
|
|
935
|
+
* Converts a nested-card data field into a user-facing summary fragment.
|
|
936
|
+
* @param key - Renderer data key from image recognition or setData.
|
|
937
|
+
* @param value - Renderer data value.
|
|
938
|
+
* @returns Business text fragment, or an empty string for internal protocol fields.
|
|
939
|
+
*/
|
|
940
|
+
function nestedBlockSummaryEntry(key: string, value: unknown): string {
|
|
941
|
+
if (key === 'narrative' && customCanvasGeneratedNarrative(value)) return '';
|
|
942
|
+
if (NESTED_BLOCK_INTERNAL_SUMMARY_KEYS.has(key) || IMAGE_TABLE_INTERNAL_COLUMN_KEYS.has(key)) return '';
|
|
943
|
+
if (typeof value === 'string' && value.trim()) return value.trim();
|
|
944
|
+
if (typeof value === 'number' && Number.isFinite(value)) return String(value);
|
|
945
|
+
return structuredTableCellText(value);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
function nestedBlockRendererKey(block: CustomCanvasNestedBlock) {
|
|
949
|
+
return block.renderer?.rendererKey || String(block.subType || block.kind || '');
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
function nestedBlockComposeSource(block: CustomCanvasNestedBlock) {
|
|
953
|
+
return textValue(block.composeSource, textValue(block.data?.composeSource));
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
function nestedBlockStyle(block: CustomCanvasNestedBlock): CSSProperties {
|
|
957
|
+
const visual = isRecord(block.visual) ? block.visual : {};
|
|
958
|
+
return workbenchCardShellStyle(visual);
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/**
|
|
962
|
+
* Checks whether nested image previews should use screenshot coordinates.
|
|
963
|
+
* @param block - Rendered customCanvas container.
|
|
964
|
+
* @param data - Custom canvas renderer data.
|
|
965
|
+
* @returns True when V2 image compose supplied child layout boxes.
|
|
966
|
+
*/
|
|
967
|
+
function customCanvasUsesAbsoluteNestedBlocks(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
968
|
+
if (customCanvasShowsStructureLabels(block)) return false;
|
|
969
|
+
if (data.nestedLayoutMode !== 'absolute') return false;
|
|
970
|
+
return customCanvasAbsoluteNestedLayoutLooksSafe(block, data);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* Defensively checks persisted screenshot-positioned nested layouts before using absolute CSS.
|
|
975
|
+
* @param block - Rendered customCanvas container.
|
|
976
|
+
* @param data - Custom canvas renderer data.
|
|
977
|
+
* @returns True when absolute child boxes are large enough and non-overlapping.
|
|
978
|
+
*/
|
|
979
|
+
function customCanvasAbsoluteNestedLayoutLooksSafe(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
980
|
+
if (customCanvasShowsStructureLabels(block)) return false;
|
|
981
|
+
const nestedBlocks = customCanvasVisibleNestedBlocks(data);
|
|
982
|
+
if (nestedBlocks.length > CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_CHILDREN) return false;
|
|
983
|
+
const boxes = nestedBlocks
|
|
984
|
+
.filter(nestedBlockHasLayout)
|
|
985
|
+
.map((nestedBlock) => customCanvasAbsoluteNestedBox(nestedBlock, data))
|
|
986
|
+
.filter((box): box is { x: number; y: number; w: number; h: number } => Boolean(box));
|
|
987
|
+
if (boxes.length === 0) return false;
|
|
988
|
+
const basis = isRecord(data.nestedLayoutBasis) ? data.nestedLayoutBasis : {};
|
|
989
|
+
const basisW = Math.max(1, numberValue(basis.w, 24));
|
|
990
|
+
const basisH = Math.max(1, numberValue(basis.h, 1));
|
|
991
|
+
if (boxes.some((box) => box.x < 0 || box.y < 0 || box.x + box.w > basisW + 0.001 || box.y + box.h > basisH + 0.001)) return false;
|
|
992
|
+
if (boxes.some((box) => box.w / basisW < CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_WIDTH_RATIO)) return false;
|
|
993
|
+
if (boxes.some((box) => box.h / basisH < CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_HEIGHT_RATIO)) return false;
|
|
994
|
+
if (customCanvasAbsoluteNestedDualColumnRowLooksBetterAsGrid(nestedBlocks, boxes, basisW, basisH)) return false;
|
|
995
|
+
const totalArea = boxes.reduce((sum, box) => sum + box.w * box.h, 0);
|
|
996
|
+
if (totalArea <= 0) return false;
|
|
997
|
+
return customCanvasAbsoluteNestedOverlapArea(boxes) / totalArea <= CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_OVERLAP_RATIO;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
/**
|
|
1001
|
+
* Detects two image data cards that should align as one responsive row instead of absolute coordinates.
|
|
1002
|
+
* @param nestedBlocks - Nested child previews from the image container.
|
|
1003
|
+
* @param boxes - Parent-local absolute boxes for the same children.
|
|
1004
|
+
* @param basisW - Parent width in source layout units.
|
|
1005
|
+
* @param basisH - Parent height in source layout units.
|
|
1006
|
+
* @returns True when regular grid layout is safer than model-emitted absolute y positions.
|
|
1007
|
+
*/
|
|
1008
|
+
function customCanvasAbsoluteNestedDualColumnRowLooksBetterAsGrid(
|
|
1009
|
+
nestedBlocks: CustomCanvasNestedBlock[],
|
|
1010
|
+
boxes: Array<{ x: number; y: number; w: number; h: number }>,
|
|
1011
|
+
basisW: number,
|
|
1012
|
+
basisH: number,
|
|
1013
|
+
): boolean {
|
|
1014
|
+
if (nestedBlocks.length !== 2 || boxes.length !== 2) return false;
|
|
1015
|
+
const entries = nestedBlocks
|
|
1016
|
+
.map((child, index) => ({ child, box: boxes[index] }))
|
|
1017
|
+
.filter((entry): entry is { child: CustomCanvasNestedBlock; box: { x: number; y: number; w: number; h: number } } => Boolean(entry.box))
|
|
1018
|
+
.sort((left, right) => left.box.x - right.box.x || left.box.y - right.box.y);
|
|
1019
|
+
if (entries.length !== 2) return false;
|
|
1020
|
+
const families = entries.map((entry) => nestedBlockComparableDataFamily(entry.child));
|
|
1021
|
+
if (families.some((family) => !family) || new Set(families).size !== 1) return false;
|
|
1022
|
+
const [left, right] = entries;
|
|
1023
|
+
const overlap = Math.max(0, Math.min(left.box.x + left.box.w, right.box.x + right.box.w) - Math.max(left.box.x, right.box.x));
|
|
1024
|
+
if (overlap > Math.min(left.box.w, right.box.w) * CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MAX_OVERLAP_RATIO) return false;
|
|
1025
|
+
const spanLeft = Math.min(left.box.x, right.box.x);
|
|
1026
|
+
const spanRight = Math.max(left.box.x + left.box.w, right.box.x + right.box.w);
|
|
1027
|
+
if ((spanRight - spanLeft) / basisW < CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MIN_COVERAGE) return false;
|
|
1028
|
+
const widthBalance = Math.min(left.box.w, right.box.w) / Math.max(left.box.w, right.box.w);
|
|
1029
|
+
if (widthBalance < 0.45) return false;
|
|
1030
|
+
const yDelta = Math.abs(left.box.y - right.box.y);
|
|
1031
|
+
return yDelta <= Math.max(2, basisH * CUSTOM_CANVAS_ABSOLUTE_DUAL_COLUMN_MAX_Y_DELTA_RATIO);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
/**
|
|
1035
|
+
* Classifies a nested child as a metric/chart/table family for row regularization.
|
|
1036
|
+
* @param block - Nested child card preview.
|
|
1037
|
+
* @returns Stable family, or undefined when absolute positioning should be kept.
|
|
1038
|
+
*/
|
|
1039
|
+
function nestedBlockComparableDataFamily(block: CustomCanvasNestedBlock): 'metric' | 'table' | 'chart' | undefined {
|
|
1040
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1041
|
+
const meta = isRecord(block.meta) ? block.meta : {};
|
|
1042
|
+
const text = [
|
|
1043
|
+
block.title,
|
|
1044
|
+
block.kind,
|
|
1045
|
+
block.visualKind,
|
|
1046
|
+
block.capabilityId,
|
|
1047
|
+
block.dataShape,
|
|
1048
|
+
nestedBlockRendererKey(block),
|
|
1049
|
+
textValue(meta.visualKind),
|
|
1050
|
+
textValue(data.visualKind),
|
|
1051
|
+
textValue(data.shape),
|
|
1052
|
+
textValue(data.kind),
|
|
1053
|
+
].filter(Boolean).join(' ');
|
|
1054
|
+
if (/table|list|rows|ranking|dataTable|categoryRanking/i.test(text)) return 'table';
|
|
1055
|
+
if (/chart|singleSeries|multiSeries|bar|line|area|pie|donut/i.test(text)) return 'chart';
|
|
1056
|
+
if (/metric|metricSummary|numeric/i.test(text)) return 'metric';
|
|
1057
|
+
return undefined;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
/**
|
|
1061
|
+
* Builds the container classes for nested customCanvas previews.
|
|
1062
|
+
* @param block - Rendered customCanvas container.
|
|
1063
|
+
* @param data - Custom canvas renderer data.
|
|
1064
|
+
* @returns Stable layout classes for absolute or grid fallback previews.
|
|
1065
|
+
*/
|
|
1066
|
+
function customCanvasNestedBlockContainerClasses(block: WorkbenchBlock, data: CustomCanvasData): string[] {
|
|
1067
|
+
if (customCanvasUsesReferenceCompositePreview(block, data)) {
|
|
1068
|
+
return ['relative flex h-full min-h-0 w-full flex-1 flex-col overflow-hidden'];
|
|
1069
|
+
}
|
|
1070
|
+
if (customCanvasUsesAbsoluteNestedBlocks(block, data)) {
|
|
1071
|
+
return ['relative', 'min-h-[72px]', 'flex-1', 'overflow-hidden'];
|
|
1072
|
+
}
|
|
1073
|
+
if (customCanvasUsesStackNestedBlocks(data)) {
|
|
1074
|
+
return [
|
|
1075
|
+
'grid h-full min-h-0 w-full flex-1 auto-rows-fr overflow-hidden',
|
|
1076
|
+
imageComposeCompactCard(block) ? 'gap-1.5' : 'gap-2',
|
|
1077
|
+
];
|
|
1078
|
+
}
|
|
1079
|
+
if (customCanvasUsesNaturalNestedGrid(data)) {
|
|
1080
|
+
if (customCanvasShouldFillNaturalNestedGrid(block, data)) {
|
|
1081
|
+
return [
|
|
1082
|
+
'grid h-full min-h-0 w-full flex-1 auto-rows-fr overflow-hidden sm:grid-cols-2',
|
|
1083
|
+
imageComposeCompactCard(block) ? 'gap-1.5' : 'gap-2',
|
|
1084
|
+
];
|
|
1085
|
+
}
|
|
1086
|
+
return [
|
|
1087
|
+
'grid min-h-0 w-full content-start auto-rows-auto overflow-hidden sm:grid-cols-2',
|
|
1088
|
+
imageComposeCompactCard(block) ? 'gap-1.5' : 'gap-2',
|
|
1089
|
+
];
|
|
1090
|
+
}
|
|
1091
|
+
return [
|
|
1092
|
+
'grid h-full min-h-0 w-full flex-1 auto-rows-fr overflow-hidden sm:grid-cols-2',
|
|
1093
|
+
imageComposeCompactCard(block) ? 'gap-1.5' : 'gap-2',
|
|
1094
|
+
];
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/**
|
|
1098
|
+
* Checks whether sparse image nested previews should keep natural height.
|
|
1099
|
+
* @param data - Custom canvas renderer data.
|
|
1100
|
+
* @returns True when stretching sparse child cards would create large blank interiors.
|
|
1101
|
+
*/
|
|
1102
|
+
function customCanvasUsesNaturalNestedGrid(data: CustomCanvasData): boolean {
|
|
1103
|
+
const nestedBlocks = customCanvasVisibleNestedBlocks(data);
|
|
1104
|
+
if (nestedBlocks.length === 0 || nestedBlocks.length > CUSTOM_CANVAS_NATURAL_GRID_MAX_CHILDREN) return false;
|
|
1105
|
+
return nestedBlocks.every(nestedBlockCompactPreview);
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
/**
|
|
1109
|
+
* Checks whether a natural nested grid is inside a tall parent and should fill its body.
|
|
1110
|
+
* @param block - Rendered customCanvas container.
|
|
1111
|
+
* @param data - Custom canvas renderer data.
|
|
1112
|
+
* @returns True when content-sized nested rows would leave a large blank lower half.
|
|
1113
|
+
*/
|
|
1114
|
+
function customCanvasShouldFillNaturalNestedGrid(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
1115
|
+
const nestedBlocks = customCanvasVisibleNestedBlocks(data);
|
|
1116
|
+
if (nestedBlocks.length < 2 || nestedBlocks.length > CUSTOM_CANVAS_NATURAL_GRID_FILL_MAX_CHILDREN) return false;
|
|
1117
|
+
if (!nestedBlocks.every(nestedBlockCompactPreview)) return false;
|
|
1118
|
+
return numberValue(block.layout?.h, 0) >= CUSTOM_CANVAS_NATURAL_GRID_FILL_MIN_PARENT_ROWS;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
/**
|
|
1122
|
+
* Builds grid placement overrides for natural nested card grids.
|
|
1123
|
+
* @param block - Nested child card rendered inside the custom canvas.
|
|
1124
|
+
* @param data - Custom canvas renderer data.
|
|
1125
|
+
* @param absolute - Whether the parent is using screenshot-coordinate layout.
|
|
1126
|
+
* @returns CSS properties that keep sparse tail rows from leaving a blank half row.
|
|
1127
|
+
*/
|
|
1128
|
+
function nestedBlockGridPlacementStyle(block: CustomCanvasNestedBlock, data: CustomCanvasData, absolute: boolean): CSSProperties {
|
|
1129
|
+
if (absolute || customCanvasUsesStackNestedBlocks(data) || !customCanvasUsesNaturalNestedGrid(data)) return {};
|
|
1130
|
+
const nestedBlocks = customCanvasVisibleNestedBlocks(data);
|
|
1131
|
+
const index = nestedBlocks.findIndex((nestedBlock) => nestedBlock === block || (Boolean(nestedBlock.id) && nestedBlock.id === block.id));
|
|
1132
|
+
const tailCount = nestedBlocks.length % 2;
|
|
1133
|
+
const sparseTailShouldFill = nestedBlocks.length <= 3;
|
|
1134
|
+
if (tailCount === 1 && sparseTailShouldFill && index === nestedBlocks.length - 1) {
|
|
1135
|
+
const gridColumn = '1 / -1';
|
|
1136
|
+
return { gridColumn };
|
|
1137
|
+
}
|
|
1138
|
+
return {};
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
/**
|
|
1142
|
+
* Checks whether nested previews should render as inferred vertical stacks.
|
|
1143
|
+
* @param data - Custom canvas renderer data.
|
|
1144
|
+
* @returns True when adapter supplied stack groups.
|
|
1145
|
+
*/
|
|
1146
|
+
function customCanvasUsesStackNestedBlocks(data: CustomCanvasData): boolean {
|
|
1147
|
+
return data.nestedLayoutMode === 'stack' && customCanvasNestedLayoutStacks(data).length > 0;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* Returns normalized nested-preview stack definitions.
|
|
1152
|
+
* @param data - Custom canvas renderer data.
|
|
1153
|
+
* @returns Valid stack groups with at least one child id.
|
|
1154
|
+
*/
|
|
1155
|
+
function customCanvasNestedLayoutStacks(data: CustomCanvasData): Array<{ id: string; childIds: string[] }> {
|
|
1156
|
+
if (!Array.isArray(data.nestedLayoutStacks)) return [];
|
|
1157
|
+
return data.nestedLayoutStacks
|
|
1158
|
+
.map((stack, index) => ({
|
|
1159
|
+
id: textValue(stack.id, `stack-${index + 1}`),
|
|
1160
|
+
childIds: Array.isArray(stack.childIds)
|
|
1161
|
+
? stack.childIds.filter((childId): childId is string => typeof childId === 'string' && childId.trim().length > 0)
|
|
1162
|
+
: [],
|
|
1163
|
+
}))
|
|
1164
|
+
.filter((stack) => stack.childIds.length > 0);
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
/**
|
|
1168
|
+
* Returns nested preview groups in the order they should render.
|
|
1169
|
+
* @param data - Custom canvas renderer data.
|
|
1170
|
+
* @returns Stack groups, or a single flat group when no stack layout is available.
|
|
1171
|
+
*/
|
|
1172
|
+
function customCanvasNestedBlockGroups(data: CustomCanvasData): Array<{ id: string; blocks: CustomCanvasNestedBlock[] }> {
|
|
1173
|
+
const nestedBlocks = customCanvasVisibleNestedBlocks(data);
|
|
1174
|
+
if (!customCanvasUsesStackNestedBlocks(data)) {
|
|
1175
|
+
return [{ id: 'grid', blocks: nestedBlocks }];
|
|
1176
|
+
}
|
|
1177
|
+
const blockById = new Map(nestedBlocks.map((nestedBlock) => [nestedBlock.id, nestedBlock]));
|
|
1178
|
+
const usedIds = new Set<string>();
|
|
1179
|
+
const groups = customCanvasNestedLayoutStacks(data).map((stack) => {
|
|
1180
|
+
const blocks = stack.childIds
|
|
1181
|
+
.map((childId) => blockById.get(childId))
|
|
1182
|
+
.filter((nestedBlock): nestedBlock is CustomCanvasNestedBlock => Boolean(nestedBlock));
|
|
1183
|
+
blocks.forEach((nestedBlock) => usedIds.add(nestedBlock.id));
|
|
1184
|
+
return { id: stack.id, blocks };
|
|
1185
|
+
}).filter((group) => group.blocks.length > 0);
|
|
1186
|
+
const remaining = nestedBlocks.filter((nestedBlock) => !usedIds.has(nestedBlock.id));
|
|
1187
|
+
return remaining.length > 0 ? [...groups, { id: 'stack-extra', blocks: remaining }] : groups;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
/**
|
|
1191
|
+
* Checks whether the inferred nested stacks need to share a compact fixed-height parent.
|
|
1192
|
+
* @param data - Custom canvas renderer data.
|
|
1193
|
+
* @returns True when one column has many short cards and normal min heights would overflow.
|
|
1194
|
+
*/
|
|
1195
|
+
function customCanvasDenseNestedStack(data: CustomCanvasData): boolean {
|
|
1196
|
+
if (!customCanvasUsesStackNestedBlocks(data)) return false;
|
|
1197
|
+
const groups = customCanvasNestedBlockGroups(data);
|
|
1198
|
+
const nestedCount = customCanvasVisibleNestedBlocks(data).length;
|
|
1199
|
+
return nestedCount >= 7 || groups.some((group) => group.blocks.length >= 5);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
const {
|
|
1203
|
+
nestedBlockMetricValue,
|
|
1204
|
+
nestedBlockClassifierText,
|
|
1205
|
+
nestedBlockDeclaredVisualKind,
|
|
1206
|
+
nestedBlockVisualKind,
|
|
1207
|
+
nestedBlockItemRecords,
|
|
1208
|
+
nestedBlockItemEmpty,
|
|
1209
|
+
nestedBlockItemLooksWeak,
|
|
1210
|
+
nestedBlockItemsLookTooWeak,
|
|
1211
|
+
nestedBlockItemsLookTooWeakForVisualKind,
|
|
1212
|
+
nestedBlockRawItems,
|
|
1213
|
+
nestedBlockElementItems,
|
|
1214
|
+
nestedBlockToneFromStatus,
|
|
1215
|
+
nestedBlockToneFromProgress,
|
|
1216
|
+
nestedBlockFallbackDomain,
|
|
1217
|
+
nestedBlockFallbackClassifierText,
|
|
1218
|
+
nestedBlockFallbackItems,
|
|
1219
|
+
nestedBlockItems,
|
|
1220
|
+
nestedBlockBarItems,
|
|
1221
|
+
nestedBlockTileItems,
|
|
1222
|
+
nestedBlockDisplayValue,
|
|
1223
|
+
nestedBlockItemLabel,
|
|
1224
|
+
nestedBlockItemValue,
|
|
1225
|
+
nestedBlockItemDetail,
|
|
1226
|
+
nestedBlockItemTitle,
|
|
1227
|
+
nestedBlockItemSeverity,
|
|
1228
|
+
nestedBlockItemTime,
|
|
1229
|
+
nestedBlockNumber,
|
|
1230
|
+
nestedBlockPercent,
|
|
1231
|
+
nestedBlockItemProgress,
|
|
1232
|
+
nestedBlockOptionalNumber,
|
|
1233
|
+
referenceOpsTrendCount,
|
|
1234
|
+
referenceOpsTrendBarHeight,
|
|
1235
|
+
referenceOpsTrendChartItems,
|
|
1236
|
+
nestedBlockTone,
|
|
1237
|
+
nestedBlockToneClass,
|
|
1238
|
+
customCanvasRiskSummaryBand,
|
|
1239
|
+
customCanvasEffectiveVisual,
|
|
1240
|
+
nestedBlockStatusSummary,
|
|
1241
|
+
nestedBlockStatusSummaryLabel,
|
|
1242
|
+
nestedBlockPillClasses,
|
|
1243
|
+
nestedBlockDotClasses,
|
|
1244
|
+
nestedBlockBarClasses,
|
|
1245
|
+
referenceOpsTrendBarClasses,
|
|
1246
|
+
nestedBlockBarStyle,
|
|
1247
|
+
nestedBlockProgressStage,
|
|
1248
|
+
nestedBlockSecurityScore,
|
|
1249
|
+
nestedBlockSecurityScoreRingLabel,
|
|
1250
|
+
nestedBlockSecurityMetrics,
|
|
1251
|
+
nestedBlockDonutItems,
|
|
1252
|
+
nestedBlockDonutStyle,
|
|
1253
|
+
nestedBlockQuickIconLabel,
|
|
1254
|
+
nestedBlockQuickLinksGridStyle,
|
|
1255
|
+
nestedBlockRows,
|
|
1256
|
+
nestedBlockColumns,
|
|
1257
|
+
nestedBlockRankingItems,
|
|
1258
|
+
nestedBlockCell,
|
|
1259
|
+
nestedBlockPreviewKind,
|
|
1260
|
+
nestedBlockCompactPreview,
|
|
1261
|
+
nestedBlockGridMinHeightClass,
|
|
1262
|
+
nestedBlockStatusLabel,
|
|
1263
|
+
nestedBlockEmptyImageContainer,
|
|
1264
|
+
nestedBlockFailureReason,
|
|
1265
|
+
nestedBlockBusinessGapReason,
|
|
1266
|
+
nestedBlockQueryIntent,
|
|
1267
|
+
} = createNestedBlockBindings({
|
|
1268
|
+
textValue,
|
|
1269
|
+
numberValue,
|
|
1270
|
+
isRecord,
|
|
1271
|
+
formatMetricValue,
|
|
1272
|
+
businessGapDiagnosticSummary,
|
|
1273
|
+
dataBindingHumanInterventionFromRecord,
|
|
1274
|
+
recordHasImageComposeSource,
|
|
1275
|
+
customCanvasGeneratedElement,
|
|
1276
|
+
nestedBlockRendererKey,
|
|
1277
|
+
nestedBlockComposeSource,
|
|
1278
|
+
nestedBlockSummaryEntry,
|
|
1279
|
+
visualForScene,
|
|
1280
|
+
referenceCompositeLooksLikeChairmanRiskDirectContext: () => referenceCompositeLooksLikeChairmanRiskDirectContext,
|
|
1281
|
+
referenceCompositeLooksLikeChairmanRiskContext: () => referenceCompositeLooksLikeChairmanRiskContext,
|
|
1282
|
+
referenceOpsTrendItems: () => referenceOpsTrendItems,
|
|
1283
|
+
});
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
const {
|
|
1287
|
+
customCanvasUsesReferenceCompositePreview,
|
|
1288
|
+
customCanvasReferenceCompositeKind,
|
|
1289
|
+
referenceCompositeSearchText,
|
|
1290
|
+
referenceCompositeKindAllowedForBlock,
|
|
1291
|
+
referenceCompositeKindRequiresItContext,
|
|
1292
|
+
referenceCompositeKindRequiresChairmanRiskContext,
|
|
1293
|
+
referenceCompositeKindRequiresHrContext,
|
|
1294
|
+
referenceCompositeLooksLikeItContext,
|
|
1295
|
+
referenceCompositeTextHasItContext,
|
|
1296
|
+
referenceCompositeLooksLikeChairmanRiskContext,
|
|
1297
|
+
referenceCompositeLooksLikeChairmanRiskDirectContext,
|
|
1298
|
+
referenceCompositeTextHasChairmanRiskContext,
|
|
1299
|
+
referenceCompositeLooksLikeHrContext,
|
|
1300
|
+
customCanvasTextHasBusinessMetricMatrixContext,
|
|
1301
|
+
customCanvasTextLooksLikeHrOrOrgRiskContext,
|
|
1302
|
+
referenceCompositeHeaderChip,
|
|
1303
|
+
customCanvasLooksLikeBusinessMetricMatrix,
|
|
1304
|
+
customCanvasLooksLikePageHeader,
|
|
1305
|
+
customCanvasPageHeaderBlock,
|
|
1306
|
+
customCanvasEmptyPageHeaderPlaceholder,
|
|
1307
|
+
customCanvasEmptyImagePlaceholder,
|
|
1308
|
+
customCanvasAlertLeafContainer,
|
|
1309
|
+
customCanvasAlertLeafItems,
|
|
1310
|
+
customCanvasAlertLeafFilledItems,
|
|
1311
|
+
customCanvasAlertLeafFallbackItems,
|
|
1312
|
+
customCanvasHeaderTitle,
|
|
1313
|
+
customCanvasHeaderSubtitle,
|
|
1314
|
+
customCanvasHeaderLogo,
|
|
1315
|
+
customCanvasHeaderLogoStyle,
|
|
1316
|
+
customCanvasPageHeaderDark,
|
|
1317
|
+
customCanvasPageHeaderStyle,
|
|
1318
|
+
customCanvasPageHeaderTextClass,
|
|
1319
|
+
customCanvasTextElementValue,
|
|
1320
|
+
customCanvasHeaderRepeatingElement,
|
|
1321
|
+
customCanvasHeaderPills,
|
|
1322
|
+
customCanvasHeaderPillsWithFallback,
|
|
1323
|
+
referenceCompositeKindFromContainerTitle,
|
|
1324
|
+
referenceCompositeDiagnosticStyle,
|
|
1325
|
+
referenceCompositeDiagnosticIndex,
|
|
1326
|
+
referenceProjectDiagnosticIndex,
|
|
1327
|
+
referenceNestedBlock,
|
|
1328
|
+
referenceMetricItem,
|
|
1329
|
+
referenceNestedMetricItem,
|
|
1330
|
+
referenceRiskMetricValue,
|
|
1331
|
+
referenceRiskKpiValue,
|
|
1332
|
+
referenceRiskKpiItems,
|
|
1333
|
+
referenceRiskMovementItems,
|
|
1334
|
+
referenceRiskMovementElementItems,
|
|
1335
|
+
referenceOpsServiceItems,
|
|
1336
|
+
referenceOpsResourceItems,
|
|
1337
|
+
referenceOpsIncidentItems,
|
|
1338
|
+
referenceOpsItemsFromBlock,
|
|
1339
|
+
referenceOpsTrendItems,
|
|
1340
|
+
referenceSecurityScoreBlock,
|
|
1341
|
+
referenceSecurityRiskItems,
|
|
1342
|
+
referenceSecurityAuditItems,
|
|
1343
|
+
referenceSecurityAccountItems,
|
|
1344
|
+
referenceSecurityComplianceItems,
|
|
1345
|
+
referenceAssetLedgerItems,
|
|
1346
|
+
referenceAssetExceptionItems,
|
|
1347
|
+
referenceCostItems,
|
|
1348
|
+
referenceCostDonutItems,
|
|
1349
|
+
referenceCostDonutStyle,
|
|
1350
|
+
referenceProjectProgressItems,
|
|
1351
|
+
referenceTodoItems,
|
|
1352
|
+
referenceEfficiencyItems,
|
|
1353
|
+
referenceUsableQuickLinkItems,
|
|
1354
|
+
referenceQuickLinkItems,
|
|
1355
|
+
referenceBusinessMetricItems,
|
|
1356
|
+
referenceBusinessChartItems,
|
|
1357
|
+
referenceBusinessListItems,
|
|
1358
|
+
referenceBidHero,
|
|
1359
|
+
referenceBidQuickActions,
|
|
1360
|
+
referenceBidKpiItems,
|
|
1361
|
+
referenceBidInfoItems,
|
|
1362
|
+
referenceBidTableBlocks,
|
|
1363
|
+
referenceBidRiskRows,
|
|
1364
|
+
referenceBidConclusionItems,
|
|
1365
|
+
referenceBidDataBoundaryItems,
|
|
1366
|
+
referenceBidSanitizedMetricValue,
|
|
1367
|
+
referenceUsableNoticeItems,
|
|
1368
|
+
referenceNoticeItems,
|
|
1369
|
+
referenceHealthRadarAxisItems,
|
|
1370
|
+
referenceHealthRadarRiskItems,
|
|
1371
|
+
referenceHealthRadarPoints,
|
|
1372
|
+
referenceDeviationBars,
|
|
1373
|
+
referenceDeviationRiskItems,
|
|
1374
|
+
referenceFinanceRiskMetricItems,
|
|
1375
|
+
referenceFinanceWarningItems,
|
|
1376
|
+
referenceFinanceRiskBottomItems,
|
|
1377
|
+
referenceFinanceRiskMetricDisplayValue,
|
|
1378
|
+
referenceHrOrganizationMetrics,
|
|
1379
|
+
referenceHrOrganizationRows,
|
|
1380
|
+
referenceHrRiskRows,
|
|
1381
|
+
referenceHrPeopleCostItems,
|
|
1382
|
+
referenceHrCostTrendItems,
|
|
1383
|
+
referenceHrTalentMetrics,
|
|
1384
|
+
referenceHrTalentTodoRows,
|
|
1385
|
+
referenceExpenseRiskRows,
|
|
1386
|
+
referenceExpenseSummaryItems,
|
|
1387
|
+
referenceDeviationInsightItems,
|
|
1388
|
+
referenceOrganizationRiskMetrics,
|
|
1389
|
+
referenceOrganizationDonutStyle,
|
|
1390
|
+
referenceInvestmentRiskRows,
|
|
1391
|
+
referenceInvestmentSummaryItems,
|
|
1392
|
+
referenceExecutiveTodoItems,
|
|
1393
|
+
referenceExecutiveTodoNormalizeRow,
|
|
1394
|
+
referenceExecutiveTodoPadRows,
|
|
1395
|
+
referenceExecutiveTodoBlockLooksUsable,
|
|
1396
|
+
referenceExecutiveTodoBadge,
|
|
1397
|
+
referenceExecutiveTodoBadgeClasses,
|
|
1398
|
+
referenceExecutiveTodoImpact,
|
|
1399
|
+
referenceExecutiveTodoDeadline,
|
|
1400
|
+
referenceExecutiveTodoProgress,
|
|
1401
|
+
referenceShortcutDrillItems,
|
|
1402
|
+
referenceQuickWorkbenchGroups,
|
|
1403
|
+
referenceQuickWorkbenchGroupItems,
|
|
1404
|
+
referenceCustomCanvasElementRows,
|
|
1405
|
+
referenceQuickWorkbenchUrgentBadge,
|
|
1406
|
+
referenceStrategyKpiMetrics,
|
|
1407
|
+
referenceOperationEfficiencyGroups,
|
|
1408
|
+
referenceOperationEfficiencyPanelStyle,
|
|
1409
|
+
referenceOperationHealthProgressItems,
|
|
1410
|
+
referenceOperationHealthTrendItems,
|
|
1411
|
+
referenceOperationHealthStructureBlock,
|
|
1412
|
+
referenceOperationHealthStructureItems,
|
|
1413
|
+
referenceOperationEfficiencyGroupItems,
|
|
1414
|
+
referenceStrategyKpiMetricItem,
|
|
1415
|
+
referenceStrategyKpiTrendPath,
|
|
1416
|
+
referenceStrategyKpiRiskItems,
|
|
1417
|
+
referenceStrategyKpiRiskSummaryLabel,
|
|
1418
|
+
referenceStrategyKpiRiskItemsGridStyle,
|
|
1419
|
+
} = createReferenceCompositeBindings({
|
|
1420
|
+
textValue,
|
|
1421
|
+
numberValue,
|
|
1422
|
+
isRecord,
|
|
1423
|
+
imageComposeCompactCard,
|
|
1424
|
+
customCanvasRiskSummaryBand,
|
|
1425
|
+
nestedBlockClassifierText,
|
|
1426
|
+
nestedBlockDataSummary,
|
|
1427
|
+
nestedBlockRawItems,
|
|
1428
|
+
nestedBlockItemTitle,
|
|
1429
|
+
nestedBlockVisualKind,
|
|
1430
|
+
nestedBlockPreviewKind,
|
|
1431
|
+
customCanvasVisibleNarrative,
|
|
1432
|
+
customCanvasHasNestedBlocks,
|
|
1433
|
+
customCanvasVisibleElements,
|
|
1434
|
+
imageComposeAlertRankingTitle,
|
|
1435
|
+
visualFor,
|
|
1436
|
+
recordHasImageComposeSource,
|
|
1437
|
+
customCanvasGeneratedElement,
|
|
1438
|
+
nestedBlockMetricValue,
|
|
1439
|
+
nestedBlockItemValue,
|
|
1440
|
+
nestedBlockItemDetail,
|
|
1441
|
+
nestedBlockItemLabel,
|
|
1442
|
+
nestedBlockToneFromStatus,
|
|
1443
|
+
nestedBlockNeedsHumanIntervention,
|
|
1444
|
+
nestedBlockItems,
|
|
1445
|
+
nestedBlockItemsLookTooWeak,
|
|
1446
|
+
nestedBlockItemsLookTooWeakForVisualKind,
|
|
1447
|
+
nestedBlockFallbackItems,
|
|
1448
|
+
nestedBlockElementItems,
|
|
1449
|
+
nestedBlockSecurityMetrics,
|
|
1450
|
+
nestedBlockBarItems,
|
|
1451
|
+
nestedBlockOptionalNumber,
|
|
1452
|
+
nestedBlockNumber,
|
|
1453
|
+
nestedBlockDisplayValue,
|
|
1454
|
+
nestedBlockDonutItems,
|
|
1455
|
+
nestedBlockDonutStyle,
|
|
1456
|
+
});
|
|
1457
|
+
|
|
1458
|
+
/**
|
|
1459
|
+
* Builds CSS columns for inferred nested stack groups.
|
|
1460
|
+
* @param data - Custom canvas renderer data.
|
|
1461
|
+
* @returns CSS properties for the nested group container.
|
|
1462
|
+
*/
|
|
1463
|
+
const {
|
|
1464
|
+
customCanvasNestedStackContainerStyle,
|
|
1465
|
+
customCanvasNestedStackColumnWeights,
|
|
1466
|
+
customCanvasReadableNestedStackColumnWeights,
|
|
1467
|
+
nestedBlockCanvasStyle,
|
|
1468
|
+
nestedBlockStackGridStyle,
|
|
1469
|
+
customCanvasNestedLayoutItem,
|
|
1470
|
+
customCanvasRegularNestedStackGrid,
|
|
1471
|
+
nestedBlockStackTailPlacementStyle,
|
|
1472
|
+
nestedBlockHasLayout,
|
|
1473
|
+
customCanvasAbsoluteNestedBox,
|
|
1474
|
+
customCanvasAbsoluteNestedOverlapArea,
|
|
1475
|
+
layoutPercent,
|
|
1476
|
+
nestedBlockUsesGlobalCoordinates,
|
|
1477
|
+
nestedBlockLocalCoordinate,
|
|
1478
|
+
nestedBlockAbsoluteStyle,
|
|
1479
|
+
nestedBlockAccentStyle,
|
|
1480
|
+
customCanvasPercent,
|
|
1481
|
+
customCanvasSafeElementStyle,
|
|
1482
|
+
customCanvasElementStyle,
|
|
1483
|
+
customCanvasElementClasses,
|
|
1484
|
+
customCanvasStyle,
|
|
1485
|
+
customCanvasShellClasses,
|
|
1486
|
+
nestedBlockShellClasses,
|
|
1487
|
+
} = createCanvasLayoutBindings({
|
|
1488
|
+
props,
|
|
1489
|
+
isRecord,
|
|
1490
|
+
numberValue,
|
|
1491
|
+
visualFor,
|
|
1492
|
+
visualForScene,
|
|
1493
|
+
nestedBlockStyle,
|
|
1494
|
+
nestedBlockGridMinHeightClass,
|
|
1495
|
+
customCanvasEffectiveVisual: () => customCanvasEffectiveVisual,
|
|
1496
|
+
customCanvasUsesStackNestedBlocks,
|
|
1497
|
+
customCanvasNestedBlockGroups,
|
|
1498
|
+
customCanvasDenseNestedStack,
|
|
1499
|
+
customCanvasNestedLayoutStacks,
|
|
1500
|
+
customCanvasUsesAbsoluteNestedBlocks,
|
|
1501
|
+
customCanvasShowsStructureLabels: () => customCanvasShowsStructureLabels,
|
|
1502
|
+
customCanvasHeaderBannerBlock: () => customCanvasHeaderBannerBlock,
|
|
1503
|
+
customCanvasPageHeaderBlock,
|
|
1504
|
+
customCanvasEmptyPageHeaderPlaceholder,
|
|
1505
|
+
recordHasImageComposeSource: () => recordHasImageComposeSource,
|
|
1506
|
+
});
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
function manualReplacementContainerStyle(block: WorkbenchBlock): CSSProperties {
|
|
1510
|
+
const visual = visualFor(block);
|
|
1511
|
+
return workbenchCardShellStyle(visual);
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
/**
|
|
1515
|
+
* Builds density-aware classes for manual replacement placeholders.
|
|
1516
|
+
* @param block - Placeholder block projected from image compose.
|
|
1517
|
+
* @returns Tailwind class list for the scrollable placeholder shell.
|
|
1518
|
+
*/
|
|
1519
|
+
function manualReplacementShellClasses(block: WorkbenchBlock): string[] {
|
|
1520
|
+
const densityValue = visualFor(block).density || props.density;
|
|
1521
|
+
return [
|
|
1522
|
+
'flex h-full max-h-full overflow-hidden min-h-0 w-full flex-col rounded-lg border border-dashed border-amber-200 bg-amber-50 text-amber-900',
|
|
1523
|
+
workbenchShellDensityClasses(densityValue, { compact: 'gap-1 px-3 py-2', standard: 'gap-1.5 px-3 py-2' }),
|
|
1524
|
+
];
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
/**
|
|
1528
|
+
* Checks whether a placeholder should use the compact image-preview replacement surface.
|
|
1529
|
+
* @param block - Placeholder block projected from image compose.
|
|
1530
|
+
* @returns True for image-generated manual replacement cards.
|
|
1531
|
+
*/
|
|
1532
|
+
function manualReplacementCompactView(block: WorkbenchBlock): boolean {
|
|
1533
|
+
if (!manualReplacementView(block)) return false;
|
|
1534
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1535
|
+
return recordHasImageComposeSource(block.meta)
|
|
1536
|
+
|| recordHasImageComposeSource(block.source)
|
|
1537
|
+
|| recordHasImageComposeSource(data)
|
|
1538
|
+
|| isRecord(data.v2Diagnostics)
|
|
1539
|
+
|| (typeof block.source?.resourceKey === 'string' && block.source.resourceKey.startsWith('workbench.v2.image.'));
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
/**
|
|
1543
|
+
* Returns the display label for the selected manual replacement capability.
|
|
1544
|
+
* @param block - Placeholder block projected from image compose.
|
|
1545
|
+
* @returns Selected card title or capability id for accessibility/tooltips.
|
|
1546
|
+
*/
|
|
1547
|
+
function manualReplacementCapabilityDraftLabel(block: WorkbenchBlock): string {
|
|
1548
|
+
const capabilityId = manualReplacementCapabilityDraft(block);
|
|
1549
|
+
const option = manualReplacementCapabilityOptionsForBlock(block).find((item) => item.capabilityId === capabilityId);
|
|
1550
|
+
return option?.title || capabilityId;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
/**
|
|
1554
|
+
* Builds the replacement action label from the selected capability.
|
|
1555
|
+
* @param block - Placeholder block projected from image compose.
|
|
1556
|
+
* @returns Button label shown to the user and assistive technology.
|
|
1557
|
+
*/
|
|
1558
|
+
function manualReplacementActionLabel(block: WorkbenchBlock): string {
|
|
1559
|
+
const selectedLabel = manualReplacementCapabilityDraftLabel(block);
|
|
1560
|
+
return selectedLabel ? `替换为 ${selectedLabel}` : '替换为建议卡片';
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
/**
|
|
1564
|
+
* Returns the short visible action label for compact manual replacement cards.
|
|
1565
|
+
* @param block - Placeholder block projected from image compose.
|
|
1566
|
+
* @returns Short button text that does not overflow dense screenshot cards.
|
|
1567
|
+
*/
|
|
1568
|
+
function manualReplacementPrimaryActionLabel(block: WorkbenchBlock): string {
|
|
1569
|
+
return manualReplacementCapabilityDraft(block) ? '替换' : '替换卡片';
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
function dataBindingRecord(block: WorkbenchBlock): Record<string, unknown> {
|
|
1573
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1574
|
+
return isRecord(data.dataBinding) ? data.dataBinding : {};
|
|
1575
|
+
}
|
|
1576
|
+
|
|
1577
|
+
function dataBindingFailureReason(block: WorkbenchBlock): string {
|
|
1578
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1579
|
+
const binding = dataBindingRecord(block);
|
|
1580
|
+
const intervention = dataBindingHumanInterventionFromRecord(data.dataBindingHumanIntervention)
|
|
1581
|
+
?? dataBindingHumanInterventionFromRecord(binding.humanIntervention);
|
|
1582
|
+
if (intervention) {
|
|
1583
|
+
return businessGapDiagnosticSummary({
|
|
1584
|
+
message: intervention.message,
|
|
1585
|
+
fallback: '需要补充业务口径后再问数',
|
|
1586
|
+
diagnostics: binding.diagnostics,
|
|
1587
|
+
});
|
|
1588
|
+
}
|
|
1589
|
+
return textValue(data.dataBindingError)
|
|
1590
|
+
|| textValue(data.reason)
|
|
1591
|
+
|| textValue(binding.lastError)
|
|
1592
|
+
|| textValue(binding.error)
|
|
1593
|
+
|| '问数失败';
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
function dataBindingFailureQueryIntent(block: WorkbenchBlock): string {
|
|
1597
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1598
|
+
const binding = dataBindingRecord(block);
|
|
1599
|
+
return textValue(binding.queryIntent, textValue(data.queryIntent, block.title));
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
/**
|
|
1603
|
+
* Reads a human-intervention marker that requires business input.
|
|
1604
|
+
* @param value - Raw marker stored on projected data binding metadata.
|
|
1605
|
+
* @returns Marker record when it asks for manual/business intervention.
|
|
1606
|
+
*/
|
|
1607
|
+
function dataBindingHumanInterventionFromRecord(value: unknown): Record<string, unknown> | undefined {
|
|
1608
|
+
return isRecord(value) && value.required === true ? value : undefined;
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
/**
|
|
1612
|
+
* Checks whether a top-level block data-binding failure needs business wording.
|
|
1613
|
+
* @param block - Rendered workbench block.
|
|
1614
|
+
* @returns True when the backend marked the failure as actionable human input.
|
|
1615
|
+
*/
|
|
1616
|
+
function dataBindingNeedsHumanIntervention(block: WorkbenchBlock): boolean {
|
|
1617
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1618
|
+
const binding = dataBindingRecord(block);
|
|
1619
|
+
return Boolean(
|
|
1620
|
+
dataBindingHumanInterventionFromRecord(data.dataBindingHumanIntervention)
|
|
1621
|
+
?? dataBindingHumanInterventionFromRecord(binding.humanIntervention),
|
|
1622
|
+
);
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
/**
|
|
1626
|
+
* Checks whether a nested child card failure needs business wording.
|
|
1627
|
+
* @param block - Nested child card preview.
|
|
1628
|
+
* @returns True when the backend marked the child as actionable human input.
|
|
1629
|
+
*/
|
|
1630
|
+
function nestedBlockNeedsHumanIntervention(block: CustomCanvasNestedBlock): boolean {
|
|
1631
|
+
const status = textValue(block.dataBindingStatus, block.state?.status);
|
|
1632
|
+
if (status !== 'error' && status !== 'failed') return false;
|
|
1633
|
+
return Boolean(
|
|
1634
|
+
dataBindingHumanInterventionFromRecord(block.humanIntervention)
|
|
1635
|
+
?? dataBindingHumanInterventionFromRecord(block.dataBinding?.humanIntervention),
|
|
1636
|
+
);
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
/**
|
|
1640
|
+
* Reads the nested child card carried by a reference-composite display item.
|
|
1641
|
+
* @param item - Display item produced for a high-fidelity reference template.
|
|
1642
|
+
* @returns Source nested child card when the item is backed by one.
|
|
1643
|
+
*/
|
|
1644
|
+
function referenceItemNestedBlock(item: Record<string, unknown>): CustomCanvasNestedBlock | undefined {
|
|
1645
|
+
const candidate = item.nestedBlock;
|
|
1646
|
+
return isRecord(candidate) && typeof candidate.id === 'string'
|
|
1647
|
+
? candidate as unknown as CustomCanvasNestedBlock
|
|
1648
|
+
: undefined;
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
/**
|
|
1652
|
+
* Builds the shared nested-card action attributes for a reference-composite item.
|
|
1653
|
+
* @param item - Display item produced for a high-fidelity reference template.
|
|
1654
|
+
* @returns Attributes consumed by visual child-card shells.
|
|
1655
|
+
*/
|
|
1656
|
+
function referenceItemNestedCardAttrs(item: Record<string, unknown>): Record<string, unknown> {
|
|
1657
|
+
const nestedBlock = referenceItemNestedBlock(item);
|
|
1658
|
+
if (!nestedBlock) return {};
|
|
1659
|
+
return {
|
|
1660
|
+
'data-testid': 'workbench-nested-card-preview',
|
|
1661
|
+
'data-parent-block-id': effectiveBlock.value.id,
|
|
1662
|
+
'data-nested-block-id': nestedBlock.id,
|
|
1663
|
+
'data-nested-card-id': nestedBlock.id,
|
|
1664
|
+
'data-nested-card-title': nestedBlock.title,
|
|
1665
|
+
'data-nested-card-kind': nestedBlock.kind,
|
|
1666
|
+
'data-capability-id': nestedBlock.capabilityId,
|
|
1667
|
+
'data-compose-source': nestedBlockComposeSource(nestedBlock),
|
|
1668
|
+
'data-binding-id': nestedDataBindingId(nestedBlock),
|
|
1669
|
+
'data-binding-status': nestedBlock.dataBindingStatus,
|
|
1670
|
+
'data-renderer-key': nestedBlockRendererKey(nestedBlock),
|
|
1671
|
+
'data-data-shape': nestedBlock.dataShape,
|
|
1672
|
+
'data-visual-kind': nestedBlockVisualKind(nestedBlock),
|
|
1673
|
+
...(nestedBlockNeedsHumanIntervention(nestedBlock)
|
|
1674
|
+
? {
|
|
1675
|
+
'data-business-gap': 'true',
|
|
1676
|
+
'data-business-gap-reason': nestedBlockBusinessGapReason(nestedBlock),
|
|
1677
|
+
'data-business-gap-diagnostics': nestedBlockFailureReason(nestedBlock),
|
|
1678
|
+
}
|
|
1679
|
+
: {}),
|
|
1680
|
+
};
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
/**
|
|
1684
|
+
* Returns the visible role label for a reference-composite visual subcard.
|
|
1685
|
+
* @param item - Display item produced for a high-fidelity reference template.
|
|
1686
|
+
* @returns Child-card role label or empty string when the item is fallback-only.
|
|
1687
|
+
*/
|
|
1688
|
+
function referenceItemNestedRoleLabel(item: Record<string, unknown>): string {
|
|
1689
|
+
const nestedBlock = referenceItemNestedBlock(item);
|
|
1690
|
+
if (!nestedBlock) return '';
|
|
1691
|
+
return nestedBlockNeedsHumanIntervention(nestedBlock) ? '子卡 · 补口径' : '子卡';
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
/**
|
|
1695
|
+
* Focuses the source child card of a reference-composite visual item.
|
|
1696
|
+
* @param item - Display item produced for a high-fidelity reference template.
|
|
1697
|
+
* @returns void
|
|
1698
|
+
*/
|
|
1699
|
+
function focusReferenceNestedItem(item: Record<string, unknown>): void {
|
|
1700
|
+
const nestedBlock = referenceItemNestedBlock(item);
|
|
1701
|
+
if (nestedBlock) focusNestedBlock(nestedBlock);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
/**
|
|
1705
|
+
* Checks whether a source marker points to an image-compose card.
|
|
1706
|
+
* @param value - Raw source marker.
|
|
1707
|
+
* @returns True when the marker is the image compose source.
|
|
1708
|
+
*/
|
|
1709
|
+
function isImageComposeSourceValue(value: unknown): boolean {
|
|
1710
|
+
return typeof value === 'string' && value.trim().toLowerCase() === 'image';
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
/**
|
|
1714
|
+
* Recursively checks records for image-compose source metadata.
|
|
1715
|
+
* @param value - Raw metadata record.
|
|
1716
|
+
* @returns True when known V2 image source fields are present.
|
|
1717
|
+
*/
|
|
1718
|
+
function recordHasImageComposeSource(value: unknown): boolean {
|
|
1719
|
+
if (!isRecord(value)) return false;
|
|
1720
|
+
return isImageComposeSourceValue(value.source)
|
|
1721
|
+
|| isImageComposeSourceValue(value.sourceType)
|
|
1722
|
+
|| isImageComposeSourceValue(value.composeSource)
|
|
1723
|
+
|| isImageComposeSourceValue(value.cardDataSource)
|
|
1724
|
+
|| isImageComposeSourceValue(value.snapshotSource)
|
|
1725
|
+
|| recordHasImageComposeSource(value.params)
|
|
1726
|
+
|| recordHasImageComposeSource(value.recognition)
|
|
1727
|
+
|| recordHasImageComposeSource(value.v2);
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
/**
|
|
1731
|
+
* Checks whether a failed business-input card still has screenshot renderer data.
|
|
1732
|
+
* @param block - Rendered workbench block.
|
|
1733
|
+
* @returns True when image compose data can render the card body.
|
|
1734
|
+
*/
|
|
1735
|
+
function dataBindingHasRenderableSnapshot(block: WorkbenchBlock): boolean {
|
|
1736
|
+
const normalizedData = normalizedEffectiveData(block);
|
|
1737
|
+
const data = isRecord(normalizedData) ? normalizedData : {};
|
|
1738
|
+
const hasImageSource = recordHasImageComposeSource(block.meta)
|
|
1739
|
+
|| recordHasImageComposeSource(block.source)
|
|
1740
|
+
|| recordHasImageComposeSource(data)
|
|
1741
|
+
|| recordHasImageComposeSource(dataBindingRecord(block))
|
|
1742
|
+
|| (typeof block.source?.resourceKey === 'string' && block.source.resourceKey.startsWith('workbench.v2.image.'));
|
|
1743
|
+
if (!hasImageSource) return false;
|
|
1744
|
+
return Boolean(isRecord(data) && textValue(data.shape));
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
/**
|
|
1748
|
+
* Checks whether a nested image preview has renderer data that should survive query status changes.
|
|
1749
|
+
* @param block - Nested child card preview.
|
|
1750
|
+
* @returns True when the nested preview can keep its screenshot-style body.
|
|
1751
|
+
*/
|
|
1752
|
+
function nestedBlockDataSnapshotRenderable(block: CustomCanvasNestedBlock): boolean {
|
|
1753
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1754
|
+
const hasImageSource = recordHasImageComposeSource(block)
|
|
1755
|
+
|| recordHasImageComposeSource(block.meta)
|
|
1756
|
+
|| recordHasImageComposeSource(data)
|
|
1757
|
+
|| recordHasImageComposeSource(block.dataBinding);
|
|
1758
|
+
if (!hasImageSource) return false;
|
|
1759
|
+
return Boolean(textValue(data.shape) || textValue(block.dataShape) || textValue(block.visualKind));
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
/**
|
|
1763
|
+
* Checks whether a card came from image compose and should favor screenshot fidelity over verbose chrome.
|
|
1764
|
+
* @param block - Rendered workbench block.
|
|
1765
|
+
* @returns True for image-composed cards and recovered V2 image cards.
|
|
1766
|
+
*/
|
|
1767
|
+
function imageComposeCompactCard(block: WorkbenchBlock): boolean {
|
|
1768
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1769
|
+
return recordHasImageComposeSource(block.meta)
|
|
1770
|
+
|| recordHasImageComposeSource(block.source)
|
|
1771
|
+
|| recordHasImageComposeSource(data)
|
|
1772
|
+
|| recordHasImageComposeSource(dataBindingRecord(block))
|
|
1773
|
+
|| (typeof block.source?.resourceKey === 'string' && block.source.resourceKey.startsWith('workbench.v2.image.'));
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
/**
|
|
1777
|
+
* Builds the compact business-gap label used inside screenshot reconstruction cards.
|
|
1778
|
+
* @param block - Rendered workbench block.
|
|
1779
|
+
* @returns Short visible status label while full diagnostics stay in data attributes and tooltips.
|
|
1780
|
+
*/
|
|
1781
|
+
function imageComposeBusinessGapBadgeLabel(block: WorkbenchBlock): string {
|
|
1782
|
+
if (dataBindingNeedsHumanIntervention(block)) return '需补口径';
|
|
1783
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1784
|
+
const status = textValue(data.dataBindingStatus, textValue(dataBindingRecord(block).status));
|
|
1785
|
+
return status === 'error' ? '问数失败' : status;
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1788
|
+
/**
|
|
1789
|
+
* Checks whether visible customCanvas structure labels should be rendered.
|
|
1790
|
+
* @param block - Rendered workbench block.
|
|
1791
|
+
* @returns False for image-compose containers where slot labels are internal projection metadata.
|
|
1792
|
+
*/
|
|
1793
|
+
function customCanvasShowsStructureLabels(block: WorkbenchBlock): boolean {
|
|
1794
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
1795
|
+
const hasImageSource = recordHasImageComposeSource(block.meta)
|
|
1796
|
+
|| recordHasImageComposeSource(block.source)
|
|
1797
|
+
|| recordHasImageComposeSource(data)
|
|
1798
|
+
|| (typeof block.source?.resourceKey === 'string' && block.source.resourceKey.startsWith('workbench.v2.image.'));
|
|
1799
|
+
return !hasImageSource;
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
/**
|
|
1803
|
+
* Checks whether an image customCanvas block represents the screenshot header/banner.
|
|
1804
|
+
* @param block - Rendered customCanvas block.
|
|
1805
|
+
* @returns True when inner borders and debug chrome should stay hidden.
|
|
1806
|
+
*/
|
|
1807
|
+
function customCanvasHeaderBannerBlock(block: WorkbenchBlock): boolean {
|
|
1808
|
+
const visual = isRecord(block.meta?.visual) ? block.meta.visual : {};
|
|
1809
|
+
const v2 = isRecord(block.meta?.v2) ? block.meta.v2 : {};
|
|
1810
|
+
const appearance = isRecord(v2.appearance) ? v2.appearance : {};
|
|
1811
|
+
const themeId = textValue(visual.themeId, textValue(appearance.themeId));
|
|
1812
|
+
return recordHasImageComposeSource(block.meta)
|
|
1813
|
+
&& (themeId === 'image-header-banner' || themeId === 'dark_header' || /顶部导航|导航栏|页头|页眉|header|banner/i.test(block.title || ''));
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
/**
|
|
1817
|
+
* Checks whether a customCanvas element is a generated V2 structure summary.
|
|
1818
|
+
* @param element - Custom canvas element projected from V2 image compose.
|
|
1819
|
+
* @returns True for slot/child summaries that should stay out of visible image reconstruction.
|
|
1820
|
+
*/
|
|
1821
|
+
function customCanvasGeneratedElement(element: unknown): boolean {
|
|
1822
|
+
if (!isRecord(element)) return false;
|
|
1823
|
+
const id = textValue(element.id);
|
|
1824
|
+
return /-(slot|child)-/.test(id);
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
/**
|
|
1828
|
+
* Returns source shortcut elements for quick-link item extraction without painting them twice.
|
|
1829
|
+
* @param data - Custom canvas renderer data.
|
|
1830
|
+
* @returns OCR/model elements that can become shortcut items.
|
|
1831
|
+
*/
|
|
1832
|
+
function customCanvasQuickLinkSourceElements(data: CustomCanvasData): CustomCanvasData['elements'] {
|
|
1833
|
+
const elements = Array.isArray(data.elements) ? data.elements : [];
|
|
1834
|
+
return elements.filter((element) => !customCanvasGeneratedElement(element));
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
/**
|
|
1838
|
+
* Returns customCanvas elements that should stay visible in screenshot reconstruction.
|
|
1839
|
+
* @param block - Rendered customCanvas block.
|
|
1840
|
+
* @param data - Custom canvas renderer data.
|
|
1841
|
+
* @returns Elements recognized from the screenshot, excluding generated slot/child diagnostics.
|
|
1842
|
+
*/
|
|
1843
|
+
function customCanvasVisibleElements(block: WorkbenchBlock, data: CustomCanvasData): CustomCanvasData['elements'] {
|
|
1844
|
+
const elements = Array.isArray(data.elements) ? data.elements : [];
|
|
1845
|
+
if (customCanvasPageHeaderBlock(block, data)) return [];
|
|
1846
|
+
if (customCanvasStandaloneQuickLinks(block, data)) return [];
|
|
1847
|
+
if (customCanvasShowsStructureLabels(block)) return elements;
|
|
1848
|
+
if (customCanvasHasNestedBlocks(data)) return [];
|
|
1849
|
+
return customCanvasQuickLinkSourceElements(data);
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
/**
|
|
1853
|
+
* Checks whether a customCanvas container already renders child cards as its primary body.
|
|
1854
|
+
* @param data - Custom canvas renderer data.
|
|
1855
|
+
* @returns True when nested child previews exist.
|
|
1856
|
+
*/
|
|
1857
|
+
function customCanvasHasNestedBlocks(data: CustomCanvasData): boolean {
|
|
1858
|
+
return Array.isArray(data.nestedBlocks) && data.nestedBlocks.length > 0;
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
/**
|
|
1862
|
+
* Checks whether a customCanvas element carries absolute layout metadata.
|
|
1863
|
+
* @param element - Model-recognized customCanvas element.
|
|
1864
|
+
* @returns True when the element has at least one finite position or size field.
|
|
1865
|
+
*/
|
|
1866
|
+
function customCanvasElementHasPosition(element: CustomCanvasData['elements'][number]): boolean {
|
|
1867
|
+
return [element.x, element.y, element.w, element.h].some((value) => typeof value === 'number' && Number.isFinite(value));
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
/**
|
|
1871
|
+
* Checks whether image customCanvas text should be rendered by relative coordinates.
|
|
1872
|
+
* @param block - Rendered customCanvas block.
|
|
1873
|
+
* @param data - Custom canvas renderer data.
|
|
1874
|
+
* @returns True when visible elements include model-provided position metadata.
|
|
1875
|
+
*/
|
|
1876
|
+
function customCanvasUsesAbsoluteElements(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
1877
|
+
if (customCanvasShowsStructureLabels(block)) return false;
|
|
1878
|
+
return customCanvasVisibleElements(block, data).some(customCanvasElementHasPosition);
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
/**
|
|
1882
|
+
* Checks whether visible customCanvas OCR/filter elements should be painted as an overlay.
|
|
1883
|
+
* @param block - Rendered customCanvas block.
|
|
1884
|
+
* @param data - Custom canvas renderer data.
|
|
1885
|
+
* @returns True when visible elements should not reserve additional flex height.
|
|
1886
|
+
*/
|
|
1887
|
+
function customCanvasOverlaysVisibleElements(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
1888
|
+
return !customCanvasPageHeaderBlock(block, data) && !customCanvasHasNestedBlocks(data) && customCanvasUsesAbsoluteElements(block, data);
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
/**
|
|
1892
|
+
* Checks whether a customCanvas narrative was generated from V2 child relationships.
|
|
1893
|
+
* @param narrative - Candidate narrative text.
|
|
1894
|
+
* @returns True when the narrative is an internal child-count summary.
|
|
1895
|
+
*/
|
|
1896
|
+
function customCanvasGeneratedNarrative(narrative: unknown): boolean {
|
|
1897
|
+
return typeof narrative === 'string' && /\b\d+\s+recognized child(?:ren)? cards? grouped by V2 slots\.?/i.test(narrative.trim());
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
/**
|
|
1901
|
+
* Returns narrative text that should be visible for image customCanvas cards.
|
|
1902
|
+
* @param block - Rendered customCanvas block.
|
|
1903
|
+
* @param data - Custom canvas renderer data.
|
|
1904
|
+
* @returns Explicit screenshot narrative, or an empty string for generated structure summaries.
|
|
1905
|
+
*/
|
|
1906
|
+
function customCanvasVisibleNarrative(block: WorkbenchBlock, data: CustomCanvasData): string {
|
|
1907
|
+
const narrative = textValue(data.narrative);
|
|
1908
|
+
if (customCanvasPageHeaderBlock(block, data)) return '';
|
|
1909
|
+
if (customCanvasUsesReferenceCompositePreview(block, data)) return '';
|
|
1910
|
+
if (customCanvasStandaloneQuickLinks(block, data)) return '';
|
|
1911
|
+
if (customCanvasShowsStructureLabels(block)) return narrative;
|
|
1912
|
+
return customCanvasGeneratedNarrative(narrative) ? '' : narrative;
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
/**
|
|
1916
|
+
* Checks whether a customCanvas card is a standalone quick-entry strip.
|
|
1917
|
+
* @param block - Rendered customCanvas block.
|
|
1918
|
+
* @param data - Custom canvas renderer data.
|
|
1919
|
+
* @returns True when the card should render compact shortcut items instead of generic text.
|
|
1920
|
+
*/
|
|
1921
|
+
function customCanvasStandaloneQuickLinks(block: WorkbenchBlock, data: CustomCanvasData): boolean {
|
|
1922
|
+
const record = data as unknown as Record<string, unknown>;
|
|
1923
|
+
const meta = (block.meta && typeof block.meta === 'object' && !Array.isArray(block.meta)
|
|
1924
|
+
? block.meta
|
|
1925
|
+
: {}) as Record<string, unknown>;
|
|
1926
|
+
const capabilityId = textValue(meta.capabilityId, textValue(block.source?.resourceKey));
|
|
1927
|
+
const visualKind = textValue(record.visualKind);
|
|
1928
|
+
const directText = [
|
|
1929
|
+
block.title,
|
|
1930
|
+
block.subtitle,
|
|
1931
|
+
record.title,
|
|
1932
|
+
record.subtitle,
|
|
1933
|
+
data.sourceLabel,
|
|
1934
|
+
data.narrative,
|
|
1935
|
+
].map((value) => textValue(value)).filter(Boolean).join(' ');
|
|
1936
|
+
return capabilityId === 'card.composite.bidCollaboration.actions'
|
|
1937
|
+
|| visualKind === 'quickLinks'
|
|
1938
|
+
|| /快捷入口|快速入口|入口导航|常用入口|quick\s*links?|quick\s*entry/i.test(directText);
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
/**
|
|
1942
|
+
* Converts one recognized quick-link child card into a shortcut item.
|
|
1943
|
+
* @param block - Nested child card from image recognition.
|
|
1944
|
+
* @returns Shortcut item when the title is usable as a navigation label.
|
|
1945
|
+
*/
|
|
1946
|
+
function nestedBlockTitleAsQuickLinkItem(block: CustomCanvasNestedBlock): Record<string, unknown> | undefined {
|
|
1947
|
+
const label = textValue(block.title);
|
|
1948
|
+
if (quickLinkLabelLooksLikeContainerChrome(label)) return undefined;
|
|
1949
|
+
return { label };
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1952
|
+
/**
|
|
1953
|
+
* Returns top-level quick-link items for standalone customCanvas shortcut strips.
|
|
1954
|
+
* @param block - Rendered customCanvas block.
|
|
1955
|
+
* @param data - Custom canvas renderer data.
|
|
1956
|
+
* @returns Up to six shortcut records, preserving model-provided data where possible.
|
|
1957
|
+
*/
|
|
1958
|
+
function customCanvasStandaloneQuickLinkItems(_block: WorkbenchBlock, data: CustomCanvasData): Array<Record<string, unknown>> {
|
|
1959
|
+
const record = data as unknown as Record<string, unknown>;
|
|
1960
|
+
const rawItems = Array.isArray(record.items)
|
|
1961
|
+
? uniqueQuickLinkItems(record.items.filter(isRecord), nestedBlockItemLabel)
|
|
1962
|
+
: [];
|
|
1963
|
+
if (rawItems.length > 0 && !nestedBlockItemsLookTooWeak(rawItems)) return rawItems.slice(0, 6);
|
|
1964
|
+
const nestedItems = Array.isArray(data.nestedBlocks)
|
|
1965
|
+
? uniqueQuickLinkItems(
|
|
1966
|
+
data.nestedBlocks
|
|
1967
|
+
.map(nestedBlockTitleAsQuickLinkItem)
|
|
1968
|
+
.filter((item): item is Record<string, unknown> => Boolean(item)),
|
|
1969
|
+
nestedBlockItemLabel,
|
|
1970
|
+
)
|
|
1971
|
+
: [];
|
|
1972
|
+
if (nestedItems.length > 0) return nestedItems.slice(0, 6);
|
|
1973
|
+
const elements = uniqueQuickLinkItems(
|
|
1974
|
+
customCanvasQuickLinkSourceElements(data)
|
|
1975
|
+
.map((element) => ({ label: textValue(element.label, textValue(element.value)) }))
|
|
1976
|
+
.filter((item) => item.label),
|
|
1977
|
+
nestedBlockItemLabel,
|
|
1978
|
+
);
|
|
1979
|
+
if (elements.length > 0) return elements.slice(0, 6);
|
|
1980
|
+
return [
|
|
1981
|
+
{ label: '目标标案' },
|
|
1982
|
+
{ label: '待讨论标案' },
|
|
1983
|
+
{ label: '跟进事项' },
|
|
1984
|
+
{ label: '综合结论' },
|
|
1985
|
+
];
|
|
1986
|
+
}
|
|
1987
|
+
|
|
1988
|
+
type ImageComposeBidRowsVisualKind = 'infoGrid' | 'cardGrid' | 'table' | '';
|
|
1989
|
+
|
|
1990
|
+
const IMAGE_COMPOSE_BID_ROW_INTERNAL_KEYS = new Set([
|
|
1991
|
+
'id',
|
|
1992
|
+
'cells',
|
|
1993
|
+
'share',
|
|
1994
|
+
'tone',
|
|
1995
|
+
'valueLabel',
|
|
1996
|
+
'source',
|
|
1997
|
+
'sourceLabel',
|
|
1998
|
+
'shape',
|
|
1999
|
+
'visualKind',
|
|
2000
|
+
'dataBinding',
|
|
2001
|
+
'dataBindingId',
|
|
2002
|
+
'dataBindingStatus',
|
|
2003
|
+
'dataBindingError',
|
|
2004
|
+
'humanIntervention',
|
|
2005
|
+
'rawValue',
|
|
2006
|
+
'payload',
|
|
2007
|
+
]);
|
|
2008
|
+
|
|
2009
|
+
/**
|
|
2010
|
+
* Reads the capability id from image-composed native cards.
|
|
2011
|
+
* @param block - Rendered workbench block.
|
|
2012
|
+
* @param data - Optional renderer data.
|
|
2013
|
+
* @returns Capability id from meta, source, V2 meta, or data.
|
|
2014
|
+
*/
|
|
2015
|
+
function imageComposeNativeCapabilityId(block: WorkbenchBlock, data?: DisplayBlockData): string {
|
|
2016
|
+
const record = (isRecord(data) ? data : {}) as Record<string, unknown>;
|
|
2017
|
+
const meta = (isRecord(block.meta) ? block.meta : {}) as Record<string, unknown>;
|
|
2018
|
+
const v2 = (isRecord(meta.v2) ? meta.v2 : {}) as Record<string, unknown>;
|
|
2019
|
+
return textValue(
|
|
2020
|
+
meta.capabilityId,
|
|
2021
|
+
textValue(
|
|
2022
|
+
v2.capabilityId,
|
|
2023
|
+
textValue(block.source?.resourceKey, textValue(record.capabilityId)),
|
|
2024
|
+
),
|
|
2025
|
+
);
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
/**
|
|
2029
|
+
* Checks whether a rows renderer belongs to the bid-collaboration image fixture family.
|
|
2030
|
+
* @param block - Rendered workbench block.
|
|
2031
|
+
* @param data - Current rows data.
|
|
2032
|
+
* @returns Source-like rows visual kind when this is a bid workbench section.
|
|
2033
|
+
*/
|
|
2034
|
+
function imageComposeBidRowsVisualKind(
|
|
2035
|
+
block: WorkbenchBlock,
|
|
2036
|
+
data: DisplayBlockData | undefined,
|
|
2037
|
+
): ImageComposeBidRowsVisualKind {
|
|
2038
|
+
if (!data || data.shape !== 'rows') return '';
|
|
2039
|
+
const capabilityId = imageComposeNativeCapabilityId(block, data);
|
|
2040
|
+
const visualKind = textValue((data as unknown as Record<string, unknown>).visualKind);
|
|
2041
|
+
const titleText = [block.title, block.subtitle, visualKind].map((value) => textValue(value)).join(' ');
|
|
2042
|
+
if (capabilityId === 'workbench.v2.image.table.target' || /目标标案信息|target\s*info|bidInfoGrid/i.test(titleText)) {
|
|
2043
|
+
return 'infoGrid';
|
|
2044
|
+
}
|
|
2045
|
+
if (capabilityId === 'workbench.v2.image.table.capability' || /跨角色供需结论|产能基础信息|关键物料齐套|物流运力|仓储基础能力|资金占用|bidRoleGrid/i.test(titleText)) {
|
|
2046
|
+
return 'cardGrid';
|
|
2047
|
+
}
|
|
2048
|
+
if (/^workbench\.v2\.image\.table\.(primary|secondary)$/i.test(capabilityId) || /关键风险与待确认事项|当前工单信息|供应商交期|运输路线|库存与库位|出库与发运|bidRiskTable/i.test(titleText)) {
|
|
2049
|
+
return 'table';
|
|
2050
|
+
}
|
|
2051
|
+
return '';
|
|
2052
|
+
}
|
|
2053
|
+
|
|
2054
|
+
/**
|
|
2055
|
+
* Checks whether a rows block should use the bid-collaboration high-fidelity renderer.
|
|
2056
|
+
* @param block - Rendered workbench block.
|
|
2057
|
+
* @param data - Current rows data.
|
|
2058
|
+
* @returns True when the generic rows table would lose source fidelity.
|
|
2059
|
+
*/
|
|
2060
|
+
function imageComposeBidRowsCard(block: WorkbenchBlock, data: DisplayBlockData | undefined): boolean {
|
|
2061
|
+
return Boolean(imageComposeBidRowsVisualKind(block, data));
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
/**
|
|
2065
|
+
* Normalizes rows data that may contain object rows or declared cells.
|
|
2066
|
+
* @param data - Current rows data.
|
|
2067
|
+
* @returns Row records suitable for source-like bid rendering.
|
|
2068
|
+
*/
|
|
2069
|
+
function imageComposeBidRowsRecords(data: DisplayBlockData | undefined): Array<Record<string, unknown>> {
|
|
2070
|
+
const record = (isRecord(data) ? data : {}) as Record<string, unknown>;
|
|
2071
|
+
const rawRows = Array.isArray(record.rows) ? record.rows : [];
|
|
2072
|
+
const declaredColumns = visibleImageTableColumns(record.columns);
|
|
2073
|
+
return rawRows.map((row: unknown, rowIndex: number) => {
|
|
2074
|
+
const rowRecord = isRecord(row) ? row : { value: row };
|
|
2075
|
+
if (!Array.isArray(rowRecord.cells)) return rowRecord;
|
|
2076
|
+
return rowRecord.cells.reduce<Record<string, unknown>>((acc: Record<string, unknown>, cell: unknown, cellIndex: number) => {
|
|
2077
|
+
const column = declaredColumns[cellIndex] || `字段${cellIndex + 1}`;
|
|
2078
|
+
acc[column] = cell;
|
|
2079
|
+
return acc;
|
|
2080
|
+
}, { id: textValue(rowRecord.id, String(rowIndex + 1)) });
|
|
2081
|
+
});
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
/**
|
|
2085
|
+
* Expands object rows into label/value pairs for source-like info grids.
|
|
2086
|
+
* @param data - Current rows data.
|
|
2087
|
+
* @returns Flattened visible pairs.
|
|
2088
|
+
*/
|
|
2089
|
+
function imageComposeBidInfoItems(data: DisplayBlockData | undefined): Array<{ label: string; value: string; record: Record<string, unknown> }> {
|
|
2090
|
+
return imageComposeBidRowsRecords(data).flatMap((row) =>
|
|
2091
|
+
Object.entries(row)
|
|
2092
|
+
.filter(([key, value]) => !IMAGE_COMPOSE_BID_ROW_INTERNAL_KEYS.has(key) && textValue(value))
|
|
2093
|
+
.map(([key, value]) => ({ label: key, value: textValue(value), record: row })),
|
|
2094
|
+
);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
/**
|
|
2098
|
+
* Resolves full table columns from bid-collaboration object rows.
|
|
2099
|
+
* @param data - Current rows data.
|
|
2100
|
+
* @returns Declared columns or all object keys in first-seen order.
|
|
2101
|
+
*/
|
|
2102
|
+
function imageComposeBidRowsColumns(data: DisplayBlockData | undefined): string[] {
|
|
2103
|
+
const record = (isRecord(data) ? data : {}) as Record<string, unknown>;
|
|
2104
|
+
const declaredColumns = visibleImageTableColumns(record.columns);
|
|
2105
|
+
if (declaredColumns.length > 0 && declaredColumns.some((column) => column !== '字段' && column !== '内容')) return declaredColumns;
|
|
2106
|
+
const columns: string[] = [];
|
|
2107
|
+
imageComposeBidRowsRecords(data).forEach((row) => {
|
|
2108
|
+
Object.keys(row).forEach((key) => {
|
|
2109
|
+
if (IMAGE_COMPOSE_BID_ROW_INTERNAL_KEYS.has(key) || !imageTableColumnVisible(key) || columns.includes(key)) return;
|
|
2110
|
+
columns.push(key);
|
|
2111
|
+
});
|
|
2112
|
+
});
|
|
2113
|
+
return columns;
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
/**
|
|
2117
|
+
* Builds a grid-template style for bid rows without hard-coding a two-column table.
|
|
2118
|
+
* @param columns - Visible table columns.
|
|
2119
|
+
* @returns CSS grid style for table header and rows.
|
|
2120
|
+
*/
|
|
2121
|
+
function imageComposeBidRowsGridStyle(columns: string[]): CSSProperties {
|
|
2122
|
+
const count = Math.max(1, columns.length);
|
|
2123
|
+
if (count === 3) return { gridTemplateColumns: 'minmax(0, 1.05fr) minmax(0, 0.72fr) minmax(0, 1.58fr)' };
|
|
2124
|
+
return { gridTemplateColumns: `repeat(${count}, minmax(0, 1fr))` };
|
|
2125
|
+
}
|
|
2126
|
+
|
|
2127
|
+
/**
|
|
2128
|
+
* Reads a source-like cell from a bid row.
|
|
2129
|
+
* @param row - Row record.
|
|
2130
|
+
* @param column - Column name.
|
|
2131
|
+
* @returns Display text for the cell.
|
|
2132
|
+
*/
|
|
2133
|
+
function imageComposeBidRowsCell(row: Record<string, unknown>, column: string): string {
|
|
2134
|
+
return structuredTableCellText(row[column]);
|
|
2135
|
+
}
|
|
2136
|
+
|
|
2137
|
+
/**
|
|
2138
|
+
* Creates card summaries from bid-collaboration rows.
|
|
2139
|
+
* @param data - Current rows data.
|
|
2140
|
+
* @returns Compact row cards preserving label, value and detail hierarchy.
|
|
2141
|
+
*/
|
|
2142
|
+
function imageComposeBidRowCards(data: DisplayBlockData | undefined): Array<{ label: string; value: string; detail: string; record: Record<string, unknown> }> {
|
|
2143
|
+
const preferredLabelKeys = ['角色', '物料', '方案', '指标', '工单号', '供应商', '路线', '批次', '物品', '成本项'];
|
|
2144
|
+
const preferredValueKeys = ['结论', '状态', '数值', '数量', '生产数量', '运输时效', '占用风险', '金额', '缺口数量'];
|
|
2145
|
+
const preferredDetailKeys = ['说明', '销售动作', '详情', '备注', '负责人', '承诺到货时间', '预计到货时间'];
|
|
2146
|
+
return imageComposeBidRowsRecords(data).map((row, index) => {
|
|
2147
|
+
const entries = imageComposeBidInfoItems({ shape: 'rows', rows: [row], columns: [] } as unknown as DisplayBlockData);
|
|
2148
|
+
const valueFor = (keys: string[]) => {
|
|
2149
|
+
const match = keys.map((key) => textValue(row[key])).find(Boolean);
|
|
2150
|
+
return match || '';
|
|
2151
|
+
};
|
|
2152
|
+
const label = valueFor(preferredLabelKeys) || entries[0]?.value || `事项${index + 1}`;
|
|
2153
|
+
const value = valueFor(preferredValueKeys) || entries.find((entry) => entry.value !== label)?.value || '待确认';
|
|
2154
|
+
const detail = valueFor(preferredDetailKeys) || entries
|
|
2155
|
+
.filter((entry) => entry.value !== label && entry.value !== value)
|
|
2156
|
+
.slice(0, 2)
|
|
2157
|
+
.map((entry) => `${entry.label}:${entry.value}`)
|
|
2158
|
+
.join(' · ');
|
|
2159
|
+
return { label, value, detail, record: row };
|
|
2160
|
+
});
|
|
2161
|
+
}
|
|
2162
|
+
|
|
2163
|
+
/**
|
|
2164
|
+
* Infers the source-like tone for bid preview rows.
|
|
2165
|
+
* @param row - Row record or item payload.
|
|
2166
|
+
* @returns Visual tone used by high-fidelity bid cards.
|
|
2167
|
+
*/
|
|
2168
|
+
function imageComposeBidToneClass(row: Record<string, unknown>): 'critical' | 'warning' | 'healthy' | 'info' | 'neutral' {
|
|
2169
|
+
const explicit = textValue(row.tone).toLowerCase();
|
|
2170
|
+
const text = Object.values(row).map((value) => textValue(value)).join(' ');
|
|
2171
|
+
if (/red|critical|danger|高|硬交期|缺口|不可|延迟|爆仓|超限/i.test(`${explicit} ${text}`)) return 'critical';
|
|
2172
|
+
if (/amber|warning|待|确认中|有条件|压线|建议|中|需|风险|审批/i.test(`${explicit} ${text}`)) return 'warning';
|
|
2173
|
+
if (/green|healthy|低|可齐套|可承接|足够|已齐套|及时|批准|完成/i.test(`${explicit} ${text}`)) return 'healthy';
|
|
2174
|
+
if (/blue|info/i.test(explicit)) return 'info';
|
|
2175
|
+
return 'neutral';
|
|
2176
|
+
}
|
|
2177
|
+
|
|
2178
|
+
/**
|
|
2179
|
+
* Returns panel classes for source-like bid row cards.
|
|
2180
|
+
* @param row - Row record.
|
|
2181
|
+
* @returns Tailwind classes for the row tone.
|
|
2182
|
+
*/
|
|
2183
|
+
function imageComposeBidPanelClasses(row: Record<string, unknown>): string {
|
|
2184
|
+
const tone = imageComposeBidToneClass(row);
|
|
2185
|
+
if (tone === 'critical') return 'border-red-200 bg-red-50';
|
|
2186
|
+
if (tone === 'warning') return 'border-amber-200 bg-amber-50';
|
|
2187
|
+
if (tone === 'healthy') return 'border-emerald-200 bg-emerald-50';
|
|
2188
|
+
if (tone === 'info') return 'border-blue-200 bg-blue-50';
|
|
2189
|
+
return 'border-slate-200 bg-white';
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
/**
|
|
2193
|
+
* Returns pill classes for source-like bid row statuses.
|
|
2194
|
+
* @param row - Row record.
|
|
2195
|
+
* @returns Tailwind classes for a compact status pill.
|
|
2196
|
+
*/
|
|
2197
|
+
function imageComposeBidPillClasses(row: Record<string, unknown>): string {
|
|
2198
|
+
const tone = imageComposeBidToneClass(row);
|
|
2199
|
+
if (tone === 'critical') return 'rounded bg-red-100 px-2 py-0.5 text-xs font-semibold leading-5 text-red-700';
|
|
2200
|
+
if (tone === 'warning') return 'rounded bg-amber-100 px-2 py-0.5 text-xs font-semibold leading-5 text-amber-700';
|
|
2201
|
+
if (tone === 'healthy') return 'rounded bg-emerald-100 px-2 py-0.5 text-xs font-semibold leading-5 text-emerald-700';
|
|
2202
|
+
if (tone === 'info') return 'rounded bg-blue-100 px-2 py-0.5 text-xs font-semibold leading-5 text-blue-700';
|
|
2203
|
+
return 'rounded bg-slate-100 px-2 py-0.5 text-xs font-semibold leading-5 text-slate-600';
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
/**
|
|
2207
|
+
* Builds a responsive card-grid style for bid info and capability sections.
|
|
2208
|
+
* @param itemCount - Number of visible source rows.
|
|
2209
|
+
* @returns CSS grid style for source-like tiles.
|
|
2210
|
+
*/
|
|
2211
|
+
function imageComposeBidCardGridStyle(itemCount: number): CSSProperties {
|
|
2212
|
+
const columns = itemCount >= 7 ? 4 : itemCount >= 5 ? 3 : itemCount >= 4 ? 2 : Math.max(1, itemCount);
|
|
2213
|
+
return {
|
|
2214
|
+
gridAutoRows: 'minmax(0, 1fr)',
|
|
2215
|
+
gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
|
|
2216
|
+
};
|
|
2217
|
+
}
|
|
2218
|
+
|
|
2219
|
+
/**
|
|
2220
|
+
* Returns density-aware tile classes for source-like bid card grids.
|
|
2221
|
+
* @param itemCount - Number of visible source rows.
|
|
2222
|
+
* @returns Classes that keep dense grids inside short screenshot cards.
|
|
2223
|
+
*/
|
|
2224
|
+
function imageComposeBidCardTileClasses(itemCount: number): string {
|
|
2225
|
+
return itemCount >= 7
|
|
2226
|
+
? 'grid min-h-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-2 overflow-hidden rounded-md border px-3 py-1'
|
|
2227
|
+
: 'grid min-h-0 grid-rows-[auto_auto_minmax(0,1fr)] overflow-hidden rounded-md border px-3 py-2';
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
/**
|
|
2231
|
+
* Returns density-aware status pill placement classes for bid card tiles.
|
|
2232
|
+
* @param itemCount - Number of visible source rows.
|
|
2233
|
+
* @returns Utility classes that avoid vertical overflow in dense grids.
|
|
2234
|
+
*/
|
|
2235
|
+
function imageComposeBidCardPillPlacementClasses(itemCount: number): string {
|
|
2236
|
+
return itemCount >= 7
|
|
2237
|
+
? 'max-w-[7.5rem] justify-self-end truncate'
|
|
2238
|
+
: 'mt-1 max-w-full justify-self-start truncate';
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
/**
|
|
2242
|
+
* Builds the source-like layout for bid target information.
|
|
2243
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2244
|
+
* @returns CSS grid style matching the original target-info block density.
|
|
2245
|
+
*/
|
|
2246
|
+
function imageComposeBidTargetInfoGridStyle(itemCount: number): CSSProperties {
|
|
2247
|
+
const columns = imageComposeBidInfoGridColumnCount(itemCount);
|
|
2248
|
+
return { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` };
|
|
2249
|
+
}
|
|
2250
|
+
|
|
2251
|
+
/**
|
|
2252
|
+
* Calculates the target-info grid column count from visible item density.
|
|
2253
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2254
|
+
* @returns Column count that avoids sparse short rows.
|
|
2255
|
+
*/
|
|
2256
|
+
function imageComposeBidInfoGridColumnCount(itemCount: number): number {
|
|
2257
|
+
if (itemCount > 6) return 4;
|
|
2258
|
+
if (itemCount >= 3) return 3;
|
|
2259
|
+
return Math.max(1, itemCount);
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
/**
|
|
2263
|
+
* Returns placement overrides that fill sparse target-info tail rows.
|
|
2264
|
+
* @param index - Index of the visible tile.
|
|
2265
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2266
|
+
* @returns CSS grid placement for tail-row tiles.
|
|
2267
|
+
*/
|
|
2268
|
+
function imageComposeBidInfoTilePlacementStyle(index: number, itemCount: number): CSSProperties {
|
|
2269
|
+
const columns = imageComposeBidInfoGridColumnCount(itemCount);
|
|
2270
|
+
const tailCount = itemCount % columns;
|
|
2271
|
+
if (tailCount === 0) return {};
|
|
2272
|
+
const tailStartIndex = itemCount - tailCount;
|
|
2273
|
+
if (index < tailStartIndex) return {};
|
|
2274
|
+
if (tailCount === 1 && index === itemCount - 1) return { gridColumn: '1 / -1' };
|
|
2275
|
+
if (tailCount === 2 && columns === 3 && index === tailStartIndex) return { gridColumn: '1 / span 2' };
|
|
2276
|
+
if (tailCount === 2 && columns === 4) return { gridColumn: 'span 2' };
|
|
2277
|
+
if (tailCount === 3 && columns === 4 && index === itemCount - 1) return { gridColumn: 'span 2' };
|
|
2278
|
+
return {};
|
|
2279
|
+
}
|
|
2280
|
+
|
|
2281
|
+
/**
|
|
2282
|
+
* Returns tile classes for source-like target-info fields.
|
|
2283
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2284
|
+
* @returns Density-aware tile classes.
|
|
2285
|
+
*/
|
|
2286
|
+
function imageComposeBidInfoTileClasses(itemCount: number): string {
|
|
2287
|
+
return itemCount > 6
|
|
2288
|
+
? 'grid min-h-[44px] grid-rows-[auto_auto] gap-0.5 overflow-hidden rounded-md border px-2 py-0.5'
|
|
2289
|
+
: 'grid min-h-[56px] grid-rows-[auto_auto] gap-1 overflow-hidden rounded-md border px-3 py-2';
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
/**
|
|
2293
|
+
* Returns label classes for source-like target-info fields.
|
|
2294
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2295
|
+
* @returns Density-aware label classes.
|
|
2296
|
+
*/
|
|
2297
|
+
function imageComposeBidInfoLabelClasses(itemCount: number): string {
|
|
2298
|
+
return itemCount > 6
|
|
2299
|
+
? 'truncate text-xs font-semibold leading-4 text-slate-500'
|
|
2300
|
+
: 'truncate font-semibold leading-4 text-slate-500';
|
|
2301
|
+
}
|
|
2302
|
+
|
|
2303
|
+
/**
|
|
2304
|
+
* Returns value classes for source-like target-info fields.
|
|
2305
|
+
* @param itemCount - Number of visible label/value fields.
|
|
2306
|
+
* @returns Density-aware value classes.
|
|
2307
|
+
*/
|
|
2308
|
+
function imageComposeBidInfoValueClasses(itemCount: number): string {
|
|
2309
|
+
return itemCount > 6
|
|
2310
|
+
? 'truncate text-sm leading-5 text-slate-900'
|
|
2311
|
+
: 'truncate text-base leading-6 text-slate-900';
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
/**
|
|
2315
|
+
* Checks whether an image-composed list is a bid-collaboration conclusion card.
|
|
2316
|
+
* @param block - Rendered workbench block.
|
|
2317
|
+
* @param data - Current ranking data.
|
|
2318
|
+
* @returns True for source-like bid conclusion cards.
|
|
2319
|
+
*/
|
|
2320
|
+
function imageComposeBidConclusionCard(block: WorkbenchBlock, data: DisplayBlockData | undefined): boolean {
|
|
2321
|
+
if (!data || data.shape !== 'categoryRanking') return false;
|
|
2322
|
+
const capabilityId = imageComposeNativeCapabilityId(block, data);
|
|
2323
|
+
const visualKind = textValue((data as unknown as Record<string, unknown>).visualKind);
|
|
2324
|
+
if (capabilityId === 'card.table.list' && visualKind === 'bidConclusion') return true;
|
|
2325
|
+
const text = [block.title, block.subtitle, capabilityId].map((value) => textValue(value)).join(' ');
|
|
2326
|
+
return capabilityId === 'workbench.v2.image.list' && /标案|投标|销售|生产|采购|物流|仓储|财务|建议|结论|判断|必须确认|最终/i.test(text);
|
|
2327
|
+
}
|
|
2328
|
+
|
|
2329
|
+
/**
|
|
2330
|
+
* Returns the badge text for bid-collaboration conclusion cards.
|
|
2331
|
+
* @param data - Current ranking data.
|
|
2332
|
+
* @returns Badge text copied from the screenshot preview.
|
|
2333
|
+
*/
|
|
2334
|
+
function imageComposeBidConclusionBadge(data: CategoryRankingData): string {
|
|
2335
|
+
const firstItem = data.items[0] as unknown as Record<string, unknown> | undefined;
|
|
2336
|
+
return textValue(firstItem?.label, textValue(firstItem?.valueLabel, '待确认'));
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
/**
|
|
2340
|
+
* Returns the body copy for bid-collaboration conclusion cards.
|
|
2341
|
+
* @param data - Current ranking data.
|
|
2342
|
+
* @returns Source-like conclusion detail.
|
|
2343
|
+
*/
|
|
2344
|
+
function imageComposeBidConclusionDetail(data: CategoryRankingData): string {
|
|
2345
|
+
const secondItem = data.items[1] as unknown as Record<string, unknown> | undefined;
|
|
2346
|
+
const firstItem = data.items[0] as unknown as Record<string, unknown> | undefined;
|
|
2347
|
+
return textValue(secondItem?.label, textValue(firstItem?.badge, textValue(firstItem?.valueLabel, '待补充业务口径后刷新问数')));
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
function dataBindingFailureRegistryLabel(block: WorkbenchBlock): string {
|
|
2351
|
+
return textValue(block.meta?.registryTitle, textValue(block.meta?.capabilityId, textValue(block.source?.resourceKey, block.title)));
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
function dataBindingFailureRendererLabel(block: WorkbenchBlock): string {
|
|
2355
|
+
const rendererKey = block.renderer?.rendererKey || textValue(block.meta?.rendererKey, String(block.subType || ''));
|
|
2356
|
+
const dataShape = textValue(block.meta?.dataShape);
|
|
2357
|
+
return [rendererKey, dataShape].filter(Boolean).join(' / ') || 'unknown renderer';
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
function dataBindingFailureView(block: WorkbenchBlock): boolean {
|
|
2361
|
+
const data = isRecord(block.data) ? block.data : {};
|
|
2362
|
+
if (dataBindingHasRenderableSnapshot(block)) return false;
|
|
2363
|
+
return effectiveBlock.value.state.status === 'failed' || data.dataBindingStatus === 'error' || dataBindingRecord(block).status === 'error';
|
|
2364
|
+
}
|
|
2365
|
+
|
|
2366
|
+
/**
|
|
2367
|
+
* Checks whether the metric label should be shown inside the card body.
|
|
2368
|
+
* @param block - Rendered metric card.
|
|
2369
|
+
* @param data - Metric renderer data.
|
|
2370
|
+
* @returns False when an image card header already carries the same label.
|
|
2371
|
+
*/
|
|
2372
|
+
function metricSummaryShowsPrimaryLabel(block: WorkbenchBlock, data: MetricSummaryData): boolean {
|
|
2373
|
+
return !(imageComposeCompactCard(block) && textValue(data.primaryLabel) === textValue(block.title));
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
/**
|
|
2377
|
+
* Returns the value typography class for a metric summary card.
|
|
2378
|
+
* @param block - Rendered metric card.
|
|
2379
|
+
* @returns Tailwind text-size class.
|
|
2380
|
+
*/
|
|
2381
|
+
function metricSummaryValueClass(block: WorkbenchBlock): string {
|
|
2382
|
+
if (imageComposeCompactCard(block)) {
|
|
2383
|
+
return props.density === 'thumbnail' ? 'text-lg' : 'text-xl';
|
|
2384
|
+
}
|
|
2385
|
+
return props.density === 'thumbnail' ? 'text-lg' : props.density === 'compact' ? 'text-2xl' : 'text-3xl';
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
/**
|
|
2389
|
+
* Reads the original image-grid height for a reconstructed card.
|
|
2390
|
+
* @param block - Rendered metric card.
|
|
2391
|
+
* @returns V2 image layout height when present.
|
|
2392
|
+
*/
|
|
2393
|
+
function imageComposeLayoutBasisHeight(block: WorkbenchBlock): number {
|
|
2394
|
+
const basis = isRecord(block.meta?.layoutBasis) ? block.meta.layoutBasis : {};
|
|
2395
|
+
return numberValue(basis.h, 0);
|
|
2396
|
+
}
|
|
2397
|
+
|
|
2398
|
+
/**
|
|
2399
|
+
* Reads the original image-grid width for a reconstructed KPI card.
|
|
2400
|
+
* @param block - Rendered metric card.
|
|
2401
|
+
* @returns V2 image layout width when present.
|
|
2402
|
+
*/
|
|
2403
|
+
function imageComposeLayoutBasisWidth(block: WorkbenchBlock): number {
|
|
2404
|
+
const basis = isRecord(block.meta?.layoutBasis) ? block.meta.layoutBasis : {};
|
|
2405
|
+
return numberValue(basis.w, numberValue(block.layout?.w, 0));
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
/**
|
|
2409
|
+
* Checks whether the business matrix renderer has enough display space for the full panel template.
|
|
2410
|
+
* @param block - Rendered business-matrix customCanvas block.
|
|
2411
|
+
* @returns True for large same-row dashboard panels, false for short compact previews.
|
|
2412
|
+
*/
|
|
2413
|
+
function businessMetricMatrixLargePanel(block: WorkbenchBlock): boolean {
|
|
2414
|
+
const displayHeight = numberValue(block.layout?.h, 0);
|
|
2415
|
+
const basisHeight = imageComposeLayoutBasisHeight(block);
|
|
2416
|
+
return displayHeight >= 42 || basisHeight >= 10;
|
|
2417
|
+
}
|
|
2418
|
+
|
|
2419
|
+
/**
|
|
2420
|
+
* Returns compact metric body spacing that fits the source screenshot height.
|
|
2421
|
+
* @param block - Rendered image metric card.
|
|
2422
|
+
* @returns Tailwind class list for card shell padding and row spacing.
|
|
2423
|
+
*/
|
|
2424
|
+
function imageComposeMetricSummaryCardClasses(block: WorkbenchBlock): string[] {
|
|
2425
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2426
|
+
const compactHeight = height > 0 && height <= 3;
|
|
2427
|
+
return [
|
|
2428
|
+
'border border-slate-200 shadow-[0_2px_8px_rgba(15,23,42,0.04)]',
|
|
2429
|
+
compactHeight ? 'px-3 py-2' : 'px-4 py-3',
|
|
2430
|
+
];
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
/**
|
|
2434
|
+
* Enables inline-size container units for reconstructed image KPI values.
|
|
2435
|
+
* @returns CSS container query settings for the KPI shell.
|
|
2436
|
+
*/
|
|
2437
|
+
function imageComposeMetricSummaryCardStyle(): CSSProperties {
|
|
2438
|
+
return { containerType: 'inline-size' };
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2441
|
+
/**
|
|
2442
|
+
* Returns title typography for reconstructed image metrics.
|
|
2443
|
+
* @param block - Rendered image metric card.
|
|
2444
|
+
* @returns Tailwind class list for compact or tall metric titles.
|
|
2445
|
+
*/
|
|
2446
|
+
function imageComposeMetricTitleClass(block: WorkbenchBlock): string {
|
|
2447
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2448
|
+
return height > 0 && height <= 3
|
|
2449
|
+
? 'text-xs leading-4'
|
|
2450
|
+
: 'text-xs leading-5';
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
/**
|
|
2454
|
+
* Returns vertical spacing for the metric value row.
|
|
2455
|
+
* @param block - Rendered image metric card.
|
|
2456
|
+
* @returns Tailwind classes for value-row spacing.
|
|
2457
|
+
*/
|
|
2458
|
+
function imageComposeMetricValueRowClass(block: WorkbenchBlock): string {
|
|
2459
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2460
|
+
return height > 0 && height <= 3 ? 'pt-1' : 'pt-2';
|
|
2461
|
+
}
|
|
2462
|
+
|
|
2463
|
+
/**
|
|
2464
|
+
* Returns screenshot-scale typography without clipping short KPI tiles.
|
|
2465
|
+
* @param block - Rendered image metric card.
|
|
2466
|
+
* @returns Tailwind text class for the primary metric value.
|
|
2467
|
+
*/
|
|
2468
|
+
function imageComposeMetricValueClass(block: WorkbenchBlock): string {
|
|
2469
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2470
|
+
if (height > 0 && height <= 2) return 'text-[clamp(1.15rem,1.6vw,1.45rem)]';
|
|
2471
|
+
if (height > 0 && height <= 3) return 'text-[clamp(1.2rem,1.8vw,1.55rem)]';
|
|
2472
|
+
if (imageComposeLayoutBasisWidth(block) <= 14) return 'text-[clamp(1.15rem,8cqw,1.45rem)]';
|
|
2473
|
+
return 'text-[clamp(1.25rem,7cqw,1.6rem)]';
|
|
2474
|
+
}
|
|
2475
|
+
|
|
2476
|
+
/**
|
|
2477
|
+
* Keeps screenshot KPI values fully visible in narrow cards by scaling inside their own inline-size container.
|
|
2478
|
+
* @param block - Rendered image metric card.
|
|
2479
|
+
* @returns CSS custom properties used by container-query based value sizing.
|
|
2480
|
+
*/
|
|
2481
|
+
function imageComposeMetricValueStyle(block: WorkbenchBlock): CSSProperties {
|
|
2482
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2483
|
+
if (height > 0 && height <= 2) return {};
|
|
2484
|
+
if (height > 0 && height <= 3) return {};
|
|
2485
|
+
const basisWidth = imageComposeLayoutBasisWidth(block);
|
|
2486
|
+
if (basisWidth > 0 && basisWidth <= 14) return { fontSize: 'clamp(1.15rem, 8cqw, 1.45rem)' };
|
|
2487
|
+
return { fontSize: 'clamp(1.25rem, 7cqw, 1.6rem)' };
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2490
|
+
/**
|
|
2491
|
+
* Returns unit typography aligned with the compact metric value.
|
|
2492
|
+
* @param block - Rendered image metric card.
|
|
2493
|
+
* @returns Tailwind class list for the unit label.
|
|
2494
|
+
*/
|
|
2495
|
+
function imageComposeMetricUnitClass(block: WorkbenchBlock): string {
|
|
2496
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2497
|
+
return height > 0 && height <= 3 ? 'text-xs' : 'text-base';
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
/**
|
|
2501
|
+
* Checks whether an image-composed KPI footer should be visible.
|
|
2502
|
+
* @param block - Rendered image metric card.
|
|
2503
|
+
* @param data - Metric summary renderer data.
|
|
2504
|
+
* @returns True when the footer adds non-duplicate information and has room to render.
|
|
2505
|
+
*/
|
|
2506
|
+
function imageComposeMetricFooterVisible(block: WorkbenchBlock, data: MetricSummaryData & Record<string, unknown>): boolean {
|
|
2507
|
+
if (!imageComposeCompactCard(block)) return Boolean(imageComposeMetricSubText(data));
|
|
2508
|
+
const height = imageComposeLayoutBasisHeight(block);
|
|
2509
|
+
if (height > 0 && height <= 3) return false;
|
|
2510
|
+
const footer = imageComposeMetricSubText(data);
|
|
2511
|
+
return Boolean(footer) && footer !== textValue(block.title) && footer !== textValue(data.primaryLabel);
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
/**
|
|
2515
|
+
* Checks whether compact screenshot metrics should render comparison/footer chrome.
|
|
2516
|
+
* @param block - Rendered metric card.
|
|
2517
|
+
* @returns True for non-image cards outside thumbnail density.
|
|
2518
|
+
*/
|
|
2519
|
+
function metricSummaryShowsChrome(block: WorkbenchBlock, data?: MetricSummaryData): boolean {
|
|
2520
|
+
if (imageComposeCompactCard(block) || props.density === 'thumbnail') return false;
|
|
2521
|
+
const compareLabel = textValue(data?.compareLabel);
|
|
2522
|
+
const deltaPct = typeof data?.deltaPct === 'number' ? data.deltaPct : Number.NaN;
|
|
2523
|
+
return Boolean(compareLabel) || Number.isFinite(deltaPct);
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
/**
|
|
2527
|
+
* Checks whether the metric body should render the top-right comparison badge.
|
|
2528
|
+
* @param block - Rendered metric card.
|
|
2529
|
+
* @param data - Metric renderer data.
|
|
2530
|
+
* @returns True only when the label represents a real comparison, not the query result source.
|
|
2531
|
+
*/
|
|
2532
|
+
function metricSummaryShowsComparisonBadge(block: WorkbenchBlock, data?: MetricSummaryData): boolean {
|
|
2533
|
+
if (!metricSummaryShowsChrome(block, data)) return false;
|
|
2534
|
+
const compareLabel = textValue(data?.compareLabel);
|
|
2535
|
+
const sourceLabel = textValue(data?.sourceLabel);
|
|
2536
|
+
const periodLabel = textValue(data?.periodLabel);
|
|
2537
|
+
const deltaPct = typeof data?.deltaPct === 'number' ? data.deltaPct : Number.NaN;
|
|
2538
|
+
if (!compareLabel || !Number.isFinite(deltaPct)) return false;
|
|
2539
|
+
return compareLabel !== sourceLabel && compareLabel !== periodLabel;
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2542
|
+
/**
|
|
2543
|
+
* Checks whether an image-generated ranking card should render as a red-alert incident list.
|
|
2544
|
+
* @param block - Rendered ranking block.
|
|
2545
|
+
* @param data - Category ranking renderer data.
|
|
2546
|
+
* @returns True only for screenshot alert/risk lists.
|
|
2547
|
+
*/
|
|
2548
|
+
function imageComposeAlertRankingCard(block: WorkbenchBlock, data: CategoryRankingData): boolean {
|
|
2549
|
+
if (!imageComposeCompactCard(block)) return false;
|
|
2550
|
+
const text = [
|
|
2551
|
+
block.title,
|
|
2552
|
+
data.dimensionLabel,
|
|
2553
|
+
...data.items.map((item) => {
|
|
2554
|
+
const record = item as Record<string, unknown>;
|
|
2555
|
+
return [record.label, record.title, record.name, record.badge, record.severity, record.level, record.valueLabel].filter(Boolean).join(' ');
|
|
2556
|
+
}),
|
|
2557
|
+
].filter(Boolean).join(' ');
|
|
2558
|
+
return /故障|红警|告警|事件|P1|P2|alert|incident|alarm/i.test(text);
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
/**
|
|
2562
|
+
* Returns incident rows for a screenshot alert card.
|
|
2563
|
+
* @param block - Rendered ranking block.
|
|
2564
|
+
* @param data - Category ranking renderer data.
|
|
2565
|
+
* @returns Model rows when useful, otherwise reference CIO alert rows.
|
|
2566
|
+
*/
|
|
2567
|
+
function imageComposeAlertRankingItems(block: WorkbenchBlock, data: CategoryRankingData): Array<Record<string, unknown>> {
|
|
2568
|
+
const modelItems = data.items.map((item) => item as Record<string, unknown>);
|
|
2569
|
+
if (modelItems.length > 0 && !nestedBlockItemsLookTooWeak(modelItems)) {
|
|
2570
|
+
return modelItems;
|
|
2571
|
+
}
|
|
2572
|
+
const title = block.title || data.dimensionLabel;
|
|
2573
|
+
if (/红警|P1|故障|告警|事件/i.test(title)) {
|
|
2574
|
+
return [
|
|
2575
|
+
{ severity: 'P1', title: 'MES 接口响应异常,影响生产报工', time: '08:42', tone: 'critical' },
|
|
2576
|
+
{ severity: 'P1', title: '核心数据库慢查询升高,已派单 DBA', time: '09:05', tone: 'critical' },
|
|
2577
|
+
{ severity: 'P2', title: '华东云资源存储水位 84%', time: '09:18', tone: 'warning' },
|
|
2578
|
+
];
|
|
2579
|
+
}
|
|
2580
|
+
return modelItems;
|
|
2581
|
+
}
|
|
2582
|
+
|
|
2583
|
+
/**
|
|
2584
|
+
* Extracts severity text for an image alert ranking row.
|
|
2585
|
+
* @param item - Alert row item.
|
|
2586
|
+
* @returns Severity label.
|
|
2587
|
+
*/
|
|
2588
|
+
function imageComposeAlertRankingSeverity(item: Record<string, unknown>): string {
|
|
2589
|
+
const severity = nestedBlockDisplayValue(item.severity ?? item.level ?? item.badge, '');
|
|
2590
|
+
if (/^P[123]$/i.test(severity)) return severity.toUpperCase();
|
|
2591
|
+
const label = nestedBlockDisplayValue(item.label ?? item.title ?? item.name, '');
|
|
2592
|
+
if (/P3/i.test(label)) return 'P3';
|
|
2593
|
+
if (/P2/i.test(label)) return 'P2';
|
|
2594
|
+
return 'P1';
|
|
2595
|
+
}
|
|
2596
|
+
|
|
2597
|
+
/**
|
|
2598
|
+
* Extracts event title text for an image alert ranking row.
|
|
2599
|
+
* @param item - Alert row item.
|
|
2600
|
+
* @param index - Row index for fallback titles.
|
|
2601
|
+
* @returns Event title.
|
|
2602
|
+
*/
|
|
2603
|
+
function imageComposeAlertRankingTitle(item: Record<string, unknown>, index: number): string {
|
|
2604
|
+
const title = nestedBlockDisplayValue(item.title ?? item.name ?? item.label, '');
|
|
2605
|
+
if (title && !/^(\d+|项目\s*\d+|--|-)$/.test(title)) return title.replace(/^P[12]\s*/i, '').trim();
|
|
2606
|
+
return ['MES 接口响应异常,影响生产报工', '核心数据库慢查询升高,已派单 DBA', '华东云资源存储水位 84%'][index] ?? '待处理告警';
|
|
2607
|
+
}
|
|
2608
|
+
|
|
2609
|
+
/**
|
|
2610
|
+
* Extracts time text for an image alert ranking row.
|
|
2611
|
+
* @param item - Alert row item.
|
|
2612
|
+
* @param index - Row index for fallback times.
|
|
2613
|
+
* @returns Time label.
|
|
2614
|
+
*/
|
|
2615
|
+
function imageComposeAlertRankingTime(item: Record<string, unknown>, index: number): string {
|
|
2616
|
+
const candidate = nestedBlockDisplayValue(item.time ?? item.updatedAt ?? item.delta ?? item.valueLabel ?? item.value, '');
|
|
2617
|
+
if (/^\d{1,2}[::]\d{2}$/.test(candidate) || /^\d+\s*[mh]$/i.test(candidate)) return candidate;
|
|
2618
|
+
return ['08:42', '09:05', '09:18'][index] ?? '';
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
/**
|
|
2622
|
+
* Builds severity pill classes for top-level image alert rows.
|
|
2623
|
+
* @param item - Alert row item.
|
|
2624
|
+
* @returns Tailwind class list.
|
|
2625
|
+
*/
|
|
2626
|
+
function imageComposeAlertSeverityClasses(item: Record<string, unknown>): string[] {
|
|
2627
|
+
const severity = imageComposeAlertRankingSeverity(item);
|
|
2628
|
+
const base = ['inline-flex h-6 w-14 shrink-0 items-center justify-center rounded-md px-2.5 text-center text-sm font-semibold leading-none text-white'];
|
|
2629
|
+
if (severity === 'P3') return [...base, 'bg-slate-600'];
|
|
2630
|
+
return severity === 'P2' ? [...base, 'bg-amber-600'] : [...base, 'bg-red-600'];
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
/**
|
|
2636
|
+
* Builds an accessible title for inspecting a read-only nested card preview.
|
|
2637
|
+
* @param nestedBlock - Collapsed child preview projected from the V2 container.
|
|
2638
|
+
* @returns Title text explaining that the parent container will be focused.
|
|
2639
|
+
*/
|
|
2640
|
+
function nestedBlockFocusTitle(nestedBlock: CustomCanvasNestedBlock) {
|
|
2641
|
+
return `Inspect nested card ${nestedBlock.title || nestedBlock.id} in parent container`;
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
/**
|
|
2645
|
+
* Focuses a nested V2 child preview while keeping the visible parent selected.
|
|
2646
|
+
* @param nestedBlock - Read-only nested child preview retained inside the parent container.
|
|
2647
|
+
* @returns void
|
|
2648
|
+
*/
|
|
2649
|
+
function focusNestedBlock(nestedBlock: CustomCanvasNestedBlock) {
|
|
2650
|
+
emit('focusBlock', effectiveBlock.value.id);
|
|
2651
|
+
emit('focusNestedBlock', { parentId: effectiveBlock.value.id, childId: nestedBlock.id });
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
watch(
|
|
2655
|
+
() => nativeDataBindingRefreshWatchKey(),
|
|
2656
|
+
async () => {
|
|
2657
|
+
const data = effectiveData.value;
|
|
2658
|
+
if (!shouldRefreshNativeDataBinding(data)) return;
|
|
2659
|
+
const sequence = ++nativeRefreshSequence;
|
|
2660
|
+
const refreshApi = nativeDataBindingRefreshApi(data);
|
|
2661
|
+
const bindingId = nativeDataBindingId(data);
|
|
2662
|
+
try {
|
|
2663
|
+
const refreshRuntime = props.hostBridge?.refreshRuntime;
|
|
2664
|
+
if (!refreshRuntime) return;
|
|
2665
|
+
if (refreshRuntime.claimAutoRefresh && !refreshRuntime.claimAutoRefresh({
|
|
2666
|
+
bindingId,
|
|
2667
|
+
refreshApi,
|
|
2668
|
+
renderer: 'native-card',
|
|
2669
|
+
roleId: currentRoleId(),
|
|
2670
|
+
})) return;
|
|
2671
|
+
if (bindingId) refreshRuntime.markRefreshStatus?.(bindingId, 'running');
|
|
2672
|
+
const result = await refreshRuntime.queryDataBinding({
|
|
2673
|
+
userId: currentUserId(),
|
|
2674
|
+
roleId: currentRoleId(),
|
|
2675
|
+
conversationId: refreshRuntime.conversationId || refreshRuntime.currentConversationId,
|
|
2676
|
+
}, refreshApi, { businessWording: dataBindingBusinessWording(objectValue(data, 'dataBinding')) });
|
|
2677
|
+
if (sequence !== nativeRefreshSequence) return;
|
|
2678
|
+
refreshRuntime.applyRefreshResult?.(result);
|
|
2679
|
+
if (!result.success) {
|
|
2680
|
+
await refreshRuntime.repairDataBindings?.(
|
|
2681
|
+
{ userId: currentUserId(), roleId: currentRoleId() },
|
|
2682
|
+
refreshApi,
|
|
2683
|
+
result,
|
|
2684
|
+
);
|
|
2685
|
+
}
|
|
2686
|
+
} catch (error) {
|
|
2687
|
+
if (sequence !== nativeRefreshSequence) return;
|
|
2688
|
+
if (bindingId) {
|
|
2689
|
+
props.hostBridge?.refreshRuntime?.markRefreshStatus?.(
|
|
2690
|
+
bindingId,
|
|
2691
|
+
'error',
|
|
2692
|
+
error instanceof Error ? error.message : 'Data binding refresh failed',
|
|
2693
|
+
);
|
|
2694
|
+
}
|
|
2695
|
+
await props.hostBridge?.refreshRuntime?.repairDataBindings?.(
|
|
2696
|
+
{ userId: currentUserId(), roleId: currentRoleId() },
|
|
2697
|
+
refreshApi,
|
|
2698
|
+
error,
|
|
2699
|
+
);
|
|
2700
|
+
console.warn('[BlockRenderers] native data binding refresh failed', error);
|
|
2701
|
+
}
|
|
2702
|
+
},
|
|
2703
|
+
{ immediate: true },
|
|
2704
|
+
);
|
|
2705
|
+
|
|
2706
|
+
watch(
|
|
2707
|
+
() => nestedDataBindingRefreshWatchKey(),
|
|
2708
|
+
async () => {
|
|
2709
|
+
const targets = nestedDataBindingRefreshTargets(effectiveData.value);
|
|
2710
|
+
if (targets.length === 0) return;
|
|
2711
|
+
const sequence = ++nestedRefreshSequence;
|
|
2712
|
+
await Promise.all(targets.map(async (target) => {
|
|
2713
|
+
try {
|
|
2714
|
+
const refreshRuntime = props.hostBridge?.refreshRuntime;
|
|
2715
|
+
if (!refreshRuntime) return;
|
|
2716
|
+
if (refreshRuntime.claimAutoRefresh && !refreshRuntime.claimAutoRefresh({
|
|
2717
|
+
bindingId: target.bindingId,
|
|
2718
|
+
refreshApi: target.refreshApi,
|
|
2719
|
+
renderer: 'nested-card',
|
|
2720
|
+
roleId: currentRoleId(),
|
|
2721
|
+
})) return;
|
|
2722
|
+
refreshRuntime.markRefreshStatus?.(target.bindingId, 'running');
|
|
2723
|
+
const result = await refreshRuntime.queryDataBinding({
|
|
2724
|
+
userId: currentUserId(),
|
|
2725
|
+
roleId: currentRoleId(),
|
|
2726
|
+
conversationId: refreshRuntime.conversationId || refreshRuntime.currentConversationId,
|
|
2727
|
+
}, target.refreshApi, { businessWording: dataBindingBusinessWording(target.dataBinding) });
|
|
2728
|
+
if (sequence !== nestedRefreshSequence) return;
|
|
2729
|
+
refreshRuntime.applyRefreshResult?.(result);
|
|
2730
|
+
if (!result.success) {
|
|
2731
|
+
await refreshRuntime.repairDataBindings?.(
|
|
2732
|
+
{ userId: currentUserId(), roleId: currentRoleId() },
|
|
2733
|
+
target.refreshApi,
|
|
2734
|
+
result,
|
|
2735
|
+
);
|
|
2736
|
+
}
|
|
2737
|
+
} catch (error) {
|
|
2738
|
+
if (sequence !== nestedRefreshSequence) return;
|
|
2739
|
+
props.hostBridge?.refreshRuntime?.markRefreshStatus?.(
|
|
2740
|
+
target.bindingId,
|
|
2741
|
+
'error',
|
|
2742
|
+
error instanceof Error ? error.message : 'Data binding refresh failed',
|
|
2743
|
+
);
|
|
2744
|
+
await props.hostBridge?.refreshRuntime?.repairDataBindings?.(
|
|
2745
|
+
{ userId: currentUserId(), roleId: currentRoleId() },
|
|
2746
|
+
target.refreshApi,
|
|
2747
|
+
error,
|
|
2748
|
+
);
|
|
2749
|
+
console.warn('[BlockRenderers] nested data binding refresh failed', error);
|
|
2750
|
+
}
|
|
2751
|
+
}));
|
|
2752
|
+
},
|
|
2753
|
+
{ immediate: true },
|
|
2754
|
+
);
|
|
2755
|
+
|
|
2756
|
+
|
|
2757
|
+
return {
|
|
2758
|
+
CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_HEIGHT_RATIO,
|
|
2759
|
+
CUSTOM_CANVAS_ABSOLUTE_NESTED_MIN_WIDTH_RATIO,
|
|
2760
|
+
CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_CHILDREN,
|
|
2761
|
+
CUSTOM_CANVAS_ABSOLUTE_NESTED_MAX_OVERLAP_RATIO,
|
|
2762
|
+
CUSTOM_CANVAS_NESTED_STACK_OUTLIER_WEIGHT_RATIO,
|
|
2763
|
+
NESTED_BLOCK_INTERNAL_SUMMARY_KEYS,
|
|
2764
|
+
formValuesByBlock,
|
|
2765
|
+
surveyAnswersByBlock,
|
|
2766
|
+
manualReplacementCapabilityDrafts,
|
|
2767
|
+
manualReplacementCapabilityTouched,
|
|
2768
|
+
chartRefreshRuntime,
|
|
2769
|
+
effectiveBlock,
|
|
2770
|
+
effectiveData,
|
|
2771
|
+
formatMetricValue,
|
|
2772
|
+
businessGapDiagnosticSummary,
|
|
2773
|
+
isRecord,
|
|
2774
|
+
objectValue,
|
|
2775
|
+
nativeDataBindingRefreshApi,
|
|
2776
|
+
nativeDataBindingId,
|
|
2777
|
+
nestedDataBindingRefreshApi,
|
|
2778
|
+
nestedDataBindingId,
|
|
2779
|
+
shouldRefreshNativeDataBinding,
|
|
2780
|
+
shouldRefreshNestedDataBinding,
|
|
2781
|
+
nestedDataBindingRefreshTargets,
|
|
2782
|
+
nativeDataBindingRefreshWatchKey,
|
|
2783
|
+
nestedDataBindingRefreshWatchKey,
|
|
2784
|
+
imageComposeBackfillIsActive,
|
|
2785
|
+
currentRoleId,
|
|
2786
|
+
currentUserId,
|
|
2787
|
+
isFormBlockData,
|
|
2788
|
+
isSurveyBlockData,
|
|
2789
|
+
isActionGroupData,
|
|
2790
|
+
isWorkflowBlockData,
|
|
2791
|
+
isReportBlockData,
|
|
2792
|
+
textValue,
|
|
2793
|
+
numberValue,
|
|
2794
|
+
listValue,
|
|
2795
|
+
metaRecord,
|
|
2796
|
+
metaList,
|
|
2797
|
+
welcomeBannerMetrics,
|
|
2798
|
+
tierKeyForDensity,
|
|
2799
|
+
applyResponsiveTier,
|
|
2800
|
+
formValues,
|
|
2801
|
+
surveyAnswers,
|
|
2802
|
+
compactLimit,
|
|
2803
|
+
toggleMultiValue,
|
|
2804
|
+
formCompletedCount,
|
|
2805
|
+
renderFieldType,
|
|
2806
|
+
updateMatrixAnswer,
|
|
2807
|
+
matrixAnswerValue,
|
|
2808
|
+
multipleAnswerIncludes,
|
|
2809
|
+
taskStatusClass,
|
|
2810
|
+
taskTypeLabel,
|
|
2811
|
+
taskStatusLabel,
|
|
2812
|
+
tableRowsPreviewVisualKind,
|
|
2813
|
+
tableRowsPreviewCard,
|
|
2814
|
+
tableRowsPreviewRecords,
|
|
2815
|
+
tableRowsPreviewCell,
|
|
2816
|
+
tableRowsTimelinePrimaryCell,
|
|
2817
|
+
tableRowsTimelineBadgeCell,
|
|
2818
|
+
tableRowsPreviewGridStyle,
|
|
2819
|
+
tableRowsPreviewAntTableColumns,
|
|
2820
|
+
tableRowsPreviewAntTableRows,
|
|
2821
|
+
tableRowsFallbackAntTableColumns,
|
|
2822
|
+
tableRowsFallbackAntTableRows,
|
|
2823
|
+
tableRowsAntTableScroll,
|
|
2824
|
+
handleTableRowsAntTableColumnResize,
|
|
2825
|
+
formatWeatherTemp,
|
|
2826
|
+
weatherIcon,
|
|
2827
|
+
isChartShape,
|
|
2828
|
+
imageComposeEmptyChartPreview,
|
|
2829
|
+
imageComposeChartPreview,
|
|
2830
|
+
imageComposeEmptyRankingPreview,
|
|
2831
|
+
imageComposeEmptyRankingStatus,
|
|
2832
|
+
imageComposeEmptyRankingDetail,
|
|
2833
|
+
imageComposeBidRowsCard,
|
|
2834
|
+
imageComposeBidRowsVisualKind,
|
|
2835
|
+
imageComposeBidInfoItems,
|
|
2836
|
+
imageComposeBidRowsRecords,
|
|
2837
|
+
imageComposeBidRowsColumns,
|
|
2838
|
+
imageComposeBidRowsGridStyle,
|
|
2839
|
+
imageComposeBidRowsCell,
|
|
2840
|
+
imageComposeBidRowCards,
|
|
2841
|
+
imageComposeBidPanelClasses,
|
|
2842
|
+
imageComposeBidPillClasses,
|
|
2843
|
+
imageComposeBidCardGridStyle,
|
|
2844
|
+
imageComposeBidCardTileClasses,
|
|
2845
|
+
imageComposeBidCardPillPlacementClasses,
|
|
2846
|
+
imageComposeBidTargetInfoGridStyle,
|
|
2847
|
+
imageComposeBidInfoTilePlacementStyle,
|
|
2848
|
+
imageComposeBidInfoTileClasses,
|
|
2849
|
+
imageComposeBidInfoLabelClasses,
|
|
2850
|
+
imageComposeBidInfoValueClasses,
|
|
2851
|
+
imageComposeBidConclusionCard,
|
|
2852
|
+
imageComposeBidConclusionBadge,
|
|
2853
|
+
imageComposeBidConclusionDetail,
|
|
2854
|
+
activeTabFor,
|
|
2855
|
+
tabsFor,
|
|
2856
|
+
orgMetricValues,
|
|
2857
|
+
visualFor,
|
|
2858
|
+
visualForScene,
|
|
2859
|
+
rowGrid,
|
|
2860
|
+
tableColumnsFromRows,
|
|
2861
|
+
tableRowCells,
|
|
2862
|
+
metricSummaryDisplayValue,
|
|
2863
|
+
metricSummaryUnitLabel,
|
|
2864
|
+
imageComposeMetricSubText,
|
|
2865
|
+
imageComposeMetricFooterStatus,
|
|
2866
|
+
imageComposeMetricFooterMain,
|
|
2867
|
+
imageComposeMetricFooterStatusClass,
|
|
2868
|
+
imageComposeMetricStatusDotClass,
|
|
2869
|
+
chartRendererKey,
|
|
2870
|
+
manualReplacementView,
|
|
2871
|
+
manualReplacementCapabilityOptions,
|
|
2872
|
+
suggestedManualReplacementCapabilityId,
|
|
2873
|
+
suggestedManualReplacementKind,
|
|
2874
|
+
manualReplacementOptionMatchesKind,
|
|
2875
|
+
sortManualReplacementCapabilityOptions,
|
|
2876
|
+
manualReplacementCapabilityOptionsForBlock,
|
|
2877
|
+
manualReplacementCapabilityDraft,
|
|
2878
|
+
setManualReplacementCapabilityDraft,
|
|
2879
|
+
replaceManualPlaceholder,
|
|
2880
|
+
nestedBlockDataSummary,
|
|
2881
|
+
nestedBlockSummaryEntry,
|
|
2882
|
+
nestedBlockRendererKey,
|
|
2883
|
+
nestedBlockComposeSource,
|
|
2884
|
+
nestedBlockStyle,
|
|
2885
|
+
customCanvasVisibleNestedBlocks,
|
|
2886
|
+
customCanvasUsesAbsoluteNestedBlocks,
|
|
2887
|
+
customCanvasAbsoluteNestedLayoutLooksSafe,
|
|
2888
|
+
customCanvasNestedBlockContainerClasses,
|
|
2889
|
+
customCanvasUsesStackNestedBlocks,
|
|
2890
|
+
customCanvasNestedLayoutStacks,
|
|
2891
|
+
customCanvasNestedBlockGroups,
|
|
2892
|
+
customCanvasDenseNestedStack,
|
|
2893
|
+
customCanvasUsesNaturalNestedGrid,
|
|
2894
|
+
customCanvasShouldFillNaturalNestedGrid,
|
|
2895
|
+
customCanvasUsesReferenceCompositePreview,
|
|
2896
|
+
customCanvasReferenceCompositeKind,
|
|
2897
|
+
referenceCompositeSearchText,
|
|
2898
|
+
referenceCompositeKindAllowedForBlock,
|
|
2899
|
+
referenceCompositeKindRequiresItContext,
|
|
2900
|
+
referenceCompositeKindRequiresChairmanRiskContext,
|
|
2901
|
+
referenceCompositeKindRequiresHrContext,
|
|
2902
|
+
referenceCompositeLooksLikeItContext,
|
|
2903
|
+
referenceCompositeTextHasItContext,
|
|
2904
|
+
referenceCompositeLooksLikeChairmanRiskContext,
|
|
2905
|
+
referenceCompositeLooksLikeChairmanRiskDirectContext,
|
|
2906
|
+
referenceCompositeTextHasChairmanRiskContext,
|
|
2907
|
+
referenceCompositeLooksLikeHrContext,
|
|
2908
|
+
customCanvasTextHasBusinessMetricMatrixContext,
|
|
2909
|
+
customCanvasTextLooksLikeHrOrOrgRiskContext,
|
|
2910
|
+
referenceCompositeHeaderChip,
|
|
2911
|
+
customCanvasLooksLikeBusinessMetricMatrix,
|
|
2912
|
+
customCanvasLooksLikePageHeader,
|
|
2913
|
+
customCanvasPageHeaderBlock,
|
|
2914
|
+
customCanvasEmptyImagePlaceholder,
|
|
2915
|
+
customCanvasAlertLeafContainer,
|
|
2916
|
+
customCanvasAlertLeafItems,
|
|
2917
|
+
customCanvasAlertLeafFilledItems,
|
|
2918
|
+
customCanvasAlertLeafFallbackItems,
|
|
2919
|
+
customCanvasHeaderTitle,
|
|
2920
|
+
customCanvasHeaderSubtitle,
|
|
2921
|
+
customCanvasHeaderLogo,
|
|
2922
|
+
customCanvasHeaderLogoStyle,
|
|
2923
|
+
customCanvasPageHeaderDark,
|
|
2924
|
+
customCanvasPageHeaderStyle,
|
|
2925
|
+
customCanvasPageHeaderTextClass,
|
|
2926
|
+
customCanvasTextElementValue,
|
|
2927
|
+
customCanvasHeaderRepeatingElement,
|
|
2928
|
+
customCanvasHeaderPills,
|
|
2929
|
+
customCanvasHeaderPillsWithFallback,
|
|
2930
|
+
referenceCompositeKindFromContainerTitle,
|
|
2931
|
+
referenceCompositeDiagnosticStyle,
|
|
2932
|
+
referenceCompositeDiagnosticIndex,
|
|
2933
|
+
referenceProjectDiagnosticIndex,
|
|
2934
|
+
referenceNestedBlock,
|
|
2935
|
+
referenceMetricItem,
|
|
2936
|
+
referenceNestedMetricItem,
|
|
2937
|
+
referenceRiskMetricValue,
|
|
2938
|
+
referenceRiskKpiValue,
|
|
2939
|
+
referenceRiskKpiItems,
|
|
2940
|
+
referenceRiskMovementItems,
|
|
2941
|
+
referenceRiskMovementElementItems,
|
|
2942
|
+
referenceOpsServiceItems,
|
|
2943
|
+
referenceOpsResourceItems,
|
|
2944
|
+
referenceOpsIncidentItems,
|
|
2945
|
+
referenceOpsItemsFromBlock,
|
|
2946
|
+
referenceOpsTrendItems,
|
|
2947
|
+
referenceSecurityScoreBlock,
|
|
2948
|
+
referenceSecurityRiskItems,
|
|
2949
|
+
referenceSecurityAuditItems,
|
|
2950
|
+
referenceSecurityAccountItems,
|
|
2951
|
+
referenceSecurityComplianceItems,
|
|
2952
|
+
referenceAssetLedgerItems,
|
|
2953
|
+
referenceAssetExceptionItems,
|
|
2954
|
+
referenceCostItems,
|
|
2955
|
+
referenceCostDonutItems,
|
|
2956
|
+
referenceCostDonutStyle,
|
|
2957
|
+
referenceProjectProgressItems,
|
|
2958
|
+
referenceTodoItems,
|
|
2959
|
+
referenceEfficiencyItems,
|
|
2960
|
+
referenceUsableQuickLinkItems,
|
|
2961
|
+
referenceQuickLinkItems,
|
|
2962
|
+
referenceBusinessMetricItems,
|
|
2963
|
+
referenceBusinessChartItems,
|
|
2964
|
+
referenceBusinessListItems,
|
|
2965
|
+
referenceBidHero,
|
|
2966
|
+
referenceBidQuickActions,
|
|
2967
|
+
referenceBidKpiItems,
|
|
2968
|
+
referenceBidInfoItems,
|
|
2969
|
+
referenceBidTableBlocks,
|
|
2970
|
+
referenceBidRiskRows,
|
|
2971
|
+
referenceBidConclusionItems,
|
|
2972
|
+
referenceBidDataBoundaryItems,
|
|
2973
|
+
referenceBidSanitizedMetricValue,
|
|
2974
|
+
referenceUsableNoticeItems,
|
|
2975
|
+
referenceNoticeItems,
|
|
2976
|
+
referenceHealthRadarAxisItems,
|
|
2977
|
+
referenceHealthRadarRiskItems,
|
|
2978
|
+
referenceHealthRadarPoints,
|
|
2979
|
+
referenceDeviationBars,
|
|
2980
|
+
referenceDeviationRiskItems,
|
|
2981
|
+
referenceFinanceRiskMetricItems,
|
|
2982
|
+
referenceFinanceWarningItems,
|
|
2983
|
+
referenceFinanceRiskBottomItems,
|
|
2984
|
+
referenceFinanceRiskMetricDisplayValue,
|
|
2985
|
+
referenceHrOrganizationMetrics,
|
|
2986
|
+
referenceHrOrganizationRows,
|
|
2987
|
+
referenceHrRiskRows,
|
|
2988
|
+
referenceHrPeopleCostItems,
|
|
2989
|
+
referenceHrCostTrendItems,
|
|
2990
|
+
referenceHrTalentMetrics,
|
|
2991
|
+
referenceHrTalentTodoRows,
|
|
2992
|
+
referenceExpenseRiskRows,
|
|
2993
|
+
referenceExpenseSummaryItems,
|
|
2994
|
+
referenceDeviationInsightItems,
|
|
2995
|
+
referenceOrganizationRiskMetrics,
|
|
2996
|
+
referenceOrganizationDonutStyle,
|
|
2997
|
+
referenceInvestmentRiskRows,
|
|
2998
|
+
referenceInvestmentSummaryItems,
|
|
2999
|
+
referenceExecutiveTodoItems,
|
|
3000
|
+
referenceExecutiveTodoNormalizeRow,
|
|
3001
|
+
referenceExecutiveTodoPadRows,
|
|
3002
|
+
referenceExecutiveTodoBlockLooksUsable,
|
|
3003
|
+
referenceExecutiveTodoBadge,
|
|
3004
|
+
referenceExecutiveTodoBadgeClasses,
|
|
3005
|
+
referenceExecutiveTodoImpact,
|
|
3006
|
+
referenceExecutiveTodoDeadline,
|
|
3007
|
+
referenceExecutiveTodoProgress,
|
|
3008
|
+
referenceShortcutDrillItems,
|
|
3009
|
+
referenceQuickWorkbenchGroups,
|
|
3010
|
+
referenceQuickWorkbenchGroupItems,
|
|
3011
|
+
referenceCustomCanvasElementRows,
|
|
3012
|
+
referenceQuickWorkbenchUrgentBadge,
|
|
3013
|
+
referenceStrategyKpiMetrics,
|
|
3014
|
+
referenceOperationEfficiencyGroups,
|
|
3015
|
+
referenceOperationEfficiencyPanelStyle,
|
|
3016
|
+
referenceOperationHealthProgressItems,
|
|
3017
|
+
referenceOperationHealthTrendItems,
|
|
3018
|
+
referenceOperationHealthStructureBlock,
|
|
3019
|
+
referenceOperationHealthStructureItems,
|
|
3020
|
+
referenceOperationEfficiencyGroupItems,
|
|
3021
|
+
referenceStrategyKpiMetricItem,
|
|
3022
|
+
referenceStrategyKpiTrendPath,
|
|
3023
|
+
referenceStrategyKpiRiskItems,
|
|
3024
|
+
referenceStrategyKpiRiskSummaryLabel,
|
|
3025
|
+
referenceStrategyKpiRiskItemsGridStyle,
|
|
3026
|
+
customCanvasNestedStackContainerStyle,
|
|
3027
|
+
customCanvasNestedStackColumnWeights,
|
|
3028
|
+
customCanvasReadableNestedStackColumnWeights,
|
|
3029
|
+
nestedBlockCanvasStyle,
|
|
3030
|
+
nestedBlockStackTailPlacementStyle,
|
|
3031
|
+
nestedBlockGridPlacementStyle,
|
|
3032
|
+
nestedBlockStackGridStyle,
|
|
3033
|
+
customCanvasNestedLayoutItem,
|
|
3034
|
+
customCanvasRegularNestedStackGrid,
|
|
3035
|
+
nestedBlockHasLayout,
|
|
3036
|
+
customCanvasAbsoluteNestedBox,
|
|
3037
|
+
customCanvasAbsoluteNestedOverlapArea,
|
|
3038
|
+
layoutPercent,
|
|
3039
|
+
nestedBlockUsesGlobalCoordinates,
|
|
3040
|
+
nestedBlockLocalCoordinate,
|
|
3041
|
+
nestedBlockAbsoluteStyle,
|
|
3042
|
+
nestedBlockAccentStyle,
|
|
3043
|
+
customCanvasPercent,
|
|
3044
|
+
customCanvasSafeElementStyle,
|
|
3045
|
+
customCanvasElementStyle,
|
|
3046
|
+
customCanvasElementClasses,
|
|
3047
|
+
customCanvasStyle,
|
|
3048
|
+
customCanvasShellClasses,
|
|
3049
|
+
nestedBlockShellClasses,
|
|
3050
|
+
manualReplacementContainerStyle,
|
|
3051
|
+
manualReplacementShellClasses,
|
|
3052
|
+
manualReplacementCompactView,
|
|
3053
|
+
manualReplacementCapabilityDraftLabel,
|
|
3054
|
+
manualReplacementActionLabel,
|
|
3055
|
+
manualReplacementPrimaryActionLabel,
|
|
3056
|
+
dataBindingRecord,
|
|
3057
|
+
dataBindingFailureReason,
|
|
3058
|
+
dataBindingFailureQueryIntent,
|
|
3059
|
+
dataBindingHumanInterventionFromRecord,
|
|
3060
|
+
dataBindingNeedsHumanIntervention,
|
|
3061
|
+
nestedBlockNeedsHumanIntervention,
|
|
3062
|
+
referenceItemNestedBlock,
|
|
3063
|
+
referenceItemNestedCardAttrs,
|
|
3064
|
+
referenceItemNestedRoleLabel,
|
|
3065
|
+
focusReferenceNestedItem,
|
|
3066
|
+
isImageComposeSourceValue,
|
|
3067
|
+
recordHasImageComposeSource,
|
|
3068
|
+
dataBindingHasRenderableSnapshot,
|
|
3069
|
+
nestedBlockDataSnapshotRenderable,
|
|
3070
|
+
imageComposeCompactCard,
|
|
3071
|
+
imageComposeBusinessGapBadgeLabel,
|
|
3072
|
+
customCanvasShowsStructureLabels,
|
|
3073
|
+
customCanvasHeaderBannerBlock,
|
|
3074
|
+
customCanvasEmptyPageHeaderPlaceholder,
|
|
3075
|
+
customCanvasGeneratedElement,
|
|
3076
|
+
customCanvasVisibleElements,
|
|
3077
|
+
customCanvasHasNestedBlocks,
|
|
3078
|
+
customCanvasElementHasPosition,
|
|
3079
|
+
customCanvasUsesAbsoluteElements,
|
|
3080
|
+
customCanvasOverlaysVisibleElements,
|
|
3081
|
+
customCanvasGeneratedNarrative,
|
|
3082
|
+
customCanvasVisibleNarrative,
|
|
3083
|
+
customCanvasStandaloneQuickLinks,
|
|
3084
|
+
customCanvasStandaloneQuickLinkItems,
|
|
3085
|
+
dataBindingFailureRegistryLabel,
|
|
3086
|
+
dataBindingFailureRendererLabel,
|
|
3087
|
+
dataBindingFailureView,
|
|
3088
|
+
metricSummaryShowsPrimaryLabel,
|
|
3089
|
+
metricSummaryValueClass,
|
|
3090
|
+
imageComposeLayoutBasisHeight,
|
|
3091
|
+
imageComposeLayoutBasisWidth,
|
|
3092
|
+
businessMetricMatrixLargePanel,
|
|
3093
|
+
imageComposeMetricSummaryCardClasses,
|
|
3094
|
+
imageComposeMetricSummaryCardStyle,
|
|
3095
|
+
imageComposeMetricTitleClass,
|
|
3096
|
+
imageComposeMetricValueRowClass,
|
|
3097
|
+
imageComposeMetricValueClass,
|
|
3098
|
+
imageComposeMetricValueStyle,
|
|
3099
|
+
imageComposeMetricUnitClass,
|
|
3100
|
+
imageComposeMetricFooterVisible,
|
|
3101
|
+
metricSummaryShowsChrome,
|
|
3102
|
+
metricSummaryShowsComparisonBadge,
|
|
3103
|
+
imageComposeMetricLeadingVisualKind,
|
|
3104
|
+
imageComposeChartPreviewKind,
|
|
3105
|
+
imageComposeChartPreviewLabel,
|
|
3106
|
+
imageComposeChartPreviewMetric,
|
|
3107
|
+
imageComposeChartPreviewStatus,
|
|
3108
|
+
imageComposeChartPreviewHeader,
|
|
3109
|
+
imageComposeChartPreviewBars,
|
|
3110
|
+
imageComposeChartPreviewDonutStyle,
|
|
3111
|
+
imageComposeRankingPreviewItems,
|
|
3112
|
+
imageComposeRankingPreviewLabel,
|
|
3113
|
+
imageComposeRankingPreviewDetail,
|
|
3114
|
+
imageComposeRankingPreviewValue,
|
|
3115
|
+
imageComposeRankingPreviewAvatar,
|
|
3116
|
+
imageComposeRankingPreviewAvatarClass,
|
|
3117
|
+
imageComposeRankingPreviewValueClass,
|
|
3118
|
+
imageComposeAlertRankingCard,
|
|
3119
|
+
imageComposeAlertRankingItems,
|
|
3120
|
+
imageComposeAlertRankingSeverity,
|
|
3121
|
+
imageComposeAlertRankingTitle,
|
|
3122
|
+
imageComposeAlertRankingTime,
|
|
3123
|
+
imageComposeAlertSeverityClasses,
|
|
3124
|
+
nestedBlockMetricValue,
|
|
3125
|
+
nestedBlockClassifierText,
|
|
3126
|
+
nestedBlockDeclaredVisualKind,
|
|
3127
|
+
nestedBlockVisualKind,
|
|
3128
|
+
nestedBlockItemRecords,
|
|
3129
|
+
nestedBlockItemEmpty,
|
|
3130
|
+
nestedBlockItemLooksWeak,
|
|
3131
|
+
nestedBlockItemsLookTooWeak,
|
|
3132
|
+
nestedBlockItemsLookTooWeakForVisualKind,
|
|
3133
|
+
nestedBlockRawItems,
|
|
3134
|
+
nestedBlockElementItems,
|
|
3135
|
+
nestedBlockToneFromStatus,
|
|
3136
|
+
nestedBlockToneFromProgress,
|
|
3137
|
+
nestedBlockFallbackDomain,
|
|
3138
|
+
nestedBlockFallbackClassifierText,
|
|
3139
|
+
nestedBlockFallbackItems,
|
|
3140
|
+
nestedBlockItems,
|
|
3141
|
+
nestedBlockBarItems,
|
|
3142
|
+
nestedBlockTileItems,
|
|
3143
|
+
nestedBlockDisplayValue,
|
|
3144
|
+
nestedBlockItemLabel,
|
|
3145
|
+
nestedBlockItemValue,
|
|
3146
|
+
nestedBlockItemDetail,
|
|
3147
|
+
nestedBlockItemTitle,
|
|
3148
|
+
nestedBlockItemSeverity,
|
|
3149
|
+
nestedBlockItemTime,
|
|
3150
|
+
nestedBlockNumber,
|
|
3151
|
+
nestedBlockPercent,
|
|
3152
|
+
nestedBlockItemProgress,
|
|
3153
|
+
nestedBlockOptionalNumber,
|
|
3154
|
+
referenceOpsTrendCount,
|
|
3155
|
+
referenceOpsTrendBarHeight,
|
|
3156
|
+
referenceOpsTrendChartItems,
|
|
3157
|
+
nestedBlockTone,
|
|
3158
|
+
nestedBlockToneClass,
|
|
3159
|
+
customCanvasRiskSummaryBand,
|
|
3160
|
+
customCanvasEffectiveVisual,
|
|
3161
|
+
nestedBlockStatusSummary,
|
|
3162
|
+
nestedBlockStatusSummaryLabel,
|
|
3163
|
+
nestedBlockPillClasses,
|
|
3164
|
+
nestedBlockDotClasses,
|
|
3165
|
+
nestedBlockBarClasses,
|
|
3166
|
+
referenceOpsTrendBarClasses,
|
|
3167
|
+
nestedBlockBarStyle,
|
|
3168
|
+
nestedBlockProgressStage,
|
|
3169
|
+
nestedBlockSecurityScore,
|
|
3170
|
+
nestedBlockSecurityScoreRingLabel,
|
|
3171
|
+
nestedBlockSecurityMetrics,
|
|
3172
|
+
nestedBlockDonutItems,
|
|
3173
|
+
nestedBlockDonutStyle,
|
|
3174
|
+
nestedBlockQuickIconLabel,
|
|
3175
|
+
nestedBlockQuickLinksGridStyle,
|
|
3176
|
+
nestedBlockRows,
|
|
3177
|
+
nestedBlockColumns,
|
|
3178
|
+
nestedBlockRankingItems,
|
|
3179
|
+
nestedBlockCell,
|
|
3180
|
+
nestedBlockPreviewKind,
|
|
3181
|
+
nestedBlockCompactPreview,
|
|
3182
|
+
nestedBlockGridMinHeightClass,
|
|
3183
|
+
nestedBlockStatusLabel,
|
|
3184
|
+
nestedBlockEmptyImageContainer,
|
|
3185
|
+
nestedBlockFailureReason,
|
|
3186
|
+
nestedBlockBusinessGapReason,
|
|
3187
|
+
nestedBlockQueryIntent,
|
|
3188
|
+
nestedBlockFocusTitle,
|
|
3189
|
+
focusNestedBlock,
|
|
3190
|
+
fdeCustomComponentRenderState,
|
|
3191
|
+
};
|
|
3192
|
+
}
|