@nocobase/flow-engine 2.0.0-alpha.7 → 2.0.0-alpha.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +91 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +6 -4
  6. package/lib/JSRunner.d.ts +6 -0
  7. package/lib/JSRunner.js +27 -1
  8. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  9. package/lib/ViewScopedFlowEngine.js +18 -1
  10. package/lib/acl/Acl.d.ts +12 -12
  11. package/lib/acl/Acl.js +88 -30
  12. package/lib/components/DynamicFlowsEditor.js +2 -4
  13. package/lib/components/FieldModelRenderer.js +17 -9
  14. package/lib/components/FieldSkeleton.d.ts +10 -0
  15. package/lib/components/FieldSkeleton.js +64 -0
  16. package/lib/components/FlowContextSelector.js +19 -3
  17. package/lib/components/FlowModelRenderer.d.ts +4 -6
  18. package/lib/components/FlowModelRenderer.js +35 -53
  19. package/lib/components/FormItem.js +5 -1
  20. package/lib/components/MobilePopup.d.ts +20 -0
  21. package/lib/components/MobilePopup.js +102 -0
  22. package/lib/components/MobilePopup.style.d.ts +17 -0
  23. package/lib/components/MobilePopup.style.js +186 -0
  24. package/lib/components/common/withFlowDesignMode.d.ts +1 -1
  25. package/lib/components/common/withFlowDesignMode.js +5 -5
  26. package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
  27. package/lib/components/dnd/gridDragPlanner.js +53 -1
  28. package/lib/components/index.d.ts +1 -0
  29. package/lib/components/index.js +3 -1
  30. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
  31. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
  32. package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
  33. package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
  34. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
  35. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
  36. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
  37. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  38. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
  39. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
  40. package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
  41. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
  42. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
  43. package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
  44. package/lib/components/subModel/AddSubModelButton.js +78 -8
  45. package/lib/components/subModel/LazyDropdown.js +14 -15
  46. package/lib/components/subModel/utils.d.ts +1 -1
  47. package/lib/components/subModel/utils.js +21 -11
  48. package/lib/components/variables/VariableInput.js +26 -6
  49. package/lib/components/variables/VariableTag.js +43 -2
  50. package/lib/components/variables/types.d.ts +2 -0
  51. package/lib/components/variables/utils.js +4 -2
  52. package/lib/data-source/index.d.ts +23 -4
  53. package/lib/data-source/index.js +135 -14
  54. package/lib/data-source/jioToJoiSchema.js +1 -0
  55. package/lib/emitter.d.ts +6 -0
  56. package/lib/emitter.js +12 -0
  57. package/lib/executor/FlowExecutor.d.ts +6 -6
  58. package/lib/executor/FlowExecutor.js +302 -99
  59. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  60. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  61. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  62. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  63. package/lib/flowContext.d.ts +105 -6
  64. package/lib/flowContext.js +447 -139
  65. package/lib/flowEngine.d.ts +71 -1
  66. package/lib/flowEngine.js +319 -16
  67. package/lib/flowSettings.d.ts +4 -3
  68. package/lib/flowSettings.js +45 -21
  69. package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
  70. package/lib/hooks/useApplyAutoFlows.js +3 -2
  71. package/lib/index.d.ts +14 -3
  72. package/lib/index.js +54 -7
  73. package/lib/locale/de-DE.json +62 -0
  74. package/lib/locale/en-US.json +57 -45
  75. package/lib/locale/es-ES.json +62 -0
  76. package/lib/locale/fr-FR.json +62 -0
  77. package/lib/locale/hu-HU.json +62 -0
  78. package/lib/locale/id-ID.json +62 -0
  79. package/lib/locale/index.d.ts +114 -90
  80. package/lib/locale/it-IT.json +62 -0
  81. package/lib/locale/ja-JP.json +62 -0
  82. package/lib/locale/ko-KR.json +62 -0
  83. package/lib/locale/nl-NL.json +62 -0
  84. package/lib/locale/pt-BR.json +62 -0
  85. package/lib/locale/ru-RU.json +62 -0
  86. package/lib/locale/tr-TR.json +62 -0
  87. package/lib/locale/uk-UA.json +62 -0
  88. package/lib/locale/vi-VN.json +62 -0
  89. package/lib/locale/zh-CN.json +58 -46
  90. package/lib/locale/zh-TW.json +62 -0
  91. package/lib/models/CollectionFieldModel.d.ts +7 -2
  92. package/lib/models/CollectionFieldModel.js +63 -16
  93. package/lib/models/flowModel.d.ts +76 -32
  94. package/lib/models/flowModel.js +300 -112
  95. package/lib/models/forkFlowModel.d.ts +8 -4
  96. package/lib/models/forkFlowModel.js +38 -8
  97. package/lib/provider.d.ts +3 -1
  98. package/lib/provider.js +14 -11
  99. package/lib/reactive/index.d.ts +10 -0
  100. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
  101. package/lib/reactive/observer.d.ts +19 -0
  102. package/lib/reactive/observer.js +109 -0
  103. package/lib/resources/baseRecordResource.d.ts +6 -0
  104. package/lib/resources/baseRecordResource.js +38 -3
  105. package/lib/resources/multiRecordResource.d.ts +5 -2
  106. package/lib/resources/multiRecordResource.js +26 -10
  107. package/lib/resources/singleRecordResource.js +8 -3
  108. package/lib/resources/sqlResource.d.ts +5 -3
  109. package/lib/resources/sqlResource.js +30 -28
  110. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  111. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
  112. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  113. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  114. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  115. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  116. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  117. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  118. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  119. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  120. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  121. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  122. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  123. package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
  124. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  125. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  126. package/lib/runjs-context/contexts/base.d.ts +9 -0
  127. package/lib/runjs-context/contexts/base.js +879 -0
  128. package/lib/runjs-context/contributions.d.ts +33 -0
  129. package/lib/runjs-context/contributions.js +88 -0
  130. package/lib/runjs-context/helpers.d.ts +5 -2
  131. package/lib/runjs-context/helpers.js +36 -27
  132. package/lib/runjs-context/registry.d.ts +7 -4
  133. package/lib/runjs-context/registry.js +10 -42
  134. package/lib/runjs-context/setup.d.ts +9 -0
  135. package/lib/runjs-context/setup.js +88 -0
  136. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  137. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  138. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  139. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  140. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  141. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  142. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  143. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  144. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  145. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  146. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  148. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  149. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  150. package/lib/runjs-context/snippets/index.d.ts +24 -3
  151. package/lib/runjs-context/snippets/index.js +183 -40
  152. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  154. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  158. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  159. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  161. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  163. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  165. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  167. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  169. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  170. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  171. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  172. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  173. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  174. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  175. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  176. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  177. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  178. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  179. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  180. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  181. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  182. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  183. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  184. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  185. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  186. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  187. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  188. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  189. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  190. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  191. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  192. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  193. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  194. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  195. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  196. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  197. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  198. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  199. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  200. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  201. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  202. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  203. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  204. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  205. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  206. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  207. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  208. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  209. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  210. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  211. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  212. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  213. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  214. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  215. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  216. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  217. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  218. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  219. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  220. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  221. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  222. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  223. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  224. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  225. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  227. package/lib/runjs-context/snippets/types.d.ts +9 -1
  228. package/lib/runjsLibs.d.ts +28 -0
  229. package/lib/runjsLibs.js +532 -0
  230. package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
  231. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  232. package/lib/types.d.ts +66 -7
  233. package/lib/types.js +4 -3
  234. package/lib/utils/associationObjectVariable.d.ts +32 -0
  235. package/lib/utils/associationObjectVariable.js +157 -0
  236. package/lib/utils/createCollectionContextMeta.d.ts +1 -1
  237. package/lib/utils/createCollectionContextMeta.js +9 -4
  238. package/lib/utils/createEphemeralContext.d.ts +13 -0
  239. package/lib/utils/createEphemeralContext.js +140 -0
  240. package/lib/utils/flows.d.ts +10 -0
  241. package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
  242. package/lib/utils/index.d.ts +9 -3
  243. package/lib/utils/index.js +30 -2
  244. package/lib/utils/jsxTransform.d.ts +15 -0
  245. package/lib/utils/jsxTransform.js +68 -0
  246. package/lib/utils/params-resolvers.js +19 -12
  247. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  248. package/lib/utils/parsePathnameToViewParams.js +41 -5
  249. package/lib/utils/pruneFilter.d.ts +21 -0
  250. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  251. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  252. package/lib/utils/resolveModuleUrl.js +65 -0
  253. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  254. package/lib/utils/runjsModuleLoader.js +422 -0
  255. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  256. package/lib/utils/runjsTemplateCompat.js +743 -0
  257. package/lib/utils/safeGlobals.d.ts +6 -8
  258. package/lib/utils/safeGlobals.js +169 -14
  259. package/lib/utils/schema-utils.d.ts +6 -0
  260. package/lib/utils/schema-utils.js +71 -6
  261. package/lib/utils/serverContextParams.d.ts +4 -0
  262. package/lib/utils/serverContextParams.js +2 -0
  263. package/lib/utils/translation.d.ts +4 -1
  264. package/lib/utils/translation.js +6 -2
  265. package/lib/utils/variablesParams.d.ts +22 -5
  266. package/lib/utils/variablesParams.js +141 -61
  267. package/lib/views/DialogComponent.js +1 -5
  268. package/lib/views/DrawerComponent.js +18 -9
  269. package/lib/views/PageComponent.js +5 -5
  270. package/lib/views/ViewNavigation.d.ts +11 -15
  271. package/lib/views/ViewNavigation.js +37 -19
  272. package/lib/views/createViewMeta.d.ts +27 -5
  273. package/lib/views/createViewMeta.js +338 -72
  274. package/lib/views/index.d.ts +1 -1
  275. package/lib/views/index.js +4 -0
  276. package/lib/views/useDialog.d.ts +10 -9
  277. package/lib/views/useDialog.js +46 -34
  278. package/lib/views/useDrawer.d.ts +10 -9
  279. package/lib/views/useDrawer.js +74 -48
  280. package/lib/views/usePage.d.ts +14 -9
  281. package/lib/views/usePage.js +82 -33
  282. package/lib/views/usePopover.js +4 -1
  283. package/lib/views/viewEvents.d.ts +17 -0
  284. package/lib/views/viewEvents.js +90 -0
  285. package/package.json +6 -3
  286. package/src/BlockScopedFlowEngine.ts +85 -0
  287. package/src/FlowContextProvider.tsx +4 -2
  288. package/src/JSRunner.ts +39 -1
  289. package/src/ViewScopedFlowEngine.ts +21 -1
  290. package/src/__tests__/JSRunner.test.ts +125 -52
  291. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  292. package/src/__tests__/createViewMeta.popup.test.ts +203 -0
  293. package/src/__tests__/flow-engine.test.ts +3 -0
  294. package/src/__tests__/flowContext.test.ts +160 -0
  295. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  296. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  297. package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
  298. package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
  299. package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
  300. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  301. package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
  302. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  303. package/src/__tests__/flowSettings.open.test.tsx +71 -15
  304. package/src/__tests__/flowSettings.test.ts +2 -0
  305. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  306. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  307. package/src/__tests__/objectVariable.test.ts +464 -0
  308. package/src/__tests__/provider.test.tsx +0 -5
  309. package/src/__tests__/runjsContext.test.ts +219 -35
  310. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  311. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  312. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  313. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  314. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  315. package/src/__tests__/runjsLocales.test.ts +39 -0
  316. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  317. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  318. package/src/__tests__/runjsSnippets.test.ts +140 -0
  319. package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
  320. package/src/acl/Acl.tsx +85 -31
  321. package/src/acl/__tests__/Acl.test.tsx +43 -1
  322. package/src/components/DynamicFlowsEditor.tsx +0 -10
  323. package/src/components/FieldModelRenderer.tsx +22 -9
  324. package/src/components/FieldSkeleton.tsx +27 -0
  325. package/src/components/FlowContextSelector.tsx +20 -2
  326. package/src/components/FlowModelRenderer.tsx +52 -84
  327. package/src/components/FormItem.tsx +8 -1
  328. package/src/components/MobilePopup.style.ts +220 -0
  329. package/src/components/MobilePopup.tsx +86 -0
  330. package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
  331. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  332. package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
  333. package/src/components/common/withFlowDesignMode.tsx +5 -5
  334. package/src/components/dnd/gridDragPlanner.ts +60 -0
  335. package/src/components/index.ts +1 -0
  336. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
  337. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
  338. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
  339. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  340. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
  341. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
  342. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
  343. package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
  344. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
  345. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
  346. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
  347. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
  348. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
  349. package/src/components/subModel/AddSubModelButton.tsx +104 -9
  350. package/src/components/subModel/LazyDropdown.tsx +14 -14
  351. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
  352. package/src/components/subModel/__tests__/utils.test.ts +12 -12
  353. package/src/components/subModel/utils.ts +25 -6
  354. package/src/components/variables/VariableInput.tsx +32 -6
  355. package/src/components/variables/VariableTag.tsx +54 -2
  356. package/src/components/variables/types.ts +2 -0
  357. package/src/components/variables/utils.ts +7 -3
  358. package/src/data-source/index.ts +143 -12
  359. package/src/data-source/jioToJoiSchema.ts +1 -0
  360. package/src/emitter.ts +14 -0
  361. package/src/executor/FlowExecutor.ts +383 -119
  362. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  363. package/src/executor/__tests__/flowExecutor.test.ts +217 -5
  364. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  365. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  366. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  367. package/src/flowContext.ts +646 -158
  368. package/src/flowEngine.ts +385 -14
  369. package/src/flowSettings.ts +59 -30
  370. package/src/hooks/useApplyAutoFlows.ts +5 -3
  371. package/src/index.ts +26 -3
  372. package/src/locale/de-DE.json +62 -0
  373. package/src/locale/en-US.json +57 -45
  374. package/src/locale/es-ES.json +62 -0
  375. package/src/locale/fr-FR.json +62 -0
  376. package/src/locale/hu-HU.json +62 -0
  377. package/src/locale/id-ID.json +62 -0
  378. package/src/locale/it-IT.json +62 -0
  379. package/src/locale/ja-JP.json +62 -0
  380. package/src/locale/ko-KR.json +62 -0
  381. package/src/locale/nl-NL.json +62 -0
  382. package/src/locale/pt-BR.json +62 -0
  383. package/src/locale/ru-RU.json +62 -0
  384. package/src/locale/tr-TR.json +62 -0
  385. package/src/locale/uk-UA.json +62 -0
  386. package/src/locale/vi-VN.json +62 -0
  387. package/src/locale/zh-CN.json +58 -46
  388. package/src/locale/zh-TW.json +62 -0
  389. package/src/models/CollectionFieldModel.tsx +82 -18
  390. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  391. package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
  392. package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
  393. package/src/models/__tests__/flowModel.clone.test.ts +416 -0
  394. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  395. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  396. package/src/models/__tests__/flowModel.test.ts +296 -119
  397. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  398. package/src/models/flowModel.tsx +426 -148
  399. package/src/models/forkFlowModel.ts +48 -8
  400. package/src/provider.tsx +18 -14
  401. package/src/reactive/__tests__/observer.test.tsx +211 -0
  402. package/src/reactive/index.ts +11 -0
  403. package/src/reactive/observer.tsx +101 -0
  404. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  405. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  406. package/src/resources/baseRecordResource.ts +46 -3
  407. package/src/resources/multiRecordResource.ts +28 -12
  408. package/src/resources/singleRecordResource.ts +9 -3
  409. package/src/resources/sqlResource.ts +33 -32
  410. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
  411. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
  412. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  413. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  414. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  415. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  416. package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
  417. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  418. package/src/runjs-context/contexts/base.ts +871 -0
  419. package/src/runjs-context/contributions.ts +88 -0
  420. package/src/runjs-context/helpers.ts +32 -30
  421. package/src/runjs-context/registry.ts +16 -47
  422. package/src/runjs-context/setup.ts +57 -0
  423. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  424. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  425. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  426. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  427. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  428. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  429. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  430. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  431. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  432. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  433. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  434. package/src/runjs-context/snippets/index.ts +212 -39
  435. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  436. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  437. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  438. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  439. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  440. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  441. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  442. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  443. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  444. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  445. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  446. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  447. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  448. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  449. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  450. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  451. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  452. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  453. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  454. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  455. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  456. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  457. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  458. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  459. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  460. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  461. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  462. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  463. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  464. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  465. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  466. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  467. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  468. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  469. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  470. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  471. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  472. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  473. package/src/runjs-context/snippets/types.ts +5 -1
  474. package/src/runjsLibs.ts +622 -0
  475. package/src/scheduler/ModelOperationScheduler.ts +306 -0
  476. package/src/types.ts +86 -5
  477. package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
  478. package/src/utils/__tests__/flows.test.ts +65 -0
  479. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  480. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  481. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  482. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  483. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  484. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  485. package/src/utils/__tests__/safeGlobals.test.ts +79 -2
  486. package/src/utils/__tests__/utils.test.ts +114 -15
  487. package/src/utils/__tests__/variablesParams.test.ts +120 -0
  488. package/src/utils/associationObjectVariable.ts +180 -0
  489. package/src/utils/createCollectionContextMeta.ts +9 -3
  490. package/src/utils/createEphemeralContext.ts +142 -0
  491. package/src/utils/flows.ts +23 -0
  492. package/src/utils/index.ts +17 -3
  493. package/src/utils/jsxTransform.ts +39 -0
  494. package/src/utils/params-resolvers.ts +25 -11
  495. package/src/utils/parsePathnameToViewParams.ts +50 -6
  496. package/src/utils/pruneFilter.ts +41 -0
  497. package/src/utils/resolveModuleUrl.ts +91 -0
  498. package/src/utils/runjsModuleLoader.ts +553 -0
  499. package/src/utils/runjsTemplateCompat.ts +828 -0
  500. package/src/utils/safeGlobals.ts +181 -15
  501. package/src/utils/schema-utils.ts +81 -3
  502. package/src/utils/serverContextParams.ts +6 -0
  503. package/src/utils/translation.ts +7 -2
  504. package/src/utils/variablesParams.ts +164 -72
  505. package/src/views/DialogComponent.tsx +1 -4
  506. package/src/views/DrawerComponent.tsx +19 -7
  507. package/src/views/PageComponent.tsx +3 -5
  508. package/src/views/ViewNavigation.ts +49 -43
  509. package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
  510. package/src/views/__tests__/ViewNavigation.test.ts +54 -34
  511. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
  512. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  513. package/src/views/createViewMeta.ts +402 -73
  514. package/src/views/index.tsx +1 -1
  515. package/src/views/useDialog.tsx +52 -31
  516. package/src/views/useDrawer.tsx +99 -55
  517. package/src/views/usePage.tsx +101 -33
  518. package/src/views/usePopover.tsx +4 -1
  519. package/src/views/viewEvents.ts +55 -0
  520. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  521. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  522. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  523. package/lib/runjs-context/index.d.ts +0 -19
  524. package/lib/runjs-context/index.js +0 -57
  525. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  526. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  527. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  528. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  529. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  530. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  531. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  532. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  533. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  534. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  535. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  536. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  537. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  538. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  539. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  540. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  541. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  542. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  543. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  544. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  545. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  546. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  547. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  548. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  549. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  550. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  551. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  552. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  553. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  554. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  555. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  556. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  557. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  558. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  559. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  560. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  561. package/src/runjs-context/index.ts +0 -20
  562. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  563. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  564. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  565. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  566. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  567. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  568. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  569. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  570. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  571. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  572. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  573. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  574. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  575. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  576. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  577. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  578. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  579. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  580. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  581. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  582. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  583. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  584. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  585. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  586. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  587. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  588. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  589. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -7,14 +7,14 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { describe, it, expect } from 'vitest';
11
- import { buildItems, buildSubModelGroups, buildSubModelItem, buildSubModelItems } from '../utils';
12
- import { mergeSubModelItems } from '../AddSubModelButton';
10
+ import { describe, expect, it } from 'vitest';
11
+ import type { FlowModelContext } from '../../../flowContext';
13
12
  import { FlowEngine } from '../../../flowEngine';
14
13
  import { FlowModel } from '../../../models';
15
- import type { FlowModelContext } from '../../../flowContext';
16
- import type { SubModelItem } from '../AddSubModelButton';
17
14
  import type { ModelConstructor } from '../../../types';
15
+ import type { SubModelItem } from '../AddSubModelButton';
16
+ import { mergeSubModelItems } from '../AddSubModelButton';
17
+ import { buildItems, buildSubModelGroups, buildSubModelItem, buildSubModelItems } from '../utils';
18
18
 
19
19
  type DefineChildren = (ctx: FlowModelContext) => SubModelItem[] | Promise<SubModelItem[]>;
20
20
  type WithDefineChildren<T extends ModelConstructor = ModelConstructor> = T & { defineChildren: DefineChildren };
@@ -153,7 +153,7 @@ describe('subModel/utils', () => {
153
153
  });
154
154
 
155
155
  describe('buildSubModelItem', () => {
156
- it('returns undefined for hidden meta entries', () => {
156
+ it('returns undefined for hidden meta entries', async () => {
157
157
  const engine = new FlowEngine();
158
158
 
159
159
  class Parent extends FlowModel {}
@@ -163,7 +163,7 @@ describe('subModel/utils', () => {
163
163
  engine.registerModels({ Parent, HiddenChild });
164
164
  const parent = engine.createModel({ use: 'Parent', uid: 'parent-hidden' });
165
165
 
166
- const item = buildSubModelItem(HiddenChild, parent.context);
166
+ const item = await buildSubModelItem(HiddenChild, parent.context);
167
167
  expect(item).toBeUndefined();
168
168
  });
169
169
 
@@ -194,7 +194,7 @@ describe('subModel/utils', () => {
194
194
  const parent = engine.createModel<Parent>({ use: 'Parent', uid: 'parent-child-group' });
195
195
  const ctx = parent.context;
196
196
 
197
- const item = buildSubModelItem(ChildGroup, ctx, false);
197
+ const item = await buildSubModelItem(ChildGroup, ctx, false);
198
198
  expect(item).toBeTruthy();
199
199
  expect(item?.label).toBe('Child Group');
200
200
  expect(item?.searchable).toBe(true);
@@ -214,7 +214,7 @@ describe('subModel/utils', () => {
214
214
  expect(merged?.extra).toMatchObject({ fromTest: true });
215
215
  });
216
216
 
217
- it('falls back to use=current class name when meta createModelOptions omitted', () => {
217
+ it('falls back to use=current class name when meta createModelOptions omitted', async () => {
218
218
  const engine = new FlowEngine();
219
219
 
220
220
  class Parent extends FlowModel {}
@@ -223,11 +223,11 @@ describe('subModel/utils', () => {
223
223
  engine.registerModels({ Parent, PlainChild });
224
224
  const parent = engine.createModel<Parent>({ use: 'Parent', uid: 'parent-default-create-options' });
225
225
 
226
- const item = buildSubModelItem(PlainChild, parent.context);
226
+ const item = await buildSubModelItem(PlainChild, parent.context);
227
227
  expect(item?.createModelOptions).toEqual({ use: 'PlainChild' });
228
228
  });
229
229
 
230
- it('still returns item when skipHide=true', () => {
230
+ it('still returns item when skipHide=true', async () => {
231
231
  const engine = new FlowEngine();
232
232
 
233
233
  class Parent extends FlowModel {}
@@ -237,7 +237,7 @@ describe('subModel/utils', () => {
237
237
  engine.registerModels({ Parent, HiddenChild });
238
238
  const parent = engine.createModel({ use: 'Parent', uid: 'parent-skip-hide' });
239
239
 
240
- const item = buildSubModelItem(HiddenChild, parent.context, true);
240
+ const item = await buildSubModelItem(HiddenChild, parent.context, true);
241
241
  expect(item).toBeTruthy();
242
242
  expect(item?.label).toBe('Hidden but allowed');
243
243
  });
@@ -14,9 +14,23 @@ import { FlowModelMeta, ModelConstructor } from '../../types';
14
14
  import { isInheritedFrom, resolveCreateModelOptions } from '../../utils';
15
15
  import { SubModelItem } from './AddSubModelButton';
16
16
 
17
- export function buildSubModelItem(M: ModelConstructor, ctx: FlowModelContext, skipHide = false): SubModelItem {
17
+ async function callHideFunction(
18
+ hide: boolean | ((context: FlowModelContext) => boolean | Promise<boolean>),
19
+ ctx: FlowModelContext,
20
+ ) {
21
+ if (typeof hide === 'function') {
22
+ return await hide(ctx);
23
+ }
24
+ return hide;
25
+ }
26
+
27
+ export async function buildSubModelItem(
28
+ M: ModelConstructor,
29
+ ctx: FlowModelContext,
30
+ skipHide = false,
31
+ ): Promise<SubModelItem | undefined> {
18
32
  const meta: FlowModelMeta = (M.meta ?? {}) as FlowModelMeta;
19
- if (meta.hide && !skipHide) {
33
+ if ((await callHideFunction(meta.hide, ctx)) && !skipHide) {
20
34
  return;
21
35
  }
22
36
  // 判断是否为 CollectionBlockModel 的子类(用于集合选择层开启搜索)
@@ -102,8 +116,13 @@ export function buildSubModelItems(subModelBaseClass: string | ModelConstructor,
102
116
  return async (ctx: FlowModelContext) => {
103
117
  const SubModelClasses = ctx.engine.getSubclassesOf(subModelBaseClass);
104
118
  // Collect and sort subclasses by meta.sort (ascending), excluding hidden or inherited ones in `exclude`
105
- let candidates = Array.from(SubModelClasses.values())
106
- .filter((C) => !C.meta?.hide)
119
+ let candidates = [];
120
+ for (const C of Array.from(SubModelClasses.values())) {
121
+ if (!(await callHideFunction(C.meta?.hide, ctx))) {
122
+ candidates.push(C);
123
+ }
124
+ }
125
+ candidates = candidates
107
126
  .filter((C) => {
108
127
  for (const P of exclude as (string | ModelConstructor)[]) {
109
128
  if (typeof P === 'string') {
@@ -120,14 +139,14 @@ export function buildSubModelItems(subModelBaseClass: string | ModelConstructor,
120
139
  if (candidates.length === 0) {
121
140
  const BaseClass =
122
141
  typeof subModelBaseClass === 'string' ? ctx.engine.getModelClass(subModelBaseClass) : subModelBaseClass;
123
- if (BaseClass && !BaseClass.meta?.hide) {
142
+ if (BaseClass && !(await callHideFunction(BaseClass.meta?.hide, ctx))) {
124
143
  candidates = [BaseClass];
125
144
  }
126
145
  }
127
146
 
128
147
  const items: SubModelItem[] = [];
129
148
  for (const M of candidates) {
130
- const item = buildSubModelItem(M, ctx);
149
+ const item = await buildSubModelItem(M, ctx);
131
150
  if (item) items.push(item);
132
151
  }
133
152
  return items;
@@ -85,6 +85,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
85
85
  showValueComponent = true,
86
86
  onlyLeafSelectable = false,
87
87
  clearValue,
88
+ ignoreFieldNames,
88
89
  ...restProps
89
90
  }) => {
90
91
  const [currentMetaTreeNode, setCurrentMetaTreeNode] = useState<MetaTreeNode | null>(null);
@@ -138,7 +139,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
138
139
  // 当 value 存在但 currentMetaTreeNode 还未恢复,尝试按路径逐级加载(支持 children 为函数的场景)
139
140
  useEffect(() => {
140
141
  const restoreFromValue = async () => {
141
- if (!Array.isArray(resolvedMetaTree) || !value) return;
142
+ if (!Array.isArray(resolvedMetaTree) || value == null) return;
142
143
 
143
144
  // 若已存在且路径匹配,跳过
144
145
  if (currentMetaTreeNode) {
@@ -202,7 +203,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
202
203
 
203
204
  useEffect(() => {
204
205
  if (!resolvedMetaTreeNode) return;
205
- if (!Array.isArray(resolvedMetaTree) || !innerValue) return;
206
+ if (!Array.isArray(resolvedMetaTree) || innerValue == null) return;
206
207
  const finalValue = resolveValueFromPath?.(resolvedMetaTreeNode) || innerValue;
207
208
  emitChange(finalValue, resolvedMetaTreeNode);
208
209
  setCurrentMetaTreeNode(resolvedMetaTreeNode);
@@ -240,12 +241,18 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
240
241
 
241
242
  const handleVariableSelect = useCallback(
242
243
  (variableValue: string, metaTreeNode?: MetaTreeNode) => {
244
+ if (!metaTreeNode && variableValue === '') {
245
+ const cleared = clearValue !== undefined ? clearValue : null;
246
+ setInnerValue(cleared);
247
+ emitChange(cleared as any);
248
+ return;
249
+ }
243
250
  setCurrentMetaTreeNode(metaTreeNode);
244
251
  const finalValue = resolveValueFromPath?.(metaTreeNode) || variableValue;
245
252
  setInnerValue(finalValue);
246
253
  emitChange(finalValue, metaTreeNode);
247
254
  },
248
- [emitChange, resolveValueFromPath],
255
+ [emitChange, resolveValueFromPath, clearValue],
249
256
  );
250
257
 
251
258
  const { disabled } = restProps;
@@ -254,11 +261,29 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
254
261
  if (disabled) {
255
262
  return;
256
263
  }
257
- setCurrentMetaTreeNode(null);
258
264
  const cleared = clearValue !== undefined ? clearValue : null;
259
265
  setInnerValue(cleared);
266
+
267
+ // 若 clearValue 能解析到某个路径(例如 ['constant']),
268
+ // 则尝试立即定位到对应的 MetaTreeNode,以便渲染正确的常量组件。
269
+ try {
270
+ const path = resolvePathFromValue?.(cleared);
271
+ if (Array.isArray(resolvedMetaTree) && path && path.length > 0) {
272
+ const node = findMetaTreeNodeByPath(resolvedMetaTree as MetaTreeNode[], path as string[]);
273
+ if (node) {
274
+ setCurrentMetaTreeNode(node);
275
+ emitChange(cleared as any, node);
276
+ return;
277
+ }
278
+ }
279
+ } catch (_) {
280
+ // 忽略解析异常,走默认回退
281
+ }
282
+
283
+ // 默认回退(无法定位具体 MetaTreeNode 时)
284
+ setCurrentMetaTreeNode(null);
260
285
  emitChange(cleared as any);
261
- }, [emitChange, disabled, clearValue]);
286
+ }, [emitChange, disabled, clearValue, resolvedMetaTree, resolvePathFromValue]);
262
287
 
263
288
  const stableProps = useMemo(() => {
264
289
  const { style, onFocus, onBlur, disabled, ...otherProps } = restProps;
@@ -267,7 +292,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
267
292
 
268
293
  const inputProps = useMemo(() => {
269
294
  const baseProps = {
270
- value: innerValue || '',
295
+ value: ValueComponent === Input ? innerValue ?? '' : innerValue,
271
296
  onChange: handleInputChange,
272
297
  disabled,
273
298
  };
@@ -333,6 +358,7 @@ const VariableInputComponent: React.FC<VariableInputProps> = ({
333
358
  parseValueToPath={resolvePathFromValue}
334
359
  formatPathToValue={resolveValueFromPath}
335
360
  onlyLeafSelectable={onlyLeafSelectable}
361
+ ignoreFieldNames={ignoreFieldNames}
336
362
  {...(!showValueComponent && { children: null, placeholder: restProps?.placeholder })}
337
363
  />
338
364
  </Space.Compact>
@@ -15,6 +15,7 @@ import { parseValueToPath } from './utils';
15
15
  import { useResolvedMetaTree } from './useResolvedMetaTree';
16
16
  import { useRequest } from 'ahooks';
17
17
  import { useFlowContext } from '../../FlowContextProvider';
18
+ import type { MetaTreeNode } from '../../flowContext';
18
19
 
19
20
  const VariableTagComponent: React.FC<VariableTagProps> = ({
20
21
  value,
@@ -29,14 +30,65 @@ const VariableTagComponent: React.FC<VariableTagProps> = ({
29
30
 
30
31
  const { data: displayedValue } = useRequest(
31
32
  async () => {
33
+ // 1) 优先使用已解析到的节点(包含完整父标题链)
32
34
  if (metaTreeNode) {
33
35
  return metaTreeNode.parentTitles
34
36
  ? [...metaTreeNode.parentTitles, metaTreeNode.title].map(ctx.t).join('/')
35
37
  : ctx.t(metaTreeNode.title) || '';
36
38
  }
39
+
40
+ // 2) 无 metaTreeNode 时,尝试从值还原路径,并在 metaTree 中寻找“最深前缀节点”,
41
+ // 即便最后一段无效,也能显示前缀的翻译标题。
37
42
  if (!value) return String(value);
38
- const path = parseValueToPath(value);
39
- return path ? path.join('/') : String(value);
43
+ const rawPath = parseValueToPath(value);
44
+ if (!rawPath || !Array.isArray(resolvedMetaTree)) {
45
+ return Array.isArray(rawPath) ? rawPath.join('/') : String(value);
46
+ }
47
+
48
+ // 兼容 metaTree 为子树:顶层不含首段时,裁剪首段
49
+ const topNames = new Set((resolvedMetaTree || []).map((n: any) => String(n?.name)));
50
+ const path = !topNames.has(String(rawPath[0])) ? rawPath.slice(1) : rawPath;
51
+ if (!path.length) return '';
52
+
53
+ let nodes: MetaTreeNode[] | undefined = resolvedMetaTree as MetaTreeNode[];
54
+ let deepest: MetaTreeNode | null = null;
55
+ let matchedCount = 0;
56
+ for (let i = 0; i < path.length; i++) {
57
+ if (!nodes) break;
58
+ const seg = String(path[i]);
59
+ const node = nodes.find((n) => String(n?.name) === seg) as MetaTreeNode | undefined;
60
+ if (!node) break; // 停在第一个无效段之前
61
+ deepest = node;
62
+ matchedCount = i + 1;
63
+ if (i < path.length - 1) {
64
+ if (Array.isArray(node.children)) {
65
+ nodes = node.children as any;
66
+ } else if (typeof node.children === 'function') {
67
+ try {
68
+ const childNodes = await (node.children as any)();
69
+ (node as any).children = childNodes;
70
+ nodes = childNodes as any;
71
+ } catch {
72
+ nodes = undefined;
73
+ }
74
+ } else {
75
+ nodes = undefined;
76
+ }
77
+ }
78
+ }
79
+
80
+ if (deepest) {
81
+ const titles = deepest.parentTitles ? [...deepest.parentTitles, deepest.title] : [deepest.title];
82
+ let label = titles.map(ctx.t).join('/');
83
+ if (matchedCount < path.length) {
84
+ const tail = path.slice(matchedCount).join('/');
85
+ label = tail ? `${label}/${tail}` : label;
86
+ }
87
+ return label;
88
+ }
89
+
90
+ // 3) 完全找不到任何前缀时,退回原始路径字符串
91
+ return path.join('/');
40
92
  },
41
93
  { refreshDeps: [resolvedMetaTree, value, metaTreeNode] },
42
94
  );
@@ -21,6 +21,7 @@ export interface FlowContextSelectorProps
21
21
  formatPathToValue?: (item: MetaTreeNode) => string;
22
22
  open?: boolean;
23
23
  onlyLeafSelectable?: boolean;
24
+ ignoreFieldNames?: string[];
24
25
  }
25
26
 
26
27
  export interface ContextSelectorItem {
@@ -69,6 +70,7 @@ export interface VariableInputProps {
69
70
  * 默认行为为 null;可设置为 '' 等,以便清空后默认切换为“常量-空字符串”。
70
71
  */
71
72
  clearValue?: any;
73
+ ignoreFieldNames?: string[];
72
74
  [key: string]: any;
73
75
  }
74
76
 
@@ -95,7 +95,9 @@ export const buildContextSelectorItems = (metaTree: MetaTreeNode[]): ContextSele
95
95
  return [];
96
96
  }
97
97
 
98
- const convertNode = (node: MetaTreeNode): ContextSelectorItem => {
98
+ const convertNode = (node: MetaTreeNode): ContextSelectorItem | null => {
99
+ const hidden = !!(typeof node.hidden === 'function' ? node.hidden() : node.hidden);
100
+ if (hidden) return null;
99
101
  const hasChildren = !!(
100
102
  node.children &&
101
103
  (typeof node.children === 'function' || (Array.isArray(node.children) && node.children.length > 0))
@@ -112,13 +114,15 @@ export const buildContextSelectorItems = (metaTree: MetaTreeNode[]): ContextSele
112
114
  };
113
115
 
114
116
  if (Array.isArray(node.children) && node.children.length > 0) {
115
- option.children = node.children.map((child) => convertNode(child));
117
+ option.children = node.children
118
+ .map((child) => convertNode(child))
119
+ .filter((item): item is ContextSelectorItem => item !== null);
116
120
  }
117
121
 
118
122
  return option;
119
123
  };
120
124
 
121
- return metaTree.map((node) => convertNode(node));
125
+ return metaTree.map((node) => convertNode(node)).filter((item): item is ContextSelectorItem => item !== null);
122
126
  };
123
127
 
124
128
  /**
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import { observable } from '@formily/reactive';
11
+ import { CascaderProps } from 'antd';
11
12
  import _ from 'lodash';
12
13
  import { FlowEngine } from '../flowEngine';
13
14
  import { jioToJoiSchema } from './jioToJoiSchema';
@@ -144,8 +145,8 @@ export class DataSource {
144
145
  return this.collectionManager.upsertCollection(options);
145
146
  }
146
147
 
147
- upsertCollections(collections: CollectionOptions[]) {
148
- return this.collectionManager.upsertCollections(collections);
148
+ upsertCollections(collections: CollectionOptions[], options: { clearFields?: boolean } = {}) {
149
+ return this.collectionManager.upsertCollections(collections, options);
149
150
  }
150
151
 
151
152
  removeCollection(name: string) {
@@ -166,7 +167,7 @@ export class DataSource {
166
167
  const fieldName = otherKeys.join('.');
167
168
  const collection = this.getCollection(collectionName);
168
169
  if (!collection) {
169
- throw new Error(`Collection ${collectionName} not found in data source ${this.key}`);
170
+ return;
170
171
  }
171
172
  const field = collection.getFieldByPath(fieldName);
172
173
  if (!field) {
@@ -186,6 +187,9 @@ export interface CollectionOptions {
186
187
  export class CollectionManager {
187
188
  collections: Map<string, Collection>;
188
189
 
190
+ allCollectionsInheritChain: string[];
191
+ protected childrenCollectionsName: { supportView?: string[]; notSupportView?: string[] } = {};
192
+
189
193
  constructor(public dataSource: DataSource) {
190
194
  this.collections = observable.shallow<Map<string, Collection>>(new Map());
191
195
  }
@@ -210,12 +214,12 @@ export class CollectionManager {
210
214
  this.collections.delete(name);
211
215
  }
212
216
 
213
- updateCollection(newOptions: CollectionOptions) {
217
+ updateCollection(newOptions: CollectionOptions, options: { clearFields?: boolean } = {}) {
214
218
  const collection = this.getCollection(newOptions.name);
215
219
  if (!collection) {
216
220
  throw new Error(`Collection ${newOptions.name} not found`);
217
221
  }
218
- collection.setOptions(newOptions);
222
+ collection.setOptions(newOptions, options);
219
223
  }
220
224
 
221
225
  upsertCollection(options: CollectionOptions) {
@@ -227,10 +231,10 @@ export class CollectionManager {
227
231
  return this.getCollection(options.name);
228
232
  }
229
233
 
230
- upsertCollections(collections: CollectionOptions[]) {
234
+ upsertCollections(collections: CollectionOptions[], options: { clearFields?: boolean } = {}) {
231
235
  for (const collection of sortCollectionsByInherits(collections)) {
232
236
  if (this.collections.has(collection.name)) {
233
- this.updateCollection(collection);
237
+ this.updateCollection(collection, options);
234
238
  } else {
235
239
  this.addCollection(collection);
236
240
  }
@@ -321,6 +325,98 @@ export class CollectionManager {
321
325
  }
322
326
  return collection.getField(fieldName);
323
327
  }
328
+
329
+ getChildrenCollections(name) {
330
+ const childrens = [];
331
+ const collections = Array.from(this.collections.values());
332
+ const getChildrens = (name) => {
333
+ const inheritCollections = collections.filter((v: any) => {
334
+ return v.options.inherits?.includes(name);
335
+ });
336
+ inheritCollections.forEach((v) => {
337
+ const collectionKey = v.name;
338
+ childrens.push(v);
339
+ return getChildrens(collectionKey);
340
+ });
341
+ return childrens;
342
+ };
343
+ return getChildrens(name);
344
+ }
345
+ getChildrenCollectionsName(name, isSupportView = false) {
346
+ const cacheKey = isSupportView ? 'supportView' : 'notSupportView';
347
+ if (this.childrenCollectionsName[cacheKey]) {
348
+ return this.childrenCollectionsName[cacheKey].slice();
349
+ }
350
+
351
+ const children: string[] = [];
352
+ const collections = [...this.getCollections()];
353
+ const getChildrenCollectionsInner = (collectionName: string) => {
354
+ const inheritCollections = collections.filter((v: any) => {
355
+ return [...v.inherits]?.includes(collectionName);
356
+ });
357
+ inheritCollections.forEach((v) => {
358
+ const collectionKey = v.name;
359
+ children.push(collectionKey);
360
+ return getChildrenCollectionsInner(collectionKey);
361
+ });
362
+ if (isSupportView) {
363
+ const sourceCollections = collections.filter((v: any) => {
364
+ return [...v.sources]?.length === 1 && v?.sources[0] === collectionName;
365
+ });
366
+ sourceCollections.forEach((v) => {
367
+ const collectionKey = v.name;
368
+ children.push(v.name);
369
+ return getChildrenCollectionsInner(collectionKey);
370
+ });
371
+ }
372
+ return _.uniq(children);
373
+ };
374
+
375
+ this.childrenCollectionsName[cacheKey] = getChildrenCollectionsInner(name);
376
+ return this.childrenCollectionsName[cacheKey];
377
+ }
378
+
379
+ getAllCollectionsInheritChain(name) {
380
+ if (this.allCollectionsInheritChain) {
381
+ return this.allCollectionsInheritChain.slice();
382
+ }
383
+
384
+ const collectionsInheritChain = [name];
385
+ const getInheritChain = (name: string) => {
386
+ const collection = this.getCollection(name);
387
+ if (collection) {
388
+ const { inherits } = collection as any;
389
+ const children = this.getChildrenCollectionsName(name);
390
+ // 搜寻祖先表
391
+ if (inherits) {
392
+ for (let index = 0; index < inherits.length; index++) {
393
+ const collectionKey = inherits[index];
394
+ if (collectionsInheritChain.includes(collectionKey)) {
395
+ continue;
396
+ }
397
+ collectionsInheritChain.push(collectionKey);
398
+ getInheritChain(collectionKey);
399
+ }
400
+ }
401
+ // 搜寻后代表
402
+ if (children) {
403
+ for (let index = 0; index < children.length; index++) {
404
+ const collection = this.getCollection(children[index]);
405
+ const collectionKey = collection.name;
406
+ if (collectionsInheritChain.includes(collectionKey)) {
407
+ continue;
408
+ }
409
+ collectionsInheritChain.push(collectionKey);
410
+ getInheritChain(collectionKey);
411
+ }
412
+ }
413
+ }
414
+ return collectionsInheritChain;
415
+ };
416
+
417
+ this.allCollectionsInheritChain = getInheritChain(name);
418
+ return this.allCollectionsInheritChain || [];
419
+ }
324
420
  }
325
421
 
326
422
  // Collection 负责管理自己的 Field
@@ -337,6 +433,12 @@ export class Collection {
337
433
  this.setFields(options.fields || []);
338
434
  }
339
435
 
436
+ clone() {
437
+ const newCollection = new Collection(_.cloneDeep(this.options));
438
+ newCollection.setDataSource(this.dataSource);
439
+ return newCollection;
440
+ }
441
+
340
442
  getFilterByTK(record) {
341
443
  if (!record) {
342
444
  throw new Error('Record is required to get filterByTk');
@@ -350,9 +452,16 @@ export class Collection {
350
452
  if (typeof this.filterTargetKey === 'string') {
351
453
  return record[this.filterTargetKey];
352
454
  }
455
+ if (Array.isArray(this.filterTargetKey) && this.filterTargetKey.length === 1) {
456
+ return record[this.filterTargetKey[0]];
457
+ }
353
458
  return _.pick(record, this.filterTargetKey);
354
459
  }
355
460
 
461
+ get titleableFields() {
462
+ return this.getFields().filter((field) => field.titleable);
463
+ }
464
+
356
465
  get hidden() {
357
466
  return this.options.hidden || false;
358
467
  }
@@ -412,10 +521,13 @@ export class Collection {
412
521
  this.dataSource = dataSource;
413
522
  }
414
523
 
415
- setOptions(newOptions: any = {}) {
524
+ setOptions(newOptions: any = {}, options: { clearFields?: boolean } = {}) {
416
525
  Object.keys(this.options).forEach((key) => delete this.options[key]);
417
526
  Object.assign(this.options, newOptions);
418
527
  this.initInherits();
528
+ if (options.clearFields) {
529
+ this.clearFields();
530
+ }
419
531
  this.upsertFields(this.options.fields || []);
420
532
  }
421
533
 
@@ -483,14 +595,13 @@ export class Collection {
483
595
  if (otherKeys.length === 0) {
484
596
  return field;
485
597
  }
486
- if (!field.targetCollection) {
598
+ if (!field?.targetCollection) {
487
599
  return null;
488
600
  }
489
601
  return field.targetCollection.getFieldByPath(otherKeys.join('.'));
490
602
  }
491
603
 
492
604
  getField(fieldName: string): CollectionField | undefined {
493
- this.setFields(this.options.fields); //数据表字段被删除
494
605
  return this.fields.get(fieldName);
495
606
  }
496
607
 
@@ -621,6 +732,10 @@ export class CollectionField {
621
732
  return this.options.readonly || this.options.uiSchema?.['x-read-pretty'] || false;
622
733
  }
623
734
 
735
+ get titleable() {
736
+ return !!(this.options.titleable ?? this.options.titleUsable);
737
+ }
738
+
624
739
  get fullpath() {
625
740
  return this.collection.dataSource.key + '.' + this.collection.name + '.' + this.name;
626
741
  }
@@ -654,7 +769,7 @@ export class CollectionField {
654
769
  }
655
770
 
656
771
  get title() {
657
- const titleValue = this.options?.title || this.options?.uiSchema?.title || this.options.name;
772
+ const titleValue = this.options?.uiSchema?.title || this.options?.title || this.options.name;
658
773
  return this.flowEngine.translate(titleValue);
659
774
  }
660
775
 
@@ -663,7 +778,22 @@ export class CollectionField {
663
778
  }
664
779
 
665
780
  get enum(): any[] {
666
- return this.options.uiSchema?.enum || [];
781
+ const options = this.options.uiSchema?.enum || [];
782
+ if (this.type === 'integer') {
783
+ return options.map((v) => {
784
+ if (typeof v !== 'object') {
785
+ return v;
786
+ }
787
+ if (v.value === null || v.value === undefined) {
788
+ return v;
789
+ }
790
+ return {
791
+ ...v,
792
+ value: Number(v.value),
793
+ };
794
+ });
795
+ }
796
+ return options;
667
797
  }
668
798
 
669
799
  get defaultValue() {
@@ -703,6 +833,7 @@ export class CollectionField {
703
833
  multiple: target ? ['belongsToMany', 'hasMany', 'belongsToArray'].includes(type) : undefined,
704
834
  maxCount: target && !['belongsToMany', 'hasMany', 'belongsToArray'].includes(type) ? 1 : undefined,
705
835
  target: target,
836
+ template: this.targetCollection?.template,
706
837
  },
707
838
  _.isUndefined,
708
839
  );
@@ -97,6 +97,7 @@ export function jioToJoiSchema<T extends JioType>(jioConfig: {
97
97
  // 4️⃣ 如果没有 required,默认可选并允许空字符串
98
98
  if (!hasRequired) {
99
99
  schema = schema.optional().allow('');
100
+ schema = schema.optional().allow(null);
100
101
  }
101
102
 
102
103
  return schema;
package/src/emitter.ts CHANGED
@@ -30,4 +30,18 @@ export class Emitter {
30
30
  }
31
31
  (this.events[event] || []).forEach((fn) => fn(...args));
32
32
  }
33
+
34
+ /**
35
+ * 异步触发事件:按监听器注册顺序依次(串行)等待执行完成。
36
+ * - 若某个监听器抛错/Promise reject,将中断后续执行并将异常向上传递(便于调用方统一处理)。
37
+ * - 当前不提供并行触发能力;如需并发处理,请在监听器内部自行管理(例如在回调内使用 Promise.all)。
38
+ */
39
+ async emitAsync(event: string, ...args: any[]): Promise<void> {
40
+ if (this.paused) return;
41
+ const listeners = (this.events[event] || []).slice(); // 防止触发过程中被修改
42
+ for (const fn of listeners) {
43
+ // 兼容同步/异步监听器
44
+ await fn(...args);
45
+ }
46
+ }
33
47
  }