@nocobase/flow-engine 2.0.0-alpha.4 → 2.0.0-alpha.40

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 (462) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +90 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +4 -2
  6. package/lib/JSRunner.js +3 -0
  7. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  8. package/lib/ViewScopedFlowEngine.js +12 -0
  9. package/lib/acl/Acl.d.ts +1 -0
  10. package/lib/acl/Acl.js +11 -0
  11. package/lib/components/FieldModelRenderer.js +14 -6
  12. package/lib/components/FieldSkeleton.d.ts +10 -0
  13. package/lib/components/FieldSkeleton.js +64 -0
  14. package/lib/components/FlowContextSelector.js +7 -2
  15. package/lib/components/FlowModelRenderer.d.ts +3 -6
  16. package/lib/components/FlowModelRenderer.js +16 -47
  17. package/lib/components/FormItem.js +5 -1
  18. package/lib/components/MobilePopup.d.ts +20 -0
  19. package/lib/components/MobilePopup.js +102 -0
  20. package/lib/components/MobilePopup.style.d.ts +17 -0
  21. package/lib/components/MobilePopup.style.js +186 -0
  22. package/lib/components/index.d.ts +1 -0
  23. package/lib/components/index.js +3 -1
  24. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  25. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  26. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  27. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  28. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +35 -6
  29. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  30. package/lib/components/variables/VariableInput.js +19 -5
  31. package/lib/components/variables/VariableTag.js +43 -2
  32. package/lib/components/variables/types.d.ts +2 -0
  33. package/lib/data-source/index.d.ts +15 -4
  34. package/lib/data-source/index.js +42 -13
  35. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  36. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  37. package/lib/emitter.d.ts +6 -0
  38. package/lib/emitter.js +12 -0
  39. package/lib/executor/FlowExecutor.d.ts +4 -5
  40. package/lib/executor/FlowExecutor.js +168 -99
  41. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  42. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  43. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  44. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  45. package/lib/flowContext.d.ts +37 -5
  46. package/lib/flowContext.js +215 -87
  47. package/lib/flowEngine.d.ts +24 -1
  48. package/lib/flowEngine.js +56 -6
  49. package/lib/flowSettings.d.ts +2 -1
  50. package/lib/flowSettings.js +12 -8
  51. package/lib/hooks/useApplyAutoFlows.js +2 -1
  52. package/lib/index.d.ts +7 -1
  53. package/lib/index.js +32 -3
  54. package/lib/locale/en-US.json +4 -2
  55. package/lib/locale/index.d.ts +4 -0
  56. package/lib/locale/zh-CN.json +4 -2
  57. package/lib/models/CollectionFieldModel.d.ts +3 -0
  58. package/lib/models/CollectionFieldModel.js +48 -5
  59. package/lib/models/flowModel.d.ts +30 -29
  60. package/lib/models/flowModel.js +135 -98
  61. package/lib/models/forkFlowModel.d.ts +8 -4
  62. package/lib/models/forkFlowModel.js +38 -8
  63. package/lib/provider.d.ts +3 -1
  64. package/lib/provider.js +7 -5
  65. package/lib/resources/multiRecordResource.js +25 -1
  66. package/lib/resources/singleRecordResource.js +19 -1
  67. package/lib/resources/sqlResource.d.ts +1 -0
  68. package/lib/resources/sqlResource.js +20 -24
  69. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  70. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  71. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  72. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  73. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  74. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  75. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  76. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  77. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  78. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  79. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  80. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  81. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  82. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  83. package/lib/runjs-context/contexts/base.d.ts +9 -0
  84. package/lib/runjs-context/contexts/base.js +183 -0
  85. package/lib/runjs-context/helpers.d.ts +5 -2
  86. package/lib/runjs-context/helpers.js +36 -27
  87. package/lib/runjs-context/registry.d.ts +7 -4
  88. package/lib/runjs-context/registry.js +10 -42
  89. package/lib/runjs-context/setup.d.ts +9 -0
  90. package/lib/runjs-context/setup.js +82 -0
  91. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  92. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  93. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  94. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  95. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  96. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  97. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  98. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  99. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  100. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  101. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  102. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  103. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  104. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  105. package/lib/runjs-context/snippets/index.d.ts +14 -3
  106. package/lib/runjs-context/snippets/index.js +161 -40
  107. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  109. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  111. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  113. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  114. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  115. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  116. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  117. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  118. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  119. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  120. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  121. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  122. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  123. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  124. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  125. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  126. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  127. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  128. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  129. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  130. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  131. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  132. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  133. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  134. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  135. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  136. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  137. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  138. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  139. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  140. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  141. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  142. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  143. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  144. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  145. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  146. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  148. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  149. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  150. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  151. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  152. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  154. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  156. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  158. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  159. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  160. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  161. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  162. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  163. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  164. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  165. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  166. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  167. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  168. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  169. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  170. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  171. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  172. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  173. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  174. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  175. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  176. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  177. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  178. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  179. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  180. package/lib/runjs-context/snippets/types.d.ts +9 -1
  181. package/lib/scheduler/ModelOperationScheduler.d.ts +51 -0
  182. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  183. package/lib/types.d.ts +28 -3
  184. package/lib/types.js +4 -3
  185. package/lib/utils/associationObjectVariable.d.ts +32 -0
  186. package/lib/utils/associationObjectVariable.js +157 -0
  187. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  188. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  189. package/lib/utils/createEphemeralContext.d.ts +13 -0
  190. package/lib/utils/createEphemeralContext.js +140 -0
  191. package/lib/utils/flows.d.ts +10 -0
  192. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → utils/flows.js} +21 -15
  193. package/lib/utils/index.d.ts +7 -2
  194. package/lib/utils/index.js +19 -2
  195. package/lib/utils/jsxTransform.d.ts +15 -0
  196. package/lib/utils/jsxTransform.js +68 -0
  197. package/lib/utils/params-resolvers.js +3 -3
  198. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  199. package/lib/utils/parsePathnameToViewParams.js +41 -5
  200. package/lib/utils/pruneFilter.d.ts +21 -0
  201. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  202. package/lib/utils/safeGlobals.d.ts +5 -3
  203. package/lib/utils/safeGlobals.js +40 -0
  204. package/lib/utils/schema-utils.js +2 -2
  205. package/lib/utils/serverContextParams.d.ts +1 -0
  206. package/lib/utils/translation.d.ts +4 -1
  207. package/lib/utils/translation.js +6 -2
  208. package/lib/utils/variablesParams.d.ts +9 -5
  209. package/lib/utils/variablesParams.js +47 -36
  210. package/lib/views/DrawerComponent.js +21 -2
  211. package/lib/views/PageComponent.js +2 -1
  212. package/lib/views/ViewNavigation.d.ts +3 -9
  213. package/lib/views/ViewNavigation.js +16 -2
  214. package/lib/views/createViewMeta.d.ts +29 -1
  215. package/lib/views/createViewMeta.js +338 -72
  216. package/lib/views/index.d.ts +1 -0
  217. package/lib/views/index.js +3 -0
  218. package/lib/views/useDialog.d.ts +8 -8
  219. package/lib/views/useDialog.js +8 -7
  220. package/lib/views/useDrawer.d.ts +8 -8
  221. package/lib/views/useDrawer.js +43 -28
  222. package/lib/views/usePage.d.ts +8 -8
  223. package/lib/views/usePage.js +8 -7
  224. package/package.json +6 -3
  225. package/src/BlockScopedFlowEngine.ts +86 -0
  226. package/src/FlowContextProvider.tsx +4 -2
  227. package/src/JSRunner.ts +3 -0
  228. package/src/ViewScopedFlowEngine.ts +15 -1
  229. package/src/__tests__/JSRunner.test.ts +62 -53
  230. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  231. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  232. package/src/__tests__/flow-engine.test.ts +3 -0
  233. package/src/__tests__/flowContext.test.ts +52 -0
  234. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  235. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  236. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  237. package/src/__tests__/flowSettings.open.test.tsx +2 -0
  238. package/src/__tests__/flowSettings.test.ts +2 -0
  239. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  240. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  241. package/src/__tests__/objectVariable.test.ts +464 -0
  242. package/src/__tests__/runjsContext.test.ts +216 -35
  243. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  244. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  245. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  246. package/src/__tests__/runjsLocales.test.ts +36 -0
  247. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  248. package/src/__tests__/runjsSnippets.test.ts +140 -0
  249. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  250. package/src/acl/Acl.tsx +14 -0
  251. package/src/acl/__tests__/Acl.test.tsx +43 -0
  252. package/src/components/DynamicFlowsEditor.tsx +3 -4
  253. package/src/components/FieldModelRenderer.tsx +20 -7
  254. package/src/components/FieldSkeleton.tsx +27 -0
  255. package/src/components/FlowContextSelector.tsx +6 -2
  256. package/src/components/FlowModelRenderer.tsx +33 -81
  257. package/src/components/FormItem.tsx +8 -1
  258. package/src/components/MobilePopup.style.ts +220 -0
  259. package/src/components/MobilePopup.tsx +86 -0
  260. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  261. package/src/components/index.ts +1 -0
  262. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  263. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  264. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  265. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +39 -10
  266. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  267. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +425 -0
  268. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  269. package/src/components/variables/VariableInput.tsx +25 -5
  270. package/src/components/variables/VariableTag.tsx +54 -2
  271. package/src/components/variables/types.ts +2 -0
  272. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  273. package/src/data-source/index.ts +42 -11
  274. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  275. package/src/emitter.ts +14 -0
  276. package/src/executor/FlowExecutor.ts +213 -119
  277. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  278. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  279. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  280. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  281. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  282. package/src/flowContext.ts +290 -104
  283. package/src/flowEngine.ts +74 -6
  284. package/src/flowSettings.ts +9 -4
  285. package/src/hooks/useApplyAutoFlows.ts +3 -1
  286. package/src/index.ts +12 -1
  287. package/src/locale/en-US.json +4 -2
  288. package/src/locale/zh-CN.json +4 -2
  289. package/src/models/CollectionFieldModel.tsx +56 -7
  290. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  291. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  292. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  293. package/src/models/__tests__/flowModel.test.ts +234 -111
  294. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  295. package/src/models/flowModel.tsx +180 -132
  296. package/src/models/forkFlowModel.ts +48 -8
  297. package/src/provider.tsx +10 -7
  298. package/src/resources/multiRecordResource.ts +28 -1
  299. package/src/resources/singleRecordResource.ts +19 -1
  300. package/src/resources/sqlResource.ts +20 -25
  301. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  302. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  303. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  304. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  305. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  306. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  307. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  308. package/src/runjs-context/contexts/base.ts +171 -0
  309. package/src/runjs-context/helpers.ts +32 -30
  310. package/src/runjs-context/registry.ts +16 -47
  311. package/src/runjs-context/setup.ts +51 -0
  312. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  313. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  314. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  315. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  316. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  317. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  318. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  319. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  320. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  321. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  322. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  323. package/src/runjs-context/snippets/index.ts +177 -39
  324. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  325. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  326. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  327. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  328. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  329. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  330. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  331. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  332. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  333. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  334. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  335. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  336. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  337. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  338. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  339. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  340. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  341. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  342. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  343. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  344. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  345. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  346. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  347. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  348. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  349. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  350. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  351. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  352. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  353. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  354. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  355. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  356. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  357. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  358. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  359. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  360. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  361. package/src/runjs-context/snippets/types.ts +5 -1
  362. package/src/scheduler/ModelOperationScheduler.ts +304 -0
  363. package/src/types.ts +34 -0
  364. package/src/utils/__tests__/flows.test.ts +65 -0
  365. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  366. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  367. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  368. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  369. package/src/utils/associationObjectVariable.ts +180 -0
  370. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  371. package/src/utils/createEphemeralContext.ts +142 -0
  372. package/src/utils/flows.ts +23 -0
  373. package/src/utils/index.ts +10 -2
  374. package/src/utils/jsxTransform.ts +39 -0
  375. package/src/utils/params-resolvers.ts +2 -2
  376. package/src/utils/parsePathnameToViewParams.ts +50 -6
  377. package/src/utils/pruneFilter.ts +41 -0
  378. package/src/utils/safeGlobals.ts +49 -3
  379. package/src/utils/schema-utils.ts +1 -1
  380. package/src/utils/serverContextParams.ts +1 -0
  381. package/src/utils/translation.ts +7 -2
  382. package/src/utils/variablesParams.ts +50 -38
  383. package/src/views/DrawerComponent.tsx +21 -2
  384. package/src/views/PageComponent.tsx +1 -1
  385. package/src/views/ViewNavigation.ts +20 -12
  386. package/src/views/__tests__/ViewNavigation.test.ts +10 -0
  387. package/src/views/createViewMeta.ts +393 -70
  388. package/src/views/index.tsx +1 -0
  389. package/src/views/useDialog.tsx +12 -10
  390. package/src/views/useDrawer.tsx +62 -37
  391. package/src/views/usePage.tsx +13 -10
  392. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  393. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  394. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  395. package/lib/runjs-context/index.d.ts +0 -19
  396. package/lib/runjs-context/index.js +0 -57
  397. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  398. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  399. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  400. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  401. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  402. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  403. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  404. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  405. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  406. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  407. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  408. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  409. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  410. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  411. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  412. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  413. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  414. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  415. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  416. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  417. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  418. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  419. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  420. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  421. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  422. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  423. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  424. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  425. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  426. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  427. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  428. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  429. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  430. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  431. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  432. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  433. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  434. package/src/runjs-context/index.ts +0 -20
  435. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  436. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  437. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  438. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  439. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  440. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  441. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  442. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  443. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  444. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  445. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  446. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  447. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  448. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  449. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  450. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  451. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  452. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  453. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  454. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  455. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  456. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  457. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  458. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  459. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  460. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  461. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  462. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -51,7 +51,7 @@ __export(flowContext_exports, {
51
51
  FlowEngineContext: () => FlowEngineContext,
52
52
  FlowForkModelContext: () => FlowForkModelContext,
53
53
  FlowModelContext: () => FlowModelContext,
54
- FlowRunjsContext: () => FlowRunjsContext,
54
+ FlowRunJSContext: () => FlowRunJSContext,
55
55
  FlowRuntimeContext: () => FlowRuntimeContext
56
56
  });
57
57
  module.exports = __toCommonJS(flowContext_exports);
@@ -60,18 +60,22 @@ var antd = __toESM(require("antd"));
60
60
  var import_lodash = __toESM(require("lodash"));
61
61
  var import_qs = __toESM(require("qs"));
62
62
  var import_react = __toESM(require("react"));
63
+ var ReactDOMClient = __toESM(require("react-dom/client"));
64
+ var import_ElementProxy = require("./ElementProxy");
63
65
  var import_Acl = require("./acl/Acl");
64
66
  var import_ContextPathProxy = require("./ContextPathProxy");
65
67
  var import_data_source = require("./data-source");
66
68
  var import_flowEngine = require("./flowEngine");
67
69
  var import_flowI18n = require("./flowI18n");
68
70
  var import_JSRunner = require("./JSRunner");
69
- var import_models = require("./models");
70
71
  var import_resources = require("./resources");
71
72
  var import_utils = require("./utils");
72
73
  var import_exceptions = require("./utils/exceptions");
73
74
  var import_params_resolvers = require("./utils/params-resolvers");
74
75
  var import_serverContextParams = require("./utils/serverContextParams");
76
+ var import_registry = require("./runjs-context/registry");
77
+ var import_createEphemeralContext = require("./utils/createEphemeralContext");
78
+ var import_dayjs = __toESM(require("dayjs"));
75
79
  var _proxy, _FlowContext_instances, createChildNodes_fn, findMetaByPath_fn, findMetaInDelegatesDeep_fn, findMetaInProperty_fn, resolvePathInMeta_fn, resolvePathInMetaAsync_fn, buildParentTitles_fn, toTreeNode_fn;
76
80
  function isRecordRefLike(val) {
77
81
  return !!(val && typeof val === "object" && "collection" in val && "filterByTk" in val);
@@ -657,34 +661,6 @@ toTreeNode_fn = /* @__PURE__ */ __name(function(name, metaOrFactory, paths = [na
657
661
  }, "#toTreeNode");
658
662
  __name(_FlowContext, "FlowContext");
659
663
  let FlowContext = _FlowContext;
660
- const _FlowRunjsContext = class _FlowRunjsContext extends FlowContext {
661
- constructor(delegate) {
662
- super();
663
- this.addDelegate(delegate);
664
- this.defineProperty("React", { value: import_react.default });
665
- this.defineProperty("antd", { value: antd });
666
- this.defineMethod(
667
- "dispatchModelEvent",
668
- async (modelOrUid, eventName, inputArgs) => {
669
- var _a, _b;
670
- let model = null;
671
- if (typeof modelOrUid === "string") {
672
- model = await this.engine.loadModel({ uid: modelOrUid });
673
- } else if (modelOrUid instanceof import_models.FlowModel) {
674
- model = modelOrUid;
675
- }
676
- if (model) {
677
- model.context.addDelegate(this);
678
- model.dispatchEvent(eventName, { navigation: false, ...(_b = (_a = this.model) == null ? void 0 : _a["getInputArgs"]) == null ? void 0 : _b.call(_a), ...inputArgs });
679
- } else {
680
- this.message.error(this.t("Model with ID {{uid}} not found", { uid: modelOrUid }));
681
- }
682
- }
683
- );
684
- }
685
- };
686
- __name(_FlowRunjsContext, "FlowRunjsContext");
687
- let FlowRunjsContext = _FlowRunjsContext;
688
664
  const _BaseFlowEngineContext = class _BaseFlowEngineContext extends FlowContext {
689
665
  };
690
666
  __name(_BaseFlowEngineContext, "BaseFlowEngineContext");
@@ -724,7 +700,7 @@ const _FlowEngineContext = class _FlowEngineContext extends BaseFlowEngineContex
724
700
  });
725
701
  this.defineMethod("runjs", async (code, variables, options) => {
726
702
  const mergedGlobals = { ...(options == null ? void 0 : options.globals) || {}, ...variables || {} };
727
- const runner = this.createJSRunner({
703
+ const runner = await this.createJSRunner({
728
704
  ...options || {},
729
705
  globals: mergedGlobals
730
706
  });
@@ -797,6 +773,16 @@ const _FlowEngineContext = class _FlowEngineContext extends BaseFlowEngineContex
797
773
  const inputFromMeta = await collectFromMeta();
798
774
  const autoInput = { ...inputFromMeta };
799
775
  const autoContextParams = Object.keys(autoInput).length ? (0, import_serverContextParams.buildServerContextParams)(this, autoInput) : void 0;
776
+ if (!autoContextParams) {
777
+ const keys = Object.keys(serverVarPaths);
778
+ const allOptional = keys.length > 0 && keys.every((k) => {
779
+ var _a2;
780
+ return (_a2 = this.getPropertyOptions(k)) == null ? void 0 : _a2.serverOnlyWhenContextParams;
781
+ });
782
+ if (allOptional) {
783
+ return (0, import_utils.resolveExpressions)(template, this);
784
+ }
785
+ }
800
786
  if (this.api) {
801
787
  try {
802
788
  serverResolved = await (0, import_params_resolvers.enqueueVariablesResolve)(this, {
@@ -930,45 +916,54 @@ const _FlowEngineContext = class _FlowEngineContext extends BaseFlowEngineContex
930
916
  );
931
917
  });
932
918
  });
933
- this.defineMethod("createJSRunner", function(options) {
934
- const runCtx = new FlowRunjsContext(this.createProxy());
935
- return new import_JSRunner.JSRunner({
936
- ...options,
937
- globals: {
938
- ctx: runCtx,
939
- window: (0, import_utils.createSafeWindow)(),
940
- document: (0, import_utils.createSafeDocument)(),
941
- ...options == null ? void 0 : options.globals
942
- }
943
- });
944
- });
945
- this.defineMethod("copyToClipboard", async (text) => {
946
- const content = String(text ?? "");
947
- try {
948
- if (typeof navigator !== "undefined" && navigator.clipboard && navigator.clipboard.writeText) {
949
- await navigator.clipboard.writeText(content);
950
- return;
951
- }
952
- } catch (e) {
919
+ this.defineMethod("importAsync", async (url) => {
920
+ if (!url || typeof url !== "string") {
921
+ throw new Error("invalid url");
953
922
  }
954
- return new Promise((resolve, reject) => {
923
+ const u = url.trim();
924
+ const g = globalThis;
925
+ g.__nocobaseImportAsyncCache = g.__nocobaseImportAsyncCache || /* @__PURE__ */ new Map();
926
+ const cache = g.__nocobaseImportAsyncCache;
927
+ if (cache.has(u)) return cache.get(u);
928
+ const nativeImport = /* @__PURE__ */ __name(() => import(
929
+ /* @vite-ignore */
930
+ /* webpackIgnore: true */
931
+ u
932
+ ), "nativeImport");
933
+ const evalImport = /* @__PURE__ */ __name(() => {
934
+ const importer = (0, eval)("u => import(u)");
935
+ return importer(u);
936
+ }, "evalImport");
937
+ const p = (async () => {
955
938
  try {
956
- const ta = document.createElement("textarea");
957
- ta.value = content;
958
- ta.setAttribute("readonly", "");
959
- ta.style.position = "fixed";
960
- ta.style.top = "-9999px";
961
- document.body.appendChild(ta);
962
- ta.focus();
963
- ta.select();
964
- const ok = document.execCommand("copy");
965
- document.body.removeChild(ta);
966
- if (ok) resolve();
967
- else reject(new Error("execCommand copy failed"));
939
+ return await nativeImport();
968
940
  } catch (err) {
969
- reject(err);
941
+ try {
942
+ return await evalImport();
943
+ } catch (err2) {
944
+ throw err2 || err;
945
+ }
970
946
  }
971
- });
947
+ })();
948
+ cache.set(u, p);
949
+ return p;
950
+ });
951
+ this.defineMethod("createJSRunner", async function(options) {
952
+ try {
953
+ const mod = await import("./runjs-context/setup");
954
+ if (typeof (mod == null ? void 0 : mod.setupRunJSContexts) === "function") await mod.setupRunJSContexts();
955
+ } catch (_2) {
956
+ }
957
+ const version = (options == null ? void 0 : options.version) || "v1";
958
+ const modelClass = (0, import_registry.getModelClassName)(this);
959
+ const Ctor = import_registry.RunJSContextRegistry.resolve(version, modelClass) || import_registry.RunJSContextRegistry.resolve(version, "*") || FlowRunJSContext;
960
+ let runCtx;
961
+ if (Ctor) {
962
+ runCtx = new Ctor(this);
963
+ }
964
+ const globals = { ctx: runCtx, ...(options == null ? void 0 : options.globals) || {} };
965
+ const { timeoutMs } = options || {};
966
+ return new import_JSRunner.JSRunner({ globals, timeoutMs });
972
967
  });
973
968
  this.defineMethod("buildServerContextParams", function(input) {
974
969
  return (0, import_serverContextParams.buildServerContextParams)(this, input);
@@ -986,7 +981,7 @@ const _FlowEngineContext = class _FlowEngineContext extends BaseFlowEngineContex
986
981
  "runAction",
987
982
  async function(actionName, params) {
988
983
  const def = this.engine.getAction(actionName);
989
- const ctx = this.createProxy();
984
+ const ctx = await (0, import_createEphemeralContext.createEphemeralContext)(this, def);
990
985
  if (!def) {
991
986
  throw new Error(`Action '${actionName}' not found.`);
992
987
  }
@@ -1019,13 +1014,22 @@ const _FlowEngineContext = class _FlowEngineContext extends BaseFlowEngineContex
1019
1014
  context: this.createProxy()
1020
1015
  });
1021
1016
  });
1017
+ this.defineMethod(
1018
+ "useResource",
1019
+ function(className) {
1020
+ if (this.has("resource")) return;
1021
+ this.defineProperty("resource", {
1022
+ get: /* @__PURE__ */ __name(() => this.createResource(className), "get")
1023
+ });
1024
+ }
1025
+ );
1022
1026
  }
1023
1027
  };
1024
1028
  __name(_FlowEngineContext, "FlowEngineContext");
1025
1029
  let FlowEngineContext = _FlowEngineContext;
1026
1030
  const _FlowModelContext = class _FlowModelContext extends BaseFlowModelContext {
1027
1031
  constructor(model) {
1028
- if (!(model instanceof import_models.FlowModel)) {
1032
+ if (!model || typeof model !== "object") {
1029
1033
  throw new Error("Invalid FlowModel instance");
1030
1034
  }
1031
1035
  super();
@@ -1034,7 +1038,7 @@ const _FlowModelContext = class _FlowModelContext extends BaseFlowModelContext {
1034
1038
  this.engine.reactView.onRefReady(ref, cb, timeout);
1035
1039
  });
1036
1040
  this.defineMethod("runjs", async (code, variables, options) => {
1037
- const runner = this.createJSRunner({
1041
+ const runner = await this.createJSRunner({
1038
1042
  globals: variables,
1039
1043
  version: options == null ? void 0 : options.version
1040
1044
  });
@@ -1051,7 +1055,7 @@ const _FlowModelContext = class _FlowModelContext extends BaseFlowModelContext {
1051
1055
  }, "get")
1052
1056
  });
1053
1057
  this.defineMethod("openView", async function(uid, options) {
1054
- var _a, _b, _c, _d, _e, _f, _g;
1058
+ var _a, _b, _c, _d, _e, _f;
1055
1059
  const opts = { ...options };
1056
1060
  if (opts.defineProperties || opts.defineMethod) {
1057
1061
  opts.navigation = false;
@@ -1069,28 +1073,29 @@ const _FlowModelContext = class _FlowModelContext extends BaseFlowModelContext {
1069
1073
  stepParams: {
1070
1074
  popupSettings: {
1071
1075
  openView: {
1072
- ...import_lodash.default.pick(opts, ["dataSourceKey", "collectionName", "associationName"])
1076
+ // 持久化首次传入的关键展示/数据参数,供后续路由与再次打开复用
1077
+ ...import_lodash.default.pick(opts, ["dataSourceKey", "collectionName", "associationName", "mode", "size"])
1073
1078
  }
1074
1079
  }
1075
1080
  }
1076
1081
  });
1077
1082
  await model2.save();
1078
1083
  }
1079
- if ((_b = (_a = model2.getStepParams("popupSettings")) == null ? void 0 : _a.openView) == null ? void 0 : _b.dataSourceKey) {
1080
- model2.setStepParams("popupSettings", {
1081
- openView: {
1082
- ...(_c = model2.getStepParams("popupSettings")) == null ? void 0 : _c.openView,
1083
- ...import_lodash.default.pick(opts, ["dataSourceKey", "collectionName", "associationName"])
1084
- }
1085
- });
1086
- await model2.save();
1084
+ if ((_a = model2.getStepParams("popupSettings")) == null ? void 0 : _a.openView) {
1085
+ const prevOpenView = ((_b = model2.getStepParams("popupSettings")) == null ? void 0 : _b.openView) || {};
1086
+ const incoming = import_lodash.default.pick(opts, ["dataSourceKey", "collectionName", "associationName", "mode", "size"]);
1087
+ const nextOpenView = { ...prevOpenView, ...incoming };
1088
+ if (!import_lodash.default.isEqual(prevOpenView, nextOpenView)) {
1089
+ model2.setStepParams("popupSettings", { openView: nextOpenView });
1090
+ await model2.save();
1091
+ }
1087
1092
  }
1088
- const viewUid = (opts == null ? void 0 : opts.routeViewUid) ?? (opts == null ? void 0 : opts.viewUid) ?? (((_e = (_d = model2.stepParams) == null ? void 0 : _d.popupSettings) == null ? void 0 : _e.openView) ? model2.uid : this.model.uid);
1093
+ const viewUid = (opts == null ? void 0 : opts.routeViewUid) ?? (opts == null ? void 0 : opts.viewUid) ?? (((_d = (_c = model2.stepParams) == null ? void 0 : _c.popupSettings) == null ? void 0 : _d.openView) ? model2.uid : this.model.uid);
1089
1094
  const parentView = this.view;
1090
1095
  const pendingType = (opts == null ? void 0 : opts.isMobileLayout) ? "embed" : (opts == null ? void 0 : opts.mode) || "drawer";
1091
1096
  const pendingInputArgs = { ...opts, viewUid, navigation: opts.navigation };
1092
- pendingInputArgs.filterByTk = pendingInputArgs.filterByTk || ((_f = this.inputArgs) == null ? void 0 : _f.filterByTk);
1093
- pendingInputArgs.sourceId = pendingInputArgs.sourceId || ((_g = this.inputArgs) == null ? void 0 : _g.sourceId);
1097
+ pendingInputArgs.filterByTk = pendingInputArgs.filterByTk || ((_e = this.inputArgs) == null ? void 0 : _e.filterByTk);
1098
+ pendingInputArgs.sourceId = pendingInputArgs.sourceId || ((_f = this.inputArgs) == null ? void 0 : _f.sourceId);
1094
1099
  const pendingView = {
1095
1100
  type: pendingType,
1096
1101
  inputArgs: pendingInputArgs,
@@ -1119,7 +1124,7 @@ const _FlowModelContext = class _FlowModelContext extends BaseFlowModelContext {
1119
1124
  "runAction",
1120
1125
  async function(actionName, params) {
1121
1126
  const def = this.model.getAction(actionName);
1122
- const ctx = this.createProxy();
1127
+ const ctx = await (0, import_createEphemeralContext.createEphemeralContext)(this, def);
1123
1128
  if (!def) {
1124
1129
  throw new Error(`Action '${actionName}' not found.`);
1125
1130
  }
@@ -1144,7 +1149,7 @@ __name(_FlowModelContext, "FlowModelContext");
1144
1149
  let FlowModelContext = _FlowModelContext;
1145
1150
  const _FlowForkModelContext = class _FlowForkModelContext extends BaseFlowModelContext {
1146
1151
  constructor(master, fork) {
1147
- if (!(master instanceof import_models.FlowModel)) {
1152
+ if (!master || typeof master !== "object") {
1148
1153
  throw new Error("Invalid FlowModel instance");
1149
1154
  }
1150
1155
  super();
@@ -1165,7 +1170,7 @@ const _FlowForkModelContext = class _FlowForkModelContext extends BaseFlowModelC
1165
1170
  }, "get")
1166
1171
  });
1167
1172
  this.defineMethod("runjs", async (code, variables, options) => {
1168
- const runner = this.createJSRunner({
1173
+ const runner = await this.createJSRunner({
1169
1174
  globals: variables,
1170
1175
  version: options == null ? void 0 : options.version
1171
1176
  });
@@ -1216,7 +1221,7 @@ const _FlowRuntimeContext = class _FlowRuntimeContext extends BaseFlowModelConte
1216
1221
  this.engine.reactView.onRefReady(ref, cb, timeout);
1217
1222
  });
1218
1223
  this.defineMethod("runjs", async (code, variables, options) => {
1219
- const runner = this.createJSRunner({
1224
+ const runner = await this.createJSRunner({
1220
1225
  globals: variables,
1221
1226
  version: options == null ? void 0 : options.version
1222
1227
  });
@@ -1257,12 +1262,135 @@ const _FlowRuntimeContext = class _FlowRuntimeContext extends BaseFlowModelConte
1257
1262
  };
1258
1263
  __name(_FlowRuntimeContext, "FlowRuntimeContext");
1259
1264
  let FlowRuntimeContext = _FlowRuntimeContext;
1265
+ const __runjsClassDefaultMeta = /* @__PURE__ */ new WeakMap();
1266
+ const __runjsClassLocaleMeta = /* @__PURE__ */ new WeakMap();
1267
+ const __runjsDocCache = /* @__PURE__ */ new WeakMap();
1268
+ function __runjsDeepMerge(base, patch) {
1269
+ if (patch === null) return void 0;
1270
+ if (Array.isArray(base) || Array.isArray(patch) || typeof base !== "object" || typeof patch !== "object") {
1271
+ return patch ?? base;
1272
+ }
1273
+ const out = { ...base };
1274
+ for (const k of Object.keys(patch)) {
1275
+ const v = __runjsDeepMerge(base == null ? void 0 : base[k], patch[k]);
1276
+ if (typeof v === "undefined") delete out[k];
1277
+ else out[k] = v;
1278
+ }
1279
+ return out;
1280
+ }
1281
+ __name(__runjsDeepMerge, "__runjsDeepMerge");
1282
+ const _FlowRunJSContext = class _FlowRunJSContext extends FlowContext {
1283
+ constructor(delegate) {
1284
+ super();
1285
+ this.addDelegate(delegate);
1286
+ this.defineProperty("React", { value: import_react.default });
1287
+ this.defineProperty("antd", { value: antd });
1288
+ this.defineProperty("dayjs", { value: import_dayjs.default });
1289
+ const ReactDOMShim = {
1290
+ ...ReactDOMClient,
1291
+ createRoot: /* @__PURE__ */ __name((container, options) => {
1292
+ const realContainer = (container == null ? void 0 : container.__el) || container;
1293
+ return this.engine.reactView.createRoot(realContainer, options);
1294
+ }, "createRoot")
1295
+ };
1296
+ this.defineProperty("ReactDOM", { value: ReactDOMShim });
1297
+ this.defineMethod(
1298
+ "render",
1299
+ function(vnode, container) {
1300
+ const el = container || this.element;
1301
+ if (!el) throw new Error("ctx.render: container not provided and ctx.element is not available");
1302
+ const containerEl = (el == null ? void 0 : el.__el) || el;
1303
+ const globalRef = globalThis;
1304
+ globalRef.__nbRunjsRoots = globalRef.__nbRunjsRoots || /* @__PURE__ */ new WeakMap();
1305
+ const rootMap = globalRef.__nbRunjsRoots;
1306
+ if (typeof vnode === "string") {
1307
+ const existingRoot = rootMap.get(containerEl);
1308
+ if (existingRoot && typeof existingRoot.unmount === "function") {
1309
+ try {
1310
+ existingRoot.unmount();
1311
+ } finally {
1312
+ rootMap.delete(containerEl);
1313
+ }
1314
+ }
1315
+ const proxy = new import_ElementProxy.ElementProxy(containerEl);
1316
+ proxy.innerHTML = String(vnode ?? "");
1317
+ return null;
1318
+ }
1319
+ if (vnode && vnode.nodeType && (vnode.nodeType === 1 || vnode.nodeType === 3 || vnode.nodeType === 11)) {
1320
+ const existingRoot = rootMap.get(containerEl);
1321
+ if (existingRoot && typeof existingRoot.unmount === "function") {
1322
+ try {
1323
+ existingRoot.unmount();
1324
+ } finally {
1325
+ rootMap.delete(containerEl);
1326
+ }
1327
+ }
1328
+ while (containerEl.firstChild) containerEl.removeChild(containerEl.firstChild);
1329
+ containerEl.appendChild(vnode);
1330
+ return null;
1331
+ }
1332
+ let root = rootMap.get(containerEl);
1333
+ if (!root) {
1334
+ root = this.ReactDOM.createRoot(containerEl);
1335
+ rootMap.set(containerEl, root);
1336
+ }
1337
+ root.render(vnode);
1338
+ return root;
1339
+ }
1340
+ );
1341
+ }
1342
+ static define(meta, options) {
1343
+ const locale = options == null ? void 0 : options.locale;
1344
+ if (locale) {
1345
+ const map = __runjsClassLocaleMeta.get(this) || /* @__PURE__ */ new Map();
1346
+ const prev = map.get(locale) || {};
1347
+ map.set(locale, __runjsDeepMerge(prev, meta));
1348
+ __runjsClassLocaleMeta.set(this, map);
1349
+ } else {
1350
+ const prev = __runjsClassDefaultMeta.get(this) || {};
1351
+ __runjsClassDefaultMeta.set(this, __runjsDeepMerge(prev, meta));
1352
+ }
1353
+ __runjsDocCache.delete(this);
1354
+ }
1355
+ static getDoc(locale) {
1356
+ const self = this;
1357
+ let cacheForClass = __runjsDocCache.get(self);
1358
+ const cacheKey = String(locale || "default");
1359
+ if (cacheForClass && cacheForClass.has(cacheKey)) return cacheForClass.get(cacheKey);
1360
+ const chain = [];
1361
+ let cur = self;
1362
+ while (cur && cur.prototype) {
1363
+ chain.unshift(cur);
1364
+ cur = Object.getPrototypeOf(cur);
1365
+ }
1366
+ let merged = {};
1367
+ for (const cls of chain) {
1368
+ merged = __runjsDeepMerge(merged, __runjsClassDefaultMeta.get(cls) || {});
1369
+ }
1370
+ if (locale) {
1371
+ for (const cls of chain) {
1372
+ const lmap = __runjsClassLocaleMeta.get(cls);
1373
+ if (lmap && lmap.has(locale)) {
1374
+ merged = __runjsDeepMerge(merged, lmap.get(locale));
1375
+ }
1376
+ }
1377
+ }
1378
+ if (!cacheForClass) {
1379
+ cacheForClass = /* @__PURE__ */ new Map();
1380
+ __runjsDocCache.set(self, cacheForClass);
1381
+ }
1382
+ cacheForClass.set(cacheKey, merged);
1383
+ return merged;
1384
+ }
1385
+ };
1386
+ __name(_FlowRunJSContext, "FlowRunJSContext");
1387
+ let FlowRunJSContext = _FlowRunJSContext;
1260
1388
  // Annotate the CommonJS export names for ESM import in node:
1261
1389
  0 && (module.exports = {
1262
1390
  FlowContext,
1263
1391
  FlowEngineContext,
1264
1392
  FlowForkModelContext,
1265
1393
  FlowModelContext,
1266
- FlowRunjsContext,
1394
+ FlowRunJSContext,
1267
1395
  FlowRuntimeContext
1268
1396
  });
@@ -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,13 @@ export declare class FlowEngine {
81
84
  private _previousEngine?;
82
85
  private _nextEngine?;
83
86
  private _resources;
87
+ /**
88
+ * 引擎事件总线(目前用于模型生命周期等事件)。
89
+ * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
90
+ */
91
+ emitter: Emitter;
92
+ /** 调度器:仅在 View 作用域引擎本地启用;根/Block 作用域默认不持有 */
93
+ private _modelOperationScheduler?;
84
94
  logger: pino.Logger;
85
95
  /**
86
96
  * Flow settings, including components and form scopes.
@@ -95,13 +105,19 @@ export declare class FlowEngine {
95
105
  */
96
106
  reactView: ReactView;
97
107
  /**
98
- * Flow executor that runs flows and auto-flows.
108
+ * Flow executor that runs event flows.
99
109
  */
100
110
  executor: FlowExecutor;
101
111
  /**
102
112
  * Constructor. Initializes React view, registers default model and form scopes.
103
113
  */
104
114
  constructor();
115
+ /** 获取/创建当前引擎的调度器(仅在本地作用域) */
116
+ getScheduler(): ModelOperationScheduler;
117
+ /** 释放并清理当前引擎本地调度器(若存在) */
118
+ disposeScheduler(): void;
119
+ /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
120
+ scheduleModelOperation(fromModelOrUid: FlowModel | string, toUid: string, fn: (model: FlowModel) => Promise<void> | void, options?: ScheduleOptions): ScheduledCancel;
105
121
  /** 上一个引擎(根引擎为 undefined) */
106
122
  get previousEngine(): FlowEngine | undefined;
107
123
  /** 下一个引擎(若存在) */
@@ -304,6 +320,13 @@ export declare class FlowEngine {
304
320
  * @returns {Promise<boolean>} Whether destroyed successfully
305
321
  */
306
322
  destroyModel(uid: string): Promise<boolean>;
323
+ /**
324
+ * Duplicate a model tree via repository API.
325
+ * Returns the duplicated model JSON (root with subModels) or null if not available.
326
+ * @param {string} uid UID of the model to duplicate
327
+ * @returns {Promise<any | null>} Duplicated model JSON or null
328
+ */
329
+ duplicateModel(uid: string): Promise<Record<string, any>>;
307
330
  /**
308
331
  * Replace a model instance with a new instance of a class.
309
332
  * @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,13 @@ const _FlowEngine = class _FlowEngine {
118
120
  __publicField(this, "_previousEngine");
119
121
  __publicField(this, "_nextEngine");
120
122
  __publicField(this, "_resources", /* @__PURE__ */ new Map());
123
+ /**
124
+ * 引擎事件总线(目前用于模型生命周期等事件)。
125
+ * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
126
+ */
127
+ __publicField(this, "emitter", new import_emitter.Emitter());
128
+ /** 调度器:仅在 View 作用域引擎本地启用;根/Block 作用域默认不持有 */
129
+ __publicField(this, "_modelOperationScheduler");
121
130
  __publicField(this, "logger");
122
131
  /**
123
132
  * Flow settings, including components and form scopes.
@@ -132,7 +141,7 @@ const _FlowEngine = class _FlowEngine {
132
141
  */
133
142
  __publicField(this, "reactView");
134
143
  /**
135
- * Flow executor that runs flows and auto-flows.
144
+ * Flow executor that runs event flows.
136
145
  */
137
146
  __publicField(this, "executor");
138
147
  this.reactView = new import_ReactView.ReactView(this);
@@ -161,6 +170,27 @@ const _FlowEngine = class _FlowEngine {
161
170
  });
162
171
  this.executor = new import_FlowExecutor.FlowExecutor(this);
163
172
  }
173
+ /** 获取/创建当前引擎的调度器(仅在本地作用域) */
174
+ getScheduler() {
175
+ if (!this._modelOperationScheduler) {
176
+ this._modelOperationScheduler = new import_ModelOperationScheduler.default(this);
177
+ }
178
+ return this._modelOperationScheduler;
179
+ }
180
+ /** 释放并清理当前引擎本地调度器(若存在) */
181
+ disposeScheduler() {
182
+ if (this._modelOperationScheduler) {
183
+ try {
184
+ this._modelOperationScheduler.dispose();
185
+ } finally {
186
+ this._modelOperationScheduler = void 0;
187
+ }
188
+ }
189
+ }
190
+ /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
191
+ scheduleModelOperation(fromModelOrUid, toUid, fn, options) {
192
+ return this.getScheduler().schedule(fromModelOrUid, toUid, fn, options);
193
+ }
164
194
  /** 上一个引擎(根引擎为 undefined) */
165
195
  get previousEngine() {
166
196
  return this._previousEngine;
@@ -384,6 +414,10 @@ const _FlowEngine = class _FlowEngine {
384
414
  }
385
415
  this._modelInstances.set(modelInstance.uid, modelInstance);
386
416
  modelInstance.onInit(options);
417
+ void this.emitter.emitAsync("model:created", {
418
+ uid: modelInstance.uid,
419
+ model: modelInstance
420
+ });
387
421
  this._applyFlowDefinitionDefaultParams(modelInstance).catch((err) => {
388
422
  console.warn("FlowEngine: apply flow defaultParams failed:", err);
389
423
  });
@@ -485,6 +519,10 @@ const _FlowEngine = class _FlowEngine {
485
519
  }
486
520
  }
487
521
  this._modelInstances.delete(uid);
522
+ void this.emitter.emitAsync("model:destroyed", {
523
+ uid,
524
+ model: modelInstance
525
+ });
488
526
  return true;
489
527
  }
490
528
  /**
@@ -629,6 +667,16 @@ const _FlowEngine = class _FlowEngine {
629
667
  }
630
668
  return this.removeModel(uid);
631
669
  }
670
+ /**
671
+ * Duplicate a model tree via repository API.
672
+ * Returns the duplicated model JSON (root with subModels) or null if not available.
673
+ * @param {string} uid UID of the model to duplicate
674
+ * @returns {Promise<any | null>} Duplicated model JSON or null
675
+ */
676
+ async duplicateModel(uid) {
677
+ if (!this.ensureModelRepository()) return null;
678
+ return this._modelRepository.duplicate(uid);
679
+ }
632
680
  /**
633
681
  * Replace a model instance with a new instance of a class.
634
682
  * @template T New model type
@@ -674,7 +722,7 @@ const _FlowEngine = class _FlowEngine {
674
722
  }
675
723
  if (currentParent) {
676
724
  currentParent.emitter.setPaused(false);
677
- currentParent.parent.invalidateAutoFlowCache(true);
725
+ currentParent.parent.invalidateFlowCache("beforeRender", true);
678
726
  (_a = currentParent.parent) == null ? void 0 : _a.rerender();
679
727
  currentParent.emitter.emit("onSubModelReplaced", { oldModel, newModel });
680
728
  }
@@ -704,7 +752,8 @@ const _FlowEngine = class _FlowEngine {
704
752
  console.error("FlowModel.moveTo: Parent subModels must be an array to perform move operation.");
705
753
  return false;
706
754
  }
707
- const findIndex = /* @__PURE__ */ __name((model) => subModels.findIndex((item) => item.uid === model.uid), "findIndex");
755
+ const subModelsCopy = [...subModels];
756
+ const findIndex = /* @__PURE__ */ __name((model) => subModelsCopy.findIndex((item) => item.uid === model.uid), "findIndex");
708
757
  const currentIndex = findIndex(sourceModel2);
709
758
  const targetIndex = findIndex(targetModel2);
710
759
  if (currentIndex === -1 || targetIndex === -1) {
@@ -715,11 +764,12 @@ const _FlowEngine = class _FlowEngine {
715
764
  console.warn("FlowModel.moveTo: Current model is already at the target position. No action taken.");
716
765
  return false;
717
766
  }
718
- const [movedModel] = subModels.splice(currentIndex, 1);
719
- subModels.splice(targetIndex, 0, movedModel);
720
- subModels.forEach((model, index) => {
767
+ const [movedModel] = subModelsCopy.splice(currentIndex, 1);
768
+ subModelsCopy.splice(targetIndex, 0, movedModel);
769
+ subModelsCopy.forEach((model, index) => {
721
770
  model.sortIndex = index;
722
771
  });
772
+ sourceModel2.parent.subModels[sourceModel2.subKey] = subModelsCopy;
723
773
  return true;
724
774
  }, "move");
725
775
  move(sourceModel, targetModel);
@@ -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 的可配置步骤)