@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
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { describe,
|
|
11
|
-
import {
|
|
12
|
-
import { mergeSubModelItems } from '../AddSubModelButton';
|
|
10
|
+
import { describe, expect, it } from 'vitest';
|
|
11
|
+
import type { FlowModelContext } from '../../../flowContext';
|
|
13
12
|
import { FlowEngine } from '../../../flowEngine';
|
|
14
13
|
import { FlowModel } from '../../../models';
|
|
15
|
-
import type { FlowModelContext } from '../../../flowContext';
|
|
16
|
-
import type { SubModelItem } from '../AddSubModelButton';
|
|
17
14
|
import type { ModelConstructor } from '../../../types';
|
|
15
|
+
import type { SubModelItem } from '../AddSubModelButton';
|
|
16
|
+
import { mergeSubModelItems } from '../AddSubModelButton';
|
|
17
|
+
import { buildItems, buildSubModelGroups, buildSubModelItem, buildSubModelItems } from '../utils';
|
|
18
18
|
|
|
19
19
|
type DefineChildren = (ctx: FlowModelContext) => SubModelItem[] | Promise<SubModelItem[]>;
|
|
20
20
|
type WithDefineChildren<T extends ModelConstructor = ModelConstructor> = T & { defineChildren: DefineChildren };
|
|
@@ -153,7 +153,7 @@ describe('subModel/utils', () => {
|
|
|
153
153
|
});
|
|
154
154
|
|
|
155
155
|
describe('buildSubModelItem', () => {
|
|
156
|
-
it('returns undefined for hidden meta entries', () => {
|
|
156
|
+
it('returns undefined for hidden meta entries', async () => {
|
|
157
157
|
const engine = new FlowEngine();
|
|
158
158
|
|
|
159
159
|
class Parent extends FlowModel {}
|
|
@@ -163,7 +163,7 @@ describe('subModel/utils', () => {
|
|
|
163
163
|
engine.registerModels({ Parent, HiddenChild });
|
|
164
164
|
const parent = engine.createModel({ use: 'Parent', uid: 'parent-hidden' });
|
|
165
165
|
|
|
166
|
-
const item = buildSubModelItem(HiddenChild, parent.context);
|
|
166
|
+
const item = await buildSubModelItem(HiddenChild, parent.context);
|
|
167
167
|
expect(item).toBeUndefined();
|
|
168
168
|
});
|
|
169
169
|
|
|
@@ -194,7 +194,7 @@ describe('subModel/utils', () => {
|
|
|
194
194
|
const parent = engine.createModel<Parent>({ use: 'Parent', uid: 'parent-child-group' });
|
|
195
195
|
const ctx = parent.context;
|
|
196
196
|
|
|
197
|
-
const item = buildSubModelItem(ChildGroup, ctx, false);
|
|
197
|
+
const item = await buildSubModelItem(ChildGroup, ctx, false);
|
|
198
198
|
expect(item).toBeTruthy();
|
|
199
199
|
expect(item?.label).toBe('Child Group');
|
|
200
200
|
expect(item?.searchable).toBe(true);
|
|
@@ -214,7 +214,7 @@ describe('subModel/utils', () => {
|
|
|
214
214
|
expect(merged?.extra).toMatchObject({ fromTest: true });
|
|
215
215
|
});
|
|
216
216
|
|
|
217
|
-
it('falls back to use=current class name when meta createModelOptions omitted', () => {
|
|
217
|
+
it('falls back to use=current class name when meta createModelOptions omitted', async () => {
|
|
218
218
|
const engine = new FlowEngine();
|
|
219
219
|
|
|
220
220
|
class Parent extends FlowModel {}
|
|
@@ -223,11 +223,11 @@ describe('subModel/utils', () => {
|
|
|
223
223
|
engine.registerModels({ Parent, PlainChild });
|
|
224
224
|
const parent = engine.createModel<Parent>({ use: 'Parent', uid: 'parent-default-create-options' });
|
|
225
225
|
|
|
226
|
-
const item = buildSubModelItem(PlainChild, parent.context);
|
|
226
|
+
const item = await buildSubModelItem(PlainChild, parent.context);
|
|
227
227
|
expect(item?.createModelOptions).toEqual({ use: 'PlainChild' });
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
it('still returns item when skipHide=true', () => {
|
|
230
|
+
it('still returns item when skipHide=true', async () => {
|
|
231
231
|
const engine = new FlowEngine();
|
|
232
232
|
|
|
233
233
|
class Parent extends FlowModel {}
|
|
@@ -237,7 +237,7 @@ describe('subModel/utils', () => {
|
|
|
237
237
|
engine.registerModels({ Parent, HiddenChild });
|
|
238
238
|
const parent = engine.createModel({ use: 'Parent', uid: 'parent-skip-hide' });
|
|
239
239
|
|
|
240
|
-
const item = buildSubModelItem(HiddenChild, parent.context, true);
|
|
240
|
+
const item = await buildSubModelItem(HiddenChild, parent.context, true);
|
|
241
241
|
expect(item).toBeTruthy();
|
|
242
242
|
expect(item?.label).toBe('Hidden but allowed');
|
|
243
243
|
});
|
|
@@ -14,9 +14,23 @@ import { FlowModelMeta, ModelConstructor } from '../../types';
|
|
|
14
14
|
import { isInheritedFrom, resolveCreateModelOptions } from '../../utils';
|
|
15
15
|
import { SubModelItem } from './AddSubModelButton';
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
async function callHideFunction(
|
|
18
|
+
hide: boolean | ((context: FlowModelContext) => boolean | Promise<boolean>),
|
|
19
|
+
ctx: FlowModelContext,
|
|
20
|
+
) {
|
|
21
|
+
if (typeof hide === 'function') {
|
|
22
|
+
return await hide(ctx);
|
|
23
|
+
}
|
|
24
|
+
return hide;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function buildSubModelItem(
|
|
28
|
+
M: ModelConstructor,
|
|
29
|
+
ctx: FlowModelContext,
|
|
30
|
+
skipHide = false,
|
|
31
|
+
): Promise<SubModelItem | undefined> {
|
|
18
32
|
const meta: FlowModelMeta = (M.meta ?? {}) as FlowModelMeta;
|
|
19
|
-
if (meta.hide && !skipHide) {
|
|
33
|
+
if ((await callHideFunction(meta.hide, ctx)) && !skipHide) {
|
|
20
34
|
return;
|
|
21
35
|
}
|
|
22
36
|
// 判断是否为 CollectionBlockModel 的子类(用于集合选择层开启搜索)
|
|
@@ -102,8 +116,13 @@ export function buildSubModelItems(subModelBaseClass: string | ModelConstructor,
|
|
|
102
116
|
return async (ctx: FlowModelContext) => {
|
|
103
117
|
const SubModelClasses = ctx.engine.getSubclassesOf(subModelBaseClass);
|
|
104
118
|
// Collect and sort subclasses by meta.sort (ascending), excluding hidden or inherited ones in `exclude`
|
|
105
|
-
let candidates =
|
|
106
|
-
|
|
119
|
+
let candidates = [];
|
|
120
|
+
for (const C of Array.from(SubModelClasses.values())) {
|
|
121
|
+
if (!(await callHideFunction(C.meta?.hide, ctx))) {
|
|
122
|
+
candidates.push(C);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
candidates = candidates
|
|
107
126
|
.filter((C) => {
|
|
108
127
|
for (const P of exclude as (string | ModelConstructor)[]) {
|
|
109
128
|
if (typeof P === 'string') {
|
|
@@ -120,14 +139,14 @@ export function buildSubModelItems(subModelBaseClass: string | ModelConstructor,
|
|
|
120
139
|
if (candidates.length === 0) {
|
|
121
140
|
const BaseClass =
|
|
122
141
|
typeof subModelBaseClass === 'string' ? ctx.engine.getModelClass(subModelBaseClass) : subModelBaseClass;
|
|
123
|
-
if (BaseClass && !BaseClass.meta?.hide) {
|
|
142
|
+
if (BaseClass && !(await callHideFunction(BaseClass.meta?.hide, ctx))) {
|
|
124
143
|
candidates = [BaseClass];
|
|
125
144
|
}
|
|
126
145
|
}
|
|
127
146
|
|
|
128
147
|
const items: SubModelItem[] = [];
|
|
129
148
|
for (const M of candidates) {
|
|
130
|
-
const item = buildSubModelItem(M, ctx);
|
|
149
|
+
const item = await buildSubModelItem(M, ctx);
|
|
131
150
|
if (item) items.push(item);
|
|
132
151
|
}
|
|
133
152
|
return items;
|
|
@@ -85,6 +85,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
85
85
|
showValueComponent = true,
|
|
86
86
|
onlyLeafSelectable = false,
|
|
87
87
|
clearValue,
|
|
88
|
+
ignoreFieldNames,
|
|
88
89
|
...restProps
|
|
89
90
|
}) => {
|
|
90
91
|
const [currentMetaTreeNode, setCurrentMetaTreeNode] = useState<MetaTreeNode | null>(null);
|
|
@@ -138,7 +139,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
138
139
|
// 当 value 存在但 currentMetaTreeNode 还未恢复,尝试按路径逐级加载(支持 children 为函数的场景)
|
|
139
140
|
useEffect(() => {
|
|
140
141
|
const restoreFromValue = async () => {
|
|
141
|
-
if (!Array.isArray(resolvedMetaTree) ||
|
|
142
|
+
if (!Array.isArray(resolvedMetaTree) || value == null) return;
|
|
142
143
|
|
|
143
144
|
// 若已存在且路径匹配,跳过
|
|
144
145
|
if (currentMetaTreeNode) {
|
|
@@ -202,7 +203,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
202
203
|
|
|
203
204
|
useEffect(() => {
|
|
204
205
|
if (!resolvedMetaTreeNode) return;
|
|
205
|
-
if (!Array.isArray(resolvedMetaTree) ||
|
|
206
|
+
if (!Array.isArray(resolvedMetaTree) || innerValue == null) return;
|
|
206
207
|
const finalValue = resolveValueFromPath?.(resolvedMetaTreeNode) || innerValue;
|
|
207
208
|
emitChange(finalValue, resolvedMetaTreeNode);
|
|
208
209
|
setCurrentMetaTreeNode(resolvedMetaTreeNode);
|
|
@@ -240,12 +241,18 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
240
241
|
|
|
241
242
|
const handleVariableSelect = useCallback(
|
|
242
243
|
(variableValue: string, metaTreeNode?: MetaTreeNode) => {
|
|
244
|
+
if (!metaTreeNode && variableValue === '') {
|
|
245
|
+
const cleared = clearValue !== undefined ? clearValue : null;
|
|
246
|
+
setInnerValue(cleared);
|
|
247
|
+
emitChange(cleared as any);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
243
250
|
setCurrentMetaTreeNode(metaTreeNode);
|
|
244
251
|
const finalValue = resolveValueFromPath?.(metaTreeNode) || variableValue;
|
|
245
252
|
setInnerValue(finalValue);
|
|
246
253
|
emitChange(finalValue, metaTreeNode);
|
|
247
254
|
},
|
|
248
|
-
[emitChange, resolveValueFromPath],
|
|
255
|
+
[emitChange, resolveValueFromPath, clearValue],
|
|
249
256
|
);
|
|
250
257
|
|
|
251
258
|
const { disabled } = restProps;
|
|
@@ -254,11 +261,29 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
254
261
|
if (disabled) {
|
|
255
262
|
return;
|
|
256
263
|
}
|
|
257
|
-
setCurrentMetaTreeNode(null);
|
|
258
264
|
const cleared = clearValue !== undefined ? clearValue : null;
|
|
259
265
|
setInnerValue(cleared);
|
|
266
|
+
|
|
267
|
+
// 若 clearValue 能解析到某个路径(例如 ['constant']),
|
|
268
|
+
// 则尝试立即定位到对应的 MetaTreeNode,以便渲染正确的常量组件。
|
|
269
|
+
try {
|
|
270
|
+
const path = resolvePathFromValue?.(cleared);
|
|
271
|
+
if (Array.isArray(resolvedMetaTree) && path && path.length > 0) {
|
|
272
|
+
const node = findMetaTreeNodeByPath(resolvedMetaTree as MetaTreeNode[], path as string[]);
|
|
273
|
+
if (node) {
|
|
274
|
+
setCurrentMetaTreeNode(node);
|
|
275
|
+
emitChange(cleared as any, node);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
} catch (_) {
|
|
280
|
+
// 忽略解析异常,走默认回退
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// 默认回退(无法定位具体 MetaTreeNode 时)
|
|
284
|
+
setCurrentMetaTreeNode(null);
|
|
260
285
|
emitChange(cleared as any);
|
|
261
|
-
}, [emitChange, disabled, clearValue]);
|
|
286
|
+
}, [emitChange, disabled, clearValue, resolvedMetaTree, resolvePathFromValue]);
|
|
262
287
|
|
|
263
288
|
const stableProps = useMemo(() => {
|
|
264
289
|
const { style, onFocus, onBlur, disabled, ...otherProps } = restProps;
|
|
@@ -267,7 +292,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
267
292
|
|
|
268
293
|
const inputProps = useMemo(() => {
|
|
269
294
|
const baseProps = {
|
|
270
|
-
value: innerValue
|
|
295
|
+
value: ValueComponent === Input ? innerValue ?? '' : innerValue,
|
|
271
296
|
onChange: handleInputChange,
|
|
272
297
|
disabled,
|
|
273
298
|
};
|
|
@@ -333,6 +358,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
|
|
|
333
358
|
parseValueToPath={resolvePathFromValue}
|
|
334
359
|
formatPathToValue={resolveValueFromPath}
|
|
335
360
|
onlyLeafSelectable={onlyLeafSelectable}
|
|
361
|
+
ignoreFieldNames={ignoreFieldNames}
|
|
336
362
|
{...(!showValueComponent && { children: null, placeholder: restProps?.placeholder })}
|
|
337
363
|
/>
|
|
338
364
|
</Space.Compact>
|
|
@@ -15,6 +15,7 @@ import { parseValueToPath } from './utils';
|
|
|
15
15
|
import { useResolvedMetaTree } from './useResolvedMetaTree';
|
|
16
16
|
import { useRequest } from 'ahooks';
|
|
17
17
|
import { useFlowContext } from '../../FlowContextProvider';
|
|
18
|
+
import type { MetaTreeNode } from '../../flowContext';
|
|
18
19
|
|
|
19
20
|
const VariableTagComponent: React.FC<VariableTagProps> = ({
|
|
20
21
|
value,
|
|
@@ -29,14 +30,65 @@ const VariableTagComponent: React.FC<VariableTagProps> = ({
|
|
|
29
30
|
|
|
30
31
|
const { data: displayedValue } = useRequest(
|
|
31
32
|
async () => {
|
|
33
|
+
// 1) 优先使用已解析到的节点(包含完整父标题链)
|
|
32
34
|
if (metaTreeNode) {
|
|
33
35
|
return metaTreeNode.parentTitles
|
|
34
36
|
? [...metaTreeNode.parentTitles, metaTreeNode.title].map(ctx.t).join('/')
|
|
35
37
|
: ctx.t(metaTreeNode.title) || '';
|
|
36
38
|
}
|
|
39
|
+
|
|
40
|
+
// 2) 无 metaTreeNode 时,尝试从值还原路径,并在 metaTree 中寻找“最深前缀节点”,
|
|
41
|
+
// 即便最后一段无效,也能显示前缀的翻译标题。
|
|
37
42
|
if (!value) return String(value);
|
|
38
|
-
const
|
|
39
|
-
|
|
43
|
+
const rawPath = parseValueToPath(value);
|
|
44
|
+
if (!rawPath || !Array.isArray(resolvedMetaTree)) {
|
|
45
|
+
return Array.isArray(rawPath) ? rawPath.join('/') : String(value);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 兼容 metaTree 为子树:顶层不含首段时,裁剪首段
|
|
49
|
+
const topNames = new Set((resolvedMetaTree || []).map((n: any) => String(n?.name)));
|
|
50
|
+
const path = !topNames.has(String(rawPath[0])) ? rawPath.slice(1) : rawPath;
|
|
51
|
+
if (!path.length) return '';
|
|
52
|
+
|
|
53
|
+
let nodes: MetaTreeNode[] | undefined = resolvedMetaTree as MetaTreeNode[];
|
|
54
|
+
let deepest: MetaTreeNode | null = null;
|
|
55
|
+
let matchedCount = 0;
|
|
56
|
+
for (let i = 0; i < path.length; i++) {
|
|
57
|
+
if (!nodes) break;
|
|
58
|
+
const seg = String(path[i]);
|
|
59
|
+
const node = nodes.find((n) => String(n?.name) === seg) as MetaTreeNode | undefined;
|
|
60
|
+
if (!node) break; // 停在第一个无效段之前
|
|
61
|
+
deepest = node;
|
|
62
|
+
matchedCount = i + 1;
|
|
63
|
+
if (i < path.length - 1) {
|
|
64
|
+
if (Array.isArray(node.children)) {
|
|
65
|
+
nodes = node.children as any;
|
|
66
|
+
} else if (typeof node.children === 'function') {
|
|
67
|
+
try {
|
|
68
|
+
const childNodes = await (node.children as any)();
|
|
69
|
+
(node as any).children = childNodes;
|
|
70
|
+
nodes = childNodes as any;
|
|
71
|
+
} catch {
|
|
72
|
+
nodes = undefined;
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
nodes = undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (deepest) {
|
|
81
|
+
const titles = deepest.parentTitles ? [...deepest.parentTitles, deepest.title] : [deepest.title];
|
|
82
|
+
let label = titles.map(ctx.t).join('/');
|
|
83
|
+
if (matchedCount < path.length) {
|
|
84
|
+
const tail = path.slice(matchedCount).join('/');
|
|
85
|
+
label = tail ? `${label}/${tail}` : label;
|
|
86
|
+
}
|
|
87
|
+
return label;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 3) 完全找不到任何前缀时,退回原始路径字符串
|
|
91
|
+
return path.join('/');
|
|
40
92
|
},
|
|
41
93
|
{ refreshDeps: [resolvedMetaTree, value, metaTreeNode] },
|
|
42
94
|
);
|
|
@@ -21,6 +21,7 @@ export interface FlowContextSelectorProps
|
|
|
21
21
|
formatPathToValue?: (item: MetaTreeNode) => string;
|
|
22
22
|
open?: boolean;
|
|
23
23
|
onlyLeafSelectable?: boolean;
|
|
24
|
+
ignoreFieldNames?: string[];
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export interface ContextSelectorItem {
|
|
@@ -69,6 +70,7 @@ export interface VariableInputProps {
|
|
|
69
70
|
* 默认行为为 null;可设置为 '' 等,以便清空后默认切换为“常量-空字符串”。
|
|
70
71
|
*/
|
|
71
72
|
clearValue?: any;
|
|
73
|
+
ignoreFieldNames?: string[];
|
|
72
74
|
[key: string]: any;
|
|
73
75
|
}
|
|
74
76
|
|
|
@@ -95,7 +95,9 @@ export const buildContextSelectorItems = (metaTree: MetaTreeNode[]): ContextSele
|
|
|
95
95
|
return [];
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
const convertNode = (node: MetaTreeNode): ContextSelectorItem => {
|
|
98
|
+
const convertNode = (node: MetaTreeNode): ContextSelectorItem | null => {
|
|
99
|
+
const hidden = !!(typeof node.hidden === 'function' ? node.hidden() : node.hidden);
|
|
100
|
+
if (hidden) return null;
|
|
99
101
|
const hasChildren = !!(
|
|
100
102
|
node.children &&
|
|
101
103
|
(typeof node.children === 'function' || (Array.isArray(node.children) && node.children.length > 0))
|
|
@@ -112,13 +114,15 @@ export const buildContextSelectorItems = (metaTree: MetaTreeNode[]): ContextSele
|
|
|
112
114
|
};
|
|
113
115
|
|
|
114
116
|
if (Array.isArray(node.children) && node.children.length > 0) {
|
|
115
|
-
option.children = node.children
|
|
117
|
+
option.children = node.children
|
|
118
|
+
.map((child) => convertNode(child))
|
|
119
|
+
.filter((item): item is ContextSelectorItem => item !== null);
|
|
116
120
|
}
|
|
117
121
|
|
|
118
122
|
return option;
|
|
119
123
|
};
|
|
120
124
|
|
|
121
|
-
return metaTree.map((node) => convertNode(node));
|
|
125
|
+
return metaTree.map((node) => convertNode(node)).filter((item): item is ContextSelectorItem => item !== null);
|
|
122
126
|
};
|
|
123
127
|
|
|
124
128
|
/**
|
package/src/data-source/index.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { observable } from '@formily/reactive';
|
|
11
|
+
import { CascaderProps } from 'antd';
|
|
11
12
|
import _ from 'lodash';
|
|
12
13
|
import { FlowEngine } from '../flowEngine';
|
|
13
14
|
import { jioToJoiSchema } from './jioToJoiSchema';
|
|
@@ -144,8 +145,8 @@ export class DataSource {
|
|
|
144
145
|
return this.collectionManager.upsertCollection(options);
|
|
145
146
|
}
|
|
146
147
|
|
|
147
|
-
upsertCollections(collections: CollectionOptions[]) {
|
|
148
|
-
return this.collectionManager.upsertCollections(collections);
|
|
148
|
+
upsertCollections(collections: CollectionOptions[], options: { clearFields?: boolean } = {}) {
|
|
149
|
+
return this.collectionManager.upsertCollections(collections, options);
|
|
149
150
|
}
|
|
150
151
|
|
|
151
152
|
removeCollection(name: string) {
|
|
@@ -166,7 +167,7 @@ export class DataSource {
|
|
|
166
167
|
const fieldName = otherKeys.join('.');
|
|
167
168
|
const collection = this.getCollection(collectionName);
|
|
168
169
|
if (!collection) {
|
|
169
|
-
|
|
170
|
+
return;
|
|
170
171
|
}
|
|
171
172
|
const field = collection.getFieldByPath(fieldName);
|
|
172
173
|
if (!field) {
|
|
@@ -186,6 +187,9 @@ export interface CollectionOptions {
|
|
|
186
187
|
export class CollectionManager {
|
|
187
188
|
collections: Map<string, Collection>;
|
|
188
189
|
|
|
190
|
+
allCollectionsInheritChain: string[];
|
|
191
|
+
protected childrenCollectionsName: { supportView?: string[]; notSupportView?: string[] } = {};
|
|
192
|
+
|
|
189
193
|
constructor(public dataSource: DataSource) {
|
|
190
194
|
this.collections = observable.shallow<Map<string, Collection>>(new Map());
|
|
191
195
|
}
|
|
@@ -210,12 +214,12 @@ export class CollectionManager {
|
|
|
210
214
|
this.collections.delete(name);
|
|
211
215
|
}
|
|
212
216
|
|
|
213
|
-
updateCollection(newOptions: CollectionOptions) {
|
|
217
|
+
updateCollection(newOptions: CollectionOptions, options: { clearFields?: boolean } = {}) {
|
|
214
218
|
const collection = this.getCollection(newOptions.name);
|
|
215
219
|
if (!collection) {
|
|
216
220
|
throw new Error(`Collection ${newOptions.name} not found`);
|
|
217
221
|
}
|
|
218
|
-
collection.setOptions(newOptions);
|
|
222
|
+
collection.setOptions(newOptions, options);
|
|
219
223
|
}
|
|
220
224
|
|
|
221
225
|
upsertCollection(options: CollectionOptions) {
|
|
@@ -227,10 +231,10 @@ export class CollectionManager {
|
|
|
227
231
|
return this.getCollection(options.name);
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
upsertCollections(collections: CollectionOptions[]) {
|
|
234
|
+
upsertCollections(collections: CollectionOptions[], options: { clearFields?: boolean } = {}) {
|
|
231
235
|
for (const collection of sortCollectionsByInherits(collections)) {
|
|
232
236
|
if (this.collections.has(collection.name)) {
|
|
233
|
-
this.updateCollection(collection);
|
|
237
|
+
this.updateCollection(collection, options);
|
|
234
238
|
} else {
|
|
235
239
|
this.addCollection(collection);
|
|
236
240
|
}
|
|
@@ -321,6 +325,98 @@ export class CollectionManager {
|
|
|
321
325
|
}
|
|
322
326
|
return collection.getField(fieldName);
|
|
323
327
|
}
|
|
328
|
+
|
|
329
|
+
getChildrenCollections(name) {
|
|
330
|
+
const childrens = [];
|
|
331
|
+
const collections = Array.from(this.collections.values());
|
|
332
|
+
const getChildrens = (name) => {
|
|
333
|
+
const inheritCollections = collections.filter((v: any) => {
|
|
334
|
+
return v.options.inherits?.includes(name);
|
|
335
|
+
});
|
|
336
|
+
inheritCollections.forEach((v) => {
|
|
337
|
+
const collectionKey = v.name;
|
|
338
|
+
childrens.push(v);
|
|
339
|
+
return getChildrens(collectionKey);
|
|
340
|
+
});
|
|
341
|
+
return childrens;
|
|
342
|
+
};
|
|
343
|
+
return getChildrens(name);
|
|
344
|
+
}
|
|
345
|
+
getChildrenCollectionsName(name, isSupportView = false) {
|
|
346
|
+
const cacheKey = isSupportView ? 'supportView' : 'notSupportView';
|
|
347
|
+
if (this.childrenCollectionsName[cacheKey]) {
|
|
348
|
+
return this.childrenCollectionsName[cacheKey].slice();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const children: string[] = [];
|
|
352
|
+
const collections = [...this.getCollections()];
|
|
353
|
+
const getChildrenCollectionsInner = (collectionName: string) => {
|
|
354
|
+
const inheritCollections = collections.filter((v: any) => {
|
|
355
|
+
return [...v.inherits]?.includes(collectionName);
|
|
356
|
+
});
|
|
357
|
+
inheritCollections.forEach((v) => {
|
|
358
|
+
const collectionKey = v.name;
|
|
359
|
+
children.push(collectionKey);
|
|
360
|
+
return getChildrenCollectionsInner(collectionKey);
|
|
361
|
+
});
|
|
362
|
+
if (isSupportView) {
|
|
363
|
+
const sourceCollections = collections.filter((v: any) => {
|
|
364
|
+
return [...v.sources]?.length === 1 && v?.sources[0] === collectionName;
|
|
365
|
+
});
|
|
366
|
+
sourceCollections.forEach((v) => {
|
|
367
|
+
const collectionKey = v.name;
|
|
368
|
+
children.push(v.name);
|
|
369
|
+
return getChildrenCollectionsInner(collectionKey);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
return _.uniq(children);
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
this.childrenCollectionsName[cacheKey] = getChildrenCollectionsInner(name);
|
|
376
|
+
return this.childrenCollectionsName[cacheKey];
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
getAllCollectionsInheritChain(name) {
|
|
380
|
+
if (this.allCollectionsInheritChain) {
|
|
381
|
+
return this.allCollectionsInheritChain.slice();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const collectionsInheritChain = [name];
|
|
385
|
+
const getInheritChain = (name: string) => {
|
|
386
|
+
const collection = this.getCollection(name);
|
|
387
|
+
if (collection) {
|
|
388
|
+
const { inherits } = collection as any;
|
|
389
|
+
const children = this.getChildrenCollectionsName(name);
|
|
390
|
+
// 搜寻祖先表
|
|
391
|
+
if (inherits) {
|
|
392
|
+
for (let index = 0; index < inherits.length; index++) {
|
|
393
|
+
const collectionKey = inherits[index];
|
|
394
|
+
if (collectionsInheritChain.includes(collectionKey)) {
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
collectionsInheritChain.push(collectionKey);
|
|
398
|
+
getInheritChain(collectionKey);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// 搜寻后代表
|
|
402
|
+
if (children) {
|
|
403
|
+
for (let index = 0; index < children.length; index++) {
|
|
404
|
+
const collection = this.getCollection(children[index]);
|
|
405
|
+
const collectionKey = collection.name;
|
|
406
|
+
if (collectionsInheritChain.includes(collectionKey)) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
collectionsInheritChain.push(collectionKey);
|
|
410
|
+
getInheritChain(collectionKey);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return collectionsInheritChain;
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
this.allCollectionsInheritChain = getInheritChain(name);
|
|
418
|
+
return this.allCollectionsInheritChain || [];
|
|
419
|
+
}
|
|
324
420
|
}
|
|
325
421
|
|
|
326
422
|
// Collection 负责管理自己的 Field
|
|
@@ -337,6 +433,12 @@ export class Collection {
|
|
|
337
433
|
this.setFields(options.fields || []);
|
|
338
434
|
}
|
|
339
435
|
|
|
436
|
+
clone() {
|
|
437
|
+
const newCollection = new Collection(_.cloneDeep(this.options));
|
|
438
|
+
newCollection.setDataSource(this.dataSource);
|
|
439
|
+
return newCollection;
|
|
440
|
+
}
|
|
441
|
+
|
|
340
442
|
getFilterByTK(record) {
|
|
341
443
|
if (!record) {
|
|
342
444
|
throw new Error('Record is required to get filterByTk');
|
|
@@ -350,9 +452,16 @@ export class Collection {
|
|
|
350
452
|
if (typeof this.filterTargetKey === 'string') {
|
|
351
453
|
return record[this.filterTargetKey];
|
|
352
454
|
}
|
|
455
|
+
if (Array.isArray(this.filterTargetKey) && this.filterTargetKey.length === 1) {
|
|
456
|
+
return record[this.filterTargetKey[0]];
|
|
457
|
+
}
|
|
353
458
|
return _.pick(record, this.filterTargetKey);
|
|
354
459
|
}
|
|
355
460
|
|
|
461
|
+
get titleableFields() {
|
|
462
|
+
return this.getFields().filter((field) => field.titleable);
|
|
463
|
+
}
|
|
464
|
+
|
|
356
465
|
get hidden() {
|
|
357
466
|
return this.options.hidden || false;
|
|
358
467
|
}
|
|
@@ -412,10 +521,13 @@ export class Collection {
|
|
|
412
521
|
this.dataSource = dataSource;
|
|
413
522
|
}
|
|
414
523
|
|
|
415
|
-
setOptions(newOptions: any = {}) {
|
|
524
|
+
setOptions(newOptions: any = {}, options: { clearFields?: boolean } = {}) {
|
|
416
525
|
Object.keys(this.options).forEach((key) => delete this.options[key]);
|
|
417
526
|
Object.assign(this.options, newOptions);
|
|
418
527
|
this.initInherits();
|
|
528
|
+
if (options.clearFields) {
|
|
529
|
+
this.clearFields();
|
|
530
|
+
}
|
|
419
531
|
this.upsertFields(this.options.fields || []);
|
|
420
532
|
}
|
|
421
533
|
|
|
@@ -483,14 +595,13 @@ export class Collection {
|
|
|
483
595
|
if (otherKeys.length === 0) {
|
|
484
596
|
return field;
|
|
485
597
|
}
|
|
486
|
-
if (!field
|
|
598
|
+
if (!field?.targetCollection) {
|
|
487
599
|
return null;
|
|
488
600
|
}
|
|
489
601
|
return field.targetCollection.getFieldByPath(otherKeys.join('.'));
|
|
490
602
|
}
|
|
491
603
|
|
|
492
604
|
getField(fieldName: string): CollectionField | undefined {
|
|
493
|
-
this.setFields(this.options.fields); //数据表字段被删除
|
|
494
605
|
return this.fields.get(fieldName);
|
|
495
606
|
}
|
|
496
607
|
|
|
@@ -621,6 +732,10 @@ export class CollectionField {
|
|
|
621
732
|
return this.options.readonly || this.options.uiSchema?.['x-read-pretty'] || false;
|
|
622
733
|
}
|
|
623
734
|
|
|
735
|
+
get titleable() {
|
|
736
|
+
return !!(this.options.titleable ?? this.options.titleUsable);
|
|
737
|
+
}
|
|
738
|
+
|
|
624
739
|
get fullpath() {
|
|
625
740
|
return this.collection.dataSource.key + '.' + this.collection.name + '.' + this.name;
|
|
626
741
|
}
|
|
@@ -654,7 +769,7 @@ export class CollectionField {
|
|
|
654
769
|
}
|
|
655
770
|
|
|
656
771
|
get title() {
|
|
657
|
-
const titleValue = this.options?.title || this.options?.
|
|
772
|
+
const titleValue = this.options?.uiSchema?.title || this.options?.title || this.options.name;
|
|
658
773
|
return this.flowEngine.translate(titleValue);
|
|
659
774
|
}
|
|
660
775
|
|
|
@@ -663,7 +778,22 @@ export class CollectionField {
|
|
|
663
778
|
}
|
|
664
779
|
|
|
665
780
|
get enum(): any[] {
|
|
666
|
-
|
|
781
|
+
const options = this.options.uiSchema?.enum || [];
|
|
782
|
+
if (this.type === 'integer') {
|
|
783
|
+
return options.map((v) => {
|
|
784
|
+
if (typeof v !== 'object') {
|
|
785
|
+
return v;
|
|
786
|
+
}
|
|
787
|
+
if (v.value === null || v.value === undefined) {
|
|
788
|
+
return v;
|
|
789
|
+
}
|
|
790
|
+
return {
|
|
791
|
+
...v,
|
|
792
|
+
value: Number(v.value),
|
|
793
|
+
};
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
return options;
|
|
667
797
|
}
|
|
668
798
|
|
|
669
799
|
get defaultValue() {
|
|
@@ -703,6 +833,7 @@ export class CollectionField {
|
|
|
703
833
|
multiple: target ? ['belongsToMany', 'hasMany', 'belongsToArray'].includes(type) : undefined,
|
|
704
834
|
maxCount: target && !['belongsToMany', 'hasMany', 'belongsToArray'].includes(type) ? 1 : undefined,
|
|
705
835
|
target: target,
|
|
836
|
+
template: this.targetCollection?.template,
|
|
706
837
|
},
|
|
707
838
|
_.isUndefined,
|
|
708
839
|
);
|
package/src/emitter.ts
CHANGED
|
@@ -30,4 +30,18 @@ export class Emitter {
|
|
|
30
30
|
}
|
|
31
31
|
(this.events[event] || []).forEach((fn) => fn(...args));
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 异步触发事件:按监听器注册顺序依次(串行)等待执行完成。
|
|
36
|
+
* - 若某个监听器抛错/Promise reject,将中断后续执行并将异常向上传递(便于调用方统一处理)。
|
|
37
|
+
* - 当前不提供并行触发能力;如需并发处理,请在监听器内部自行管理(例如在回调内使用 Promise.all)。
|
|
38
|
+
*/
|
|
39
|
+
async emitAsync(event: string, ...args: any[]): Promise<void> {
|
|
40
|
+
if (this.paused) return;
|
|
41
|
+
const listeners = (this.events[event] || []).slice(); // 防止触发过程中被修改
|
|
42
|
+
for (const fn of listeners) {
|
|
43
|
+
// 兼容同步/异步监听器
|
|
44
|
+
await fn(...args);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
33
47
|
}
|