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

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 (466) 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 +224 -87
  47. package/lib/flowEngine.d.ts +24 -1
  48. package/lib/flowEngine.js +81 -8
  49. package/lib/flowSettings.d.ts +2 -1
  50. package/lib/flowSettings.js +16 -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 +52 -6
  59. package/lib/models/flowModel.d.ts +30 -29
  60. package/lib/models/flowModel.js +153 -100
  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 +205 -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 +162 -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-antd-icons.snippet.d.ts +11 -0
  115. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  116. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  117. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  118. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  119. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  120. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  121. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  122. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  123. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  124. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  125. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  126. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  127. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  128. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  129. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  130. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  131. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  132. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  133. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  134. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  135. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  136. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  137. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  138. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  139. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  140. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  141. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  142. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  143. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  144. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  145. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  146. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  148. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  149. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  150. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  151. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  152. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  154. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  158. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  159. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  160. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  161. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  162. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  163. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  164. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  165. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  166. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  167. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  168. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  169. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  170. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  171. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  172. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  173. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  174. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  175. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  176. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  177. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  178. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  179. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  180. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  181. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  182. package/lib/runjs-context/snippets/types.d.ts +9 -1
  183. package/lib/scheduler/ModelOperationScheduler.d.ts +51 -0
  184. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  185. package/lib/types.d.ts +28 -3
  186. package/lib/types.js +4 -3
  187. package/lib/utils/associationObjectVariable.d.ts +32 -0
  188. package/lib/utils/associationObjectVariable.js +157 -0
  189. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  190. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  191. package/lib/utils/createEphemeralContext.d.ts +13 -0
  192. package/lib/utils/createEphemeralContext.js +140 -0
  193. package/lib/utils/flows.d.ts +10 -0
  194. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → utils/flows.js} +21 -15
  195. package/lib/utils/index.d.ts +7 -2
  196. package/lib/utils/index.js +21 -2
  197. package/lib/utils/jsxTransform.d.ts +15 -0
  198. package/lib/utils/jsxTransform.js +68 -0
  199. package/lib/utils/params-resolvers.js +3 -3
  200. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  201. package/lib/utils/parsePathnameToViewParams.js +41 -5
  202. package/lib/utils/pruneFilter.d.ts +21 -0
  203. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  204. package/lib/utils/safeGlobals.d.ts +5 -3
  205. package/lib/utils/safeGlobals.js +40 -0
  206. package/lib/utils/schema-utils.js +2 -2
  207. package/lib/utils/serverContextParams.d.ts +1 -0
  208. package/lib/utils/translation.d.ts +4 -1
  209. package/lib/utils/translation.js +6 -2
  210. package/lib/utils/variablesParams.d.ts +22 -5
  211. package/lib/utils/variablesParams.js +132 -36
  212. package/lib/views/DrawerComponent.js +21 -2
  213. package/lib/views/PageComponent.js +2 -1
  214. package/lib/views/ViewNavigation.d.ts +3 -9
  215. package/lib/views/ViewNavigation.js +16 -2
  216. package/lib/views/createViewMeta.d.ts +29 -1
  217. package/lib/views/createViewMeta.js +338 -72
  218. package/lib/views/index.d.ts +1 -0
  219. package/lib/views/index.js +3 -0
  220. package/lib/views/useDialog.d.ts +9 -8
  221. package/lib/views/useDialog.js +19 -14
  222. package/lib/views/useDrawer.d.ts +9 -8
  223. package/lib/views/useDrawer.js +54 -35
  224. package/lib/views/usePage.d.ts +9 -8
  225. package/lib/views/usePage.js +20 -14
  226. package/package.json +6 -3
  227. package/src/BlockScopedFlowEngine.ts +86 -0
  228. package/src/FlowContextProvider.tsx +4 -2
  229. package/src/JSRunner.ts +3 -0
  230. package/src/ViewScopedFlowEngine.ts +15 -1
  231. package/src/__tests__/JSRunner.test.ts +62 -53
  232. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  233. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  234. package/src/__tests__/flow-engine.test.ts +3 -0
  235. package/src/__tests__/flowContext.test.ts +52 -0
  236. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  237. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  238. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  239. package/src/__tests__/flowSettings.open.test.tsx +2 -0
  240. package/src/__tests__/flowSettings.test.ts +2 -0
  241. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  242. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  243. package/src/__tests__/objectVariable.test.ts +464 -0
  244. package/src/__tests__/runjsContext.test.ts +216 -35
  245. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  246. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  247. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  248. package/src/__tests__/runjsLocales.test.ts +36 -0
  249. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  250. package/src/__tests__/runjsSnippets.test.ts +140 -0
  251. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  252. package/src/acl/Acl.tsx +14 -0
  253. package/src/acl/__tests__/Acl.test.tsx +43 -0
  254. package/src/components/DynamicFlowsEditor.tsx +3 -4
  255. package/src/components/FieldModelRenderer.tsx +20 -7
  256. package/src/components/FieldSkeleton.tsx +27 -0
  257. package/src/components/FlowContextSelector.tsx +6 -2
  258. package/src/components/FlowModelRenderer.tsx +33 -81
  259. package/src/components/FormItem.tsx +8 -1
  260. package/src/components/MobilePopup.style.ts +220 -0
  261. package/src/components/MobilePopup.tsx +86 -0
  262. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  263. package/src/components/index.ts +1 -0
  264. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  265. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  266. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  267. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +39 -10
  268. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  269. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +425 -0
  270. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  271. package/src/components/variables/VariableInput.tsx +25 -5
  272. package/src/components/variables/VariableTag.tsx +54 -2
  273. package/src/components/variables/types.ts +2 -0
  274. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  275. package/src/data-source/index.ts +42 -11
  276. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  277. package/src/emitter.ts +14 -0
  278. package/src/executor/FlowExecutor.ts +213 -119
  279. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  280. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  281. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  282. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  283. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  284. package/src/flowContext.ts +303 -104
  285. package/src/flowEngine.ts +96 -6
  286. package/src/flowSettings.ts +12 -4
  287. package/src/hooks/useApplyAutoFlows.ts +3 -1
  288. package/src/index.ts +12 -1
  289. package/src/locale/en-US.json +4 -2
  290. package/src/locale/zh-CN.json +4 -2
  291. package/src/models/CollectionFieldModel.tsx +60 -8
  292. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  293. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  294. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  295. package/src/models/__tests__/flowModel.test.ts +234 -111
  296. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  297. package/src/models/flowModel.tsx +197 -132
  298. package/src/models/forkFlowModel.ts +48 -8
  299. package/src/provider.tsx +10 -7
  300. package/src/resources/multiRecordResource.ts +28 -1
  301. package/src/resources/singleRecordResource.ts +19 -1
  302. package/src/resources/sqlResource.ts +20 -25
  303. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  304. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  305. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  306. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  307. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  308. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  309. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  310. package/src/runjs-context/contexts/base.ts +196 -0
  311. package/src/runjs-context/helpers.ts +32 -30
  312. package/src/runjs-context/registry.ts +16 -47
  313. package/src/runjs-context/setup.ts +51 -0
  314. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  315. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  316. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  317. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  318. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  319. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  320. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  321. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  322. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  323. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  324. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  325. package/src/runjs-context/snippets/index.ts +178 -39
  326. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  327. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  328. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  329. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  330. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  331. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  332. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  333. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  334. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  335. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  336. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  337. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  338. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  339. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  340. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  341. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  342. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  343. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  344. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  345. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  346. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  347. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  348. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  349. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  350. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  351. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  352. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  353. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  354. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  355. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  356. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  357. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  358. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  359. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  360. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  361. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  362. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  363. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  364. package/src/runjs-context/snippets/types.ts +5 -1
  365. package/src/scheduler/ModelOperationScheduler.ts +304 -0
  366. package/src/types.ts +34 -0
  367. package/src/utils/__tests__/flows.test.ts +65 -0
  368. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  369. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  370. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  371. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  372. package/src/utils/__tests__/variablesParams.test.ts +63 -0
  373. package/src/utils/associationObjectVariable.ts +180 -0
  374. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  375. package/src/utils/createEphemeralContext.ts +142 -0
  376. package/src/utils/flows.ts +23 -0
  377. package/src/utils/index.ts +11 -2
  378. package/src/utils/jsxTransform.ts +39 -0
  379. package/src/utils/params-resolvers.ts +2 -2
  380. package/src/utils/parsePathnameToViewParams.ts +50 -6
  381. package/src/utils/pruneFilter.ts +41 -0
  382. package/src/utils/safeGlobals.ts +49 -3
  383. package/src/utils/schema-utils.ts +1 -1
  384. package/src/utils/serverContextParams.ts +1 -0
  385. package/src/utils/translation.ts +7 -2
  386. package/src/utils/variablesParams.ts +156 -38
  387. package/src/views/DrawerComponent.tsx +21 -2
  388. package/src/views/PageComponent.tsx +1 -1
  389. package/src/views/ViewNavigation.ts +20 -12
  390. package/src/views/__tests__/ViewNavigation.test.ts +10 -0
  391. package/src/views/createViewMeta.ts +393 -70
  392. package/src/views/index.tsx +1 -0
  393. package/src/views/useDialog.tsx +24 -18
  394. package/src/views/useDrawer.tsx +74 -45
  395. package/src/views/usePage.tsx +26 -17
  396. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  397. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  398. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  399. package/lib/runjs-context/index.d.ts +0 -19
  400. package/lib/runjs-context/index.js +0 -57
  401. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  402. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  403. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  404. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  405. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  406. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  407. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  408. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  409. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  410. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  411. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  412. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  413. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  414. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  415. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  416. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  417. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  418. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  419. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  420. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  421. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  422. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  423. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  424. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  425. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  426. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  427. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  428. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  429. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  430. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  431. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  432. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  433. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  434. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  435. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  436. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  437. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  438. package/src/runjs-context/index.ts +0 -20
  439. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  440. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  441. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  442. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  443. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  444. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  445. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  446. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  447. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  448. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  449. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  450. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  451. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  452. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  453. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  454. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  455. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  456. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  457. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  458. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  459. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  460. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  461. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  462. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  463. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  464. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  465. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  466. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -69,4 +69,47 @@ describe('ACL', () => {
69
69
  });
70
70
  expect(notOk).toBe(false);
71
71
  });
72
+
73
+ it('reloads permissions when auth token changes', async () => {
74
+ const payload1 = {
75
+ data: {
76
+ allowAll: false,
77
+ actionAlias: { remove: 'destroy' },
78
+ resources: ['posts'],
79
+ actions: {},
80
+ strategy: { actions: [] },
81
+ },
82
+ };
83
+ const payload2 = {
84
+ data: {
85
+ allowAll: false,
86
+ actionAlias: { remove: 'erase' },
87
+ resources: ['posts'],
88
+ actions: {},
89
+ strategy: { actions: [] },
90
+ },
91
+ };
92
+
93
+ const engine = new FlowEngine();
94
+ const api: any = {
95
+ auth: { token: 't1' },
96
+ request: vi.fn().mockImplementation(async () => {
97
+ // 返回依据当前 token 的不同 ACL 数据
98
+ return api.auth.token === 't1' ? { data: payload1 } : { data: payload2 };
99
+ }),
100
+ };
101
+ engine.context.defineProperty('api', { value: api });
102
+
103
+ const acl = new ACL(engine);
104
+ await acl.load();
105
+ expect(acl.getActionAlias('remove')).toBe('destroy');
106
+
107
+ // 切换 token,应触发下次校验时的 ACL 重载
108
+ api.auth.token = 't2';
109
+ await acl.aclCheck({ dataSourceKey: 'main', resourceName: 'posts', actionName: 'remove' });
110
+ expect(acl.getActionAlias('remove')).toBe('erase');
111
+
112
+ // 确认 roles:check 请求至少调用两次(初次 + 重载)
113
+ expect(api.request).toHaveBeenCalledTimes(2);
114
+ });
72
115
  });
@@ -8,13 +8,12 @@
8
8
  */
9
9
 
10
10
  import { DeleteOutlined, PlusOutlined } from '@ant-design/icons';
11
- import { uid } from '@nocobase/utils/client';
12
- import { Collapse, Space, Button, Tabs, Input, Modal, Form, Empty, Select } from 'antd';
13
- import type { FormInstance } from 'antd';
14
11
  import { observer } from '@formily/react';
12
+ import type { FormInstance } from 'antd';
13
+ import { Button, Collapse, Empty, Form, Input, Modal, Select, Space, Tabs } from 'antd';
15
14
  import React from 'react';
16
- import { FlowModel } from '../models';
17
15
  import { FlowDefinition } from '../FlowDefinition';
16
+ import { FlowModel } from '../models';
18
17
  import { FlowDefinitionOptions } from '../types';
19
18
 
20
19
  const Panel = Collapse.Panel;
@@ -20,7 +20,6 @@ const flowModelRendererPropKeys: (keyof FlowModelRendererProps)[] = [
20
20
  'flowSettingsVariant',
21
21
  'hideRemoveInSettings',
22
22
  'showTitle',
23
- 'skipApplyAutoFlows',
24
23
  'inputArgs',
25
24
  'showErrorFallback',
26
25
  'settingsMenuLevel',
@@ -32,20 +31,34 @@ export function FieldModelRenderer(props: any) {
32
31
  const composingRef = useRef(false);
33
32
 
34
33
  const handleChange = (e: any) => {
35
- const val = e?.target?.value || e;
34
+ let val;
35
+ if (e && e.target && typeof e.target.value !== 'undefined') {
36
+ val = e.target.value;
37
+ } else if (
38
+ typeof e === 'string' ||
39
+ typeof e === 'number' ||
40
+ typeof e === 'boolean' ||
41
+ (typeof e === 'object' && !(e instanceof Event))
42
+ ) {
43
+ val = e;
44
+ } else {
45
+ val = null;
46
+ }
47
+
36
48
  model.setProps({ value: val });
37
49
  if (!composingRef.current) {
38
- props.onChange(e);
50
+ props.onChange?.(val);
39
51
  }
40
52
  };
41
-
42
53
  const handleCompositionStart = () => {
43
54
  composingRef.current = true;
44
55
  };
45
56
 
46
- const handleCompositionEnd = (e: React.CompositionEvent<HTMLInputElement>) => {
57
+ const handleCompositionEnd = (e: React.CompositionEvent<HTMLInputElement>, flag = true) => {
47
58
  composingRef.current = false;
48
- props.onChange(e);
59
+ if (flag) {
60
+ props.onChange(e);
61
+ }
49
62
  };
50
63
 
51
64
  const modelProps = {
@@ -55,7 +68,7 @@ export function FieldModelRenderer(props: any) {
55
68
  onCompositionEnd: handleCompositionEnd,
56
69
  };
57
70
  useEffect(() => {
58
- model.setProps(modelProps);
71
+ model && model.setProps(modelProps);
59
72
  }, [modelProps]);
60
73
 
61
74
  return <FlowModelRenderer model={model} {...rest} />;
@@ -0,0 +1,27 @@
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
+ import React from 'react';
11
+ import { useFlowEngine } from '../provider';
12
+
13
+ export const FieldSkeleton: React.FC = () => {
14
+ const flowEngine = useFlowEngine();
15
+ const token = flowEngine.context.themeToken;
16
+ return (
17
+ <span
18
+ style={{
19
+ display: 'inline-block',
20
+ width: '100%',
21
+ height: 16,
22
+ backgroundColor: token.colorFillSecondary,
23
+ borderRadius: token.borderRadiusSM,
24
+ }}
25
+ />
26
+ );
27
+ };
@@ -35,6 +35,7 @@ const FlowContextSelectorComponent: React.FC<FlowContextSelectorProps> = ({
35
35
  formatPathToValue: customFormatPathToValue,
36
36
  open,
37
37
  onlyLeafSelectable = false,
38
+ ignoreFieldNames,
38
39
  ...cascaderProps
39
40
  }) => {
40
41
  // 记录最后点击的路径,用于双击检测
@@ -97,8 +98,11 @@ const FlowContextSelectorComponent: React.FC<FlowContextSelectorProps> = ({
97
98
  const options = useMemo(() => {
98
99
  if (!resolvedMetaTree) return [];
99
100
  const base = buildContextSelectorItems(resolvedMetaTree);
100
- return translateOptions(base);
101
- }, [resolvedMetaTree, updateFlag, translateOptions]);
101
+ return translateOptions(base).filter((item) => {
102
+ if (!ignoreFieldNames || ignoreFieldNames.length === 0) return true;
103
+ return !ignoreFieldNames.includes(item.meta?.name || '');
104
+ });
105
+ }, [resolvedMetaTree, updateFlag, translateOptions, ignoreFieldNames]);
102
106
 
103
107
  // 内部展开路径:在 onlyLeafSelectable=true 时,点击父节点不会触发 onChange,
104
108
  // 但会触发 loadData。我们在此记录路径以在懒加载后保持展开。
@@ -43,7 +43,6 @@
43
43
  */
44
44
 
45
45
  import { observer } from '@formily/reactive-react';
46
- import { Skeleton, Spin } from 'antd';
47
46
  import _ from 'lodash';
48
47
  import React from 'react';
49
48
  import { ErrorBoundary } from 'react-error-boundary';
@@ -75,7 +74,7 @@ export interface FlowModelRendererProps {
75
74
  /**
76
75
  * @default 'inside'
77
76
  */
78
- toolbarPosition?: 'inside' | 'above';
77
+ toolbarPosition?: 'inside' | 'above' | 'below';
79
78
  }; // 默认 false
80
79
 
81
80
  /** 流程设置的交互风格 */
@@ -87,10 +86,7 @@ export interface FlowModelRendererProps {
87
86
  /** 是否在边框左上角显示模型title,默认 false */
88
87
  showTitle?: boolean; // 默认 false
89
88
 
90
- /** 是否跳过自动应用流程,默认 false */
91
- skipApplyAutoFlows?: boolean; // 默认 false
92
-
93
- /** 当 skipApplyAutoFlows !== false 时,传递给 useApplyAutoFlows 的额外上下文 */
89
+ /** 传递给 beforeRender 事件的运行时参数 */
94
90
  inputArgs?: Record<string, any>;
95
91
 
96
92
  /** 是否在最外层包装 FlowErrorFallback 组件,默认 false */
@@ -118,7 +114,7 @@ const FlowModelRendererWithAutoFlows: React.FC<{
118
114
  /**
119
115
  * @default 'inside'
120
116
  */
121
- toolbarPosition?: 'inside' | 'above';
117
+ toolbarPosition?: 'inside' | 'above' | 'below';
122
118
  };
123
119
  flowSettingsVariant: string;
124
120
  hideRemoveInSettings: boolean;
@@ -168,57 +164,7 @@ const FlowModelRendererWithAutoFlows: React.FC<{
168
164
  },
169
165
  );
170
166
 
171
- /**
172
- * 内部组件:不带 useApplyAutoFlows 的渲染器
173
- */
174
- const FlowModelRendererWithoutAutoFlows: React.FC<{
175
- model: FlowModel;
176
- showFlowSettings:
177
- | boolean
178
- | {
179
- showBackground?: boolean;
180
- showBorder?: boolean;
181
- showDragHandle?: boolean;
182
- style?: React.CSSProperties;
183
- /**
184
- * @default 'inside'
185
- */
186
- toolbarPosition?: 'inside' | 'above';
187
- };
188
- flowSettingsVariant: string;
189
- hideRemoveInSettings: boolean;
190
- showTitle: boolean;
191
- showErrorFallback?: boolean;
192
- settingsMenuLevel?: number;
193
- extraToolbarItems?: ToolbarItemConfig[];
194
- }> = observer(
195
- ({
196
- model,
197
- showFlowSettings,
198
- flowSettingsVariant,
199
- hideRemoveInSettings,
200
- showTitle,
201
- showErrorFallback,
202
- settingsMenuLevel,
203
- extraToolbarItems,
204
- }) => {
205
- setAutoFlowError(model, null);
206
- return (
207
- <FlowModelProvider model={model}>
208
- <FlowModelRendererCore
209
- model={model}
210
- showFlowSettings={showFlowSettings}
211
- flowSettingsVariant={flowSettingsVariant}
212
- hideRemoveInSettings={hideRemoveInSettings}
213
- showTitle={showTitle}
214
- showErrorFallback={showErrorFallback}
215
- settingsMenuLevel={settingsMenuLevel}
216
- extraToolbarItems={extraToolbarItems}
217
- />
218
- </FlowModelProvider>
219
- );
220
- },
221
- );
167
+ // 移除不带 beforeRender 执行的渲染器,统一触发 beforeRender 事件
222
168
 
223
169
  /**
224
170
  * 核心渲染逻辑组件
@@ -235,7 +181,7 @@ const FlowModelRendererCore: React.FC<{
235
181
  /**
236
182
  * @default 'inside'
237
183
  */
238
- toolbarPosition?: 'inside' | 'above';
184
+ toolbarPosition?: 'inside' | 'above' | 'below';
239
185
  };
240
186
  flowSettingsVariant: string;
241
187
  hideRemoveInSettings: boolean;
@@ -264,7 +210,7 @@ const FlowModelRendererCore: React.FC<{
264
210
  const ContentOrError: React.FC = () => {
265
211
  const autoError = getAutoFlowError(model);
266
212
  if (autoError) {
267
- // 把自动流的错误转化为内容区错误,由内层边界兜住
213
+ // 将 beforeRender 事件错误转化为内容区错误,由内层边界兜住
268
214
  throw autoError;
269
215
  }
270
216
  const rendered = model.render();
@@ -276,8 +222,15 @@ const FlowModelRendererCore: React.FC<{
276
222
  };
277
223
 
278
224
  // 如果不显示流程设置,直接返回模型内容(可能包装 ErrorBoundary)
225
+ // 当模型类发生变化(如 replaceModel),强制重挂载内容,规避部分子组件 hooks deps 形态不一致导致的报错
226
+ const contentKey = (model as any)?.use || (model as any)?.constructor?.name || model.uid;
227
+
279
228
  if (!showFlowSettings) {
280
- return wrapWithErrorBoundary(<ContentOrError />);
229
+ return wrapWithErrorBoundary(
230
+ <div key={contentKey}>
231
+ <ContentOrError />
232
+ </div>,
233
+ );
281
234
  }
282
235
 
283
236
  // 根据 flowSettingsVariant 包装相应的设置组件
@@ -296,14 +249,22 @@ const FlowModelRendererCore: React.FC<{
296
249
  toolbarStyle={_.isObject(showFlowSettings) ? showFlowSettings.style : undefined}
297
250
  toolbarPosition={_.isObject(showFlowSettings) ? showFlowSettings.toolbarPosition : undefined}
298
251
  >
299
- {wrapWithErrorBoundary(<ContentOrError />)}
252
+ {wrapWithErrorBoundary(
253
+ <div key={contentKey}>
254
+ <ContentOrError />
255
+ </div>,
256
+ )}
300
257
  </FlowsFloatContextMenu>
301
258
  );
302
259
 
303
260
  case 'contextMenu':
304
261
  return (
305
262
  <FlowsContextMenu model={model} showDeleteButton={!hideRemoveInSettings}>
306
- {wrapWithErrorBoundary(<ContentOrError />)}
263
+ {wrapWithErrorBoundary(
264
+ <div key={contentKey}>
265
+ <ContentOrError />
266
+ </div>,
267
+ )}
307
268
  </FlowsContextMenu>
308
269
  );
309
270
 
@@ -334,7 +295,11 @@ const FlowModelRendererCore: React.FC<{
334
295
  toolbarStyle={_.isObject(showFlowSettings) ? showFlowSettings.style : undefined}
335
296
  toolbarPosition={_.isObject(showFlowSettings) ? showFlowSettings.toolbarPosition : undefined}
336
297
  >
337
- {wrapWithErrorBoundary(<ContentOrError />)}
298
+ {wrapWithErrorBoundary(
299
+ <div key={contentKey}>
300
+ <ContentOrError />
301
+ </div>,
302
+ )}
338
303
  </FlowsFloatContextMenu>
339
304
  );
340
305
  }
@@ -355,8 +320,7 @@ const FlowModelRendererCore: React.FC<{
355
320
  * @param {string} props.flowSettingsVariant - The interaction style for flow settings.
356
321
  * @param {boolean} props.hideRemoveInSettings - Whether to hide remove button in settings.
357
322
  * @param {boolean} props.showTitle - Whether to show model title in the top-left corner of the border.
358
- * @param {boolean} props.skipApplyAutoFlows - Whether to skip applying auto flows.
359
- * @param {any} props.inputArgs - Runtime arguments to pass to useApplyAutoFlows when skipApplyAutoFlows is false.
323
+ * @param {any} props.inputArgs - Runtime arguments to pass to beforeRender event flows.
360
324
  * @param {number} props.settingsMenuLevel - Settings menu levels: 1=current model only (default), 2=include sub-models.
361
325
  * @param {ToolbarItemConfig[]} props.extraToolbarItems - Extra toolbar items to add to this renderer instance.
362
326
  * @returns {React.ReactNode | null} The rendered output of the model, or null if the model or its render method is invalid.
@@ -364,12 +328,11 @@ const FlowModelRendererCore: React.FC<{
364
328
  export const FlowModelRenderer: React.FC<FlowModelRendererProps> = observer(
365
329
  ({
366
330
  model,
367
- fallback = <Skeleton.Button size="small" />,
331
+ fallback = null,
368
332
  showFlowSettings = false,
369
333
  flowSettingsVariant = 'dropdown',
370
334
  hideRemoveInSettings = false,
371
335
  showTitle = false,
372
- skipApplyAutoFlows = false,
373
336
  inputArgs,
374
337
  showErrorFallback = true,
375
338
  settingsMenuLevel,
@@ -381,19 +344,8 @@ export const FlowModelRenderer: React.FC<FlowModelRendererProps> = observer(
381
344
  return null;
382
345
  }
383
346
 
384
- // 构建渲染内容
385
- const content = skipApplyAutoFlows ? (
386
- <FlowModelRendererWithoutAutoFlows
387
- model={model}
388
- showFlowSettings={showFlowSettings}
389
- flowSettingsVariant={flowSettingsVariant}
390
- hideRemoveInSettings={hideRemoveInSettings}
391
- showTitle={showTitle}
392
- showErrorFallback={showErrorFallback}
393
- settingsMenuLevel={settingsMenuLevel}
394
- extraToolbarItems={extraToolbarItems}
395
- />
396
- ) : (
347
+ // 构建渲染内容:统一在渲染前触发 beforeRender 事件(带缓存)
348
+ const content = (
397
349
  <FlowModelRendererWithAutoFlows
398
350
  model={model}
399
351
  showFlowSettings={showFlowSettings}
@@ -9,7 +9,7 @@
9
9
 
10
10
  import React from 'react';
11
11
  import { Tooltip, Form } from 'antd';
12
- import type { FormItemProps } from 'antd';
12
+ import type { FormItemProps, TooltipProps } from 'antd';
13
13
 
14
14
  type ChildExtraProps = Record<string, any>;
15
15
 
@@ -123,6 +123,13 @@ export const FormItem = ({
123
123
  label={renderLabel()}
124
124
  colon={false}
125
125
  extra={rest.extra && <span style={{ whiteSpace: 'pre-wrap' }}>{rest.extra}</span>}
126
+ tooltip={
127
+ rest.tooltip &&
128
+ ({
129
+ title: rest.tooltip,
130
+ overlayInnerStyle: { whiteSpace: 'pre-line' },
131
+ } as TooltipProps)
132
+ }
126
133
  >
127
134
  {processedChildren}
128
135
  </Form.Item>
@@ -0,0 +1,220 @@
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
+ import type { CSSInterpolation, CSSObject } from '@ant-design/cssinjs';
11
+ import { useStyleRegister } from '@ant-design/cssinjs';
12
+ import { merge } from '@formily/shared';
13
+ import type { ComponentTokenMap } from 'antd/es/theme/interface';
14
+ import { useMemo, useContext } from 'react';
15
+ import { ConfigProvider, theme } from 'antd';
16
+
17
+ const usePrefixCls = (
18
+ tag?: string,
19
+ props?: {
20
+ prefixCls?: string;
21
+ },
22
+ ) => {
23
+ const { getPrefixCls } = useContext(ConfigProvider.ConfigContext) || {};
24
+ if ('ConfigContext' in ConfigProvider) {
25
+ return getPrefixCls?.(tag, props?.prefixCls) || '';
26
+ } else {
27
+ const prefix = props?.prefixCls ?? 'ant-';
28
+ return `${prefix}${tag ?? ''}`;
29
+ }
30
+ };
31
+ const { ConfigContext } = ConfigProvider;
32
+ const useConfig = () => useContext(ConfigContext);
33
+ const useToken = theme.useToken;
34
+
35
+ type OverrideComponent = keyof ComponentTokenMap | string;
36
+
37
+ interface StyleInfo {
38
+ hashId: string;
39
+ prefixCls: string;
40
+ rootPrefixCls: string;
41
+ iconPrefixCls: string;
42
+ }
43
+
44
+ type TokenWithCommonCls<T> = T & {
45
+ /** Wrap component class with `.` prefix */
46
+ componentCls: string;
47
+ /** Origin prefix which do not have `.` prefix */
48
+ prefixCls: string;
49
+ /** Wrap icon class with `.` prefix */
50
+ iconCls: string;
51
+ /** Wrap ant prefixCls class with `.` prefix */
52
+ antCls: string;
53
+ };
54
+
55
+ const genCommonStyle = (token: any, componentPrefixCls: string): CSSObject => {
56
+ const { fontFamily, fontSize } = token;
57
+
58
+ const rootPrefixSelector = `[class^="${componentPrefixCls}"], [class*=" ${componentPrefixCls}"]`;
59
+
60
+ return {
61
+ [rootPrefixSelector]: {
62
+ fontFamily,
63
+ fontSize,
64
+ boxSizing: 'border-box',
65
+
66
+ '&::before, &::after': {
67
+ boxSizing: 'border-box',
68
+ },
69
+
70
+ [rootPrefixSelector]: {
71
+ boxSizing: 'border-box',
72
+
73
+ '&::before, &::after': {
74
+ boxSizing: 'border-box',
75
+ },
76
+ },
77
+ },
78
+ };
79
+ };
80
+ type UseComponentStyleResult = {
81
+ wrapSSR: ReturnType<typeof useStyleRegister>;
82
+ hashId: string;
83
+ componentCls: string;
84
+ rootPrefixCls: string;
85
+ };
86
+
87
+ const genStyleHook = <ComponentName extends OverrideComponent>(
88
+ component: ComponentName,
89
+ styleFn: (token: TokenWithCommonCls<any>, props: any, info: StyleInfo) => CSSInterpolation,
90
+ ) => {
91
+ return (props?: any): UseComponentStyleResult => {
92
+ const { theme, token, hashId } = useToken();
93
+ const { getPrefixCls, iconPrefixCls } = useConfig();
94
+ const prefixCls = usePrefixCls(component);
95
+ const rootPrefixCls = getPrefixCls();
96
+
97
+ const wrapSSR = useStyleRegister(
98
+ {
99
+ theme: theme as any,
100
+ token,
101
+ hashId,
102
+ path: ['formily-antd', component, prefixCls, iconPrefixCls],
103
+ },
104
+ () => {
105
+ const componentCls = `.${prefixCls}`;
106
+ const mergedToken: TokenWithCommonCls<any> = merge(token, {
107
+ componentCls,
108
+ prefixCls,
109
+ iconCls: `.${iconPrefixCls}`,
110
+ antCls: `.${rootPrefixCls}`,
111
+ });
112
+
113
+ const styleInterpolation = styleFn(mergedToken, props, {
114
+ hashId,
115
+ prefixCls,
116
+ rootPrefixCls,
117
+ iconPrefixCls,
118
+ });
119
+ return [genCommonStyle(token, prefixCls), styleInterpolation];
120
+ },
121
+ );
122
+
123
+ // useStyleRegister 有 BUG,会导致重复渲染,所以这里做了一层缓存
124
+ // 等 https://github.com/ant-design/cssinjs/pull/176 合并后,可以去掉这层缓存
125
+ const memoizedWrapSSR = useMemo(() => {
126
+ return wrapSSR;
127
+ }, [theme, token, hashId, prefixCls, iconPrefixCls, rootPrefixCls, props]);
128
+
129
+ return {
130
+ wrapSSR: memoizedWrapSSR,
131
+ hashId,
132
+ componentCls: prefixCls,
133
+ rootPrefixCls,
134
+ };
135
+ };
136
+ };
137
+
138
+ export const useMobileActionDrawerStyle = genStyleHook('nb-mobile-action-drawer', (token) => {
139
+ const { componentCls } = token;
140
+ return {
141
+ [componentCls]: {
142
+ '.nb-mobile-action-drawer-header': {
143
+ height: 'var(--nb-mobile-page-header-height)',
144
+ display: 'flex',
145
+ alignItems: 'center',
146
+ justifyContent: 'space-between',
147
+ borderBottom: `1px solid ${token.colorSplit}`,
148
+ position: 'sticky',
149
+ top: 0,
150
+ backgroundColor: 'white',
151
+ zIndex: 1000,
152
+
153
+ // to match the button named 'Add block'
154
+ '& + .nb-grid-container > .nb-grid > .nb-grid-warp > .ant-btn': {
155
+ margin: 12,
156
+ },
157
+ },
158
+
159
+ '.nb-mobile-action-drawer-placeholder': {
160
+ display: 'inline-block',
161
+ padding: 12,
162
+ visibility: 'hidden',
163
+ },
164
+
165
+ '.nb-mobile-action-drawer-close-icon': {
166
+ display: 'inline-block',
167
+ padding: 12,
168
+ cursor: 'pointer',
169
+ },
170
+
171
+ '.nb-mobile-action-drawer-body': {
172
+ borderTopLeftRadius: 8,
173
+ borderTopRightRadius: 8,
174
+ maxHeight: 'calc(100% - var(--nb-mobile-page-header-height))',
175
+ overflowY: 'auto',
176
+ overflowX: 'hidden',
177
+ backgroundColor: token.colorBgLayout,
178
+
179
+ // 不带 tab 页的半窗
180
+ '& > .nb-grid-container': {
181
+ padding: `${token.paddingPageVertical}px ${token.paddingPageHorizontal}px`,
182
+ },
183
+
184
+ // 带有 tab 页的半窗
185
+ '.ant-tabs-nav': {
186
+ marginBottom: '0px !important',
187
+ padding: `0 ${token.paddingPageHorizontal + token.borderRadiusBlock / 2}px`,
188
+ backgroundColor: token.colorBgContainer,
189
+ },
190
+
191
+ // clear the margin-bottom of the last block
192
+ '& > .nb-grid-container > .nb-grid > .nb-grid-warp > .nb-grid-row:nth-last-child(2) .noco-card-item': {
193
+ marginBottom: 0,
194
+
195
+ '& > .ant-card': {
196
+ marginBottom: '0 !important',
197
+ },
198
+ },
199
+ },
200
+
201
+ '.nb-mobile-action-drawer-footer': {
202
+ padding: '8px var(--nb-mobile-page-tabs-content-padding)',
203
+ display: 'flex',
204
+ alignItems: 'center',
205
+ justifyContent: 'flex-end',
206
+ position: 'sticky',
207
+ bottom: 0,
208
+ left: 0,
209
+ right: 0,
210
+ zIndex: 1000,
211
+ borderTop: `1px solid ${token.colorSplit}`,
212
+ backgroundColor: token.colorBgLayout,
213
+
214
+ '.ant-btn': {
215
+ marginLeft: 8,
216
+ },
217
+ },
218
+ },
219
+ };
220
+ });