@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
@@ -0,0 +1,64 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var export_selected_json_snippet_exports = {};
28
+ __export(export_selected_json_snippet_exports, {
29
+ default: () => export_selected_json_snippet_default
30
+ });
31
+ module.exports = __toCommonJS(export_selected_json_snippet_exports);
32
+ var import_JSCollectionActionRunJSContext = require("../../../contexts/JSCollectionActionRunJSContext");
33
+ const snippet = {
34
+ contexts: [import_JSCollectionActionRunJSContext.JSCollectionActionRunJSContext],
35
+ prefix: "sn-act-export",
36
+ label: "Export selected rows as JSON",
37
+ description: "Download selected rows as a JSON file",
38
+ locales: {
39
+ "zh-CN": {
40
+ label: "\u5BFC\u51FA\u9009\u4E2D\u884C\u4E3A JSON",
41
+ description: "\u5C06\u9009\u4E2D\u7684\u884C\u5BFC\u51FA\u4E3A JSON \u6587\u4EF6\u4E0B\u8F7D"
42
+ }
43
+ },
44
+ content: `
45
+ const rows = ctx.resource?.getSelectedRows?.() || [];
46
+ if (!rows.length) {
47
+ ctx.message.warning(ctx.t('Please select at least one row'));
48
+ return;
49
+ }
50
+
51
+ // Create JSON file and download
52
+ const jsonStr = JSON.stringify(rows, null, 2);
53
+ const blob = new Blob([jsonStr], { type: 'application/json' });
54
+ const url = URL.createObjectURL(blob);
55
+ const link = document.createElement('a');
56
+ link.href = url;
57
+ link.download = \`export-\${new Date().toISOString().split('T')[0]}.json\`;
58
+ link.click();
59
+ URL.revokeObjectURL(url);
60
+
61
+ ctx.message.success(ctx.t('Exported {{count}} records', { count: rows.length }));
62
+ `
63
+ };
64
+ var export_selected_json_snippet_default = snippet;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { SnippetModule } from '../../types';
10
+ declare const snippet: SnippetModule;
11
+ export default snippet;
@@ -29,10 +29,18 @@ __export(iterate_selected_rows_snippet_exports, {
29
29
  default: () => iterate_selected_rows_snippet_default
30
30
  });
31
31
  module.exports = __toCommonJS(iterate_selected_rows_snippet_exports);
32
- var iterate_selected_rows_snippet_default = {
33
- contexts: ["JSCollectionActionRunJSContext"],
32
+ var import_JSCollectionActionRunJSContext = require("../../../contexts/JSCollectionActionRunJSContext");
33
+ const snippet = {
34
+ contexts: [import_JSCollectionActionRunJSContext.JSCollectionActionRunJSContext],
34
35
  prefix: "sn-act-iterate",
35
36
  label: "Iterate selected rows",
37
+ description: "Loop through selected rows and process each record",
38
+ locales: {
39
+ "zh-CN": {
40
+ label: "\u904D\u5386\u9009\u4E2D\u884C",
41
+ description: "\u904D\u5386\u9009\u4E2D\u884C\u5E76\u5904\u7406\u6BCF\u6761\u8BB0\u5F55"
42
+ }
43
+ },
36
44
  content: `
37
45
  const rows = ctx.resource?.getSelectedRows?.() || [];
38
46
  for (const row of rows) {
@@ -41,3 +49,4 @@ for (const row of rows) {
41
49
  ctx.message.success(ctx.t('Processed {{count}} rows', { count: rows.length }));
42
50
  `
43
51
  };
52
+ var iterate_selected_rows_snippet_default = snippet;
@@ -6,11 +6,19 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ export type SnippetContextSpecifier = string | {
10
+ name: string;
11
+ } | (new (...args: any[]) => any);
9
12
  export type SnippetModule = {
10
13
  content: string;
11
- contexts?: string[];
14
+ contexts?: SnippetContextSpecifier[];
12
15
  versions?: string[];
16
+ scenes?: string[];
13
17
  prefix?: string;
14
18
  label?: string;
15
19
  description?: string;
20
+ locales?: Record<string, {
21
+ label?: string;
22
+ description?: string;
23
+ }>;
16
24
  };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { FlowEngine } from '../flowEngine';
10
+ import type { FlowModel } from '../models/flowModel';
11
+ type LifecycleType = 'created' | 'mounted' | 'unmounted' | 'destroyed' | `event:${string}:start` | `event:${string}:end` | `event:${string}:error`;
12
+ export type ScheduleWhen = LifecycleType | ((e: LifecycleEvent) => boolean);
13
+ export interface ScheduleOptions {
14
+ when?: ScheduleWhen;
15
+ }
16
+ export type ScheduledCancel = () => boolean;
17
+ export interface LifecycleEvent {
18
+ type: LifecycleType;
19
+ uid: string;
20
+ model?: FlowModel;
21
+ runId?: string;
22
+ error?: any;
23
+ inputArgs?: Record<string, any>;
24
+ result?: any;
25
+ }
26
+ export declare class ModelOperationScheduler {
27
+ private engine;
28
+ private itemsByTargetUid;
29
+ private itemIdsByFromUid;
30
+ private itemsById;
31
+ private unbindHandlers;
32
+ private subscribedEventNames;
33
+ constructor(engine: FlowEngine);
34
+ /** 外部调用入口 */
35
+ schedule(fromModelOrUid: FlowModel | string, toUid: string, fn: (model: FlowModel) => Promise<void> | void, options?: ScheduleOptions): ScheduledCancel;
36
+ cancel(filter: {
37
+ fromUid?: string;
38
+ toUid?: string;
39
+ }): void;
40
+ /** 引擎关闭时释放 */
41
+ dispose(): void;
42
+ private bindEngineLifecycle;
43
+ private ensureEventSubscriptionIfNeeded;
44
+ private parseEventWhen;
45
+ private processLifecycleEvent;
46
+ private shouldTrigger;
47
+ private tryExecuteOnce;
48
+ private internalCancel;
49
+ private takeItem;
50
+ }
51
+ export default ModelOperationScheduler;
@@ -0,0 +1,262 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var ModelOperationScheduler_exports = {};
29
+ __export(ModelOperationScheduler_exports, {
30
+ ModelOperationScheduler: () => ModelOperationScheduler,
31
+ default: () => ModelOperationScheduler_default
32
+ });
33
+ module.exports = __toCommonJS(ModelOperationScheduler_exports);
34
+ var import_secure = require("uid/secure");
35
+ const _ModelOperationScheduler = class _ModelOperationScheduler {
36
+ constructor(engine) {
37
+ this.engine = engine;
38
+ this.bindEngineLifecycle();
39
+ }
40
+ itemsByTargetUid = /* @__PURE__ */ new Map();
41
+ itemIdsByFromUid = /* @__PURE__ */ new Map();
42
+ itemsById = /* @__PURE__ */ new Map();
43
+ unbindHandlers = [];
44
+ subscribedEventNames = /* @__PURE__ */ new Set();
45
+ /** 外部调用入口 */
46
+ schedule(fromModelOrUid, toUid, fn, options) {
47
+ const fromUid = typeof fromModelOrUid === "string" ? fromModelOrUid : fromModelOrUid == null ? void 0 : fromModelOrUid.uid;
48
+ if (!fromUid) {
49
+ throw new Error("scheduleModelOperation: invalid from model or uid");
50
+ }
51
+ if (!toUid || typeof toUid !== "string") {
52
+ throw new Error("scheduleModelOperation: invalid target uid");
53
+ }
54
+ const item = {
55
+ id: (0, import_secure.uid)(),
56
+ fromUid,
57
+ toUid,
58
+ fn,
59
+ options: {
60
+ // 默认语义:仅当 when === 'created' 时,对“已存在的目标”进行一次立即执行;
61
+ // 其它 when 不做立即执行,需等待后续真实生命周期事件。
62
+ when: (options == null ? void 0 : options.when) ?? "created"
63
+ }
64
+ };
65
+ let targetMap = this.itemsByTargetUid.get(toUid);
66
+ if (!targetMap) {
67
+ targetMap = /* @__PURE__ */ new Map();
68
+ this.itemsByTargetUid.set(toUid, targetMap);
69
+ }
70
+ targetMap.set(item.id, item);
71
+ let fromSet = this.itemIdsByFromUid.get(fromUid);
72
+ if (!fromSet) {
73
+ fromSet = /* @__PURE__ */ new Set();
74
+ this.itemIdsByFromUid.set(fromUid, fromSet);
75
+ }
76
+ fromSet.add(item.id);
77
+ this.itemsById.set(item.id, item);
78
+ this.ensureEventSubscriptionIfNeeded(item.options.when);
79
+ const modelNow = this.engine.getModel(toUid);
80
+ if (modelNow && item.options.when === "created") {
81
+ void this.tryExecuteOnce(item.id, { type: "created", uid: toUid, model: modelNow });
82
+ }
83
+ return () => this.internalCancel(item.id);
84
+ }
85
+ cancel(filter) {
86
+ const { fromUid, toUid } = filter || {};
87
+ if (toUid && this.itemsByTargetUid.has(toUid)) {
88
+ const map = this.itemsByTargetUid.get(toUid);
89
+ if (map)
90
+ for (const item of map.values()) {
91
+ if (fromUid && item.fromUid !== fromUid) continue;
92
+ this.internalCancel(item.id);
93
+ }
94
+ return;
95
+ }
96
+ if (fromUid && this.itemIdsByFromUid.has(fromUid)) {
97
+ const set = this.itemIdsByFromUid.get(fromUid);
98
+ if (set)
99
+ for (const id of Array.from(set)) {
100
+ const it = this.itemsById.get(id);
101
+ if (!it) continue;
102
+ if (toUid && it.toUid !== toUid) continue;
103
+ this.internalCancel(id);
104
+ }
105
+ }
106
+ }
107
+ /** 引擎关闭时释放 */
108
+ dispose() {
109
+ try {
110
+ for (const unbind of this.unbindHandlers) {
111
+ try {
112
+ unbind();
113
+ } catch (err) {
114
+ }
115
+ }
116
+ } finally {
117
+ this.unbindHandlers = [];
118
+ }
119
+ for (const map of this.itemsByTargetUid.values()) {
120
+ for (const item of map.values()) this.internalCancel(item.id);
121
+ }
122
+ this.itemsByTargetUid.clear();
123
+ this.itemIdsByFromUid.clear();
124
+ }
125
+ bindEngineLifecycle() {
126
+ const emitter = this.engine.emitter;
127
+ if (!emitter || typeof emitter.on !== "function") return;
128
+ const onCreated = /* @__PURE__ */ __name((e) => {
129
+ this.processLifecycleEvent(e.uid, { ...e, type: "created" });
130
+ }, "onCreated");
131
+ emitter.on("model:created", onCreated);
132
+ this.unbindHandlers.push(() => emitter.off("model:created", onCreated));
133
+ const onMounted = /* @__PURE__ */ __name((e) => {
134
+ this.processLifecycleEvent(e.uid, { ...e, type: "mounted" });
135
+ }, "onMounted");
136
+ emitter.on("model:mounted", onMounted);
137
+ this.unbindHandlers.push(() => emitter.off("model:mounted", onMounted));
138
+ const onGenericBeforeStart = /* @__PURE__ */ __name((e) => {
139
+ this.processLifecycleEvent(e.uid, { ...e, type: "event:beforeRender:start" });
140
+ }, "onGenericBeforeStart");
141
+ emitter.on("model:event:beforeRender:start", onGenericBeforeStart);
142
+ this.unbindHandlers.push(() => emitter.off("model:event:beforeRender:start", onGenericBeforeStart));
143
+ const onGenericBeforeEnd = /* @__PURE__ */ __name((e) => {
144
+ this.processLifecycleEvent(e.uid, { ...e, type: "event:beforeRender:end" });
145
+ }, "onGenericBeforeEnd");
146
+ emitter.on("model:event:beforeRender:end", onGenericBeforeEnd);
147
+ this.unbindHandlers.push(() => emitter.off("model:event:beforeRender:end", onGenericBeforeEnd));
148
+ const onUnmounted = /* @__PURE__ */ __name((e) => {
149
+ this.processLifecycleEvent(e.uid, { ...e, type: "unmounted" });
150
+ }, "onUnmounted");
151
+ emitter.on("model:unmounted", onUnmounted);
152
+ this.unbindHandlers.push(() => emitter.off("model:unmounted", onUnmounted));
153
+ const onDestroyed = /* @__PURE__ */ __name((e) => {
154
+ const targetBucket = this.itemsByTargetUid.get(e.uid);
155
+ const event = { ...e, type: "destroyed" };
156
+ if (targetBucket && targetBucket.size) {
157
+ const ids = Array.from(targetBucket.keys());
158
+ for (const id of ids) {
159
+ const it = this.itemsById.get(id);
160
+ if (!it) continue;
161
+ if (this.shouldTrigger(it.options.when, event)) {
162
+ void this.tryExecuteOnce(id, event);
163
+ } else {
164
+ this.internalCancel(id);
165
+ }
166
+ }
167
+ }
168
+ }, "onDestroyed");
169
+ emitter.on("model:destroyed", onDestroyed);
170
+ this.unbindHandlers.push(() => emitter.off("model:destroyed", onDestroyed));
171
+ }
172
+ ensureEventSubscriptionIfNeeded(when) {
173
+ if (!when || typeof when !== "string") return;
174
+ const parsed = this.parseEventWhen(when);
175
+ if (!parsed) return;
176
+ const { name } = parsed;
177
+ if (this.subscribedEventNames.has(name)) return;
178
+ this.subscribedEventNames.add(name);
179
+ const emitter = this.engine.emitter;
180
+ const onStart = /* @__PURE__ */ __name((e) => {
181
+ this.processLifecycleEvent(e.uid, { ...e, type: `event:${name}:start` });
182
+ }, "onStart");
183
+ const onEnd = /* @__PURE__ */ __name((e) => {
184
+ this.processLifecycleEvent(e.uid, { ...e, type: `event:${name}:end` });
185
+ }, "onEnd");
186
+ const onError = /* @__PURE__ */ __name((e) => {
187
+ this.processLifecycleEvent(e.uid, { ...e, type: `event:${name}:error` });
188
+ }, "onError");
189
+ emitter.on(`model:event:${name}:start`, onStart);
190
+ emitter.on(`model:event:${name}:end`, onEnd);
191
+ emitter.on(`model:event:${name}:error`, onError);
192
+ this.unbindHandlers.push(() => emitter.off(`model:event:${name}:start`, onStart));
193
+ this.unbindHandlers.push(() => emitter.off(`model:event:${name}:end`, onEnd));
194
+ this.unbindHandlers.push(() => emitter.off(`model:event:${name}:error`, onError));
195
+ }
196
+ parseEventWhen(when) {
197
+ if (!when || typeof when !== "string") return null;
198
+ const m = /^event:([^:]+):(start|end|error)$/.exec(when);
199
+ if (!m) return null;
200
+ return { name: m[1], phase: m[2] };
201
+ }
202
+ processLifecycleEvent(targetUid, event) {
203
+ const targetBucket = this.itemsByTargetUid.get(targetUid);
204
+ if (!targetBucket || targetBucket.size === 0) return;
205
+ const ids = Array.from(targetBucket.keys());
206
+ for (const id of ids) {
207
+ const item = this.itemsById.get(id);
208
+ if (!item) continue;
209
+ const should = this.shouldTrigger(item.options.when, event);
210
+ if (!should) continue;
211
+ void this.tryExecuteOnce(id, event);
212
+ }
213
+ }
214
+ shouldTrigger(when, event) {
215
+ if (!when) return false;
216
+ if (typeof when === "function") return !!when(event);
217
+ return when === event.type;
218
+ }
219
+ async tryExecuteOnce(id, event) {
220
+ var _a, _b;
221
+ const item = this.takeItem(id);
222
+ if (!item) return;
223
+ try {
224
+ const model = event.model || this.engine.getModel(item.toUid);
225
+ if (!model) return;
226
+ await Promise.resolve(item.fn(model));
227
+ } catch (err) {
228
+ (_b = (_a = this.engine.logger) == null ? void 0 : _a.error) == null ? void 0 : _b.call(
229
+ _a,
230
+ { err, id, fromUid: item.fromUid, toUid: item.toUid, when: item.options.when },
231
+ "ModelOperationScheduler: operation execution failed"
232
+ );
233
+ }
234
+ }
235
+ internalCancel(id) {
236
+ return !!this.takeItem(id);
237
+ }
238
+ takeItem(id) {
239
+ const it = this.itemsById.get(id);
240
+ if (!it) return void 0;
241
+ const { toUid, fromUid } = it;
242
+ const map = this.itemsByTargetUid.get(toUid);
243
+ if (map) {
244
+ map.delete(id);
245
+ if (map.size === 0) this.itemsByTargetUid.delete(toUid);
246
+ }
247
+ const set = this.itemIdsByFromUid.get(fromUid);
248
+ if (set) {
249
+ set.delete(id);
250
+ if (set.size === 0) this.itemIdsByFromUid.delete(fromUid);
251
+ }
252
+ this.itemsById.delete(id);
253
+ return it;
254
+ }
255
+ };
256
+ __name(_ModelOperationScheduler, "ModelOperationScheduler");
257
+ let ModelOperationScheduler = _ModelOperationScheduler;
258
+ var ModelOperationScheduler_default = ModelOperationScheduler;
259
+ // Annotate the CommonJS export names for ESM import in node:
260
+ 0 && (module.exports = {
261
+ ModelOperationScheduler
262
+ });
package/lib/types.d.ts CHANGED
@@ -10,6 +10,7 @@
10
10
  import { ISchema } from '@formily/json-schema';
11
11
  import { SubModelItem } from './components';
12
12
  import { FlowContext, FlowModelContext, FlowRuntimeContext, FlowSettingsContext } from './flowContext';
13
+ import type { PropertyOptions } from './flowContext';
13
14
  import type { FlowEngine } from './flowEngine';
14
15
  import type { FlowModel } from './models';
15
16
  /**
@@ -110,12 +111,14 @@ export declare enum ActionScene {
110
111
  BLOCK_LINKAGE_RULES = 1,
111
112
  /** 表单字段级联动规则可用 */
112
113
  FIELD_LINKAGE_RULES = 2,
114
+ /** 子表单字段级联动规则可用 */
115
+ SUB_FORM_FIELD_LINKAGE_RULES = 3,
113
116
  /** 详情字段级联动规则可用 */
114
- DETAILS_FIELD_LINKAGE_RULES = 3,
117
+ DETAILS_FIELD_LINKAGE_RULES = 4,
115
118
  /** 按钮级联动规则可用 */
116
- ACTION_LINKAGE_RULES = 4,
119
+ ACTION_LINKAGE_RULES = 5,
117
120
  /** 动态事件流可用 */
118
- DYNAMIC_EVENT_FLOW = 5
121
+ DYNAMIC_EVENT_FLOW = 6
119
122
  }
120
123
  /**
121
124
  * Defines a reusable action with generic model type support.
@@ -132,6 +135,18 @@ export interface ActionDefinition<TModel extends FlowModel = FlowModel, TCtx ext
132
135
  uiMode?: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>);
133
136
  scene?: ActionScene | ActionScene[];
134
137
  sort?: number;
138
+ /**
139
+ * 在执行 Action 前为 ctx 定义临时属性。
140
+ * - 仅支持 PropertyOptions 形态(例如:{ foo: { value: 5 } });
141
+ * - 或函数形式(接收 ctx,返回 PropertyOptions 对象;支持 Promise)。
142
+ */
143
+ defineProperties?: Record<string, PropertyOptions> | ((ctx: TCtx) => Record<string, PropertyOptions> | Promise<Record<string, PropertyOptions>>);
144
+ /**
145
+ * 在执行 Action 前为 ctx 定义临时方法。
146
+ * - 支持 JSON 形式(对象的值应为函数)
147
+ * - 或函数形式(接收 ctx,返回方法对象;支持 Promise)
148
+ */
149
+ defineMethods?: Record<string, (this: TCtx, ...args: any[]) => any> | ((ctx: TCtx) => Record<string, (this: TCtx, ...args: any[]) => any> | Promise<Record<string, (this: TCtx, ...args: any[]) => any>>);
135
150
  }
136
151
  /**
137
152
  * Flow 事件名称集合。
@@ -146,6 +161,15 @@ export type FlowEvent<TModel extends FlowModel = FlowModel> = FlowEventName | {
146
161
  eventName: FlowEventName;
147
162
  defaultParams?: Record<string, any>;
148
163
  };
164
+ /**
165
+ * 事件分发选项。
166
+ */
167
+ export interface DispatchEventOptions {
168
+ /** 是否顺序执行(默认并行) */
169
+ sequential?: boolean;
170
+ /** 是否使用缓存(默认 false;beforeRender 的默认值为 true,可覆盖) */
171
+ useCache?: boolean;
172
+ }
149
173
  /**
150
174
  * 事件定义:用于事件注册表(全局/模型类级)。
151
175
  */
@@ -240,6 +264,7 @@ export interface IFlowModelRepository<T extends FlowModel = FlowModel> {
240
264
  }): Promise<Record<string, any>>;
241
265
  destroy(uid: string): Promise<boolean>;
242
266
  move(sourceId: string, targetId: string, position: 'before' | 'after'): Promise<void>;
267
+ duplicate(uid: string): Promise<Record<string, any> | null>;
243
268
  }
244
269
  /**
245
270
  * 步骤设置对话框的属性接口
package/lib/types.js CHANGED
@@ -32,9 +32,10 @@ module.exports = __toCommonJS(types_exports);
32
32
  var ActionScene = /* @__PURE__ */ ((ActionScene2) => {
33
33
  ActionScene2[ActionScene2["BLOCK_LINKAGE_RULES"] = 1] = "BLOCK_LINKAGE_RULES";
34
34
  ActionScene2[ActionScene2["FIELD_LINKAGE_RULES"] = 2] = "FIELD_LINKAGE_RULES";
35
- ActionScene2[ActionScene2["DETAILS_FIELD_LINKAGE_RULES"] = 3] = "DETAILS_FIELD_LINKAGE_RULES";
36
- ActionScene2[ActionScene2["ACTION_LINKAGE_RULES"] = 4] = "ACTION_LINKAGE_RULES";
37
- ActionScene2[ActionScene2["DYNAMIC_EVENT_FLOW"] = 5] = "DYNAMIC_EVENT_FLOW";
35
+ ActionScene2[ActionScene2["SUB_FORM_FIELD_LINKAGE_RULES"] = 3] = "SUB_FORM_FIELD_LINKAGE_RULES";
36
+ ActionScene2[ActionScene2["DETAILS_FIELD_LINKAGE_RULES"] = 4] = "DETAILS_FIELD_LINKAGE_RULES";
37
+ ActionScene2[ActionScene2["ACTION_LINKAGE_RULES"] = 5] = "ACTION_LINKAGE_RULES";
38
+ ActionScene2[ActionScene2["DYNAMIC_EVENT_FLOW"] = 6] = "DYNAMIC_EVENT_FLOW";
38
39
  return ActionScene2;
39
40
  })(ActionScene || {});
40
41
  // Annotate the CommonJS export names for ESM import in node:
@@ -0,0 +1,32 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { Collection } from '../data-source';
10
+ import type { FlowContext, PropertyMetaFactory } from '../flowContext';
11
+ /**
12
+ * 创建一个用于“对象类变量”(如 formValues / currentObject)的 `resolveOnServer` 判定函数。
13
+ * 仅当访问路径以“关联字段名”开头(且继续访问其子属性)时,返回 true 交由服务端解析;
14
+ * 否则在前端解析即可。
15
+ *
16
+ * @param collectionAccessor 返回当前对象所在 collection
17
+ * @param valueAccessor 可选,本地值访问器。若本地已存在目标子路径的值,则认为无需走后端,优先使用本地值。
18
+ * @returns `(subPath) => boolean` 判断是否需要服务端解析
19
+ */
20
+ export declare function createAssociationSubpathResolver(collectionAccessor: () => Collection | null, valueAccessor?: () => unknown): (subPath: string) => boolean;
21
+ /**
22
+ * 构建“对象类变量”的 PropertyMetaFactory:
23
+ * - 暴露集合字段结构(通过 createCollectionContextMeta)用于变量选择器;
24
+ * - 提供 buildVariablesParams:基于对象当前值,收集所有“已选择的关联字段”
25
+ * 以便服务端在 variables:resolve 时按需补全关联数据。
26
+ *
27
+ * @param collectionAccessor 获取集合对象,用于字段/元信息来源
28
+ * @param title 变量组标题(用于 UI 展示)
29
+ * @param valueAccessor 获取当前对象值(如 ctx.form.getFieldsValue() / ctx.currentObject)
30
+ * @returns PropertyMetaFactory
31
+ */
32
+ export declare function createAssociationAwareObjectMetaFactory(collectionAccessor: () => Collection | null, title: string, valueAccessor: (ctx: FlowContext) => any): PropertyMetaFactory;