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