@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
package/src/flowEngine.ts
CHANGED
|
@@ -17,6 +17,9 @@ import { FlowSettings } from './flowSettings';
|
|
|
17
17
|
import { ErrorFlowModel, FlowModel } from './models';
|
|
18
18
|
import { ReactView } from './ReactView';
|
|
19
19
|
import { APIResource, FlowResource, MultiRecordResource, SingleRecordResource, SQLResource } from './resources';
|
|
20
|
+
import { Emitter } from './emitter';
|
|
21
|
+
import ModelOperationScheduler from './scheduler/ModelOperationScheduler';
|
|
22
|
+
import type { ScheduleOptions, ScheduledCancel } from './scheduler/ModelOperationScheduler';
|
|
20
23
|
import type {
|
|
21
24
|
ActionDefinition,
|
|
22
25
|
ApplyFlowCacheEntry,
|
|
@@ -27,6 +30,8 @@ import type {
|
|
|
27
30
|
ModelConstructor,
|
|
28
31
|
PersistOptions,
|
|
29
32
|
ResourceType,
|
|
33
|
+
RegisteredModelClassName,
|
|
34
|
+
ResolveUseResult,
|
|
30
35
|
} from './types';
|
|
31
36
|
import { isInheritedFrom } from './utils';
|
|
32
37
|
|
|
@@ -114,6 +119,27 @@ export class FlowEngine {
|
|
|
114
119
|
|
|
115
120
|
private _resources = new Map<string, typeof FlowResource>();
|
|
116
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Data change registry used to coordinate "refresh on active" across view-scoped engines.
|
|
124
|
+
*
|
|
125
|
+
* Keyed by: dataSourceKey -> resourceName -> version.
|
|
126
|
+
* - mark: increments version
|
|
127
|
+
* - get: returns current version (default 0)
|
|
128
|
+
*
|
|
129
|
+
* NOTE: ViewScopedFlowEngine proxies delegate non-local fields/methods to parents, so this
|
|
130
|
+
* registry naturally lives on the root engine instance and is shared across the whole view stack.
|
|
131
|
+
*/
|
|
132
|
+
private _dataSourceDirtyVersions: Map<string, Map<string, number>> = new Map();
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 引擎事件总线(目前用于模型生命周期等事件)。
|
|
136
|
+
* ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
|
|
137
|
+
*/
|
|
138
|
+
public emitter: Emitter = new Emitter();
|
|
139
|
+
|
|
140
|
+
/** 调度器:仅在 View 作用域引擎本地启用;根/Block 作用域默认不持有 */
|
|
141
|
+
private _modelOperationScheduler?: ModelOperationScheduler;
|
|
142
|
+
|
|
117
143
|
logger: pino.Logger;
|
|
118
144
|
|
|
119
145
|
/**
|
|
@@ -130,7 +156,7 @@ export class FlowEngine {
|
|
|
130
156
|
*/
|
|
131
157
|
public reactView: ReactView;
|
|
132
158
|
/**
|
|
133
|
-
* Flow executor that runs
|
|
159
|
+
* Flow executor that runs event flows.
|
|
134
160
|
*/
|
|
135
161
|
public executor: FlowExecutor;
|
|
136
162
|
|
|
@@ -165,6 +191,64 @@ export class FlowEngine {
|
|
|
165
191
|
this.executor = new FlowExecutor(this);
|
|
166
192
|
}
|
|
167
193
|
|
|
194
|
+
/** 获取/创建当前引擎的调度器(仅在本地作用域) */
|
|
195
|
+
public getScheduler(): ModelOperationScheduler {
|
|
196
|
+
if (!this._modelOperationScheduler) {
|
|
197
|
+
this._modelOperationScheduler = new ModelOperationScheduler(this);
|
|
198
|
+
}
|
|
199
|
+
return this._modelOperationScheduler;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** 释放并清理当前引擎本地调度器(若存在) */
|
|
203
|
+
public disposeScheduler(): void {
|
|
204
|
+
if (this._modelOperationScheduler) {
|
|
205
|
+
try {
|
|
206
|
+
this._modelOperationScheduler.dispose();
|
|
207
|
+
} finally {
|
|
208
|
+
this._modelOperationScheduler = undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Mark a data source resource as "dirty" (changed).
|
|
215
|
+
* This is used by data blocks to decide whether to refresh when a view becomes active.
|
|
216
|
+
*/
|
|
217
|
+
public markDataSourceDirty(dataSourceKey: string, resourceName: string): number {
|
|
218
|
+
const dsKey = String(dataSourceKey || 'main');
|
|
219
|
+
const resName = String(resourceName || '');
|
|
220
|
+
if (!resName) return this.getDataSourceDirtyVersion(dsKey, resName);
|
|
221
|
+
|
|
222
|
+
const ds = this._dataSourceDirtyVersions.get(dsKey) || new Map<string, number>();
|
|
223
|
+
if (!this._dataSourceDirtyVersions.has(dsKey)) {
|
|
224
|
+
this._dataSourceDirtyVersions.set(dsKey, ds);
|
|
225
|
+
}
|
|
226
|
+
const next = (ds.get(resName) || 0) + 1;
|
|
227
|
+
ds.set(resName, next);
|
|
228
|
+
return next;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get current dirty version for a data source resource.
|
|
233
|
+
* Returns 0 when no writes have been recorded.
|
|
234
|
+
*/
|
|
235
|
+
public getDataSourceDirtyVersion(dataSourceKey: string, resourceName: string): number {
|
|
236
|
+
const dsKey = String(dataSourceKey || 'main');
|
|
237
|
+
const resName = String(resourceName || '');
|
|
238
|
+
if (!resName) return 0;
|
|
239
|
+
return this._dataSourceDirtyVersions.get(dsKey)?.get(resName) || 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
|
|
243
|
+
public scheduleModelOperation(
|
|
244
|
+
fromModelOrUid: FlowModel | string,
|
|
245
|
+
toUid: string,
|
|
246
|
+
fn: (model: FlowModel) => Promise<void> | void,
|
|
247
|
+
options?: ScheduleOptions,
|
|
248
|
+
): ScheduledCancel {
|
|
249
|
+
return this.getScheduler().schedule(fromModelOrUid, toUid, fn, options);
|
|
250
|
+
}
|
|
251
|
+
|
|
168
252
|
/** 上一个引擎(根引擎为 undefined) */
|
|
169
253
|
get previousEngine(): FlowEngine | undefined {
|
|
170
254
|
return this._previousEngine;
|
|
@@ -417,7 +501,14 @@ export class FlowEngine {
|
|
|
417
501
|
extra?: { delegateToParent?: boolean; delegate?: FlowContext },
|
|
418
502
|
): T {
|
|
419
503
|
const { parentId, uid, use: modelClassName, subModels } = options;
|
|
420
|
-
const
|
|
504
|
+
const parentModel = parentId
|
|
505
|
+
? ((this.getModel(parentId) || this.previousEngine?.getModel(parentId)) as FlowModel | undefined)
|
|
506
|
+
: undefined;
|
|
507
|
+
const ModelClass = this._resolveModelClass(
|
|
508
|
+
typeof modelClassName === 'string' ? this.getModelClass(modelClassName) : modelClassName,
|
|
509
|
+
options,
|
|
510
|
+
parentModel,
|
|
511
|
+
);
|
|
421
512
|
|
|
422
513
|
if (uid && this._modelInstances.has(uid)) {
|
|
423
514
|
return this._modelInstances.get(uid) as T;
|
|
@@ -436,8 +527,8 @@ export class FlowEngine {
|
|
|
436
527
|
modelInstance.context.addDelegate(extra.delegate);
|
|
437
528
|
}
|
|
438
529
|
|
|
439
|
-
if (
|
|
440
|
-
modelInstance.setParent(
|
|
530
|
+
if (parentModel) {
|
|
531
|
+
modelInstance.setParent(parentModel);
|
|
441
532
|
if (extra?.delegateToParent === false) {
|
|
442
533
|
modelInstance.removeParentDelegate();
|
|
443
534
|
}
|
|
@@ -447,6 +538,12 @@ export class FlowEngine {
|
|
|
447
538
|
|
|
448
539
|
modelInstance.onInit(options);
|
|
449
540
|
|
|
541
|
+
// 发射 created 生命周期事件
|
|
542
|
+
void this.emitter.emitAsync('model:created', {
|
|
543
|
+
uid: modelInstance.uid,
|
|
544
|
+
model: modelInstance,
|
|
545
|
+
});
|
|
546
|
+
|
|
450
547
|
// 在模型实例化阶段应用 flow 级 defaultParams(仅填充缺失的 stepParams,不覆盖)
|
|
451
548
|
// 不阻塞创建流程:允许 defaultParams 为异步函数
|
|
452
549
|
this._applyFlowDefinitionDefaultParams(modelInstance as FlowModel).catch((err) => {
|
|
@@ -458,6 +555,67 @@ export class FlowEngine {
|
|
|
458
555
|
return modelInstance as T;
|
|
459
556
|
}
|
|
460
557
|
|
|
558
|
+
/**
|
|
559
|
+
* 按类上的 resolveUse 链路解析最终用于实例化的模型类。
|
|
560
|
+
* 允许模型类根据上下文动态指定实际使用的类,支持多级 resolveUse。
|
|
561
|
+
*/
|
|
562
|
+
private _resolveModelClass(
|
|
563
|
+
initial: ModelConstructor | undefined,
|
|
564
|
+
options: CreateModelOptions,
|
|
565
|
+
parent?: FlowModel,
|
|
566
|
+
): ModelConstructor | undefined {
|
|
567
|
+
const normalize = (
|
|
568
|
+
resolved: ResolveUseResult | void,
|
|
569
|
+
): { target?: RegisteredModelClassName | ModelConstructor; stop?: boolean } => {
|
|
570
|
+
if (!resolved) return {};
|
|
571
|
+
if (typeof resolved === 'object' && 'use' in resolved) {
|
|
572
|
+
return { target: resolved.use, stop: !!resolved.stop };
|
|
573
|
+
}
|
|
574
|
+
return { target: resolved as any, stop: false };
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
let current = initial;
|
|
578
|
+
const visited = new Set<ModelConstructor>();
|
|
579
|
+
|
|
580
|
+
while (current) {
|
|
581
|
+
if (visited.has(current)) {
|
|
582
|
+
console.warn(`FlowEngine: resolveUse circular reference detected on '${current.name}'.`);
|
|
583
|
+
break;
|
|
584
|
+
}
|
|
585
|
+
visited.add(current);
|
|
586
|
+
|
|
587
|
+
const resolver = (current as any)?.resolveUse as
|
|
588
|
+
| ((opts: CreateModelOptions, engine: FlowEngine, parent?: FlowModel) => ResolveUseResult | void)
|
|
589
|
+
| undefined;
|
|
590
|
+
if (typeof resolver !== 'function') {
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
const { target, stop } = normalize(resolver(options, this, parent));
|
|
595
|
+
if (!target || target === current) {
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
let next: ModelConstructor | undefined;
|
|
600
|
+
if (typeof target === 'string') {
|
|
601
|
+
next = this.getModelClass(target);
|
|
602
|
+
if (!next) {
|
|
603
|
+
console.warn(`FlowEngine: resolveUse returned '${target}' but no model is registered under that name.`);
|
|
604
|
+
return undefined;
|
|
605
|
+
}
|
|
606
|
+
} else {
|
|
607
|
+
next = target;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
current = next;
|
|
611
|
+
if (stop) {
|
|
612
|
+
break;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
return current;
|
|
617
|
+
}
|
|
618
|
+
|
|
461
619
|
/**
|
|
462
620
|
* 尝试应用当前模型可用 flow 的 defaultParams(如果存在)到 model.stepParams。
|
|
463
621
|
* 仅对尚未存在的步骤参数进行填充,不覆盖已有值。
|
|
@@ -544,6 +702,8 @@ export class FlowEngine {
|
|
|
544
702
|
return false;
|
|
545
703
|
}
|
|
546
704
|
const modelInstance = this._modelInstances.get(uid) as FlowModel;
|
|
705
|
+
// Ensure any cached beforeRender results tied to this uid are cleared before removal.
|
|
706
|
+
modelInstance.invalidateFlowCache(undefined, true);
|
|
547
707
|
modelInstance.clearForks();
|
|
548
708
|
// 从父模型中移除当前模型的引用
|
|
549
709
|
if (modelInstance.parent?.subModels) {
|
|
@@ -555,19 +715,73 @@ export class FlowEngine {
|
|
|
555
715
|
if (index !== -1) {
|
|
556
716
|
subModelValue.splice(index, 1);
|
|
557
717
|
modelInstance.parent.emitter.emit('onSubModelRemoved', modelInstance);
|
|
718
|
+
this.emitter?.emit('model:subModel:removed', {
|
|
719
|
+
parentUid: modelInstance.parent.uid,
|
|
720
|
+
parent: modelInstance.parent,
|
|
721
|
+
model: modelInstance,
|
|
722
|
+
});
|
|
558
723
|
break;
|
|
559
724
|
}
|
|
560
725
|
} else if (subModelValue && subModelValue === modelInstance) {
|
|
561
726
|
delete modelInstance.parent.subModels[subKey];
|
|
562
727
|
modelInstance.parent.emitter.emit('onSubModelRemoved', modelInstance);
|
|
728
|
+
this.emitter?.emit('model:subModel:removed', {
|
|
729
|
+
parentUid: modelInstance.parent.uid,
|
|
730
|
+
parent: modelInstance.parent,
|
|
731
|
+
model: modelInstance,
|
|
732
|
+
});
|
|
563
733
|
break;
|
|
564
734
|
}
|
|
565
735
|
}
|
|
566
736
|
}
|
|
567
737
|
this._modelInstances.delete(uid);
|
|
738
|
+
|
|
739
|
+
// 发射 destroyed 生命周期事件(在移除后,但携带实例便于调度器传递;严格模式:不吞错)
|
|
740
|
+
void this.emitter.emitAsync('model:destroyed', {
|
|
741
|
+
uid,
|
|
742
|
+
model: modelInstance,
|
|
743
|
+
});
|
|
568
744
|
return true;
|
|
569
745
|
}
|
|
570
746
|
|
|
747
|
+
/**
|
|
748
|
+
* Remove a local model instance and all its sub-models recursively.
|
|
749
|
+
* @param {string} uid UID of the model instance to destroy
|
|
750
|
+
* @returns {boolean} Returns true if successfully destroyed, false otherwise
|
|
751
|
+
*/
|
|
752
|
+
public removeModelWithSubModels(uid: string): boolean {
|
|
753
|
+
const model = this.getModel(uid);
|
|
754
|
+
if (!model) {
|
|
755
|
+
return false;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
const collectDescendants = (m: FlowModel, acc: FlowModel[]) => {
|
|
759
|
+
if (m.subModels) {
|
|
760
|
+
for (const key in m.subModels) {
|
|
761
|
+
const sub = m.subModels[key];
|
|
762
|
+
if (Array.isArray(sub)) {
|
|
763
|
+
[...sub].forEach((s) => collectDescendants(s, acc));
|
|
764
|
+
} else if (sub) {
|
|
765
|
+
collectDescendants(sub, acc);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
acc.push(m);
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
const allModels: FlowModel[] = [];
|
|
773
|
+
collectDescendants(model, allModels);
|
|
774
|
+
|
|
775
|
+
let success = true;
|
|
776
|
+
for (const m of allModels) {
|
|
777
|
+
if (!this.removeModel(m.uid)) {
|
|
778
|
+
success = false;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
return success;
|
|
783
|
+
}
|
|
784
|
+
|
|
571
785
|
/**
|
|
572
786
|
* Check if the model repository is set.
|
|
573
787
|
* @returns {boolean} Returns true if set, false otherwise.
|
|
@@ -581,6 +795,110 @@ export class FlowEngine {
|
|
|
581
795
|
return true;
|
|
582
796
|
}
|
|
583
797
|
|
|
798
|
+
/**
|
|
799
|
+
* Try to locate a model instance in previous engines (view stack) by uid.
|
|
800
|
+
* This is mainly used by view-scoped engines to reuse already-loaded model trees
|
|
801
|
+
* (e.g. models created from local JSON) without hitting the repository.
|
|
802
|
+
*/
|
|
803
|
+
private findModelInPreviousEngines<T extends FlowModel = FlowModel>(uid: string): T | undefined {
|
|
804
|
+
let eng = this.previousEngine;
|
|
805
|
+
while (eng) {
|
|
806
|
+
const found = eng.getModel<T>(uid);
|
|
807
|
+
if (found) return found;
|
|
808
|
+
eng = eng.previousEngine;
|
|
809
|
+
}
|
|
810
|
+
return undefined;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Try to locate a sub-model in previous engines (view stack) by (parentId, subKey).
|
|
815
|
+
*/
|
|
816
|
+
private findSubModelInPreviousEngines<T extends FlowModel = FlowModel>(
|
|
817
|
+
parentId: string,
|
|
818
|
+
subKey: string,
|
|
819
|
+
): { parent: FlowModel; model: T } | undefined {
|
|
820
|
+
let eng = this.previousEngine;
|
|
821
|
+
while (eng) {
|
|
822
|
+
const parent = eng.getModel<FlowModel>(parentId);
|
|
823
|
+
if (parent) {
|
|
824
|
+
const sub = (parent.subModels as any)?.[subKey];
|
|
825
|
+
if (sub) {
|
|
826
|
+
const model = Array.isArray(sub) ? (sub[0] as T) : (sub as T);
|
|
827
|
+
if (model) return { parent, model };
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
eng = eng.previousEngine;
|
|
831
|
+
}
|
|
832
|
+
return undefined;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/**
|
|
836
|
+
* Hydrate a model into current engine from an already-existing model instance in previous engines.
|
|
837
|
+
* - Avoids repository requests when the model tree is already present in memory.
|
|
838
|
+
*/
|
|
839
|
+
private hydrateModelFromPreviousEngines<T extends FlowModel = FlowModel>(
|
|
840
|
+
options: any,
|
|
841
|
+
extra?: { delegateToParent?: boolean; delegate?: FlowContext },
|
|
842
|
+
): T | null {
|
|
843
|
+
const uid = options?.uid;
|
|
844
|
+
const parentId = options?.parentId;
|
|
845
|
+
const subKey = options?.subKey;
|
|
846
|
+
|
|
847
|
+
// 1) Prefer exact uid match when provided.
|
|
848
|
+
if (uid && !this._modelInstances.has(uid)) {
|
|
849
|
+
const existing = this.findModelInPreviousEngines<T>(uid);
|
|
850
|
+
if (existing?.context.flowSettingsEnabled) {
|
|
851
|
+
// 如果模型实例启用 flowSettingsEnabled,直接返回 null, 避免旧数据
|
|
852
|
+
return null;
|
|
853
|
+
}
|
|
854
|
+
if (existing) {
|
|
855
|
+
const data = existing.serialize();
|
|
856
|
+
return this.createModel<T>(data as any, extra);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// 2) Parent/subKey lookup (common for pages/popups).
|
|
861
|
+
if (parentId && subKey) {
|
|
862
|
+
const found = this.findSubModelInPreviousEngines<T>(parentId, subKey);
|
|
863
|
+
if (!found || found.parent.context.flowSettingsEnabled) return null;
|
|
864
|
+
|
|
865
|
+
const { parent: parentFromPrev, model: modelFromPrev } = found;
|
|
866
|
+
// Ensure the parent shell exists in current engine so findModelByParentId can work locally.
|
|
867
|
+
let localParent = this.getModel<FlowModel>(parentId);
|
|
868
|
+
if (!localParent) {
|
|
869
|
+
const parentData = parentFromPrev.serialize();
|
|
870
|
+
delete (parentData as any).subModels;
|
|
871
|
+
localParent = this.createModel<FlowModel>(parentData as any, extra);
|
|
872
|
+
}
|
|
873
|
+
// Create (or reuse) the sub-model instance in current engine.
|
|
874
|
+
const modelData = modelFromPrev.serialize();
|
|
875
|
+
const localModel = this.createModel<T>(modelData as any, extra);
|
|
876
|
+
|
|
877
|
+
// Mount under local parent if not mounted yet (so later lookups by parentId/subKey won't hit repo).
|
|
878
|
+
const mounted = (localParent.subModels as any)?.[subKey];
|
|
879
|
+
if (Array.isArray(mounted)) {
|
|
880
|
+
const exists = mounted.some((m) => m?.uid === (localModel as any)?.uid);
|
|
881
|
+
if (!exists) {
|
|
882
|
+
localParent.addSubModel(subKey, localModel as any);
|
|
883
|
+
}
|
|
884
|
+
} else if (mounted instanceof FlowModel) {
|
|
885
|
+
// Keep existing instance when uid matches; otherwise, replace.
|
|
886
|
+
if (mounted.uid !== (localModel as any)?.uid) {
|
|
887
|
+
localParent.setSubModel(subKey, localModel as any);
|
|
888
|
+
}
|
|
889
|
+
} else {
|
|
890
|
+
if ((localModel as any)?.subType === 'array') {
|
|
891
|
+
localParent.addSubModel(subKey, localModel as any);
|
|
892
|
+
} else {
|
|
893
|
+
localParent.setSubModel(subKey, localModel as any);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
return localModel;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
return null;
|
|
900
|
+
}
|
|
901
|
+
|
|
584
902
|
/**
|
|
585
903
|
* Load a model instance (prefers local, falls back to repository).
|
|
586
904
|
* @template T FlowModel subclass type, defaults to FlowModel.
|
|
@@ -589,12 +907,26 @@ export class FlowEngine {
|
|
|
589
907
|
*/
|
|
590
908
|
async loadModel<T extends FlowModel = FlowModel>(options): Promise<T | null> {
|
|
591
909
|
if (!this.ensureModelRepository()) return;
|
|
592
|
-
const
|
|
593
|
-
if (
|
|
594
|
-
|
|
910
|
+
const refresh = !!options?.refresh;
|
|
911
|
+
if (!refresh) {
|
|
912
|
+
const model = this.findModelByParentId(options.parentId, options.subKey);
|
|
913
|
+
if (model) {
|
|
914
|
+
return model as T;
|
|
915
|
+
}
|
|
916
|
+
const hydrated = this.hydrateModelFromPreviousEngines<T>(options);
|
|
917
|
+
if (hydrated) {
|
|
918
|
+
return hydrated as T;
|
|
919
|
+
}
|
|
595
920
|
}
|
|
596
921
|
const data = await this._modelRepository.findOne(options);
|
|
597
|
-
|
|
922
|
+
if (!data?.uid) return null;
|
|
923
|
+
if (refresh) {
|
|
924
|
+
const existing = this.getModel(data.uid);
|
|
925
|
+
if (existing) {
|
|
926
|
+
this.removeModelWithSubModels(existing.uid);
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return this.createModel<T>(data as any);
|
|
598
930
|
}
|
|
599
931
|
|
|
600
932
|
/**
|
|
@@ -640,6 +972,12 @@ export class FlowEngine {
|
|
|
640
972
|
if (m) {
|
|
641
973
|
return m;
|
|
642
974
|
}
|
|
975
|
+
|
|
976
|
+
const hydrated = this.hydrateModelFromPreviousEngines<T>(options, extra);
|
|
977
|
+
if (hydrated) {
|
|
978
|
+
return hydrated;
|
|
979
|
+
}
|
|
980
|
+
|
|
643
981
|
const data = await this._modelRepository.findOne(options);
|
|
644
982
|
let model: T | null = null;
|
|
645
983
|
if (data?.uid) {
|
|
@@ -731,7 +1069,24 @@ export class FlowEngine {
|
|
|
731
1069
|
if (this.ensureModelRepository()) {
|
|
732
1070
|
await this._modelRepository.destroy(uid);
|
|
733
1071
|
}
|
|
734
|
-
|
|
1072
|
+
|
|
1073
|
+
const modelInstance = this._modelInstances.get(uid) as FlowModel;
|
|
1074
|
+
const parent = modelInstance?.parent;
|
|
1075
|
+
const result = this.removeModel(uid);
|
|
1076
|
+
parent && parent.emitter.emit('onSubModelDestroyed', modelInstance);
|
|
1077
|
+
|
|
1078
|
+
return result;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/**
|
|
1082
|
+
* Duplicate a model tree via repository API.
|
|
1083
|
+
* Returns the duplicated model JSON (root with subModels) or null if not available.
|
|
1084
|
+
* @param {string} uid UID of the model to duplicate
|
|
1085
|
+
* @returns {Promise<any | null>} Duplicated model JSON or null
|
|
1086
|
+
*/
|
|
1087
|
+
async duplicateModel(uid: string) {
|
|
1088
|
+
if (!this.ensureModelRepository()) return null;
|
|
1089
|
+
return this._modelRepository.duplicate(uid);
|
|
735
1090
|
}
|
|
736
1091
|
|
|
737
1092
|
/**
|
|
@@ -803,9 +1158,15 @@ export class FlowEngine {
|
|
|
803
1158
|
// 7. 触发事件以通知其他部分模型已替换
|
|
804
1159
|
if (currentParent) {
|
|
805
1160
|
currentParent.emitter.setPaused(false);
|
|
806
|
-
currentParent.parent.
|
|
1161
|
+
currentParent.parent.invalidateFlowCache('beforeRender', true);
|
|
807
1162
|
currentParent.parent?.rerender();
|
|
808
1163
|
currentParent.emitter.emit('onSubModelReplaced', { oldModel, newModel });
|
|
1164
|
+
this.emitter?.emit('model:subModel:replaced', {
|
|
1165
|
+
parentUid: currentParent.uid,
|
|
1166
|
+
parent: currentParent,
|
|
1167
|
+
oldModel,
|
|
1168
|
+
newModel,
|
|
1169
|
+
});
|
|
809
1170
|
}
|
|
810
1171
|
await newModel.save();
|
|
811
1172
|
return newModel;
|
|
@@ -837,7 +1198,8 @@ export class FlowEngine {
|
|
|
837
1198
|
return false;
|
|
838
1199
|
}
|
|
839
1200
|
|
|
840
|
-
const
|
|
1201
|
+
const subModelsCopy = [...subModels];
|
|
1202
|
+
const findIndex = (model: FlowModel) => subModelsCopy.findIndex((item) => item.uid === model.uid);
|
|
841
1203
|
|
|
842
1204
|
const currentIndex = findIndex(sourceModel);
|
|
843
1205
|
const targetIndex = findIndex(targetModel);
|
|
@@ -853,14 +1215,17 @@ export class FlowEngine {
|
|
|
853
1215
|
}
|
|
854
1216
|
|
|
855
1217
|
// 使用splice直接移动数组元素(O(n)比排序O(n log n)更快)
|
|
856
|
-
const [movedModel] =
|
|
857
|
-
|
|
1218
|
+
const [movedModel] = subModelsCopy.splice(currentIndex, 1);
|
|
1219
|
+
subModelsCopy.splice(targetIndex, 0, movedModel);
|
|
858
1220
|
|
|
859
1221
|
// 重新分配连续的sortIndex
|
|
860
|
-
|
|
1222
|
+
subModelsCopy.forEach((model, index) => {
|
|
861
1223
|
model.sortIndex = index;
|
|
862
1224
|
});
|
|
863
1225
|
|
|
1226
|
+
// 更新父模型的 subModels 引用,确保拖拽后仍为可观察数组
|
|
1227
|
+
subModels.splice(0, subModels.length, ...subModelsCopy);
|
|
1228
|
+
|
|
864
1229
|
return true;
|
|
865
1230
|
};
|
|
866
1231
|
move(sourceModel, targetModel);
|
|
@@ -870,6 +1235,12 @@ export class FlowEngine {
|
|
|
870
1235
|
}
|
|
871
1236
|
// 触发事件以通知其他部分模型已移动
|
|
872
1237
|
sourceModel.parent.emitter.emit('onSubModelMoved', { source: sourceModel, target: targetModel });
|
|
1238
|
+
this.emitter?.emit('model:subModel:moved', {
|
|
1239
|
+
parentUid: sourceModel.parent?.uid,
|
|
1240
|
+
parent: sourceModel.parent,
|
|
1241
|
+
source: sourceModel,
|
|
1242
|
+
target: targetModel,
|
|
1243
|
+
});
|
|
873
1244
|
}
|
|
874
1245
|
|
|
875
1246
|
/**
|