@nocobase/flow-engine 2.0.0-alpha.7 → 2.0.0-alpha.71
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/lib/BlockScopedFlowEngine.d.ts +23 -0
- package/lib/BlockScopedFlowEngine.js +91 -0
- package/lib/FlowContextProvider.d.ts +2 -2
- package/lib/FlowContextProvider.js +3 -3
- package/lib/FlowDefinition.d.ts +6 -4
- package/lib/JSRunner.d.ts +6 -0
- package/lib/JSRunner.js +27 -1
- package/lib/ViewScopedFlowEngine.d.ts +1 -1
- package/lib/ViewScopedFlowEngine.js +18 -1
- package/lib/acl/Acl.d.ts +12 -12
- package/lib/acl/Acl.js +88 -30
- package/lib/components/DynamicFlowsEditor.js +2 -4
- package/lib/components/FieldModelRenderer.js +17 -9
- package/lib/components/FieldSkeleton.d.ts +10 -0
- package/lib/components/FieldSkeleton.js +64 -0
- package/lib/components/FlowContextSelector.js +19 -3
- package/lib/components/FlowModelRenderer.d.ts +4 -6
- package/lib/components/FlowModelRenderer.js +35 -53
- package/lib/components/FormItem.js +5 -1
- package/lib/components/MobilePopup.d.ts +20 -0
- package/lib/components/MobilePopup.js +102 -0
- package/lib/components/MobilePopup.style.d.ts +17 -0
- package/lib/components/MobilePopup.style.js +186 -0
- package/lib/components/common/withFlowDesignMode.d.ts +1 -1
- package/lib/components/common/withFlowDesignMode.js +5 -5
- package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
- package/lib/components/dnd/gridDragPlanner.js +53 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +3 -1
- package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
- package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
- package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
- package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
- package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
- package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
- package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
- package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
- package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
- package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
- package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
- package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
- package/lib/components/subModel/AddSubModelButton.js +78 -8
- package/lib/components/subModel/LazyDropdown.js +14 -15
- package/lib/components/subModel/utils.d.ts +1 -1
- package/lib/components/subModel/utils.js +21 -11
- package/lib/components/variables/VariableInput.js +26 -6
- package/lib/components/variables/VariableTag.js +43 -2
- package/lib/components/variables/types.d.ts +2 -0
- package/lib/components/variables/utils.js +4 -2
- package/lib/data-source/index.d.ts +23 -4
- package/lib/data-source/index.js +135 -14
- package/lib/data-source/jioToJoiSchema.js +1 -0
- package/lib/emitter.d.ts +6 -0
- package/lib/emitter.js +12 -0
- package/lib/executor/FlowExecutor.d.ts +6 -6
- package/lib/executor/FlowExecutor.js +302 -99
- package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
- package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
- package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
- package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
- package/lib/flowContext.d.ts +105 -6
- package/lib/flowContext.js +447 -139
- package/lib/flowEngine.d.ts +71 -1
- package/lib/flowEngine.js +319 -16
- package/lib/flowSettings.d.ts +4 -3
- package/lib/flowSettings.js +45 -21
- package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
- package/lib/hooks/useApplyAutoFlows.js +3 -2
- package/lib/index.d.ts +14 -3
- package/lib/index.js +54 -7
- package/lib/locale/de-DE.json +62 -0
- package/lib/locale/en-US.json +57 -45
- package/lib/locale/es-ES.json +62 -0
- package/lib/locale/fr-FR.json +62 -0
- package/lib/locale/hu-HU.json +62 -0
- package/lib/locale/id-ID.json +62 -0
- package/lib/locale/index.d.ts +114 -90
- package/lib/locale/it-IT.json +62 -0
- package/lib/locale/ja-JP.json +62 -0
- package/lib/locale/ko-KR.json +62 -0
- package/lib/locale/nl-NL.json +62 -0
- package/lib/locale/pt-BR.json +62 -0
- package/lib/locale/ru-RU.json +62 -0
- package/lib/locale/tr-TR.json +62 -0
- package/lib/locale/uk-UA.json +62 -0
- package/lib/locale/vi-VN.json +62 -0
- package/lib/locale/zh-CN.json +58 -46
- package/lib/locale/zh-TW.json +62 -0
- package/lib/models/CollectionFieldModel.d.ts +7 -2
- package/lib/models/CollectionFieldModel.js +63 -16
- package/lib/models/flowModel.d.ts +76 -32
- package/lib/models/flowModel.js +300 -112
- package/lib/models/forkFlowModel.d.ts +8 -4
- package/lib/models/forkFlowModel.js +38 -8
- package/lib/provider.d.ts +3 -1
- package/lib/provider.js +14 -11
- package/lib/reactive/index.d.ts +10 -0
- package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
- package/lib/reactive/observer.d.ts +19 -0
- package/lib/reactive/observer.js +109 -0
- package/lib/resources/baseRecordResource.d.ts +6 -0
- package/lib/resources/baseRecordResource.js +38 -3
- package/lib/resources/multiRecordResource.d.ts +5 -2
- package/lib/resources/multiRecordResource.js +26 -10
- package/lib/resources/singleRecordResource.js +8 -3
- package/lib/resources/sqlResource.d.ts +5 -3
- package/lib/resources/sqlResource.js +30 -28
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
- package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
- package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
- package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
- package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
- package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
- package/lib/runjs-context/contexts/base.d.ts +9 -0
- package/lib/runjs-context/contexts/base.js +879 -0
- package/lib/runjs-context/contributions.d.ts +33 -0
- package/lib/runjs-context/contributions.js +88 -0
- package/lib/runjs-context/helpers.d.ts +5 -2
- package/lib/runjs-context/helpers.js +36 -27
- package/lib/runjs-context/registry.d.ts +7 -4
- package/lib/runjs-context/registry.js +10 -42
- package/lib/runjs-context/setup.d.ts +9 -0
- package/lib/runjs-context/setup.js +88 -0
- package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
- package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
- package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
- package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
- package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
- package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
- package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
- package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
- package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
- package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
- package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
- package/lib/runjs-context/snippets/index.d.ts +24 -3
- package/lib/runjs-context/snippets/index.js +183 -40
- package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
- package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
- package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
- package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
- package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
- package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
- package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
- package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
- package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
- package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
- package/lib/runjs-context/snippets/types.d.ts +9 -1
- package/lib/runjsLibs.d.ts +28 -0
- package/lib/runjsLibs.js +532 -0
- package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
- package/lib/scheduler/ModelOperationScheduler.js +262 -0
- package/lib/types.d.ts +66 -7
- package/lib/types.js +4 -3
- package/lib/utils/associationObjectVariable.d.ts +32 -0
- package/lib/utils/associationObjectVariable.js +157 -0
- package/lib/utils/createCollectionContextMeta.d.ts +1 -1
- package/lib/utils/createCollectionContextMeta.js +9 -4
- package/lib/utils/createEphemeralContext.d.ts +13 -0
- package/lib/utils/createEphemeralContext.js +140 -0
- package/lib/utils/flows.d.ts +10 -0
- package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
- package/lib/utils/index.d.ts +9 -3
- package/lib/utils/index.js +30 -2
- package/lib/utils/jsxTransform.d.ts +15 -0
- package/lib/utils/jsxTransform.js +68 -0
- package/lib/utils/params-resolvers.js +19 -12
- package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
- package/lib/utils/parsePathnameToViewParams.js +41 -5
- package/lib/utils/pruneFilter.d.ts +21 -0
- package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
- package/lib/utils/resolveModuleUrl.d.ts +58 -0
- package/lib/utils/resolveModuleUrl.js +65 -0
- package/lib/utils/runjsModuleLoader.d.ts +58 -0
- package/lib/utils/runjsModuleLoader.js +422 -0
- package/lib/utils/runjsTemplateCompat.d.ts +35 -0
- package/lib/utils/runjsTemplateCompat.js +743 -0
- package/lib/utils/safeGlobals.d.ts +6 -8
- package/lib/utils/safeGlobals.js +169 -14
- package/lib/utils/schema-utils.d.ts +6 -0
- package/lib/utils/schema-utils.js +71 -6
- package/lib/utils/serverContextParams.d.ts +4 -0
- package/lib/utils/serverContextParams.js +2 -0
- package/lib/utils/translation.d.ts +4 -1
- package/lib/utils/translation.js +6 -2
- package/lib/utils/variablesParams.d.ts +22 -5
- package/lib/utils/variablesParams.js +141 -61
- package/lib/views/DialogComponent.js +1 -5
- package/lib/views/DrawerComponent.js +18 -9
- package/lib/views/PageComponent.js +5 -5
- package/lib/views/ViewNavigation.d.ts +11 -15
- package/lib/views/ViewNavigation.js +37 -19
- package/lib/views/createViewMeta.d.ts +27 -5
- package/lib/views/createViewMeta.js +338 -72
- package/lib/views/index.d.ts +1 -1
- package/lib/views/index.js +4 -0
- package/lib/views/useDialog.d.ts +10 -9
- package/lib/views/useDialog.js +46 -34
- package/lib/views/useDrawer.d.ts +10 -9
- package/lib/views/useDrawer.js +74 -48
- package/lib/views/usePage.d.ts +14 -9
- package/lib/views/usePage.js +82 -33
- package/lib/views/usePopover.js +4 -1
- package/lib/views/viewEvents.d.ts +17 -0
- package/lib/views/viewEvents.js +90 -0
- package/package.json +6 -3
- package/src/BlockScopedFlowEngine.ts +85 -0
- package/src/FlowContextProvider.tsx +4 -2
- package/src/JSRunner.ts +39 -1
- package/src/ViewScopedFlowEngine.ts +21 -1
- package/src/__tests__/JSRunner.test.ts +125 -52
- package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
- package/src/__tests__/createViewMeta.popup.test.ts +203 -0
- package/src/__tests__/flow-engine.test.ts +3 -0
- package/src/__tests__/flowContext.test.ts +160 -0
- package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
- package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
- package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
- package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
- package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
- package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
- package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
- package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
- package/src/__tests__/flowSettings.open.test.tsx +71 -15
- package/src/__tests__/flowSettings.test.ts +2 -0
- package/src/__tests__/globalFlowRegistry.test.ts +1 -1
- package/src/__tests__/modelOperationScheduler.test.ts +346 -0
- package/src/__tests__/objectVariable.test.ts +464 -0
- package/src/__tests__/provider.test.tsx +0 -5
- package/src/__tests__/runjsContext.test.ts +219 -35
- package/src/__tests__/runjsContextImplementations.test.ts +217 -0
- package/src/__tests__/runjsContextRuntime.test.ts +269 -0
- package/src/__tests__/runjsEdgeCases.test.ts +281 -0
- package/src/__tests__/runjsExternalLibs.test.ts +242 -0
- package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
- package/src/__tests__/runjsLocales.test.ts +39 -0
- package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
- package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
- package/src/__tests__/runjsSnippets.test.ts +140 -0
- package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
- package/src/acl/Acl.tsx +85 -31
- package/src/acl/__tests__/Acl.test.tsx +43 -1
- package/src/components/DynamicFlowsEditor.tsx +0 -10
- package/src/components/FieldModelRenderer.tsx +22 -9
- package/src/components/FieldSkeleton.tsx +27 -0
- package/src/components/FlowContextSelector.tsx +20 -2
- package/src/components/FlowModelRenderer.tsx +52 -84
- package/src/components/FormItem.tsx +8 -1
- package/src/components/MobilePopup.style.ts +220 -0
- package/src/components/MobilePopup.tsx +86 -0
- package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
- package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
- package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
- package/src/components/common/withFlowDesignMode.tsx +5 -5
- package/src/components/dnd/gridDragPlanner.ts +60 -0
- package/src/components/index.ts +1 -0
- package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
- package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
- package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
- package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
- package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
- package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
- package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
- package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
- package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
- package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
- package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
- package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
- package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
- package/src/components/subModel/AddSubModelButton.tsx +104 -9
- package/src/components/subModel/LazyDropdown.tsx +14 -14
- package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
- package/src/components/subModel/__tests__/utils.test.ts +12 -12
- package/src/components/subModel/utils.ts +25 -6
- package/src/components/variables/VariableInput.tsx +32 -6
- package/src/components/variables/VariableTag.tsx +54 -2
- package/src/components/variables/types.ts +2 -0
- package/src/components/variables/utils.ts +7 -3
- package/src/data-source/index.ts +143 -12
- package/src/data-source/jioToJoiSchema.ts +1 -0
- package/src/emitter.ts +14 -0
- package/src/executor/FlowExecutor.ts +383 -119
- package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
- package/src/executor/__tests__/flowExecutor.test.ts +217 -5
- package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
- package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
- package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
- package/src/flowContext.ts +646 -158
- package/src/flowEngine.ts +385 -14
- package/src/flowSettings.ts +59 -30
- package/src/hooks/useApplyAutoFlows.ts +5 -3
- package/src/index.ts +26 -3
- package/src/locale/de-DE.json +62 -0
- package/src/locale/en-US.json +57 -45
- package/src/locale/es-ES.json +62 -0
- package/src/locale/fr-FR.json +62 -0
- package/src/locale/hu-HU.json +62 -0
- package/src/locale/id-ID.json +62 -0
- package/src/locale/it-IT.json +62 -0
- package/src/locale/ja-JP.json +62 -0
- package/src/locale/ko-KR.json +62 -0
- package/src/locale/nl-NL.json +62 -0
- package/src/locale/pt-BR.json +62 -0
- package/src/locale/ru-RU.json +62 -0
- package/src/locale/tr-TR.json +62 -0
- package/src/locale/uk-UA.json +62 -0
- package/src/locale/vi-VN.json +62 -0
- package/src/locale/zh-CN.json +58 -46
- package/src/locale/zh-TW.json +62 -0
- package/src/models/CollectionFieldModel.tsx +82 -18
- package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
- package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
- package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
- package/src/models/__tests__/flowModel.clone.test.ts +416 -0
- package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
- package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
- package/src/models/__tests__/flowModel.test.ts +296 -119
- package/src/models/__tests__/forkFlowModel.test.ts +40 -7
- package/src/models/flowModel.tsx +426 -148
- package/src/models/forkFlowModel.ts +48 -8
- package/src/provider.tsx +18 -14
- package/src/reactive/__tests__/observer.test.tsx +211 -0
- package/src/reactive/index.ts +11 -0
- package/src/reactive/observer.tsx +101 -0
- package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
- package/src/resources/__tests__/sqlResource.test.ts +60 -0
- package/src/resources/baseRecordResource.ts +46 -3
- package/src/resources/multiRecordResource.ts +28 -12
- package/src/resources/singleRecordResource.ts +9 -3
- package/src/resources/sqlResource.ts +33 -32
- package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
- package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
- package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
- package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
- package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
- package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
- package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
- package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
- package/src/runjs-context/contexts/base.ts +871 -0
- package/src/runjs-context/contributions.ts +88 -0
- package/src/runjs-context/helpers.ts +32 -30
- package/src/runjs-context/registry.ts +16 -47
- package/src/runjs-context/setup.ts +57 -0
- package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
- package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
- package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
- package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
- package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
- package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
- package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
- package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
- package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
- package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
- package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
- package/src/runjs-context/snippets/index.ts +212 -39
- package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
- package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
- package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
- package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
- package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
- package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
- package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
- package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
- package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
- package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
- package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
- package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
- package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
- package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
- package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
- package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
- package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
- package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
- package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
- package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
- package/src/runjs-context/snippets/types.ts +5 -1
- package/src/runjsLibs.ts +622 -0
- package/src/scheduler/ModelOperationScheduler.ts +306 -0
- package/src/types.ts +86 -5
- package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
- package/src/utils/__tests__/flows.test.ts +65 -0
- package/src/utils/__tests__/jsxTransform.test.ts +38 -0
- package/src/utils/__tests__/params-resolvers.test.ts +40 -0
- package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
- package/src/utils/__tests__/pruneFilter.test.ts +38 -0
- package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
- package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
- package/src/utils/__tests__/safeGlobals.test.ts +79 -2
- package/src/utils/__tests__/utils.test.ts +114 -15
- package/src/utils/__tests__/variablesParams.test.ts +120 -0
- package/src/utils/associationObjectVariable.ts +180 -0
- package/src/utils/createCollectionContextMeta.ts +9 -3
- package/src/utils/createEphemeralContext.ts +142 -0
- package/src/utils/flows.ts +23 -0
- package/src/utils/index.ts +17 -3
- package/src/utils/jsxTransform.ts +39 -0
- package/src/utils/params-resolvers.ts +25 -11
- package/src/utils/parsePathnameToViewParams.ts +50 -6
- package/src/utils/pruneFilter.ts +41 -0
- package/src/utils/resolveModuleUrl.ts +91 -0
- package/src/utils/runjsModuleLoader.ts +553 -0
- package/src/utils/runjsTemplateCompat.ts +828 -0
- package/src/utils/safeGlobals.ts +181 -15
- package/src/utils/schema-utils.ts +81 -3
- package/src/utils/serverContextParams.ts +6 -0
- package/src/utils/translation.ts +7 -2
- package/src/utils/variablesParams.ts +164 -72
- package/src/views/DialogComponent.tsx +1 -4
- package/src/views/DrawerComponent.tsx +19 -7
- package/src/views/PageComponent.tsx +3 -5
- package/src/views/ViewNavigation.ts +49 -43
- package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
- package/src/views/__tests__/ViewNavigation.test.ts +54 -34
- package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
- package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
- package/src/views/createViewMeta.ts +402 -73
- package/src/views/index.tsx +1 -1
- package/src/views/useDialog.tsx +52 -31
- package/src/views/useDrawer.tsx +99 -55
- package/src/views/usePage.tsx +101 -33
- package/src/views/usePopover.tsx +4 -1
- package/src/views/viewEvents.ts +55 -0
- package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
- package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
- package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
- package/lib/runjs-context/index.d.ts +0 -19
- package/lib/runjs-context/index.js +0 -57
- package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
- package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
- package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
- package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
- package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
- package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
- package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
- package/src/runjs-context/index.ts +0 -20
- package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
- package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
- package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
- package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
- package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
- package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
- package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
- package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
- package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
- package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
- package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
- package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
- package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
- package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
- package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
- /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
11
|
+
import { FlowRunJSContext } from '../flowContext';
|
|
12
|
+
|
|
13
|
+
describe('FlowRunJSContext.define() and getDoc() deep tests', () => {
|
|
14
|
+
// Create test classes for inheritance testing
|
|
15
|
+
class TestBaseContext extends FlowRunJSContext {}
|
|
16
|
+
class TestChildContext extends TestBaseContext {}
|
|
17
|
+
class TestGrandchildContext extends TestChildContext {}
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
// Clear all caches to ensure clean state for each test
|
|
21
|
+
// @ts-ignore - accessing private WeakMap for testing
|
|
22
|
+
const cache = (FlowRunJSContext as any).__runjsDocCache;
|
|
23
|
+
if (cache) {
|
|
24
|
+
// WeakMaps can't be cleared directly, but we can create new test classes
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe('Deep merging', () => {
|
|
29
|
+
it('should deep merge nested object properties', () => {
|
|
30
|
+
class MergeTestContext extends FlowRunJSContext {}
|
|
31
|
+
|
|
32
|
+
MergeTestContext.define({
|
|
33
|
+
properties: {
|
|
34
|
+
api: {
|
|
35
|
+
description: 'API client',
|
|
36
|
+
properties: {
|
|
37
|
+
request: { description: 'Request method' },
|
|
38
|
+
auth: { description: 'Auth info' },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
MergeTestContext.define({
|
|
45
|
+
properties: {
|
|
46
|
+
api: {
|
|
47
|
+
properties: {
|
|
48
|
+
request: { description: 'Updated request method' },
|
|
49
|
+
query: { description: 'Query method' },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const doc = MergeTestContext.getDoc();
|
|
56
|
+
expect(doc.properties?.api).toBeTruthy();
|
|
57
|
+
const apiProp: any = doc.properties?.api;
|
|
58
|
+
expect(apiProp.description).toBe('API client');
|
|
59
|
+
expect(apiProp.properties?.request?.description).toBe('Updated request method');
|
|
60
|
+
expect(apiProp.properties?.query?.description).toBe('Query method');
|
|
61
|
+
expect(apiProp.properties?.auth?.description).toBe('Auth info');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should deep merge method documentation', () => {
|
|
65
|
+
class MethodMergeContext extends FlowRunJSContext {}
|
|
66
|
+
|
|
67
|
+
MethodMergeContext.define({
|
|
68
|
+
methods: {
|
|
69
|
+
runAction: {
|
|
70
|
+
description: 'Run an action',
|
|
71
|
+
completion: { insertText: 'ctx.runAction()' },
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
MethodMergeContext.define({
|
|
77
|
+
methods: {
|
|
78
|
+
runAction: {
|
|
79
|
+
description: 'Execute a data action',
|
|
80
|
+
examples: ['ctx.runAction("create", {})'],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const doc = MethodMergeContext.getDoc();
|
|
86
|
+
const method: any = doc.methods?.runAction;
|
|
87
|
+
expect(method?.description).toBe('Execute a data action');
|
|
88
|
+
expect(method?.completion?.insertText).toBe('ctx.runAction()');
|
|
89
|
+
expect(method?.examples).toEqual(['ctx.runAction("create", {})']);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('Null value property deletion', () => {
|
|
94
|
+
it('should remove property when defined with null', () => {
|
|
95
|
+
class NullTestContext extends FlowRunJSContext {}
|
|
96
|
+
|
|
97
|
+
NullTestContext.define({
|
|
98
|
+
properties: {
|
|
99
|
+
foo: 'Foo property',
|
|
100
|
+
bar: 'Bar property',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
NullTestContext.define({
|
|
105
|
+
properties: {
|
|
106
|
+
foo: null as any,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const doc = NullTestContext.getDoc();
|
|
111
|
+
expect(doc.properties?.foo).toBeUndefined();
|
|
112
|
+
expect(doc.properties?.bar).toBe('Bar property');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should remove nested property when defined with null', () => {
|
|
116
|
+
class NestedNullContext extends FlowRunJSContext {}
|
|
117
|
+
|
|
118
|
+
NestedNullContext.define({
|
|
119
|
+
properties: {
|
|
120
|
+
api: {
|
|
121
|
+
description: 'API client',
|
|
122
|
+
properties: {
|
|
123
|
+
request: { description: 'Request' },
|
|
124
|
+
query: { description: 'Query' },
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
NestedNullContext.define({
|
|
131
|
+
properties: {
|
|
132
|
+
api: {
|
|
133
|
+
properties: {
|
|
134
|
+
query: null as any,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const doc = NestedNullContext.getDoc();
|
|
141
|
+
const apiProp: any = doc.properties?.api;
|
|
142
|
+
expect(apiProp.properties?.request?.description).toBe('Request');
|
|
143
|
+
expect(apiProp.properties?.query).toBeUndefined();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should remove method when defined with null', () => {
|
|
147
|
+
class MethodNullContext extends FlowRunJSContext {}
|
|
148
|
+
|
|
149
|
+
MethodNullContext.define({
|
|
150
|
+
methods: {
|
|
151
|
+
foo: 'Foo method',
|
|
152
|
+
bar: 'Bar method',
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
MethodNullContext.define({
|
|
157
|
+
methods: {
|
|
158
|
+
foo: null as any,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const doc = MethodNullContext.getDoc();
|
|
163
|
+
expect(doc.methods?.foo).toBeUndefined();
|
|
164
|
+
expect(doc.methods?.bar).toBe('Bar method');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
describe('Inheritance chain merging', () => {
|
|
169
|
+
it('should merge metadata from parent class', () => {
|
|
170
|
+
class InheritBaseContext extends FlowRunJSContext {}
|
|
171
|
+
class InheritChildContext extends InheritBaseContext {}
|
|
172
|
+
|
|
173
|
+
InheritBaseContext.define({
|
|
174
|
+
label: 'Base Context',
|
|
175
|
+
properties: {
|
|
176
|
+
baseProp: 'Base property',
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
InheritChildContext.define({
|
|
181
|
+
label: 'Child Context',
|
|
182
|
+
properties: {
|
|
183
|
+
childProp: 'Child property',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const doc = InheritChildContext.getDoc();
|
|
188
|
+
expect(doc.label).toBe('Child Context');
|
|
189
|
+
expect(doc.properties?.baseProp).toBe('Base property');
|
|
190
|
+
expect(doc.properties?.childProp).toBe('Child property');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should merge metadata from entire inheritance chain', () => {
|
|
194
|
+
class ChainBase extends FlowRunJSContext {}
|
|
195
|
+
class ChainMiddle extends ChainBase {}
|
|
196
|
+
class ChainLeaf extends ChainMiddle {}
|
|
197
|
+
|
|
198
|
+
ChainBase.define({
|
|
199
|
+
properties: { base: 'base' },
|
|
200
|
+
methods: { baseMethod: 'base method' },
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
ChainMiddle.define({
|
|
204
|
+
properties: { middle: 'middle' },
|
|
205
|
+
methods: { middleMethod: 'middle method' },
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
ChainLeaf.define({
|
|
209
|
+
properties: { leaf: 'leaf' },
|
|
210
|
+
methods: { leafMethod: 'leaf method' },
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
const doc = ChainLeaf.getDoc();
|
|
214
|
+
expect(doc.properties?.base).toBe('base');
|
|
215
|
+
expect(doc.properties?.middle).toBe('middle');
|
|
216
|
+
expect(doc.properties?.leaf).toBe('leaf');
|
|
217
|
+
expect(doc.methods?.baseMethod).toBe('base method');
|
|
218
|
+
expect(doc.methods?.middleMethod).toBe('middle method');
|
|
219
|
+
expect(doc.methods?.leafMethod).toBe('leaf method');
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('should allow child to override parent properties', () => {
|
|
223
|
+
class OverrideBase extends FlowRunJSContext {}
|
|
224
|
+
class OverrideChild extends OverrideBase {}
|
|
225
|
+
|
|
226
|
+
OverrideBase.define({
|
|
227
|
+
properties: {
|
|
228
|
+
shared: 'Base version',
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
OverrideChild.define({
|
|
233
|
+
properties: {
|
|
234
|
+
shared: 'Child version',
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
const doc = OverrideChild.getDoc();
|
|
239
|
+
expect(doc.properties?.shared).toBe('Child version');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('should allow child to remove parent properties with null', () => {
|
|
243
|
+
class RemoveBase extends FlowRunJSContext {}
|
|
244
|
+
class RemoveChild extends RemoveBase {}
|
|
245
|
+
|
|
246
|
+
RemoveBase.define({
|
|
247
|
+
properties: {
|
|
248
|
+
toRemove: 'To be removed',
|
|
249
|
+
toKeep: 'To keep',
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
RemoveChild.define({
|
|
254
|
+
properties: {
|
|
255
|
+
toRemove: null as any,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
const doc = RemoveChild.getDoc();
|
|
260
|
+
expect(doc.properties?.toRemove).toBeUndefined();
|
|
261
|
+
expect(doc.properties?.toKeep).toBe('To keep');
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
describe('Locale-specific metadata', () => {
|
|
266
|
+
it('should support multiple locales', () => {
|
|
267
|
+
class LocaleContext extends FlowRunJSContext {}
|
|
268
|
+
|
|
269
|
+
LocaleContext.define({
|
|
270
|
+
label: 'Default Label',
|
|
271
|
+
properties: { message: 'Default message' },
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
LocaleContext.define(
|
|
275
|
+
{
|
|
276
|
+
label: 'Chinese Label',
|
|
277
|
+
properties: { message: '中文消息' },
|
|
278
|
+
},
|
|
279
|
+
{ locale: 'zh-CN' },
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
LocaleContext.define(
|
|
283
|
+
{
|
|
284
|
+
label: 'Japanese Label',
|
|
285
|
+
properties: { message: '日本語メッセージ' },
|
|
286
|
+
},
|
|
287
|
+
{ locale: 'ja-JP' },
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
const defaultDoc = LocaleContext.getDoc();
|
|
291
|
+
expect(defaultDoc.label).toBe('Default Label');
|
|
292
|
+
expect(defaultDoc.properties?.message).toBe('Default message');
|
|
293
|
+
|
|
294
|
+
const zhDoc = LocaleContext.getDoc('zh-CN');
|
|
295
|
+
expect(zhDoc.label).toBe('Chinese Label');
|
|
296
|
+
expect(zhDoc.properties?.message).toBe('中文消息');
|
|
297
|
+
|
|
298
|
+
const jaDoc = LocaleContext.getDoc('ja-JP');
|
|
299
|
+
expect(jaDoc.label).toBe('Japanese Label');
|
|
300
|
+
expect(jaDoc.properties?.message).toBe('日本語メッセージ');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('should merge locale-specific metadata with default', () => {
|
|
304
|
+
class LocaleMergeContext extends FlowRunJSContext {}
|
|
305
|
+
|
|
306
|
+
LocaleMergeContext.define({
|
|
307
|
+
properties: {
|
|
308
|
+
api: 'API client',
|
|
309
|
+
message: 'Message',
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
LocaleMergeContext.define(
|
|
314
|
+
{
|
|
315
|
+
properties: {
|
|
316
|
+
message: '消息',
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
{ locale: 'zh-CN' },
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
const zhDoc = LocaleMergeContext.getDoc('zh-CN');
|
|
323
|
+
expect(zhDoc.properties?.api).toBe('API client');
|
|
324
|
+
expect(zhDoc.properties?.message).toBe('消息');
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it('should support locale inheritance', () => {
|
|
328
|
+
class LocaleInheritBase extends FlowRunJSContext {}
|
|
329
|
+
class LocaleInheritChild extends LocaleInheritBase {}
|
|
330
|
+
|
|
331
|
+
LocaleInheritBase.define({ properties: { base: 'base' } });
|
|
332
|
+
LocaleInheritBase.define({ properties: { base: '基础' } }, { locale: 'zh-CN' });
|
|
333
|
+
|
|
334
|
+
LocaleInheritChild.define({ properties: { child: 'child' } });
|
|
335
|
+
LocaleInheritChild.define({ properties: { child: '子级' } }, { locale: 'zh-CN' });
|
|
336
|
+
|
|
337
|
+
const zhDoc = LocaleInheritChild.getDoc('zh-CN');
|
|
338
|
+
expect(zhDoc.properties?.base).toBe('基础');
|
|
339
|
+
expect(zhDoc.properties?.child).toBe('子级');
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
describe('Cache behavior', () => {
|
|
344
|
+
it('should cache getDoc results', () => {
|
|
345
|
+
class CacheContext extends FlowRunJSContext {}
|
|
346
|
+
|
|
347
|
+
CacheContext.define({
|
|
348
|
+
properties: { foo: 'bar' },
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const doc1 = CacheContext.getDoc();
|
|
352
|
+
const doc2 = CacheContext.getDoc();
|
|
353
|
+
|
|
354
|
+
// Should return the same cached object
|
|
355
|
+
expect(doc1).toBe(doc2);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it('should invalidate cache when define is called', () => {
|
|
359
|
+
class InvalidateContext extends FlowRunJSContext {}
|
|
360
|
+
|
|
361
|
+
InvalidateContext.define({
|
|
362
|
+
properties: { foo: 'initial' },
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
const doc1 = InvalidateContext.getDoc();
|
|
366
|
+
expect(doc1.properties?.foo).toBe('initial');
|
|
367
|
+
|
|
368
|
+
InvalidateContext.define({
|
|
369
|
+
properties: { foo: 'updated' },
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
const doc2 = InvalidateContext.getDoc();
|
|
373
|
+
expect(doc2.properties?.foo).toBe('updated');
|
|
374
|
+
|
|
375
|
+
// Should be different objects after invalidation
|
|
376
|
+
expect(doc1).not.toBe(doc2);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('should cache different locales separately', () => {
|
|
380
|
+
class LocaleCacheContext extends FlowRunJSContext {}
|
|
381
|
+
|
|
382
|
+
LocaleCacheContext.define({ properties: { msg: 'English' } });
|
|
383
|
+
LocaleCacheContext.define({ properties: { msg: '中文' } }, { locale: 'zh-CN' });
|
|
384
|
+
|
|
385
|
+
const enDoc1 = LocaleCacheContext.getDoc();
|
|
386
|
+
const zhDoc1 = LocaleCacheContext.getDoc('zh-CN');
|
|
387
|
+
const enDoc2 = LocaleCacheContext.getDoc();
|
|
388
|
+
const zhDoc2 = LocaleCacheContext.getDoc('zh-CN');
|
|
389
|
+
|
|
390
|
+
expect(enDoc1).toBe(enDoc2);
|
|
391
|
+
expect(zhDoc1).toBe(zhDoc2);
|
|
392
|
+
expect(enDoc1).not.toBe(zhDoc1);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
describe('Edge cases', () => {
|
|
397
|
+
it('should handle empty define calls', () => {
|
|
398
|
+
class EmptyContext extends FlowRunJSContext {}
|
|
399
|
+
|
|
400
|
+
EmptyContext.define({});
|
|
401
|
+
const doc = EmptyContext.getDoc();
|
|
402
|
+
|
|
403
|
+
expect(doc).toBeTruthy();
|
|
404
|
+
expect(typeof doc).toBe('object');
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('should handle undefined values gracefully', () => {
|
|
408
|
+
class UndefinedContext extends FlowRunJSContext {}
|
|
409
|
+
|
|
410
|
+
UndefinedContext.define({
|
|
411
|
+
properties: {
|
|
412
|
+
foo: undefined as any,
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
const doc = UndefinedContext.getDoc();
|
|
417
|
+
expect(doc.properties?.foo).toBeUndefined();
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it('should handle arrays in properties', () => {
|
|
421
|
+
class ArrayContext extends FlowRunJSContext {}
|
|
422
|
+
|
|
423
|
+
ArrayContext.define({
|
|
424
|
+
properties: {
|
|
425
|
+
examples: ['example1', 'example2'] as any,
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
const doc = ArrayContext.getDoc();
|
|
430
|
+
expect(doc.properties?.examples).toEqual(['example1', 'example2']);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('should not merge arrays, replace them instead', () => {
|
|
434
|
+
class ArrayReplaceContext extends FlowRunJSContext {}
|
|
435
|
+
|
|
436
|
+
ArrayReplaceContext.define({
|
|
437
|
+
properties: {
|
|
438
|
+
items: ['a', 'b'] as any,
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
ArrayReplaceContext.define({
|
|
443
|
+
properties: {
|
|
444
|
+
items: ['c', 'd'] as any,
|
|
445
|
+
},
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
const doc = ArrayReplaceContext.getDoc();
|
|
449
|
+
expect(doc.properties?.items).toEqual(['c', 'd']);
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
describe('Multiple define calls', () => {
|
|
454
|
+
it('should accumulate metadata from multiple define calls', () => {
|
|
455
|
+
class MultiDefineContext extends FlowRunJSContext {}
|
|
456
|
+
|
|
457
|
+
MultiDefineContext.define({
|
|
458
|
+
properties: { prop1: 'value1' },
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
MultiDefineContext.define({
|
|
462
|
+
properties: { prop2: 'value2' },
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
MultiDefineContext.define({
|
|
466
|
+
methods: { method1: 'desc1' },
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
const doc = MultiDefineContext.getDoc();
|
|
470
|
+
expect(doc.properties?.prop1).toBe('value1');
|
|
471
|
+
expect(doc.properties?.prop2).toBe('value2');
|
|
472
|
+
expect(doc.methods?.method1).toBe('desc1');
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('should allow incremental updates to nested structures', () => {
|
|
476
|
+
class IncrementalContext extends FlowRunJSContext {}
|
|
477
|
+
|
|
478
|
+
IncrementalContext.define({
|
|
479
|
+
properties: {
|
|
480
|
+
api: {
|
|
481
|
+
description: 'API client',
|
|
482
|
+
properties: {
|
|
483
|
+
request: { description: 'Request method' },
|
|
484
|
+
},
|
|
485
|
+
},
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
IncrementalContext.define({
|
|
490
|
+
properties: {
|
|
491
|
+
api: {
|
|
492
|
+
detail: 'APIClient instance',
|
|
493
|
+
properties: {
|
|
494
|
+
query: { description: 'Query method' },
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const doc = IncrementalContext.getDoc();
|
|
501
|
+
const apiProp: any = doc.properties?.api;
|
|
502
|
+
expect(apiProp.description).toBe('API client');
|
|
503
|
+
expect(apiProp.detail).toBe('APIClient instance');
|
|
504
|
+
expect(apiProp.properties?.request?.description).toBe('Request method');
|
|
505
|
+
expect(apiProp.properties?.query?.description).toBe('Query method');
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
});
|
|
@@ -12,6 +12,7 @@ import { screen } from '@testing-library/react';
|
|
|
12
12
|
import { FlowSettings } from '../flowSettings';
|
|
13
13
|
import { FlowModel } from '../models';
|
|
14
14
|
import { FlowEngine } from '../flowEngine';
|
|
15
|
+
import { GLOBAL_EMBED_CONTAINER_ID } from '../views';
|
|
15
16
|
|
|
16
17
|
// We will stub viewer directly on model.context in tests
|
|
17
18
|
|
|
@@ -82,6 +83,8 @@ vi.mock('antd', () => {
|
|
|
82
83
|
Paragraph: ({ children }: any) => children ?? 'Paragraph',
|
|
83
84
|
Text: ({ children }: any) => children ?? 'Text',
|
|
84
85
|
},
|
|
86
|
+
ConfigProvider: ({ children }: any) => children ?? 'ConfigProvider',
|
|
87
|
+
theme: { useToken: () => ({}) },
|
|
85
88
|
};
|
|
86
89
|
});
|
|
87
90
|
|
|
@@ -1085,18 +1088,18 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1085
1088
|
|
|
1086
1089
|
// Create mock DOM element for embed target
|
|
1087
1090
|
const mockTarget = document.createElement('div');
|
|
1088
|
-
mockTarget.id =
|
|
1091
|
+
mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
|
|
1089
1092
|
mockTarget.style.width = 'auto';
|
|
1090
1093
|
mockTarget.style.maxWidth = 'none';
|
|
1091
1094
|
document.body.appendChild(mockTarget);
|
|
1092
1095
|
|
|
1093
1096
|
// Mock querySelector to return our mock element
|
|
1094
|
-
const originalQuerySelector = document.querySelector;
|
|
1095
|
-
|
|
1096
|
-
if (selector ===
|
|
1097
|
+
const originalQuerySelector = document.querySelector.bind(document);
|
|
1098
|
+
const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
|
|
1099
|
+
if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
|
|
1097
1100
|
return mockTarget;
|
|
1098
1101
|
}
|
|
1099
|
-
return originalQuerySelector
|
|
1102
|
+
return originalQuerySelector(selector);
|
|
1100
1103
|
});
|
|
1101
1104
|
|
|
1102
1105
|
const M = model.constructor as any;
|
|
@@ -1162,7 +1165,61 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1162
1165
|
|
|
1163
1166
|
// Cleanup
|
|
1164
1167
|
document.body.removeChild(mockTarget);
|
|
1165
|
-
|
|
1168
|
+
querySelectorSpy.mockRestore();
|
|
1169
|
+
});
|
|
1170
|
+
|
|
1171
|
+
it('does not clear embed target DOM before opening (avoids portal unmount errors)', async () => {
|
|
1172
|
+
const engine = new FlowEngine();
|
|
1173
|
+
const flowSettings = new FlowSettings(engine);
|
|
1174
|
+
const model = new FlowModel({ uid: 'm-embed-no-clear', flowEngine: engine });
|
|
1175
|
+
|
|
1176
|
+
const mockTarget = document.createElement('div');
|
|
1177
|
+
mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
|
|
1178
|
+
mockTarget.innerHTML = '<div data-testid="existing">Existing</div>';
|
|
1179
|
+
document.body.appendChild(mockTarget);
|
|
1180
|
+
|
|
1181
|
+
const originalQuerySelector = document.querySelector.bind(document);
|
|
1182
|
+
const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
|
|
1183
|
+
if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
|
|
1184
|
+
return mockTarget;
|
|
1185
|
+
}
|
|
1186
|
+
return originalQuerySelector(selector);
|
|
1187
|
+
});
|
|
1188
|
+
|
|
1189
|
+
const M = model.constructor as any;
|
|
1190
|
+
M.registerFlow({
|
|
1191
|
+
key: 'embedNoClearFlow',
|
|
1192
|
+
steps: {
|
|
1193
|
+
step: {
|
|
1194
|
+
title: 'Step',
|
|
1195
|
+
uiSchema: { f: { type: 'string', 'x-component': 'Input' } },
|
|
1196
|
+
},
|
|
1197
|
+
},
|
|
1198
|
+
});
|
|
1199
|
+
|
|
1200
|
+
const embed = vi.fn((opts: any) => {
|
|
1201
|
+
// The existing DOM should not be wiped out before opening the embed view.
|
|
1202
|
+
expect(mockTarget.querySelector('[data-testid="existing"]')).toBeTruthy();
|
|
1203
|
+
const dlg = { close: vi.fn(), Footer: (p: any) => null } as any;
|
|
1204
|
+
if (typeof opts.content === 'function') opts.content(dlg, { defineMethod: vi.fn() });
|
|
1205
|
+
return dlg;
|
|
1206
|
+
});
|
|
1207
|
+
|
|
1208
|
+
model.context.defineProperty('viewer', { value: { embed } });
|
|
1209
|
+
model.context.defineProperty('message', { value: { info: vi.fn(), error: vi.fn(), success: vi.fn() } });
|
|
1210
|
+
|
|
1211
|
+
await flowSettings.open({
|
|
1212
|
+
model,
|
|
1213
|
+
flowKey: 'embedNoClearFlow',
|
|
1214
|
+
stepKey: 'step',
|
|
1215
|
+
uiMode: 'embed',
|
|
1216
|
+
} as any);
|
|
1217
|
+
|
|
1218
|
+
expect(embed).toHaveBeenCalledTimes(1);
|
|
1219
|
+
expect(mockTarget.querySelector('[data-testid="existing"]')).toBeTruthy();
|
|
1220
|
+
|
|
1221
|
+
document.body.removeChild(mockTarget);
|
|
1222
|
+
querySelectorSpy.mockRestore();
|
|
1166
1223
|
});
|
|
1167
1224
|
|
|
1168
1225
|
it('uses embed uiMode with default props when target element exists', async () => {
|
|
@@ -1172,16 +1229,16 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1172
1229
|
|
|
1173
1230
|
// Create mock DOM element for embed target
|
|
1174
1231
|
const mockTarget = document.createElement('div');
|
|
1175
|
-
mockTarget.id =
|
|
1232
|
+
mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
|
|
1176
1233
|
document.body.appendChild(mockTarget);
|
|
1177
1234
|
|
|
1178
1235
|
// Mock querySelector
|
|
1179
|
-
const originalQuerySelector = document.querySelector;
|
|
1180
|
-
|
|
1181
|
-
if (selector ===
|
|
1236
|
+
const originalQuerySelector = document.querySelector.bind(document);
|
|
1237
|
+
const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
|
|
1238
|
+
if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
|
|
1182
1239
|
return mockTarget;
|
|
1183
1240
|
}
|
|
1184
|
-
return originalQuerySelector
|
|
1241
|
+
return originalQuerySelector(selector);
|
|
1185
1242
|
});
|
|
1186
1243
|
|
|
1187
1244
|
const M = model.constructor as any;
|
|
@@ -1221,7 +1278,7 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1221
1278
|
|
|
1222
1279
|
// Cleanup
|
|
1223
1280
|
document.body.removeChild(mockTarget);
|
|
1224
|
-
|
|
1281
|
+
querySelectorSpy.mockRestore();
|
|
1225
1282
|
});
|
|
1226
1283
|
|
|
1227
1284
|
it('handles embed uiMode when target element is not found', async () => {
|
|
@@ -1230,8 +1287,7 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1230
1287
|
const model = new FlowModel({ uid: 'm-embed-no-target', flowEngine: engine });
|
|
1231
1288
|
|
|
1232
1289
|
// Mock querySelector to return null (target not found)
|
|
1233
|
-
const
|
|
1234
|
-
document.querySelector = vi.fn(() => null);
|
|
1290
|
+
const querySelectorSpy = vi.spyOn(document, 'querySelector').mockReturnValue(null);
|
|
1235
1291
|
|
|
1236
1292
|
const M = model.constructor as any;
|
|
1237
1293
|
M.registerFlow({
|
|
@@ -1264,7 +1320,7 @@ describe('FlowSettings.open rendering behavior', () => {
|
|
|
1264
1320
|
expect(embed).toHaveBeenCalledTimes(1);
|
|
1265
1321
|
|
|
1266
1322
|
// Restore querySelector
|
|
1267
|
-
|
|
1323
|
+
querySelectorSpy.mockRestore();
|
|
1268
1324
|
});
|
|
1269
1325
|
|
|
1270
1326
|
it('handles error in function-based step uiMode gracefully', async () => {
|
|
@@ -95,6 +95,8 @@ vi.mock('antd', () => {
|
|
|
95
95
|
Paragraph: vi.fn(({ children }: any) => children ?? 'Paragraph'),
|
|
96
96
|
Text: vi.fn(({ children }: any) => children ?? 'Text'),
|
|
97
97
|
},
|
|
98
|
+
ConfigProvider: ({ children }: any) => children ?? 'ConfigProvider',
|
|
99
|
+
theme: { useToken: () => ({}) },
|
|
98
100
|
} as any;
|
|
99
101
|
});
|
|
100
102
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { describe, it, expect } from 'vitest';
|
|
11
10
|
import { FlowModel } from '@nocobase/flow-engine';
|
|
11
|
+
import { describe, expect, it } from 'vitest';
|
|
12
12
|
|
|
13
13
|
describe('GlobalFlowRegistry (class-level flows)', () => {
|
|
14
14
|
class BaseModel extends FlowModel {}
|