@nocobase/flow-engine 2.0.0-alpha.7 → 2.0.0-alpha.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/BlockScopedFlowEngine.d.ts +23 -0
- package/lib/BlockScopedFlowEngine.js +91 -0
- package/lib/FlowContextProvider.d.ts +2 -2
- package/lib/FlowContextProvider.js +3 -3
- package/lib/FlowDefinition.d.ts +6 -4
- package/lib/JSRunner.d.ts +6 -0
- package/lib/JSRunner.js +27 -1
- package/lib/ViewScopedFlowEngine.d.ts +1 -1
- package/lib/ViewScopedFlowEngine.js +18 -1
- package/lib/acl/Acl.d.ts +12 -12
- package/lib/acl/Acl.js +88 -30
- package/lib/components/DynamicFlowsEditor.js +2 -4
- package/lib/components/FieldModelRenderer.js +17 -9
- package/lib/components/FieldSkeleton.d.ts +10 -0
- package/lib/components/FieldSkeleton.js +64 -0
- package/lib/components/FlowContextSelector.js +19 -3
- package/lib/components/FlowModelRenderer.d.ts +4 -6
- package/lib/components/FlowModelRenderer.js +35 -53
- package/lib/components/FormItem.js +5 -1
- package/lib/components/MobilePopup.d.ts +20 -0
- package/lib/components/MobilePopup.js +102 -0
- package/lib/components/MobilePopup.style.d.ts +17 -0
- package/lib/components/MobilePopup.style.js +186 -0
- package/lib/components/common/withFlowDesignMode.d.ts +1 -1
- package/lib/components/common/withFlowDesignMode.js +5 -5
- package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
- package/lib/components/dnd/gridDragPlanner.js +53 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +3 -1
- package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
- package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
- package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
- package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
- package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
- package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
- package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
- package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
- package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
- package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
- package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
- package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
- package/lib/components/subModel/AddSubModelButton.js +78 -8
- package/lib/components/subModel/LazyDropdown.js +14 -15
- package/lib/components/subModel/utils.d.ts +1 -1
- package/lib/components/subModel/utils.js +21 -11
- package/lib/components/variables/VariableInput.js +26 -6
- package/lib/components/variables/VariableTag.js +43 -2
- package/lib/components/variables/types.d.ts +2 -0
- package/lib/components/variables/utils.js +4 -2
- package/lib/data-source/index.d.ts +23 -4
- package/lib/data-source/index.js +135 -14
- package/lib/data-source/jioToJoiSchema.js +1 -0
- package/lib/emitter.d.ts +6 -0
- package/lib/emitter.js +12 -0
- package/lib/executor/FlowExecutor.d.ts +6 -6
- package/lib/executor/FlowExecutor.js +302 -99
- package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
- package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
- package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
- package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
- package/lib/flowContext.d.ts +105 -6
- package/lib/flowContext.js +447 -139
- package/lib/flowEngine.d.ts +71 -1
- package/lib/flowEngine.js +319 -16
- package/lib/flowSettings.d.ts +4 -3
- package/lib/flowSettings.js +45 -21
- package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
- package/lib/hooks/useApplyAutoFlows.js +3 -2
- package/lib/index.d.ts +14 -3
- package/lib/index.js +54 -7
- package/lib/locale/de-DE.json +62 -0
- package/lib/locale/en-US.json +57 -45
- package/lib/locale/es-ES.json +62 -0
- package/lib/locale/fr-FR.json +62 -0
- package/lib/locale/hu-HU.json +62 -0
- package/lib/locale/id-ID.json +62 -0
- package/lib/locale/index.d.ts +114 -90
- package/lib/locale/it-IT.json +62 -0
- package/lib/locale/ja-JP.json +62 -0
- package/lib/locale/ko-KR.json +62 -0
- package/lib/locale/nl-NL.json +62 -0
- package/lib/locale/pt-BR.json +62 -0
- package/lib/locale/ru-RU.json +62 -0
- package/lib/locale/tr-TR.json +62 -0
- package/lib/locale/uk-UA.json +62 -0
- package/lib/locale/vi-VN.json +62 -0
- package/lib/locale/zh-CN.json +58 -46
- package/lib/locale/zh-TW.json +62 -0
- package/lib/models/CollectionFieldModel.d.ts +7 -2
- package/lib/models/CollectionFieldModel.js +63 -16
- package/lib/models/flowModel.d.ts +76 -32
- package/lib/models/flowModel.js +300 -112
- package/lib/models/forkFlowModel.d.ts +8 -4
- package/lib/models/forkFlowModel.js +38 -8
- package/lib/provider.d.ts +3 -1
- package/lib/provider.js +14 -11
- package/lib/reactive/index.d.ts +10 -0
- package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
- package/lib/reactive/observer.d.ts +19 -0
- package/lib/reactive/observer.js +109 -0
- package/lib/resources/baseRecordResource.d.ts +6 -0
- package/lib/resources/baseRecordResource.js +38 -3
- package/lib/resources/multiRecordResource.d.ts +5 -2
- package/lib/resources/multiRecordResource.js +26 -10
- package/lib/resources/singleRecordResource.js +8 -3
- package/lib/resources/sqlResource.d.ts +5 -3
- package/lib/resources/sqlResource.js +30 -28
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
- package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
- package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
- package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
- package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
- package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
- package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
- package/lib/runjs-context/contexts/base.d.ts +9 -0
- package/lib/runjs-context/contexts/base.js +879 -0
- package/lib/runjs-context/contributions.d.ts +33 -0
- package/lib/runjs-context/contributions.js +88 -0
- package/lib/runjs-context/helpers.d.ts +5 -2
- package/lib/runjs-context/helpers.js +36 -27
- package/lib/runjs-context/registry.d.ts +7 -4
- package/lib/runjs-context/registry.js +10 -42
- package/lib/runjs-context/setup.d.ts +9 -0
- package/lib/runjs-context/setup.js +88 -0
- package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
- package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
- package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
- package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
- package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
- package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
- package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
- package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
- package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
- package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
- package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
- package/lib/runjs-context/snippets/index.d.ts +24 -3
- package/lib/runjs-context/snippets/index.js +183 -40
- package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
- package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
- package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
- package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
- package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
- package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
- package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
- package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
- package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
- package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
- package/lib/runjs-context/snippets/types.d.ts +9 -1
- package/lib/runjsLibs.d.ts +28 -0
- package/lib/runjsLibs.js +532 -0
- package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
- package/lib/scheduler/ModelOperationScheduler.js +262 -0
- package/lib/types.d.ts +66 -7
- package/lib/types.js +4 -3
- package/lib/utils/associationObjectVariable.d.ts +32 -0
- package/lib/utils/associationObjectVariable.js +157 -0
- package/lib/utils/createCollectionContextMeta.d.ts +1 -1
- package/lib/utils/createCollectionContextMeta.js +9 -4
- package/lib/utils/createEphemeralContext.d.ts +13 -0
- package/lib/utils/createEphemeralContext.js +140 -0
- package/lib/utils/flows.d.ts +10 -0
- package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
- package/lib/utils/index.d.ts +9 -3
- package/lib/utils/index.js +30 -2
- package/lib/utils/jsxTransform.d.ts +15 -0
- package/lib/utils/jsxTransform.js +68 -0
- package/lib/utils/params-resolvers.js +19 -12
- package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
- package/lib/utils/parsePathnameToViewParams.js +41 -5
- package/lib/utils/pruneFilter.d.ts +21 -0
- package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
- package/lib/utils/resolveModuleUrl.d.ts +58 -0
- package/lib/utils/resolveModuleUrl.js +65 -0
- package/lib/utils/runjsModuleLoader.d.ts +58 -0
- package/lib/utils/runjsModuleLoader.js +422 -0
- package/lib/utils/runjsTemplateCompat.d.ts +35 -0
- package/lib/utils/runjsTemplateCompat.js +743 -0
- package/lib/utils/safeGlobals.d.ts +6 -8
- package/lib/utils/safeGlobals.js +169 -14
- package/lib/utils/schema-utils.d.ts +6 -0
- package/lib/utils/schema-utils.js +71 -6
- package/lib/utils/serverContextParams.d.ts +4 -0
- package/lib/utils/serverContextParams.js +2 -0
- package/lib/utils/translation.d.ts +4 -1
- package/lib/utils/translation.js +6 -2
- package/lib/utils/variablesParams.d.ts +22 -5
- package/lib/utils/variablesParams.js +141 -61
- package/lib/views/DialogComponent.js +1 -5
- package/lib/views/DrawerComponent.js +18 -9
- package/lib/views/PageComponent.js +5 -5
- package/lib/views/ViewNavigation.d.ts +11 -15
- package/lib/views/ViewNavigation.js +37 -19
- package/lib/views/createViewMeta.d.ts +27 -5
- package/lib/views/createViewMeta.js +338 -72
- package/lib/views/index.d.ts +1 -1
- package/lib/views/index.js +4 -0
- package/lib/views/useDialog.d.ts +10 -9
- package/lib/views/useDialog.js +46 -34
- package/lib/views/useDrawer.d.ts +10 -9
- package/lib/views/useDrawer.js +74 -48
- package/lib/views/usePage.d.ts +14 -9
- package/lib/views/usePage.js +82 -33
- package/lib/views/usePopover.js +4 -1
- package/lib/views/viewEvents.d.ts +17 -0
- package/lib/views/viewEvents.js +90 -0
- package/package.json +6 -3
- package/src/BlockScopedFlowEngine.ts +85 -0
- package/src/FlowContextProvider.tsx +4 -2
- package/src/JSRunner.ts +39 -1
- package/src/ViewScopedFlowEngine.ts +21 -1
- package/src/__tests__/JSRunner.test.ts +125 -52
- package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
- package/src/__tests__/createViewMeta.popup.test.ts +203 -0
- package/src/__tests__/flow-engine.test.ts +3 -0
- package/src/__tests__/flowContext.test.ts +160 -0
- package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
- package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
- package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
- package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
- package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
- package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
- package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
- package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
- package/src/__tests__/flowSettings.open.test.tsx +71 -15
- package/src/__tests__/flowSettings.test.ts +2 -0
- package/src/__tests__/globalFlowRegistry.test.ts +1 -1
- package/src/__tests__/modelOperationScheduler.test.ts +346 -0
- package/src/__tests__/objectVariable.test.ts +464 -0
- package/src/__tests__/provider.test.tsx +0 -5
- package/src/__tests__/runjsContext.test.ts +219 -35
- package/src/__tests__/runjsContextImplementations.test.ts +217 -0
- package/src/__tests__/runjsContextRuntime.test.ts +269 -0
- package/src/__tests__/runjsEdgeCases.test.ts +281 -0
- package/src/__tests__/runjsExternalLibs.test.ts +242 -0
- package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
- package/src/__tests__/runjsLocales.test.ts +39 -0
- package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
- package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
- package/src/__tests__/runjsSnippets.test.ts +140 -0
- package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
- package/src/acl/Acl.tsx +85 -31
- package/src/acl/__tests__/Acl.test.tsx +43 -1
- package/src/components/DynamicFlowsEditor.tsx +0 -10
- package/src/components/FieldModelRenderer.tsx +22 -9
- package/src/components/FieldSkeleton.tsx +27 -0
- package/src/components/FlowContextSelector.tsx +20 -2
- package/src/components/FlowModelRenderer.tsx +52 -84
- package/src/components/FormItem.tsx +8 -1
- package/src/components/MobilePopup.style.ts +220 -0
- package/src/components/MobilePopup.tsx +86 -0
- package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
- package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
- package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
- package/src/components/common/withFlowDesignMode.tsx +5 -5
- package/src/components/dnd/gridDragPlanner.ts +60 -0
- package/src/components/index.ts +1 -0
- package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
- package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
- package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
- package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
- package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
- package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
- package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
- package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
- package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
- package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
- package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
- package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
- package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
- package/src/components/subModel/AddSubModelButton.tsx +104 -9
- package/src/components/subModel/LazyDropdown.tsx +14 -14
- package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
- package/src/components/subModel/__tests__/utils.test.ts +12 -12
- package/src/components/subModel/utils.ts +25 -6
- package/src/components/variables/VariableInput.tsx +32 -6
- package/src/components/variables/VariableTag.tsx +54 -2
- package/src/components/variables/types.ts +2 -0
- package/src/components/variables/utils.ts +7 -3
- package/src/data-source/index.ts +143 -12
- package/src/data-source/jioToJoiSchema.ts +1 -0
- package/src/emitter.ts +14 -0
- package/src/executor/FlowExecutor.ts +383 -119
- package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
- package/src/executor/__tests__/flowExecutor.test.ts +217 -5
- package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
- package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
- package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
- package/src/flowContext.ts +646 -158
- package/src/flowEngine.ts +385 -14
- package/src/flowSettings.ts +59 -30
- package/src/hooks/useApplyAutoFlows.ts +5 -3
- package/src/index.ts +26 -3
- package/src/locale/de-DE.json +62 -0
- package/src/locale/en-US.json +57 -45
- package/src/locale/es-ES.json +62 -0
- package/src/locale/fr-FR.json +62 -0
- package/src/locale/hu-HU.json +62 -0
- package/src/locale/id-ID.json +62 -0
- package/src/locale/it-IT.json +62 -0
- package/src/locale/ja-JP.json +62 -0
- package/src/locale/ko-KR.json +62 -0
- package/src/locale/nl-NL.json +62 -0
- package/src/locale/pt-BR.json +62 -0
- package/src/locale/ru-RU.json +62 -0
- package/src/locale/tr-TR.json +62 -0
- package/src/locale/uk-UA.json +62 -0
- package/src/locale/vi-VN.json +62 -0
- package/src/locale/zh-CN.json +58 -46
- package/src/locale/zh-TW.json +62 -0
- package/src/models/CollectionFieldModel.tsx +82 -18
- package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
- package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
- package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
- package/src/models/__tests__/flowModel.clone.test.ts +416 -0
- package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
- package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
- package/src/models/__tests__/flowModel.test.ts +296 -119
- package/src/models/__tests__/forkFlowModel.test.ts +40 -7
- package/src/models/flowModel.tsx +426 -148
- package/src/models/forkFlowModel.ts +48 -8
- package/src/provider.tsx +18 -14
- package/src/reactive/__tests__/observer.test.tsx +211 -0
- package/src/reactive/index.ts +11 -0
- package/src/reactive/observer.tsx +101 -0
- package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
- package/src/resources/__tests__/sqlResource.test.ts +60 -0
- package/src/resources/baseRecordResource.ts +46 -3
- package/src/resources/multiRecordResource.ts +28 -12
- package/src/resources/singleRecordResource.ts +9 -3
- package/src/resources/sqlResource.ts +33 -32
- package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
- package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
- package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
- package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
- package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
- package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
- package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
- package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
- package/src/runjs-context/contexts/base.ts +871 -0
- package/src/runjs-context/contributions.ts +88 -0
- package/src/runjs-context/helpers.ts +32 -30
- package/src/runjs-context/registry.ts +16 -47
- package/src/runjs-context/setup.ts +57 -0
- package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
- package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
- package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
- package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
- package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
- package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
- package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
- package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
- package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
- package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
- package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
- package/src/runjs-context/snippets/index.ts +212 -39
- package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
- package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
- package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
- package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
- package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
- package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
- package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
- package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
- package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
- package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
- package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
- package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
- package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
- package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
- package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
- package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
- package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
- package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
- package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
- package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
- package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
- package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
- package/src/runjs-context/snippets/types.ts +5 -1
- package/src/runjsLibs.ts +622 -0
- package/src/scheduler/ModelOperationScheduler.ts +306 -0
- package/src/types.ts +86 -5
- package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
- package/src/utils/__tests__/flows.test.ts +65 -0
- package/src/utils/__tests__/jsxTransform.test.ts +38 -0
- package/src/utils/__tests__/params-resolvers.test.ts +40 -0
- package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
- package/src/utils/__tests__/pruneFilter.test.ts +38 -0
- package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
- package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
- package/src/utils/__tests__/safeGlobals.test.ts +79 -2
- package/src/utils/__tests__/utils.test.ts +114 -15
- package/src/utils/__tests__/variablesParams.test.ts +120 -0
- package/src/utils/associationObjectVariable.ts +180 -0
- package/src/utils/createCollectionContextMeta.ts +9 -3
- package/src/utils/createEphemeralContext.ts +142 -0
- package/src/utils/flows.ts +23 -0
- package/src/utils/index.ts +17 -3
- package/src/utils/jsxTransform.ts +39 -0
- package/src/utils/params-resolvers.ts +25 -11
- package/src/utils/parsePathnameToViewParams.ts +50 -6
- package/src/utils/pruneFilter.ts +41 -0
- package/src/utils/resolveModuleUrl.ts +91 -0
- package/src/utils/runjsModuleLoader.ts +553 -0
- package/src/utils/runjsTemplateCompat.ts +828 -0
- package/src/utils/safeGlobals.ts +181 -15
- package/src/utils/schema-utils.ts +81 -3
- package/src/utils/serverContextParams.ts +6 -0
- package/src/utils/translation.ts +7 -2
- package/src/utils/variablesParams.ts +164 -72
- package/src/views/DialogComponent.tsx +1 -4
- package/src/views/DrawerComponent.tsx +19 -7
- package/src/views/PageComponent.tsx +3 -5
- package/src/views/ViewNavigation.ts +49 -43
- package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
- package/src/views/__tests__/ViewNavigation.test.ts +54 -34
- package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
- package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
- package/src/views/createViewMeta.ts +402 -73
- package/src/views/index.tsx +1 -1
- package/src/views/useDialog.tsx +52 -31
- package/src/views/useDrawer.tsx +99 -55
- package/src/views/usePage.tsx +101 -33
- package/src/views/usePopover.tsx +4 -1
- package/src/views/viewEvents.ts +55 -0
- package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
- package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
- package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
- package/lib/runjs-context/index.d.ts +0 -19
- package/lib/runjs-context/index.js +0 -57
- package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
- package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
- package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
- package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
- package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
- package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
- package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
- package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
- package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
- package/src/runjs-context/index.ts +0 -20
- package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
- package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
- package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
- package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
- package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
- package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
- package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
- package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
- package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
- package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
- package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
- package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
- package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
- package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
- package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
- package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
- package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
- /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
- /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
11
|
+
import { APIClient as SDKApiClient } from '@nocobase/sdk';
|
|
12
|
+
import { FlowEngine } from '../flowEngine';
|
|
13
|
+
import { createBlockScopedEngine } from '../BlockScopedFlowEngine';
|
|
14
|
+
import { FlowModel } from '../models';
|
|
15
|
+
|
|
16
|
+
describe('BlockScopedFlowEngine', () => {
|
|
17
|
+
it('shares global actions/events and model classes with parent', async () => {
|
|
18
|
+
const parent = new FlowEngine();
|
|
19
|
+
// 在运行时 host app 会注入 api,这里补一个最小 mock,避免偶发访问 ctx.auth 抛错
|
|
20
|
+
const api = new SDKApiClient({ storageType: 'memory' });
|
|
21
|
+
api.auth.role = 'guest';
|
|
22
|
+
api.auth.locale = 'en-US';
|
|
23
|
+
api.auth.token = 't';
|
|
24
|
+
parent.context.defineProperty('api', { value: api });
|
|
25
|
+
parent.registerActions({
|
|
26
|
+
ping: {
|
|
27
|
+
name: 'ping',
|
|
28
|
+
handler: () => 'pong',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const child = createBlockScopedEngine(parent);
|
|
32
|
+
|
|
33
|
+
// child can read parent's action
|
|
34
|
+
expect(child.getAction('ping')).toBeDefined();
|
|
35
|
+
|
|
36
|
+
// registering via child should affect parent
|
|
37
|
+
child.registerActions({ pong: { name: 'pong', handler: () => 'ok' } });
|
|
38
|
+
expect(parent.getAction('pong')).toBeDefined();
|
|
39
|
+
|
|
40
|
+
// model class resolution is proxied
|
|
41
|
+
class TestModel extends FlowModel {}
|
|
42
|
+
parent.registerModels({ TestModel });
|
|
43
|
+
expect(child.getModelClass('TestModel')).toBeDefined();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('isolates model instances map and beforeRender cache across engines with identical model uid', async () => {
|
|
47
|
+
const parent = new FlowEngine();
|
|
48
|
+
// 提供最小 api mock,满足 ctx.auth 相关 getter
|
|
49
|
+
const api = new SDKApiClient({ storageType: 'memory' });
|
|
50
|
+
api.auth.role = 'guest';
|
|
51
|
+
api.auth.locale = 'en-US';
|
|
52
|
+
api.auth.token = 't';
|
|
53
|
+
parent.context.defineProperty('api', { value: api });
|
|
54
|
+
const child = createBlockScopedEngine(parent);
|
|
55
|
+
|
|
56
|
+
let count = 0;
|
|
57
|
+
class CounterModel extends FlowModel {}
|
|
58
|
+
CounterModel.registerFlow({
|
|
59
|
+
key: 'autoCounter',
|
|
60
|
+
steps: {
|
|
61
|
+
s1: {
|
|
62
|
+
handler: async () => {
|
|
63
|
+
count += 1;
|
|
64
|
+
return count;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const uid = 'model-uid-cache';
|
|
71
|
+
const pm = parent.createModel<CounterModel>({ use: CounterModel, uid });
|
|
72
|
+
const cm = child.createModel<CounterModel>({ use: CounterModel, uid });
|
|
73
|
+
|
|
74
|
+
await pm.dispatchEvent('beforeRender');
|
|
75
|
+
expect(count).toBe(1);
|
|
76
|
+
|
|
77
|
+
// If cache was shared, the next call would hit cache and not increment.
|
|
78
|
+
await cm.dispatchEvent('beforeRender');
|
|
79
|
+
expect(count).toBe(2);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('stacks engines and repairs chain when unlinking a middle block-scoped engine', () => {
|
|
83
|
+
const root = new FlowEngine();
|
|
84
|
+
// 提供最小 api mock,满足 ctx.auth 相关 getter
|
|
85
|
+
const api = new SDKApiClient({ storageType: 'memory' });
|
|
86
|
+
api.auth.role = 'guest';
|
|
87
|
+
api.auth.locale = 'en-US';
|
|
88
|
+
api.auth.token = 't';
|
|
89
|
+
root.context.defineProperty('api', { value: api });
|
|
90
|
+
const c1 = createBlockScopedEngine(root);
|
|
91
|
+
const c2 = createBlockScopedEngine(root);
|
|
92
|
+
const c3 = createBlockScopedEngine(root);
|
|
93
|
+
|
|
94
|
+
// chain root -> c1 -> c2 -> c3
|
|
95
|
+
expect(root.nextEngine).toBeTruthy();
|
|
96
|
+
expect(root.nextEngine?.nextEngine).toBeTruthy();
|
|
97
|
+
expect(root.nextEngine?.nextEngine?.nextEngine).toBeTruthy();
|
|
98
|
+
|
|
99
|
+
// unlink middle (c2) should link c1 <-> c3 and keep the tail intact
|
|
100
|
+
c2.unlinkFromStack();
|
|
101
|
+
|
|
102
|
+
// root.nextEngine 指向的是被代理的本地 FlowEngine 实例,不与 c1 的 Proxy 引用相等
|
|
103
|
+
// 这里通过前后指针关系来校验链修复是否正确
|
|
104
|
+
const first = root.nextEngine;
|
|
105
|
+
const second = first?.nextEngine;
|
|
106
|
+
expect(first?.previousEngine).toBe(root);
|
|
107
|
+
expect(second?.previousEngine).toBe(first);
|
|
108
|
+
expect(second?.nextEngine).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('global model lookup traverses from top to root across stack', () => {
|
|
112
|
+
const root = new FlowEngine();
|
|
113
|
+
// 提供最小 api mock,满足 ctx.auth 相关 getter
|
|
114
|
+
const api = new SDKApiClient({ storageType: 'memory' });
|
|
115
|
+
api.auth.role = 'guest';
|
|
116
|
+
api.auth.locale = 'en-US';
|
|
117
|
+
api.auth.token = 't';
|
|
118
|
+
root.context.defineProperty('api', { value: api });
|
|
119
|
+
const c1 = createBlockScopedEngine(root);
|
|
120
|
+
const c2 = createBlockScopedEngine(root);
|
|
121
|
+
|
|
122
|
+
class TM extends FlowModel {}
|
|
123
|
+
const uid = 'same-uid-global-lookup';
|
|
124
|
+
const mRoot = root.createModel<TM>({ use: TM, uid });
|
|
125
|
+
const m1 = c1.createModel<TM>({ use: TM, uid });
|
|
126
|
+
const m2 = c2.createModel<TM>({ use: TM, uid });
|
|
127
|
+
|
|
128
|
+
// sanity: each scope returns its own when not global
|
|
129
|
+
expect(root.getModel(uid)).toBe(mRoot);
|
|
130
|
+
expect(c1.getModel(uid)).toBe(m1);
|
|
131
|
+
expect(c2.getModel(uid)).toBe(m2);
|
|
132
|
+
|
|
133
|
+
// global search from any engine hits the top-most engine's instance first
|
|
134
|
+
expect(root.getModel(uid, true)).toBe(m2);
|
|
135
|
+
expect(c1.getModel(uid, true)).toBe(m2);
|
|
136
|
+
expect(c2.getModel(uid, true)).toBe(m2);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('delegates saveModel to parent (concurrency gate sharing)', async () => {
|
|
140
|
+
const parent = new FlowEngine();
|
|
141
|
+
// 提供最小 api mock,满足 ctx.auth 相关 getter
|
|
142
|
+
const api = new SDKApiClient({ storageType: 'memory' });
|
|
143
|
+
api.auth.role = 'guest';
|
|
144
|
+
api.auth.locale = 'en-US';
|
|
145
|
+
api.auth.token = 't';
|
|
146
|
+
parent.context.defineProperty('api', { value: api });
|
|
147
|
+
const child = createBlockScopedEngine(parent);
|
|
148
|
+
const spy = vi.spyOn(parent, 'saveModel').mockResolvedValueOnce(true);
|
|
149
|
+
class T extends FlowModel {}
|
|
150
|
+
const m = child.createModel<T>({ use: T });
|
|
151
|
+
await child.saveModel(m);
|
|
152
|
+
expect(spy).toHaveBeenCalledOnce();
|
|
153
|
+
});
|
|
154
|
+
});
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
+
import { FlowContext } from '../flowContext';
|
|
12
|
+
import { FlowEngine } from '../flowEngine';
|
|
13
|
+
import type { FlowView } from '../views/FlowView';
|
|
14
|
+
import { createPopupMeta } from '../views/createViewMeta';
|
|
15
|
+
|
|
16
|
+
describe('createPopupMeta - popup variables', () => {
|
|
17
|
+
function makeCtx() {
|
|
18
|
+
const engine = new FlowEngine();
|
|
19
|
+
const ctx = new FlowContext();
|
|
20
|
+
ctx.defineProperty('engine', { value: engine });
|
|
21
|
+
// 简化 i18n:直接返回 key
|
|
22
|
+
ctx.defineProperty('t', { value: (s: string) => s });
|
|
23
|
+
return { engine, ctx };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
it('buildVariablesParams(record) uses anchor view instead of ctx.view', async () => {
|
|
27
|
+
const { engine, ctx } = makeCtx();
|
|
28
|
+
|
|
29
|
+
// 模拟锚定弹窗视图(被测试目标)
|
|
30
|
+
const anchorView: FlowView = {
|
|
31
|
+
type: 'embed',
|
|
32
|
+
inputArgs: {},
|
|
33
|
+
Header: null,
|
|
34
|
+
Footer: null,
|
|
35
|
+
close: () => void 0,
|
|
36
|
+
update: () => void 0,
|
|
37
|
+
navigation: {
|
|
38
|
+
viewStack: [
|
|
39
|
+
{
|
|
40
|
+
viewUid: 'base-page-uid',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
viewUid: 'popup-uid',
|
|
44
|
+
filterByTk: 111,
|
|
45
|
+
sourceId: 42,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
} as any,
|
|
49
|
+
} as any;
|
|
50
|
+
|
|
51
|
+
// ctx.view 指向另一个(例如设置弹窗)
|
|
52
|
+
ctx.defineProperty('view', {
|
|
53
|
+
value: {
|
|
54
|
+
type: 'dialog',
|
|
55
|
+
inputArgs: {},
|
|
56
|
+
navigation: {
|
|
57
|
+
viewStack: [
|
|
58
|
+
{
|
|
59
|
+
viewUid: 'settings-uid',
|
|
60
|
+
filterByTk: 9999,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// 为两个视图 uid 注入不同的 openView 配置,确保只取锚定视图
|
|
68
|
+
const popupModel = {
|
|
69
|
+
getStepParams: vi.fn((_fk: string, sk: string) =>
|
|
70
|
+
sk === 'openView'
|
|
71
|
+
? {
|
|
72
|
+
collectionName: 'posts',
|
|
73
|
+
dataSourceKey: 'main',
|
|
74
|
+
associationName: 'users.posts',
|
|
75
|
+
}
|
|
76
|
+
: undefined,
|
|
77
|
+
),
|
|
78
|
+
} as any;
|
|
79
|
+
const settingsModel = {
|
|
80
|
+
getStepParams: vi.fn((_fk: string, sk: string) =>
|
|
81
|
+
sk === 'openView'
|
|
82
|
+
? {
|
|
83
|
+
collectionName: 'comments',
|
|
84
|
+
dataSourceKey: 'main',
|
|
85
|
+
}
|
|
86
|
+
: undefined,
|
|
87
|
+
),
|
|
88
|
+
} as any;
|
|
89
|
+
|
|
90
|
+
const getModelSpy = vi.spyOn(engine as any, 'getModel');
|
|
91
|
+
getModelSpy.mockImplementation((uid: string) => (uid === 'popup-uid' ? popupModel : settingsModel));
|
|
92
|
+
|
|
93
|
+
const metaFactory = createPopupMeta(ctx, anchorView);
|
|
94
|
+
const meta = (await metaFactory())!;
|
|
95
|
+
|
|
96
|
+
// record 应来自锚定视图的 openView 配置
|
|
97
|
+
const vars = (await meta.buildVariablesParams!(ctx)) as any;
|
|
98
|
+
expect(vars).toBeTruthy();
|
|
99
|
+
expect(vars.record).toEqual({
|
|
100
|
+
collection: 'posts',
|
|
101
|
+
dataSourceKey: 'main',
|
|
102
|
+
filterByTk: 111,
|
|
103
|
+
associationName: 'users.posts',
|
|
104
|
+
sourceId: 42,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// 确认没有误用 ctx.view(settings-uid)的集合
|
|
108
|
+
expect(vars.record.collection).not.toBe('comments');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('properties() provides a record factory node (lazy) with title', async () => {
|
|
112
|
+
const { engine, ctx } = makeCtx();
|
|
113
|
+
// 只要能通过 anchorView 推断到集合名和主键即可;集合详情在懒加载时再取
|
|
114
|
+
const anchorView: FlowView = {
|
|
115
|
+
type: 'embed',
|
|
116
|
+
inputArgs: {},
|
|
117
|
+
Header: null,
|
|
118
|
+
Footer: null,
|
|
119
|
+
close: () => void 0,
|
|
120
|
+
update: () => void 0,
|
|
121
|
+
navigation: { viewStack: [{ viewUid: 'base-page-uid' }, { viewUid: 'popup-uid', filterByTk: 1 }] } as any,
|
|
122
|
+
} as any;
|
|
123
|
+
const popupModel = {
|
|
124
|
+
getStepParams: vi.fn((_fk: string, sk: string) =>
|
|
125
|
+
sk === 'openView'
|
|
126
|
+
? {
|
|
127
|
+
collectionName: 'tasks',
|
|
128
|
+
dataSourceKey: 'main',
|
|
129
|
+
}
|
|
130
|
+
: undefined,
|
|
131
|
+
),
|
|
132
|
+
} as any;
|
|
133
|
+
vi.spyOn(engine as any, 'getModel').mockImplementation(() => popupModel);
|
|
134
|
+
|
|
135
|
+
const meta = (await createPopupMeta(ctx, anchorView)())!;
|
|
136
|
+
const props = typeof meta.properties === 'function' ? await (meta.properties as any)() : meta.properties || {};
|
|
137
|
+
// 断言存在 record 节点工厂,且有标题(懒加载,不触发集合访问)
|
|
138
|
+
expect(typeof props.record).toBe('function');
|
|
139
|
+
expect((props.record as any).title).toBe('Current popup record');
|
|
140
|
+
expect((props.record as any).hasChildren).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('treats views with openerUids as popup (meta visible)', async () => {
|
|
144
|
+
const { ctx } = makeCtx();
|
|
145
|
+
|
|
146
|
+
// openerUids 作为路由栈缺失时的兜底标记:即使没有 navigation.viewStack,也应展示 ctx.popup 元信息
|
|
147
|
+
const anchorView: FlowView = {
|
|
148
|
+
type: 'dialog',
|
|
149
|
+
inputArgs: {
|
|
150
|
+
openerUids: ['opener-uid-1'],
|
|
151
|
+
viewUid: 'popup-uid',
|
|
152
|
+
dataSourceKey: 'main',
|
|
153
|
+
collectionName: 'posts',
|
|
154
|
+
filterByTk: 1,
|
|
155
|
+
},
|
|
156
|
+
Header: null,
|
|
157
|
+
Footer: null,
|
|
158
|
+
close: () => void 0,
|
|
159
|
+
update: () => void 0,
|
|
160
|
+
} as any;
|
|
161
|
+
|
|
162
|
+
const meta = (await createPopupMeta(ctx, anchorView)())!;
|
|
163
|
+
expect(typeof meta.hidden).toBe('function');
|
|
164
|
+
expect((meta.hidden as any)()).toBe(false);
|
|
165
|
+
expect(typeof meta.disabled).toBe('function');
|
|
166
|
+
expect((meta.disabled as any)()).toBe(false);
|
|
167
|
+
|
|
168
|
+
const vars = (await meta.buildVariablesParams!(ctx)) as any;
|
|
169
|
+
expect(vars).toBeTruthy();
|
|
170
|
+
expect(vars.record).toEqual({
|
|
171
|
+
collection: 'posts',
|
|
172
|
+
dataSourceKey: 'main',
|
|
173
|
+
filterByTk: 1,
|
|
174
|
+
associationName: undefined,
|
|
175
|
+
sourceId: undefined,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('does not expose popup.record without filterByTk', async () => {
|
|
180
|
+
const { ctx } = makeCtx();
|
|
181
|
+
|
|
182
|
+
const anchorView: FlowView = {
|
|
183
|
+
type: 'dialog',
|
|
184
|
+
inputArgs: {
|
|
185
|
+
openerUids: ['opener-uid-1'],
|
|
186
|
+
viewUid: 'popup-uid',
|
|
187
|
+
dataSourceKey: 'main',
|
|
188
|
+
collectionName: 'posts',
|
|
189
|
+
// filterByTk 缺失:不应展示“当前弹窗记录”变量
|
|
190
|
+
},
|
|
191
|
+
Header: null,
|
|
192
|
+
Footer: null,
|
|
193
|
+
close: () => void 0,
|
|
194
|
+
update: () => void 0,
|
|
195
|
+
} as any;
|
|
196
|
+
|
|
197
|
+
ctx.defineProperty('view', { value: anchorView });
|
|
198
|
+
|
|
199
|
+
const meta = (await createPopupMeta(ctx, anchorView)())!;
|
|
200
|
+
const props = typeof meta.properties === 'function' ? await (meta.properties as any)() : meta.properties || {};
|
|
201
|
+
expect(props.record).toBeUndefined();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
@@ -241,6 +241,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
241
241
|
parentTitles: undefined,
|
|
242
242
|
disabled: false,
|
|
243
243
|
disabledReason: undefined,
|
|
244
|
+
hidden: false,
|
|
244
245
|
children: undefined,
|
|
245
246
|
},
|
|
246
247
|
{
|
|
@@ -253,6 +254,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
253
254
|
parentTitles: undefined,
|
|
254
255
|
disabled: false,
|
|
255
256
|
disabledReason: undefined,
|
|
257
|
+
hidden: false,
|
|
256
258
|
children: [
|
|
257
259
|
{
|
|
258
260
|
name: 'baz',
|
|
@@ -264,6 +266,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
264
266
|
parentTitles: ['Bar'],
|
|
265
267
|
disabled: false,
|
|
266
268
|
disabledReason: undefined,
|
|
269
|
+
hidden: false,
|
|
267
270
|
children: undefined,
|
|
268
271
|
},
|
|
269
272
|
{
|
|
@@ -276,6 +279,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
276
279
|
parentTitles: ['Bar'],
|
|
277
280
|
disabled: false,
|
|
278
281
|
disabledReason: undefined,
|
|
282
|
+
hidden: false,
|
|
279
283
|
children: undefined,
|
|
280
284
|
},
|
|
281
285
|
],
|
|
@@ -316,6 +320,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
316
320
|
parentTitles: undefined,
|
|
317
321
|
disabled: false,
|
|
318
322
|
disabledReason: undefined,
|
|
323
|
+
hidden: false,
|
|
319
324
|
children: undefined,
|
|
320
325
|
},
|
|
321
326
|
{
|
|
@@ -328,6 +333,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
328
333
|
parentTitles: undefined,
|
|
329
334
|
disabled: false,
|
|
330
335
|
disabledReason: undefined,
|
|
336
|
+
hidden: false,
|
|
331
337
|
children: [
|
|
332
338
|
{
|
|
333
339
|
name: 'x',
|
|
@@ -339,6 +345,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
339
345
|
parentTitles: ['Local Bar'],
|
|
340
346
|
disabled: false,
|
|
341
347
|
disabledReason: undefined,
|
|
348
|
+
hidden: false,
|
|
342
349
|
children: undefined,
|
|
343
350
|
},
|
|
344
351
|
],
|
|
@@ -390,6 +397,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
390
397
|
parentTitles: undefined,
|
|
391
398
|
disabled: false,
|
|
392
399
|
disabledReason: undefined,
|
|
400
|
+
hidden: false,
|
|
393
401
|
children: [
|
|
394
402
|
{
|
|
395
403
|
name: 'field1',
|
|
@@ -401,6 +409,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
401
409
|
parentTitles: ['Sync Property'],
|
|
402
410
|
disabled: false,
|
|
403
411
|
disabledReason: undefined,
|
|
412
|
+
hidden: false,
|
|
404
413
|
children: undefined,
|
|
405
414
|
},
|
|
406
415
|
{
|
|
@@ -413,6 +422,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
413
422
|
parentTitles: ['Sync Property'],
|
|
414
423
|
disabled: false,
|
|
415
424
|
disabledReason: undefined,
|
|
425
|
+
hidden: false,
|
|
416
426
|
children: undefined,
|
|
417
427
|
},
|
|
418
428
|
],
|
|
@@ -436,6 +446,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
436
446
|
parentTitles: ['Async Property'],
|
|
437
447
|
disabled: false,
|
|
438
448
|
disabledReason: undefined,
|
|
449
|
+
hidden: false,
|
|
439
450
|
children: undefined,
|
|
440
451
|
},
|
|
441
452
|
{
|
|
@@ -448,6 +459,7 @@ describe('FlowContext properties and methods', () => {
|
|
|
448
459
|
parentTitles: ['Async Property'],
|
|
449
460
|
disabled: false,
|
|
450
461
|
disabledReason: undefined,
|
|
462
|
+
hidden: false,
|
|
451
463
|
children: undefined,
|
|
452
464
|
},
|
|
453
465
|
]);
|
|
@@ -747,6 +759,96 @@ describe('FlowEngine context', () => {
|
|
|
747
759
|
expect(engine.context.appName).toBe('NocoBase');
|
|
748
760
|
});
|
|
749
761
|
|
|
762
|
+
it('ctx.sql should resolve template variables from caller context in delegate chain', async () => {
|
|
763
|
+
const engine = new FlowEngine();
|
|
764
|
+
const request = vi.fn(async () => ({ data: { data: [] } }));
|
|
765
|
+
engine.context.defineProperty('api', {
|
|
766
|
+
value: { request },
|
|
767
|
+
});
|
|
768
|
+
engine.context.defineProperty('minId', {
|
|
769
|
+
get: () => 999,
|
|
770
|
+
cache: false,
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
const callerCtx = new FlowContext();
|
|
774
|
+
callerCtx.addDelegate(engine.context);
|
|
775
|
+
callerCtx.defineProperty('minId', {
|
|
776
|
+
get: () => 1,
|
|
777
|
+
cache: false,
|
|
778
|
+
});
|
|
779
|
+
|
|
780
|
+
await callerCtx.sql.run('SELECT * FROM users WHERE id > {{ctx.minId}}', { type: 'selectRows' });
|
|
781
|
+
|
|
782
|
+
expect(request).toHaveBeenCalledTimes(1);
|
|
783
|
+
const config = request.mock.calls[0]?.[0];
|
|
784
|
+
expect(config?.url).toBe('flowSql:run');
|
|
785
|
+
expect(config?.data.bind.__var1).toBe(1);
|
|
786
|
+
});
|
|
787
|
+
|
|
788
|
+
it('ctx.sql should not share repository instance between different caller contexts', async () => {
|
|
789
|
+
const engine = new FlowEngine();
|
|
790
|
+
const request = vi.fn(async () => ({ data: { data: [] } }));
|
|
791
|
+
engine.context.defineProperty('api', {
|
|
792
|
+
value: { request },
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
const caller1 = new FlowContext();
|
|
796
|
+
caller1.addDelegate(engine.context);
|
|
797
|
+
caller1.defineProperty('minId', {
|
|
798
|
+
get: () => 1,
|
|
799
|
+
cache: false,
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
const caller2 = new FlowContext();
|
|
803
|
+
caller2.addDelegate(engine.context);
|
|
804
|
+
caller2.defineProperty('minId', {
|
|
805
|
+
get: () => 2,
|
|
806
|
+
cache: false,
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
expect(caller1.sql).not.toBe(caller2.sql);
|
|
810
|
+
|
|
811
|
+
await caller1.sql.run('SELECT * FROM users WHERE id > {{ctx.minId}}', { type: 'selectRows' });
|
|
812
|
+
await caller2.sql.run('SELECT * FROM users WHERE id > {{ctx.minId}}', { type: 'selectRows' });
|
|
813
|
+
|
|
814
|
+
expect(request).toHaveBeenCalledTimes(2);
|
|
815
|
+
const config1 = request.mock.calls[0]?.[0];
|
|
816
|
+
const config2 = request.mock.calls[1]?.[0];
|
|
817
|
+
expect(config1?.data.bind.__var1).toBe(1);
|
|
818
|
+
expect(config2?.data.bind.__var1).toBe(2);
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
it('engine.context.sql should keep working when accessed directly', async () => {
|
|
822
|
+
const engine = new FlowEngine();
|
|
823
|
+
const request = vi.fn(async () => ({ data: { data: [] } }));
|
|
824
|
+
engine.context.defineProperty('api', {
|
|
825
|
+
value: { request },
|
|
826
|
+
});
|
|
827
|
+
engine.context.defineProperty('minId', {
|
|
828
|
+
get: () => 3,
|
|
829
|
+
cache: false,
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
await engine.context.sql.run('SELECT * FROM users WHERE id > {{ctx.minId}}', { type: 'selectRows' });
|
|
833
|
+
|
|
834
|
+
expect(request).toHaveBeenCalledTimes(1);
|
|
835
|
+
const config = request.mock.calls[0]?.[0];
|
|
836
|
+
expect(config?.url).toBe('flowSql:run');
|
|
837
|
+
expect(config?.data.bind.__var1).toBe(3);
|
|
838
|
+
});
|
|
839
|
+
|
|
840
|
+
it('engine.context.getVar should resolve variable by path', async () => {
|
|
841
|
+
const engine = new FlowEngine();
|
|
842
|
+
engine.context.defineProperty('foo', { value: { bar: 1 } });
|
|
843
|
+
|
|
844
|
+
const v1 = await (engine.context as any).getVar('ctx.foo.bar');
|
|
845
|
+
expect(v1).toBe(1);
|
|
846
|
+
|
|
847
|
+
await expect((engine.context as any).getVar('{{ ctx.foo.bar }}')).rejects.toThrow();
|
|
848
|
+
|
|
849
|
+
await expect((engine.context as any).getVar('foo.bar')).rejects.toThrow();
|
|
850
|
+
});
|
|
851
|
+
|
|
750
852
|
it('engine.context.runAction should resolve action from engine.getAction', async () => {
|
|
751
853
|
const engine = new FlowEngine();
|
|
752
854
|
|
|
@@ -997,6 +1099,7 @@ describe('FlowContext delayed meta loading', () => {
|
|
|
997
1099
|
parentTitles: ['Delayed User'],
|
|
998
1100
|
disabled: false,
|
|
999
1101
|
disabledReason: undefined,
|
|
1102
|
+
hidden: false,
|
|
1000
1103
|
children: undefined,
|
|
1001
1104
|
});
|
|
1002
1105
|
expect(children[1]).toEqual({
|
|
@@ -1009,6 +1112,7 @@ describe('FlowContext delayed meta loading', () => {
|
|
|
1009
1112
|
parentTitles: ['Delayed User'],
|
|
1010
1113
|
disabled: false,
|
|
1011
1114
|
disabledReason: undefined,
|
|
1115
|
+
hidden: false,
|
|
1012
1116
|
children: undefined,
|
|
1013
1117
|
});
|
|
1014
1118
|
});
|
|
@@ -1282,6 +1386,58 @@ describe('FlowContext resolveOnServer selective server resolution', () => {
|
|
|
1282
1386
|
// server was called
|
|
1283
1387
|
expect(api.request).toHaveBeenCalledTimes(1);
|
|
1284
1388
|
});
|
|
1389
|
+
|
|
1390
|
+
it('skips server call when all vars require contextParams but none provided', async () => {
|
|
1391
|
+
const engine = new FlowEngine();
|
|
1392
|
+
const api = { request: vi.fn() } as any;
|
|
1393
|
+
engine.context.defineProperty('api', { value: api });
|
|
1394
|
+
|
|
1395
|
+
engine.context.defineProperty('foo', {
|
|
1396
|
+
value: { a: 1 },
|
|
1397
|
+
resolveOnServer: true,
|
|
1398
|
+
serverOnlyWhenContextParams: true,
|
|
1399
|
+
meta: async () => ({
|
|
1400
|
+
type: 'object',
|
|
1401
|
+
title: 'Foo',
|
|
1402
|
+
// no buildVariablesParams -> empty contextParams
|
|
1403
|
+
}),
|
|
1404
|
+
});
|
|
1405
|
+
|
|
1406
|
+
const tpl = { a: '{{ ctx.foo.a }}' } as any;
|
|
1407
|
+
const out = await (engine.context as any).resolveJsonTemplate(tpl);
|
|
1408
|
+
expect(out).toEqual({ a: 1 });
|
|
1409
|
+
// skipped server, because all server vars (only foo) require contextParams but none present
|
|
1410
|
+
expect(api.request).not.toHaveBeenCalled();
|
|
1411
|
+
});
|
|
1412
|
+
|
|
1413
|
+
it('still calls server when at least one var has contextParams (even if others require contextParams but none)', async () => {
|
|
1414
|
+
const engine = new FlowEngine();
|
|
1415
|
+
const api = { request: vi.fn(async () => ({ data: { ok: true } })) } as any;
|
|
1416
|
+
engine.context.defineProperty('api', { value: api });
|
|
1417
|
+
|
|
1418
|
+
// foo: requires contextParams but none will be provided
|
|
1419
|
+
engine.context.defineProperty('foo', {
|
|
1420
|
+
value: { a: 1 },
|
|
1421
|
+
resolveOnServer: true,
|
|
1422
|
+
serverOnlyWhenContextParams: true,
|
|
1423
|
+
meta: async () => ({ type: 'object', title: 'Foo' }),
|
|
1424
|
+
});
|
|
1425
|
+
|
|
1426
|
+
// user: provides contextParams via builder
|
|
1427
|
+
engine.context.defineProperty('user', {
|
|
1428
|
+
value: { id: 9 },
|
|
1429
|
+
resolveOnServer: true,
|
|
1430
|
+
meta: async () => ({
|
|
1431
|
+
type: 'object',
|
|
1432
|
+
title: 'User',
|
|
1433
|
+
buildVariablesParams: () => ({ collection: 'users', filterByTk: 9, dataSourceKey: 'main' }),
|
|
1434
|
+
}),
|
|
1435
|
+
});
|
|
1436
|
+
|
|
1437
|
+
const tpl = { a: '{{ ctx.foo.a }}', u: '{{ ctx.user.id }}' } as any;
|
|
1438
|
+
await (engine.context as any).resolveJsonTemplate(tpl);
|
|
1439
|
+
expect(api.request).toHaveBeenCalledTimes(1);
|
|
1440
|
+
});
|
|
1285
1441
|
});
|
|
1286
1442
|
|
|
1287
1443
|
describe('FlowContext.getPropertyOptions()', () => {
|
|
@@ -1369,6 +1525,7 @@ describe('FlowContext getPropertyMetaTree with value parameter', () => {
|
|
|
1369
1525
|
parentTitles: undefined,
|
|
1370
1526
|
disabled: false,
|
|
1371
1527
|
disabledReason: undefined,
|
|
1528
|
+
hidden: false,
|
|
1372
1529
|
children: undefined,
|
|
1373
1530
|
});
|
|
1374
1531
|
expect(subTree[1]).toEqual({
|
|
@@ -1381,6 +1538,7 @@ describe('FlowContext getPropertyMetaTree with value parameter', () => {
|
|
|
1381
1538
|
parentTitles: undefined,
|
|
1382
1539
|
disabled: false,
|
|
1383
1540
|
disabledReason: undefined,
|
|
1541
|
+
hidden: false,
|
|
1384
1542
|
children: undefined,
|
|
1385
1543
|
});
|
|
1386
1544
|
});
|
|
@@ -1566,6 +1724,7 @@ describe('FlowContext getPropertyMetaTree with value parameter', () => {
|
|
|
1566
1724
|
parentTitles: ['User', 'User Profile'],
|
|
1567
1725
|
disabled: false,
|
|
1568
1726
|
disabledReason: undefined,
|
|
1727
|
+
hidden: false,
|
|
1569
1728
|
children: undefined,
|
|
1570
1729
|
});
|
|
1571
1730
|
expect(profileSubTree[1]).toEqual({
|
|
@@ -1578,6 +1737,7 @@ describe('FlowContext getPropertyMetaTree with value parameter', () => {
|
|
|
1578
1737
|
parentTitles: ['User', 'User Profile'],
|
|
1579
1738
|
disabled: false,
|
|
1580
1739
|
disabledReason: undefined,
|
|
1740
|
+
hidden: false,
|
|
1581
1741
|
children: undefined,
|
|
1582
1742
|
});
|
|
1583
1743
|
});
|