@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.
Files changed (589) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +91 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +6 -4
  6. package/lib/JSRunner.d.ts +6 -0
  7. package/lib/JSRunner.js +27 -1
  8. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  9. package/lib/ViewScopedFlowEngine.js +18 -1
  10. package/lib/acl/Acl.d.ts +12 -12
  11. package/lib/acl/Acl.js +88 -30
  12. package/lib/components/DynamicFlowsEditor.js +2 -4
  13. package/lib/components/FieldModelRenderer.js +17 -9
  14. package/lib/components/FieldSkeleton.d.ts +10 -0
  15. package/lib/components/FieldSkeleton.js +64 -0
  16. package/lib/components/FlowContextSelector.js +19 -3
  17. package/lib/components/FlowModelRenderer.d.ts +4 -6
  18. package/lib/components/FlowModelRenderer.js +35 -53
  19. package/lib/components/FormItem.js +5 -1
  20. package/lib/components/MobilePopup.d.ts +20 -0
  21. package/lib/components/MobilePopup.js +102 -0
  22. package/lib/components/MobilePopup.style.d.ts +17 -0
  23. package/lib/components/MobilePopup.style.js +186 -0
  24. package/lib/components/common/withFlowDesignMode.d.ts +1 -1
  25. package/lib/components/common/withFlowDesignMode.js +5 -5
  26. package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
  27. package/lib/components/dnd/gridDragPlanner.js +53 -1
  28. package/lib/components/index.d.ts +1 -0
  29. package/lib/components/index.js +3 -1
  30. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
  31. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
  32. package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
  33. package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
  34. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
  35. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
  36. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
  37. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  38. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
  39. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
  40. package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
  41. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
  42. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
  43. package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
  44. package/lib/components/subModel/AddSubModelButton.js +78 -8
  45. package/lib/components/subModel/LazyDropdown.js +14 -15
  46. package/lib/components/subModel/utils.d.ts +1 -1
  47. package/lib/components/subModel/utils.js +21 -11
  48. package/lib/components/variables/VariableInput.js +26 -6
  49. package/lib/components/variables/VariableTag.js +43 -2
  50. package/lib/components/variables/types.d.ts +2 -0
  51. package/lib/components/variables/utils.js +4 -2
  52. package/lib/data-source/index.d.ts +23 -4
  53. package/lib/data-source/index.js +135 -14
  54. package/lib/data-source/jioToJoiSchema.js +1 -0
  55. package/lib/emitter.d.ts +6 -0
  56. package/lib/emitter.js +12 -0
  57. package/lib/executor/FlowExecutor.d.ts +6 -6
  58. package/lib/executor/FlowExecutor.js +302 -99
  59. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  60. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  61. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  62. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  63. package/lib/flowContext.d.ts +105 -6
  64. package/lib/flowContext.js +447 -139
  65. package/lib/flowEngine.d.ts +71 -1
  66. package/lib/flowEngine.js +319 -16
  67. package/lib/flowSettings.d.ts +4 -3
  68. package/lib/flowSettings.js +45 -21
  69. package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
  70. package/lib/hooks/useApplyAutoFlows.js +3 -2
  71. package/lib/index.d.ts +14 -3
  72. package/lib/index.js +54 -7
  73. package/lib/locale/de-DE.json +62 -0
  74. package/lib/locale/en-US.json +57 -45
  75. package/lib/locale/es-ES.json +62 -0
  76. package/lib/locale/fr-FR.json +62 -0
  77. package/lib/locale/hu-HU.json +62 -0
  78. package/lib/locale/id-ID.json +62 -0
  79. package/lib/locale/index.d.ts +114 -90
  80. package/lib/locale/it-IT.json +62 -0
  81. package/lib/locale/ja-JP.json +62 -0
  82. package/lib/locale/ko-KR.json +62 -0
  83. package/lib/locale/nl-NL.json +62 -0
  84. package/lib/locale/pt-BR.json +62 -0
  85. package/lib/locale/ru-RU.json +62 -0
  86. package/lib/locale/tr-TR.json +62 -0
  87. package/lib/locale/uk-UA.json +62 -0
  88. package/lib/locale/vi-VN.json +62 -0
  89. package/lib/locale/zh-CN.json +58 -46
  90. package/lib/locale/zh-TW.json +62 -0
  91. package/lib/models/CollectionFieldModel.d.ts +7 -2
  92. package/lib/models/CollectionFieldModel.js +63 -16
  93. package/lib/models/flowModel.d.ts +76 -32
  94. package/lib/models/flowModel.js +300 -112
  95. package/lib/models/forkFlowModel.d.ts +8 -4
  96. package/lib/models/forkFlowModel.js +38 -8
  97. package/lib/provider.d.ts +3 -1
  98. package/lib/provider.js +14 -11
  99. package/lib/reactive/index.d.ts +10 -0
  100. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
  101. package/lib/reactive/observer.d.ts +19 -0
  102. package/lib/reactive/observer.js +109 -0
  103. package/lib/resources/baseRecordResource.d.ts +6 -0
  104. package/lib/resources/baseRecordResource.js +38 -3
  105. package/lib/resources/multiRecordResource.d.ts +5 -2
  106. package/lib/resources/multiRecordResource.js +26 -10
  107. package/lib/resources/singleRecordResource.js +8 -3
  108. package/lib/resources/sqlResource.d.ts +5 -3
  109. package/lib/resources/sqlResource.js +30 -28
  110. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  111. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
  112. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  113. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  114. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  115. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  116. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  117. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  118. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  119. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  120. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  121. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  122. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  123. package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
  124. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  125. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  126. package/lib/runjs-context/contexts/base.d.ts +9 -0
  127. package/lib/runjs-context/contexts/base.js +879 -0
  128. package/lib/runjs-context/contributions.d.ts +33 -0
  129. package/lib/runjs-context/contributions.js +88 -0
  130. package/lib/runjs-context/helpers.d.ts +5 -2
  131. package/lib/runjs-context/helpers.js +36 -27
  132. package/lib/runjs-context/registry.d.ts +7 -4
  133. package/lib/runjs-context/registry.js +10 -42
  134. package/lib/runjs-context/setup.d.ts +9 -0
  135. package/lib/runjs-context/setup.js +88 -0
  136. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  137. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  138. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  139. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  140. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  141. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  142. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  143. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  144. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  145. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  146. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  148. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  149. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  150. package/lib/runjs-context/snippets/index.d.ts +24 -3
  151. package/lib/runjs-context/snippets/index.js +183 -40
  152. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  154. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  158. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  159. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  161. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  163. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  165. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  167. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  169. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  170. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  171. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  172. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  173. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  174. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  175. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  176. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  177. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  178. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  179. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  180. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  181. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  182. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  183. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  184. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  185. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  186. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  187. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  188. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  189. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  190. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  191. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  192. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  193. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  194. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  195. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  196. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  197. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  198. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  199. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  200. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  201. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  202. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  203. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  204. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  205. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  206. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  207. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  208. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  209. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  210. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  211. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  212. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  213. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  214. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  215. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  216. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  217. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  218. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  219. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  220. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  221. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  222. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  223. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  224. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  225. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  227. package/lib/runjs-context/snippets/types.d.ts +9 -1
  228. package/lib/runjsLibs.d.ts +28 -0
  229. package/lib/runjsLibs.js +532 -0
  230. package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
  231. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  232. package/lib/types.d.ts +66 -7
  233. package/lib/types.js +4 -3
  234. package/lib/utils/associationObjectVariable.d.ts +32 -0
  235. package/lib/utils/associationObjectVariable.js +157 -0
  236. package/lib/utils/createCollectionContextMeta.d.ts +1 -1
  237. package/lib/utils/createCollectionContextMeta.js +9 -4
  238. package/lib/utils/createEphemeralContext.d.ts +13 -0
  239. package/lib/utils/createEphemeralContext.js +140 -0
  240. package/lib/utils/flows.d.ts +10 -0
  241. package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
  242. package/lib/utils/index.d.ts +9 -3
  243. package/lib/utils/index.js +30 -2
  244. package/lib/utils/jsxTransform.d.ts +15 -0
  245. package/lib/utils/jsxTransform.js +68 -0
  246. package/lib/utils/params-resolvers.js +19 -12
  247. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  248. package/lib/utils/parsePathnameToViewParams.js +41 -5
  249. package/lib/utils/pruneFilter.d.ts +21 -0
  250. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  251. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  252. package/lib/utils/resolveModuleUrl.js +65 -0
  253. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  254. package/lib/utils/runjsModuleLoader.js +422 -0
  255. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  256. package/lib/utils/runjsTemplateCompat.js +743 -0
  257. package/lib/utils/safeGlobals.d.ts +6 -8
  258. package/lib/utils/safeGlobals.js +169 -14
  259. package/lib/utils/schema-utils.d.ts +6 -0
  260. package/lib/utils/schema-utils.js +71 -6
  261. package/lib/utils/serverContextParams.d.ts +4 -0
  262. package/lib/utils/serverContextParams.js +2 -0
  263. package/lib/utils/translation.d.ts +4 -1
  264. package/lib/utils/translation.js +6 -2
  265. package/lib/utils/variablesParams.d.ts +22 -5
  266. package/lib/utils/variablesParams.js +141 -61
  267. package/lib/views/DialogComponent.js +1 -5
  268. package/lib/views/DrawerComponent.js +18 -9
  269. package/lib/views/PageComponent.js +5 -5
  270. package/lib/views/ViewNavigation.d.ts +11 -15
  271. package/lib/views/ViewNavigation.js +37 -19
  272. package/lib/views/createViewMeta.d.ts +27 -5
  273. package/lib/views/createViewMeta.js +338 -72
  274. package/lib/views/index.d.ts +1 -1
  275. package/lib/views/index.js +4 -0
  276. package/lib/views/useDialog.d.ts +10 -9
  277. package/lib/views/useDialog.js +46 -34
  278. package/lib/views/useDrawer.d.ts +10 -9
  279. package/lib/views/useDrawer.js +74 -48
  280. package/lib/views/usePage.d.ts +14 -9
  281. package/lib/views/usePage.js +82 -33
  282. package/lib/views/usePopover.js +4 -1
  283. package/lib/views/viewEvents.d.ts +17 -0
  284. package/lib/views/viewEvents.js +90 -0
  285. package/package.json +6 -3
  286. package/src/BlockScopedFlowEngine.ts +85 -0
  287. package/src/FlowContextProvider.tsx +4 -2
  288. package/src/JSRunner.ts +39 -1
  289. package/src/ViewScopedFlowEngine.ts +21 -1
  290. package/src/__tests__/JSRunner.test.ts +125 -52
  291. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  292. package/src/__tests__/createViewMeta.popup.test.ts +203 -0
  293. package/src/__tests__/flow-engine.test.ts +3 -0
  294. package/src/__tests__/flowContext.test.ts +160 -0
  295. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  296. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  297. package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
  298. package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
  299. package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
  300. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  301. package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
  302. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  303. package/src/__tests__/flowSettings.open.test.tsx +71 -15
  304. package/src/__tests__/flowSettings.test.ts +2 -0
  305. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  306. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  307. package/src/__tests__/objectVariable.test.ts +464 -0
  308. package/src/__tests__/provider.test.tsx +0 -5
  309. package/src/__tests__/runjsContext.test.ts +219 -35
  310. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  311. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  312. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  313. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  314. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  315. package/src/__tests__/runjsLocales.test.ts +39 -0
  316. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  317. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  318. package/src/__tests__/runjsSnippets.test.ts +140 -0
  319. package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
  320. package/src/acl/Acl.tsx +85 -31
  321. package/src/acl/__tests__/Acl.test.tsx +43 -1
  322. package/src/components/DynamicFlowsEditor.tsx +0 -10
  323. package/src/components/FieldModelRenderer.tsx +22 -9
  324. package/src/components/FieldSkeleton.tsx +27 -0
  325. package/src/components/FlowContextSelector.tsx +20 -2
  326. package/src/components/FlowModelRenderer.tsx +52 -84
  327. package/src/components/FormItem.tsx +8 -1
  328. package/src/components/MobilePopup.style.ts +220 -0
  329. package/src/components/MobilePopup.tsx +86 -0
  330. package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
  331. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  332. package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
  333. package/src/components/common/withFlowDesignMode.tsx +5 -5
  334. package/src/components/dnd/gridDragPlanner.ts +60 -0
  335. package/src/components/index.ts +1 -0
  336. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
  337. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
  338. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
  339. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  340. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
  341. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
  342. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
  343. package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
  344. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
  345. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
  346. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
  347. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
  348. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
  349. package/src/components/subModel/AddSubModelButton.tsx +104 -9
  350. package/src/components/subModel/LazyDropdown.tsx +14 -14
  351. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
  352. package/src/components/subModel/__tests__/utils.test.ts +12 -12
  353. package/src/components/subModel/utils.ts +25 -6
  354. package/src/components/variables/VariableInput.tsx +32 -6
  355. package/src/components/variables/VariableTag.tsx +54 -2
  356. package/src/components/variables/types.ts +2 -0
  357. package/src/components/variables/utils.ts +7 -3
  358. package/src/data-source/index.ts +143 -12
  359. package/src/data-source/jioToJoiSchema.ts +1 -0
  360. package/src/emitter.ts +14 -0
  361. package/src/executor/FlowExecutor.ts +383 -119
  362. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  363. package/src/executor/__tests__/flowExecutor.test.ts +217 -5
  364. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  365. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  366. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  367. package/src/flowContext.ts +646 -158
  368. package/src/flowEngine.ts +385 -14
  369. package/src/flowSettings.ts +59 -30
  370. package/src/hooks/useApplyAutoFlows.ts +5 -3
  371. package/src/index.ts +26 -3
  372. package/src/locale/de-DE.json +62 -0
  373. package/src/locale/en-US.json +57 -45
  374. package/src/locale/es-ES.json +62 -0
  375. package/src/locale/fr-FR.json +62 -0
  376. package/src/locale/hu-HU.json +62 -0
  377. package/src/locale/id-ID.json +62 -0
  378. package/src/locale/it-IT.json +62 -0
  379. package/src/locale/ja-JP.json +62 -0
  380. package/src/locale/ko-KR.json +62 -0
  381. package/src/locale/nl-NL.json +62 -0
  382. package/src/locale/pt-BR.json +62 -0
  383. package/src/locale/ru-RU.json +62 -0
  384. package/src/locale/tr-TR.json +62 -0
  385. package/src/locale/uk-UA.json +62 -0
  386. package/src/locale/vi-VN.json +62 -0
  387. package/src/locale/zh-CN.json +58 -46
  388. package/src/locale/zh-TW.json +62 -0
  389. package/src/models/CollectionFieldModel.tsx +82 -18
  390. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  391. package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
  392. package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
  393. package/src/models/__tests__/flowModel.clone.test.ts +416 -0
  394. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  395. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  396. package/src/models/__tests__/flowModel.test.ts +296 -119
  397. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  398. package/src/models/flowModel.tsx +426 -148
  399. package/src/models/forkFlowModel.ts +48 -8
  400. package/src/provider.tsx +18 -14
  401. package/src/reactive/__tests__/observer.test.tsx +211 -0
  402. package/src/reactive/index.ts +11 -0
  403. package/src/reactive/observer.tsx +101 -0
  404. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  405. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  406. package/src/resources/baseRecordResource.ts +46 -3
  407. package/src/resources/multiRecordResource.ts +28 -12
  408. package/src/resources/singleRecordResource.ts +9 -3
  409. package/src/resources/sqlResource.ts +33 -32
  410. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
  411. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
  412. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  413. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  414. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  415. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  416. package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
  417. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  418. package/src/runjs-context/contexts/base.ts +871 -0
  419. package/src/runjs-context/contributions.ts +88 -0
  420. package/src/runjs-context/helpers.ts +32 -30
  421. package/src/runjs-context/registry.ts +16 -47
  422. package/src/runjs-context/setup.ts +57 -0
  423. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  424. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  425. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  426. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  427. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  428. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  429. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  430. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  431. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  432. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  433. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  434. package/src/runjs-context/snippets/index.ts +212 -39
  435. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  436. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  437. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  438. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  439. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  440. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  441. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  442. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  443. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  444. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  445. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  446. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  447. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  448. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  449. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  450. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  451. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  452. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  453. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  454. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  455. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  456. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  457. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  458. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  459. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  460. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  461. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  462. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  463. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  464. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  465. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  466. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  467. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  468. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  469. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  470. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  471. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  472. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  473. package/src/runjs-context/snippets/types.ts +5 -1
  474. package/src/runjsLibs.ts +622 -0
  475. package/src/scheduler/ModelOperationScheduler.ts +306 -0
  476. package/src/types.ts +86 -5
  477. package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
  478. package/src/utils/__tests__/flows.test.ts +65 -0
  479. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  480. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  481. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  482. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  483. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  484. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  485. package/src/utils/__tests__/safeGlobals.test.ts +79 -2
  486. package/src/utils/__tests__/utils.test.ts +114 -15
  487. package/src/utils/__tests__/variablesParams.test.ts +120 -0
  488. package/src/utils/associationObjectVariable.ts +180 -0
  489. package/src/utils/createCollectionContextMeta.ts +9 -3
  490. package/src/utils/createEphemeralContext.ts +142 -0
  491. package/src/utils/flows.ts +23 -0
  492. package/src/utils/index.ts +17 -3
  493. package/src/utils/jsxTransform.ts +39 -0
  494. package/src/utils/params-resolvers.ts +25 -11
  495. package/src/utils/parsePathnameToViewParams.ts +50 -6
  496. package/src/utils/pruneFilter.ts +41 -0
  497. package/src/utils/resolveModuleUrl.ts +91 -0
  498. package/src/utils/runjsModuleLoader.ts +553 -0
  499. package/src/utils/runjsTemplateCompat.ts +828 -0
  500. package/src/utils/safeGlobals.ts +181 -15
  501. package/src/utils/schema-utils.ts +81 -3
  502. package/src/utils/serverContextParams.ts +6 -0
  503. package/src/utils/translation.ts +7 -2
  504. package/src/utils/variablesParams.ts +164 -72
  505. package/src/views/DialogComponent.tsx +1 -4
  506. package/src/views/DrawerComponent.tsx +19 -7
  507. package/src/views/PageComponent.tsx +3 -5
  508. package/src/views/ViewNavigation.ts +49 -43
  509. package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
  510. package/src/views/__tests__/ViewNavigation.test.ts +54 -34
  511. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
  512. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  513. package/src/views/createViewMeta.ts +402 -73
  514. package/src/views/index.tsx +1 -1
  515. package/src/views/useDialog.tsx +52 -31
  516. package/src/views/useDrawer.tsx +99 -55
  517. package/src/views/usePage.tsx +101 -33
  518. package/src/views/usePopover.tsx +4 -1
  519. package/src/views/viewEvents.ts +55 -0
  520. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  521. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  522. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  523. package/lib/runjs-context/index.d.ts +0 -19
  524. package/lib/runjs-context/index.js +0 -57
  525. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  526. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  527. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  528. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  529. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  530. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  531. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  532. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  533. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  534. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  535. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  536. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  537. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  538. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  539. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  540. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  541. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  542. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  543. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  544. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  545. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  546. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  547. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  548. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  549. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  550. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  551. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  552. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  553. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  554. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  555. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  556. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  557. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  558. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  559. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  560. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  561. package/src/runjs-context/index.ts +0 -20
  562. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  563. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  564. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  565. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  566. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  567. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  568. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  569. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  570. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  571. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  572. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  573. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  574. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  575. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  576. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  577. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  578. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  579. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  580. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  581. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  582. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  583. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  584. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  585. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  586. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  587. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  588. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  589. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -5,6 +5,9 @@ import { FlowSettings } from './flowSettings';
5
5
  import { FlowModel } from './models';
6
6
  import { ReactView } from './ReactView';
7
7
  import { FlowResource } from './resources';
8
+ import { Emitter } from './emitter';
9
+ import ModelOperationScheduler from './scheduler/ModelOperationScheduler';
10
+ import type { ScheduleOptions, ScheduledCancel } from './scheduler/ModelOperationScheduler';
8
11
  import type { ActionDefinition, ApplyFlowCacheEntry, CreateModelOptions, EventDefinition, FlowModelOptions, IFlowModelRepository, ModelConstructor, PersistOptions, ResourceType } from './types';
9
12
  /**
10
13
  * FlowEngine is the core class of the flow engine, responsible for managing flow models, actions, model repository, and more.
@@ -81,6 +84,24 @@ export declare class FlowEngine {
81
84
  private _previousEngine?;
82
85
  private _nextEngine?;
83
86
  private _resources;
87
+ /**
88
+ * Data change registry used to coordinate "refresh on active" across view-scoped engines.
89
+ *
90
+ * Keyed by: dataSourceKey -> resourceName -> version.
91
+ * - mark: increments version
92
+ * - get: returns current version (default 0)
93
+ *
94
+ * NOTE: ViewScopedFlowEngine proxies delegate non-local fields/methods to parents, so this
95
+ * registry naturally lives on the root engine instance and is shared across the whole view stack.
96
+ */
97
+ private _dataSourceDirtyVersions;
98
+ /**
99
+ * 引擎事件总线(目前用于模型生命周期等事件)。
100
+ * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
101
+ */
102
+ emitter: Emitter;
103
+ /** 调度器:仅在 View 作用域引擎本地启用;根/Block 作用域默认不持有 */
104
+ private _modelOperationScheduler?;
84
105
  logger: pino.Logger;
85
106
  /**
86
107
  * Flow settings, including components and form scopes.
@@ -95,13 +116,29 @@ export declare class FlowEngine {
95
116
  */
96
117
  reactView: ReactView;
97
118
  /**
98
- * Flow executor that runs flows and auto-flows.
119
+ * Flow executor that runs event flows.
99
120
  */
100
121
  executor: FlowExecutor;
101
122
  /**
102
123
  * Constructor. Initializes React view, registers default model and form scopes.
103
124
  */
104
125
  constructor();
126
+ /** 获取/创建当前引擎的调度器(仅在本地作用域) */
127
+ getScheduler(): ModelOperationScheduler;
128
+ /** 释放并清理当前引擎本地调度器(若存在) */
129
+ disposeScheduler(): void;
130
+ /**
131
+ * Mark a data source resource as "dirty" (changed).
132
+ * This is used by data blocks to decide whether to refresh when a view becomes active.
133
+ */
134
+ markDataSourceDirty(dataSourceKey: string, resourceName: string): number;
135
+ /**
136
+ * Get current dirty version for a data source resource.
137
+ * Returns 0 when no writes have been recorded.
138
+ */
139
+ getDataSourceDirtyVersion(dataSourceKey: string, resourceName: string): number;
140
+ /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
141
+ scheduleModelOperation(fromModelOrUid: FlowModel | string, toUid: string, fn: (model: FlowModel) => Promise<void> | void, options?: ScheduleOptions): ScheduledCancel;
105
142
  /** 上一个引擎(根引擎为 undefined) */
106
143
  get previousEngine(): FlowEngine | undefined;
107
144
  /** 下一个引擎(若存在) */
@@ -218,6 +255,11 @@ export declare class FlowEngine {
218
255
  delegateToParent?: boolean;
219
256
  delegate?: FlowContext;
220
257
  }): T;
258
+ /**
259
+ * 按类上的 resolveUse 链路解析最终用于实例化的模型类。
260
+ * 允许模型类根据上下文动态指定实际使用的类,支持多级 resolveUse。
261
+ */
262
+ private _resolveModelClass;
221
263
  /**
222
264
  * 尝试应用当前模型可用 flow 的 defaultParams(如果存在)到 model.stepParams。
223
265
  * 仅对尚未存在的步骤参数进行填充,不覆盖已有值。
@@ -242,12 +284,33 @@ export declare class FlowEngine {
242
284
  * @returns {boolean} Returns true if successfully destroyed, false otherwise (e.g. instance does not exist)
243
285
  */
244
286
  removeModel(uid: string): boolean;
287
+ /**
288
+ * Remove a local model instance and all its sub-models recursively.
289
+ * @param {string} uid UID of the model instance to destroy
290
+ * @returns {boolean} Returns true if successfully destroyed, false otherwise
291
+ */
292
+ removeModelWithSubModels(uid: string): boolean;
245
293
  /**
246
294
  * Check if the model repository is set.
247
295
  * @returns {boolean} Returns true if set, false otherwise.
248
296
  * @private
249
297
  */
250
298
  private ensureModelRepository;
299
+ /**
300
+ * Try to locate a model instance in previous engines (view stack) by uid.
301
+ * This is mainly used by view-scoped engines to reuse already-loaded model trees
302
+ * (e.g. models created from local JSON) without hitting the repository.
303
+ */
304
+ private findModelInPreviousEngines;
305
+ /**
306
+ * Try to locate a sub-model in previous engines (view stack) by (parentId, subKey).
307
+ */
308
+ private findSubModelInPreviousEngines;
309
+ /**
310
+ * Hydrate a model into current engine from an already-existing model instance in previous engines.
311
+ * - Avoids repository requests when the model tree is already present in memory.
312
+ */
313
+ private hydrateModelFromPreviousEngines;
251
314
  /**
252
315
  * Load a model instance (prefers local, falls back to repository).
253
316
  * @template T FlowModel subclass type, defaults to FlowModel.
@@ -304,6 +367,13 @@ export declare class FlowEngine {
304
367
  * @returns {Promise<boolean>} Whether destroyed successfully
305
368
  */
306
369
  destroyModel(uid: string): Promise<boolean>;
370
+ /**
371
+ * Duplicate a model tree via repository API.
372
+ * Returns the duplicated model JSON (root with subModels) or null if not available.
373
+ * @param {string} uid UID of the model to duplicate
374
+ * @returns {Promise<any | null>} Duplicated model JSON or null
375
+ */
376
+ duplicateModel(uid: string): Promise<Record<string, any>>;
307
377
  /**
308
378
  * Replace a model instance with a new instance of a class.
309
379
  * @template T New model type
package/lib/flowEngine.js CHANGED
@@ -59,6 +59,8 @@ var import_flowSettings = require("./flowSettings");
59
59
  var import_models = require("./models");
60
60
  var import_ReactView = require("./ReactView");
61
61
  var import_resources = require("./resources");
62
+ var import_emitter = require("./emitter");
63
+ var import_ModelOperationScheduler = __toESM(require("./scheduler/ModelOperationScheduler"));
62
64
  var import_utils = require("./utils");
63
65
  var _FlowEngine_instances, registerModel_fn;
64
66
  const _FlowEngine = class _FlowEngine {
@@ -118,6 +120,24 @@ const _FlowEngine = class _FlowEngine {
118
120
  __publicField(this, "_previousEngine");
119
121
  __publicField(this, "_nextEngine");
120
122
  __publicField(this, "_resources", /* @__PURE__ */ new Map());
123
+ /**
124
+ * Data change registry used to coordinate "refresh on active" across view-scoped engines.
125
+ *
126
+ * Keyed by: dataSourceKey -> resourceName -> version.
127
+ * - mark: increments version
128
+ * - get: returns current version (default 0)
129
+ *
130
+ * NOTE: ViewScopedFlowEngine proxies delegate non-local fields/methods to parents, so this
131
+ * registry naturally lives on the root engine instance and is shared across the whole view stack.
132
+ */
133
+ __publicField(this, "_dataSourceDirtyVersions", /* @__PURE__ */ new Map());
134
+ /**
135
+ * 引擎事件总线(目前用于模型生命周期等事件)。
136
+ * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
137
+ */
138
+ __publicField(this, "emitter", new import_emitter.Emitter());
139
+ /** 调度器:仅在 View 作用域引擎本地启用;根/Block 作用域默认不持有 */
140
+ __publicField(this, "_modelOperationScheduler");
121
141
  __publicField(this, "logger");
122
142
  /**
123
143
  * Flow settings, including components and form scopes.
@@ -132,7 +152,7 @@ const _FlowEngine = class _FlowEngine {
132
152
  */
133
153
  __publicField(this, "reactView");
134
154
  /**
135
- * Flow executor that runs flows and auto-flows.
155
+ * Flow executor that runs event flows.
136
156
  */
137
157
  __publicField(this, "executor");
138
158
  this.reactView = new import_ReactView.ReactView(this);
@@ -161,6 +181,54 @@ const _FlowEngine = class _FlowEngine {
161
181
  });
162
182
  this.executor = new import_FlowExecutor.FlowExecutor(this);
163
183
  }
184
+ /** 获取/创建当前引擎的调度器(仅在本地作用域) */
185
+ getScheduler() {
186
+ if (!this._modelOperationScheduler) {
187
+ this._modelOperationScheduler = new import_ModelOperationScheduler.default(this);
188
+ }
189
+ return this._modelOperationScheduler;
190
+ }
191
+ /** 释放并清理当前引擎本地调度器(若存在) */
192
+ disposeScheduler() {
193
+ if (this._modelOperationScheduler) {
194
+ try {
195
+ this._modelOperationScheduler.dispose();
196
+ } finally {
197
+ this._modelOperationScheduler = void 0;
198
+ }
199
+ }
200
+ }
201
+ /**
202
+ * Mark a data source resource as "dirty" (changed).
203
+ * This is used by data blocks to decide whether to refresh when a view becomes active.
204
+ */
205
+ markDataSourceDirty(dataSourceKey, resourceName) {
206
+ const dsKey = String(dataSourceKey || "main");
207
+ const resName = String(resourceName || "");
208
+ if (!resName) return this.getDataSourceDirtyVersion(dsKey, resName);
209
+ const ds = this._dataSourceDirtyVersions.get(dsKey) || /* @__PURE__ */ new Map();
210
+ if (!this._dataSourceDirtyVersions.has(dsKey)) {
211
+ this._dataSourceDirtyVersions.set(dsKey, ds);
212
+ }
213
+ const next = (ds.get(resName) || 0) + 1;
214
+ ds.set(resName, next);
215
+ return next;
216
+ }
217
+ /**
218
+ * Get current dirty version for a data source resource.
219
+ * Returns 0 when no writes have been recorded.
220
+ */
221
+ getDataSourceDirtyVersion(dataSourceKey, resourceName) {
222
+ var _a;
223
+ const dsKey = String(dataSourceKey || "main");
224
+ const resName = String(resourceName || "");
225
+ if (!resName) return 0;
226
+ return ((_a = this._dataSourceDirtyVersions.get(dsKey)) == null ? void 0 : _a.get(resName)) || 0;
227
+ }
228
+ /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
229
+ scheduleModelOperation(fromModelOrUid, toUid, fn, options) {
230
+ return this.getScheduler().schedule(fromModelOrUid, toUid, fn, options);
231
+ }
164
232
  /** 上一个引擎(根引擎为 undefined) */
165
233
  get previousEngine() {
166
234
  return this._previousEngine;
@@ -361,8 +429,14 @@ const _FlowEngine = class _FlowEngine {
361
429
  * @returns {T} Created model instance
362
430
  */
363
431
  createModel(options, extra) {
432
+ var _a;
364
433
  const { parentId, uid, use: modelClassName, subModels } = options;
365
- const ModelClass = typeof modelClassName === "string" ? this.getModelClass(modelClassName) : modelClassName;
434
+ const parentModel = parentId ? this.getModel(parentId) || ((_a = this.previousEngine) == null ? void 0 : _a.getModel(parentId)) : void 0;
435
+ const ModelClass = this._resolveModelClass(
436
+ typeof modelClassName === "string" ? this.getModelClass(modelClassName) : modelClassName,
437
+ options,
438
+ parentModel
439
+ );
366
440
  if (uid && this._modelInstances.has(uid)) {
367
441
  return this._modelInstances.get(uid);
368
442
  }
@@ -376,20 +450,69 @@ const _FlowEngine = class _FlowEngine {
376
450
  if (extra == null ? void 0 : extra.delegate) {
377
451
  modelInstance.context.addDelegate(extra.delegate);
378
452
  }
379
- if (parentId && this._modelInstances.has(parentId)) {
380
- modelInstance.setParent(this._modelInstances.get(parentId));
453
+ if (parentModel) {
454
+ modelInstance.setParent(parentModel);
381
455
  if ((extra == null ? void 0 : extra.delegateToParent) === false) {
382
456
  modelInstance.removeParentDelegate();
383
457
  }
384
458
  }
385
459
  this._modelInstances.set(modelInstance.uid, modelInstance);
386
460
  modelInstance.onInit(options);
461
+ void this.emitter.emitAsync("model:created", {
462
+ uid: modelInstance.uid,
463
+ model: modelInstance
464
+ });
387
465
  this._applyFlowDefinitionDefaultParams(modelInstance).catch((err) => {
388
466
  console.warn("FlowEngine: apply flow defaultParams failed:", err);
389
467
  });
390
468
  modelInstance._createSubModels(options.subModels);
391
469
  return modelInstance;
392
470
  }
471
+ /**
472
+ * 按类上的 resolveUse 链路解析最终用于实例化的模型类。
473
+ * 允许模型类根据上下文动态指定实际使用的类,支持多级 resolveUse。
474
+ */
475
+ _resolveModelClass(initial, options, parent) {
476
+ const normalize = /* @__PURE__ */ __name((resolved) => {
477
+ if (!resolved) return {};
478
+ if (typeof resolved === "object" && "use" in resolved) {
479
+ return { target: resolved.use, stop: !!resolved.stop };
480
+ }
481
+ return { target: resolved, stop: false };
482
+ }, "normalize");
483
+ let current = initial;
484
+ const visited = /* @__PURE__ */ new Set();
485
+ while (current) {
486
+ if (visited.has(current)) {
487
+ console.warn(`FlowEngine: resolveUse circular reference detected on '${current.name}'.`);
488
+ break;
489
+ }
490
+ visited.add(current);
491
+ const resolver = current == null ? void 0 : current.resolveUse;
492
+ if (typeof resolver !== "function") {
493
+ break;
494
+ }
495
+ const { target, stop } = normalize(resolver(options, this, parent));
496
+ if (!target || target === current) {
497
+ break;
498
+ }
499
+ let next;
500
+ if (typeof target === "string") {
501
+ next = this.getModelClass(target);
502
+ if (!next) {
503
+ console.warn(`FlowEngine: resolveUse returned '${target}' but no model is registered under that name.`);
504
+ return void 0;
505
+ }
506
+ } else {
507
+ next = target;
508
+ }
509
+ current = next;
510
+ if (stop) {
511
+ break;
512
+ }
513
+ }
514
+ return current;
515
+ }
393
516
  /**
394
517
  * 尝试应用当前模型可用 flow 的 defaultParams(如果存在)到 model.stepParams。
395
518
  * 仅对尚未存在的步骤参数进行填充,不覆盖已有值。
@@ -460,12 +583,13 @@ const _FlowEngine = class _FlowEngine {
460
583
  * @returns {boolean} Returns true if successfully destroyed, false otherwise (e.g. instance does not exist)
461
584
  */
462
585
  removeModel(uid) {
463
- var _a;
586
+ var _a, _b, _c;
464
587
  if (!this._modelInstances.has(uid)) {
465
588
  console.warn(`FlowEngine: Model with UID '${uid}' does not exist.`);
466
589
  return false;
467
590
  }
468
591
  const modelInstance = this._modelInstances.get(uid);
592
+ modelInstance.invalidateFlowCache(void 0, true);
469
593
  modelInstance.clearForks();
470
594
  if ((_a = modelInstance.parent) == null ? void 0 : _a.subModels) {
471
595
  for (const subKey in modelInstance.parent.subModels) {
@@ -475,18 +599,65 @@ const _FlowEngine = class _FlowEngine {
475
599
  if (index !== -1) {
476
600
  subModelValue.splice(index, 1);
477
601
  modelInstance.parent.emitter.emit("onSubModelRemoved", modelInstance);
602
+ (_b = this.emitter) == null ? void 0 : _b.emit("model:subModel:removed", {
603
+ parentUid: modelInstance.parent.uid,
604
+ parent: modelInstance.parent,
605
+ model: modelInstance
606
+ });
478
607
  break;
479
608
  }
480
609
  } else if (subModelValue && subModelValue === modelInstance) {
481
610
  delete modelInstance.parent.subModels[subKey];
482
611
  modelInstance.parent.emitter.emit("onSubModelRemoved", modelInstance);
612
+ (_c = this.emitter) == null ? void 0 : _c.emit("model:subModel:removed", {
613
+ parentUid: modelInstance.parent.uid,
614
+ parent: modelInstance.parent,
615
+ model: modelInstance
616
+ });
483
617
  break;
484
618
  }
485
619
  }
486
620
  }
487
621
  this._modelInstances.delete(uid);
622
+ void this.emitter.emitAsync("model:destroyed", {
623
+ uid,
624
+ model: modelInstance
625
+ });
488
626
  return true;
489
627
  }
628
+ /**
629
+ * Remove a local model instance and all its sub-models recursively.
630
+ * @param {string} uid UID of the model instance to destroy
631
+ * @returns {boolean} Returns true if successfully destroyed, false otherwise
632
+ */
633
+ removeModelWithSubModels(uid) {
634
+ const model = this.getModel(uid);
635
+ if (!model) {
636
+ return false;
637
+ }
638
+ const collectDescendants = /* @__PURE__ */ __name((m, acc) => {
639
+ if (m.subModels) {
640
+ for (const key in m.subModels) {
641
+ const sub = m.subModels[key];
642
+ if (Array.isArray(sub)) {
643
+ [...sub].forEach((s) => collectDescendants(s, acc));
644
+ } else if (sub) {
645
+ collectDescendants(sub, acc);
646
+ }
647
+ }
648
+ }
649
+ acc.push(m);
650
+ }, "collectDescendants");
651
+ const allModels = [];
652
+ collectDescendants(model, allModels);
653
+ let success = true;
654
+ for (const m of allModels) {
655
+ if (!this.removeModel(m.uid)) {
656
+ success = false;
657
+ }
658
+ }
659
+ return success;
660
+ }
490
661
  /**
491
662
  * Check if the model repository is set.
492
663
  * @returns {boolean} Returns true if set, false otherwise.
@@ -498,6 +669,91 @@ const _FlowEngine = class _FlowEngine {
498
669
  }
499
670
  return true;
500
671
  }
672
+ /**
673
+ * Try to locate a model instance in previous engines (view stack) by uid.
674
+ * This is mainly used by view-scoped engines to reuse already-loaded model trees
675
+ * (e.g. models created from local JSON) without hitting the repository.
676
+ */
677
+ findModelInPreviousEngines(uid) {
678
+ let eng = this.previousEngine;
679
+ while (eng) {
680
+ const found = eng.getModel(uid);
681
+ if (found) return found;
682
+ eng = eng.previousEngine;
683
+ }
684
+ return void 0;
685
+ }
686
+ /**
687
+ * Try to locate a sub-model in previous engines (view stack) by (parentId, subKey).
688
+ */
689
+ findSubModelInPreviousEngines(parentId, subKey) {
690
+ var _a;
691
+ let eng = this.previousEngine;
692
+ while (eng) {
693
+ const parent = eng.getModel(parentId);
694
+ if (parent) {
695
+ const sub = (_a = parent.subModels) == null ? void 0 : _a[subKey];
696
+ if (sub) {
697
+ const model = Array.isArray(sub) ? sub[0] : sub;
698
+ if (model) return { parent, model };
699
+ }
700
+ }
701
+ eng = eng.previousEngine;
702
+ }
703
+ return void 0;
704
+ }
705
+ /**
706
+ * Hydrate a model into current engine from an already-existing model instance in previous engines.
707
+ * - Avoids repository requests when the model tree is already present in memory.
708
+ */
709
+ hydrateModelFromPreviousEngines(options, extra) {
710
+ var _a;
711
+ const uid = options == null ? void 0 : options.uid;
712
+ const parentId = options == null ? void 0 : options.parentId;
713
+ const subKey = options == null ? void 0 : options.subKey;
714
+ if (uid && !this._modelInstances.has(uid)) {
715
+ const existing = this.findModelInPreviousEngines(uid);
716
+ if (existing == null ? void 0 : existing.context.flowSettingsEnabled) {
717
+ return null;
718
+ }
719
+ if (existing) {
720
+ const data = existing.serialize();
721
+ return this.createModel(data, extra);
722
+ }
723
+ }
724
+ if (parentId && subKey) {
725
+ const found = this.findSubModelInPreviousEngines(parentId, subKey);
726
+ if (!found || found.parent.context.flowSettingsEnabled) return null;
727
+ const { parent: parentFromPrev, model: modelFromPrev } = found;
728
+ let localParent = this.getModel(parentId);
729
+ if (!localParent) {
730
+ const parentData = parentFromPrev.serialize();
731
+ delete parentData.subModels;
732
+ localParent = this.createModel(parentData, extra);
733
+ }
734
+ const modelData = modelFromPrev.serialize();
735
+ const localModel = this.createModel(modelData, extra);
736
+ const mounted = (_a = localParent.subModels) == null ? void 0 : _a[subKey];
737
+ if (Array.isArray(mounted)) {
738
+ const exists = mounted.some((m) => (m == null ? void 0 : m.uid) === (localModel == null ? void 0 : localModel.uid));
739
+ if (!exists) {
740
+ localParent.addSubModel(subKey, localModel);
741
+ }
742
+ } else if (mounted instanceof import_models.FlowModel) {
743
+ if (mounted.uid !== (localModel == null ? void 0 : localModel.uid)) {
744
+ localParent.setSubModel(subKey, localModel);
745
+ }
746
+ } else {
747
+ if ((localModel == null ? void 0 : localModel.subType) === "array") {
748
+ localParent.addSubModel(subKey, localModel);
749
+ } else {
750
+ localParent.setSubModel(subKey, localModel);
751
+ }
752
+ }
753
+ return localModel;
754
+ }
755
+ return null;
756
+ }
501
757
  /**
502
758
  * Load a model instance (prefers local, falls back to repository).
503
759
  * @template T FlowModel subclass type, defaults to FlowModel.
@@ -506,12 +762,26 @@ const _FlowEngine = class _FlowEngine {
506
762
  */
507
763
  async loadModel(options) {
508
764
  if (!this.ensureModelRepository()) return;
509
- const model = this.findModelByParentId(options.parentId, options.subKey);
510
- if (model) {
511
- return model;
765
+ const refresh = !!(options == null ? void 0 : options.refresh);
766
+ if (!refresh) {
767
+ const model = this.findModelByParentId(options.parentId, options.subKey);
768
+ if (model) {
769
+ return model;
770
+ }
771
+ const hydrated = this.hydrateModelFromPreviousEngines(options);
772
+ if (hydrated) {
773
+ return hydrated;
774
+ }
512
775
  }
513
776
  const data = await this._modelRepository.findOne(options);
514
- return (data == null ? void 0 : data.uid) ? this.createModel(data) : null;
777
+ if (!(data == null ? void 0 : data.uid)) return null;
778
+ if (refresh) {
779
+ const existing = this.getModel(data.uid);
780
+ if (existing) {
781
+ this.removeModelWithSubModels(existing.uid);
782
+ }
783
+ }
784
+ return this.createModel(data);
515
785
  }
516
786
  /**
517
787
  * Find a sub-model by parent model ID and subKey.
@@ -549,6 +819,10 @@ const _FlowEngine = class _FlowEngine {
549
819
  if (m) {
550
820
  return m;
551
821
  }
822
+ const hydrated = this.hydrateModelFromPreviousEngines(options, extra);
823
+ if (hydrated) {
824
+ return hydrated;
825
+ }
552
826
  const data = await this._modelRepository.findOne(options);
553
827
  let model = null;
554
828
  if (data == null ? void 0 : data.uid) {
@@ -627,7 +901,21 @@ const _FlowEngine = class _FlowEngine {
627
901
  if (this.ensureModelRepository()) {
628
902
  await this._modelRepository.destroy(uid);
629
903
  }
630
- return this.removeModel(uid);
904
+ const modelInstance = this._modelInstances.get(uid);
905
+ const parent = modelInstance == null ? void 0 : modelInstance.parent;
906
+ const result = this.removeModel(uid);
907
+ parent && parent.emitter.emit("onSubModelDestroyed", modelInstance);
908
+ return result;
909
+ }
910
+ /**
911
+ * Duplicate a model tree via repository API.
912
+ * Returns the duplicated model JSON (root with subModels) or null if not available.
913
+ * @param {string} uid UID of the model to duplicate
914
+ * @returns {Promise<any | null>} Duplicated model JSON or null
915
+ */
916
+ async duplicateModel(uid) {
917
+ if (!this.ensureModelRepository()) return null;
918
+ return this._modelRepository.duplicate(uid);
631
919
  }
632
920
  /**
633
921
  * Replace a model instance with a new instance of a class.
@@ -640,7 +928,7 @@ const _FlowEngine = class _FlowEngine {
640
928
  * @returns {Promise<T | null>} Newly created model instance
641
929
  */
642
930
  async replaceModel(uid, optionsOrFn) {
643
- var _a;
931
+ var _a, _b;
644
932
  const oldModel = this.getModel(uid);
645
933
  if (!oldModel) {
646
934
  console.warn(`FlowEngine: Cannot replace model. Model with UID '${uid}' not found.`);
@@ -674,9 +962,15 @@ const _FlowEngine = class _FlowEngine {
674
962
  }
675
963
  if (currentParent) {
676
964
  currentParent.emitter.setPaused(false);
677
- currentParent.parent.invalidateAutoFlowCache(true);
965
+ currentParent.parent.invalidateFlowCache("beforeRender", true);
678
966
  (_a = currentParent.parent) == null ? void 0 : _a.rerender();
679
967
  currentParent.emitter.emit("onSubModelReplaced", { oldModel, newModel });
968
+ (_b = this.emitter) == null ? void 0 : _b.emit("model:subModel:replaced", {
969
+ parentUid: currentParent.uid,
970
+ parent: currentParent,
971
+ oldModel,
972
+ newModel
973
+ });
680
974
  }
681
975
  await newModel.save();
682
976
  return newModel;
@@ -688,6 +982,7 @@ const _FlowEngine = class _FlowEngine {
688
982
  * @returns {Promise<void>} No return value
689
983
  */
690
984
  async moveModel(sourceId, targetId, options) {
985
+ var _a, _b;
691
986
  const sourceModel = this.getModel(sourceId);
692
987
  const targetModel = this.getModel(targetId);
693
988
  if (!sourceModel || !targetModel) {
@@ -704,7 +999,8 @@ const _FlowEngine = class _FlowEngine {
704
999
  console.error("FlowModel.moveTo: Parent subModels must be an array to perform move operation.");
705
1000
  return false;
706
1001
  }
707
- const findIndex = /* @__PURE__ */ __name((model) => subModels.findIndex((item) => item.uid === model.uid), "findIndex");
1002
+ const subModelsCopy = [...subModels];
1003
+ const findIndex = /* @__PURE__ */ __name((model) => subModelsCopy.findIndex((item) => item.uid === model.uid), "findIndex");
708
1004
  const currentIndex = findIndex(sourceModel2);
709
1005
  const targetIndex = findIndex(targetModel2);
710
1006
  if (currentIndex === -1 || targetIndex === -1) {
@@ -715,11 +1011,12 @@ const _FlowEngine = class _FlowEngine {
715
1011
  console.warn("FlowModel.moveTo: Current model is already at the target position. No action taken.");
716
1012
  return false;
717
1013
  }
718
- const [movedModel] = subModels.splice(currentIndex, 1);
719
- subModels.splice(targetIndex, 0, movedModel);
720
- subModels.forEach((model, index) => {
1014
+ const [movedModel] = subModelsCopy.splice(currentIndex, 1);
1015
+ subModelsCopy.splice(targetIndex, 0, movedModel);
1016
+ subModelsCopy.forEach((model, index) => {
721
1017
  model.sortIndex = index;
722
1018
  });
1019
+ subModels.splice(0, subModels.length, ...subModelsCopy);
723
1020
  return true;
724
1021
  }, "move");
725
1022
  move(sourceModel, targetModel);
@@ -728,6 +1025,12 @@ const _FlowEngine = class _FlowEngine {
728
1025
  await this._modelRepository.move(sourceId, targetId, position);
729
1026
  }
730
1027
  sourceModel.parent.emitter.emit("onSubModelMoved", { source: sourceModel, target: targetModel });
1028
+ (_b = this.emitter) == null ? void 0 : _b.emit("model:subModel:moved", {
1029
+ parentUid: (_a = sourceModel.parent) == null ? void 0 : _a.uid,
1030
+ parent: sourceModel.parent,
1031
+ source: sourceModel,
1032
+ target: targetModel
1033
+ });
731
1034
  }
732
1035
  /**
733
1036
  * Filter model classes by parent class (supports multi-level inheritance).
@@ -25,8 +25,8 @@ export interface FlowSettingsOpenOptions {
25
25
  /** 指定打开的步骤 key(配合 flowKey 使用) */
26
26
  stepKey?: string;
27
27
  /** 弹窗展现形式(drawer 或 dialog) */
28
- uiMode?: 'dialog' | 'drawer' | 'embed' | {
29
- type?: 'dialog' | 'drawer' | 'embed';
28
+ uiMode?: 'select' | 'switch' | 'dialog' | 'drawer' | 'embed' | {
29
+ type?: 'dialog' | 'drawer' | 'embed' | 'select' | 'switch';
30
30
  props?: {
31
31
  title?: string;
32
32
  width?: number;
@@ -227,12 +227,13 @@ export declare class FlowSettings {
227
227
  * @param {any} form 表单实例(从外部传入以便统一管理)
228
228
  * @returns {React.ReactElement} 渲染的表单元素
229
229
  */
230
- renderStepForm({ uiSchema, initialValues, flowEngine, form, onFormValuesChange, }: {
230
+ renderStepForm({ uiSchema, initialValues, flowEngine, form, onFormValuesChange, key, }: {
231
231
  uiSchema: any;
232
232
  initialValues: any;
233
233
  flowEngine: any;
234
234
  form?: any;
235
235
  onFormValuesChange?: (form: any) => void;
236
+ key?: string;
236
237
  }): React.ReactElement;
237
238
  /**
238
239
  * 打开流程设置入口(聚合渲染多个 flow 的可配置步骤)