@nocobase/flow-engine 2.0.0-alpha.3 → 2.0.0-alpha.30

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 (418) 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/components/FieldModelRenderer.js +10 -4
  9. package/lib/components/FieldSkeleton.d.ts +10 -0
  10. package/lib/components/FieldSkeleton.js +64 -0
  11. package/lib/components/FlowContextSelector.js +7 -2
  12. package/lib/components/FlowModelRenderer.d.ts +2 -5
  13. package/lib/components/FlowModelRenderer.js +16 -47
  14. package/lib/components/FormItem.js +5 -1
  15. package/lib/{runjs-context/snippets/global/requireAsync.snippet.d.ts → components/dnd/findModelUidPosition.d.ts} +4 -7
  16. package/lib/{runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js → components/dnd/findModelUidPosition.js} +23 -19
  17. package/lib/components/dnd/gridDragPlanner.d.ts +130 -0
  18. package/lib/components/dnd/gridDragPlanner.js +497 -0
  19. package/lib/components/dnd/index.d.ts +2 -2
  20. package/lib/components/dnd/index.js +5 -5
  21. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  22. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  23. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  25. package/lib/components/variables/VariableInput.js +16 -2
  26. package/lib/components/variables/VariableTag.js +43 -2
  27. package/lib/components/variables/types.d.ts +2 -0
  28. package/lib/data-source/index.d.ts +12 -4
  29. package/lib/data-source/index.js +19 -13
  30. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  31. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  32. package/lib/executor/FlowExecutor.d.ts +4 -5
  33. package/lib/executor/FlowExecutor.js +135 -100
  34. package/lib/flowContext.d.ts +33 -5
  35. package/lib/flowContext.js +193 -76
  36. package/lib/flowEngine.d.ts +8 -1
  37. package/lib/flowEngine.js +18 -6
  38. package/lib/flowSettings.d.ts +2 -1
  39. package/lib/flowSettings.js +12 -8
  40. package/lib/hooks/useApplyAutoFlows.js +2 -1
  41. package/lib/index.d.ts +7 -1
  42. package/lib/index.js +32 -3
  43. package/lib/locale/en-US.json +4 -2
  44. package/lib/locale/index.d.ts +4 -0
  45. package/lib/locale/zh-CN.json +4 -2
  46. package/lib/models/CollectionFieldModel.d.ts +2 -0
  47. package/lib/models/CollectionFieldModel.js +43 -3
  48. package/lib/models/flowModel.d.ts +28 -29
  49. package/lib/models/flowModel.js +114 -92
  50. package/lib/models/forkFlowModel.d.ts +4 -4
  51. package/lib/models/forkFlowModel.js +32 -8
  52. package/lib/provider.d.ts +3 -1
  53. package/lib/provider.js +7 -5
  54. package/lib/resources/multiRecordResource.js +2 -0
  55. package/lib/resources/singleRecordResource.js +1 -0
  56. package/lib/resources/sqlResource.d.ts +1 -0
  57. package/lib/resources/sqlResource.js +20 -24
  58. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  60. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  62. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  64. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  65. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  66. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  67. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  68. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  69. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  70. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  71. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  72. package/lib/runjs-context/contexts/base.d.ts +9 -0
  73. package/lib/runjs-context/contexts/base.js +183 -0
  74. package/lib/runjs-context/helpers.d.ts +5 -2
  75. package/lib/runjs-context/helpers.js +36 -27
  76. package/lib/runjs-context/registry.d.ts +7 -4
  77. package/lib/runjs-context/registry.js +10 -42
  78. package/lib/runjs-context/setup.d.ts +9 -0
  79. package/lib/runjs-context/setup.js +82 -0
  80. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  81. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  82. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  83. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  84. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  85. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  86. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  87. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  88. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  89. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  90. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  92. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  93. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  94. package/lib/runjs-context/snippets/index.d.ts +14 -3
  95. package/lib/runjs-context/snippets/index.js +161 -40
  96. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  97. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  98. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  99. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  100. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  101. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  102. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  103. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  105. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  107. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  109. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  111. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  113. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  115. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  117. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  119. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  121. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  123. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  125. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  127. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  129. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  131. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  133. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  135. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  137. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  139. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  141. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  143. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  145. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  147. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  149. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  151. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  153. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  155. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  157. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  159. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  161. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  163. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  165. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  167. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  169. package/lib/runjs-context/snippets/types.d.ts +9 -1
  170. package/lib/types.d.ts +28 -3
  171. package/lib/types.js +4 -3
  172. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  173. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  174. package/lib/utils/createEphemeralContext.d.ts +13 -0
  175. package/lib/utils/createEphemeralContext.js +140 -0
  176. package/lib/utils/index.d.ts +3 -2
  177. package/lib/utils/index.js +5 -2
  178. package/lib/utils/jsxTransform.d.ts +15 -0
  179. package/lib/utils/jsxTransform.js +68 -0
  180. package/lib/utils/params-resolvers.js +3 -3
  181. package/lib/utils/safeGlobals.d.ts +5 -3
  182. package/lib/utils/safeGlobals.js +40 -0
  183. package/lib/utils/schema-utils.js +2 -2
  184. package/lib/utils/serverContextParams.d.ts +1 -0
  185. package/lib/utils/variablesParams.d.ts +9 -5
  186. package/lib/utils/variablesParams.js +47 -36
  187. package/lib/views/PageComponent.js +2 -1
  188. package/lib/views/createViewMeta.d.ts +29 -1
  189. package/lib/views/createViewMeta.js +338 -72
  190. package/lib/views/index.d.ts +1 -0
  191. package/lib/views/index.js +3 -0
  192. package/lib/views/useDialog.d.ts +8 -8
  193. package/lib/views/useDialog.js +8 -7
  194. package/lib/views/useDrawer.d.ts +8 -8
  195. package/lib/views/useDrawer.js +40 -26
  196. package/lib/views/usePage.d.ts +8 -8
  197. package/lib/views/usePage.js +8 -7
  198. package/package.json +5 -3
  199. package/src/BlockScopedFlowEngine.ts +86 -0
  200. package/src/FlowContextProvider.tsx +4 -2
  201. package/src/JSRunner.ts +3 -0
  202. package/src/ViewScopedFlowEngine.ts +1 -1
  203. package/src/__tests__/JSRunner.test.ts +62 -53
  204. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  205. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  206. package/src/__tests__/flow-engine.test.ts +3 -0
  207. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  208. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  209. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  210. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  211. package/src/__tests__/runjsContext.test.ts +216 -35
  212. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  213. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  214. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  215. package/src/__tests__/runjsLocales.test.ts +36 -0
  216. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  217. package/src/__tests__/runjsSnippets.test.ts +140 -0
  218. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  219. package/src/components/DynamicFlowsEditor.tsx +3 -4
  220. package/src/components/FieldModelRenderer.tsx +16 -5
  221. package/src/components/FieldSkeleton.tsx +27 -0
  222. package/src/components/FlowContextSelector.tsx +6 -2
  223. package/src/components/FlowModelRenderer.tsx +30 -78
  224. package/src/components/FormItem.tsx +8 -1
  225. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  226. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  227. package/src/components/dnd/README.md +149 -0
  228. package/src/components/dnd/findModelUidPosition.ts +26 -0
  229. package/src/components/dnd/gridDragPlanner.ts +659 -0
  230. package/src/components/dnd/index.tsx +3 -3
  231. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  232. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  233. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  234. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  235. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +424 -0
  236. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  237. package/src/components/variables/VariableInput.tsx +22 -2
  238. package/src/components/variables/VariableTag.tsx +54 -2
  239. package/src/components/variables/types.ts +2 -0
  240. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  241. package/src/data-source/index.ts +17 -11
  242. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  243. package/src/executor/FlowExecutor.ts +178 -121
  244. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  245. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  246. package/src/flowContext.ts +266 -97
  247. package/src/flowEngine.ts +21 -6
  248. package/src/flowSettings.ts +9 -4
  249. package/src/hooks/useApplyAutoFlows.ts +3 -1
  250. package/src/index.ts +12 -1
  251. package/src/locale/en-US.json +4 -2
  252. package/src/locale/zh-CN.json +4 -2
  253. package/src/models/CollectionFieldModel.tsx +43 -4
  254. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  255. package/src/models/__tests__/flowModel.test.ts +234 -111
  256. package/src/models/__tests__/forkFlowModel.test.ts +22 -7
  257. package/src/models/flowModel.tsx +149 -125
  258. package/src/models/forkFlowModel.ts +41 -8
  259. package/src/provider.tsx +10 -7
  260. package/src/resources/multiRecordResource.ts +2 -0
  261. package/src/resources/singleRecordResource.ts +1 -0
  262. package/src/resources/sqlResource.ts +20 -25
  263. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  264. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  265. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  266. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  267. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  268. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  269. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  270. package/src/runjs-context/contexts/base.ts +171 -0
  271. package/src/runjs-context/helpers.ts +32 -30
  272. package/src/runjs-context/registry.ts +16 -47
  273. package/src/runjs-context/setup.ts +51 -0
  274. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  275. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  276. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  277. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  278. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  279. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  280. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  281. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  282. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  283. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  284. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  285. package/src/runjs-context/snippets/index.ts +177 -39
  286. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  287. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  288. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  289. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  290. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  291. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  292. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  293. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  294. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  295. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  296. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  297. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  298. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  299. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  300. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  301. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  302. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  303. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  304. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  305. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  306. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  307. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  308. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  309. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  310. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  311. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  312. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  313. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  314. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  315. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  316. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  317. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  318. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  319. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  320. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  321. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  322. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  323. package/src/runjs-context/snippets/types.ts +5 -1
  324. package/src/types.ts +34 -0
  325. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  326. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  327. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  328. package/src/utils/createEphemeralContext.ts +142 -0
  329. package/src/utils/index.ts +2 -2
  330. package/src/utils/jsxTransform.ts +39 -0
  331. package/src/utils/params-resolvers.ts +2 -2
  332. package/src/utils/safeGlobals.ts +49 -3
  333. package/src/utils/schema-utils.ts +1 -1
  334. package/src/utils/serverContextParams.ts +1 -0
  335. package/src/utils/variablesParams.ts +50 -38
  336. package/src/views/PageComponent.tsx +1 -1
  337. package/src/views/createViewMeta.ts +393 -70
  338. package/src/views/index.tsx +1 -0
  339. package/src/views/useDialog.tsx +12 -10
  340. package/src/views/useDrawer.tsx +60 -36
  341. package/src/views/usePage.tsx +13 -10
  342. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  343. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  344. package/lib/components/dnd/moveBlock.d.ts +0 -33
  345. package/lib/components/dnd/moveBlock.js +0 -302
  346. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  347. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  348. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  349. package/lib/runjs-context/index.d.ts +0 -19
  350. package/lib/runjs-context/index.js +0 -57
  351. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  352. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  353. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  354. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  355. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  356. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  357. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  358. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  359. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  360. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  361. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  362. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  363. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  364. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  365. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  366. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  367. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  368. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  369. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  370. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  371. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  372. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  373. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  374. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  375. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  376. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  377. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  378. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  379. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  380. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  381. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  382. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  383. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  384. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  385. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  386. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  387. package/src/components/dnd/moveBlock.ts +0 -379
  388. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  389. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  390. package/src/runjs-context/index.ts +0 -20
  391. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  392. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  393. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  394. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  395. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  396. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  397. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  398. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  399. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  400. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  401. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  402. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  403. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  404. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  405. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  406. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  407. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  408. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  409. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  410. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  411. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  412. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  413. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  414. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  415. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  416. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  417. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  418. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -0,0 +1,659 @@
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 { uid } from '@formily/shared';
11
+ import _ from 'lodash';
12
+
13
+ /** 栅格系统常量 */
14
+ export const DEFAULT_GRID_COLUMNS = 24;
15
+
16
+ /** 最小 slot 厚度 */
17
+ export const MIN_SLOT_THICKNESS = 16;
18
+ /** 最大 slot 厚度 */
19
+ export const MAX_SLOT_THICKNESS = 48;
20
+
21
+ /** 列边缘最小宽度 */
22
+ export const COLUMN_EDGE_MIN_WIDTH = 12;
23
+ /** 列边缘最大宽度 */
24
+ export const COLUMN_EDGE_MAX_WIDTH = 28;
25
+ /** 列边缘宽度占列宽的比例(原来是 1/5) */
26
+ export const COLUMN_EDGE_WIDTH_RATIO = 0.2;
27
+
28
+ /** 插入区域厚度比例常量 */
29
+ const COLUMN_INSERT_THICKNESS_RATIO = 0.5; // 元素高度的 1/2
30
+
31
+ /** 行间隙高度比例常量 */
32
+ const ROW_GAP_HEIGHT_RATIO = 0.33; // 行高的 1/3
33
+
34
+ export interface Rect {
35
+ top: number;
36
+ left: number;
37
+ width: number;
38
+ height: number;
39
+ }
40
+
41
+ export interface Point {
42
+ x: number;
43
+ y: number;
44
+ }
45
+
46
+ export interface GridLayoutData {
47
+ rows: Record<string, string[][]>;
48
+ sizes: Record<string, number[]>;
49
+ }
50
+
51
+ export interface ColumnSlot {
52
+ type: 'column';
53
+ rowId: string;
54
+ columnIndex: number;
55
+ insertIndex: number;
56
+ position: 'before' | 'after';
57
+ rect: Rect;
58
+ }
59
+
60
+ export interface ColumnEdgeSlot {
61
+ type: 'column-edge';
62
+ rowId: string;
63
+ columnIndex: number;
64
+ direction: 'left' | 'right';
65
+ rect: Rect;
66
+ }
67
+
68
+ export interface RowGapSlot {
69
+ type: 'row-gap';
70
+ targetRowId: string;
71
+ position: 'above' | 'below';
72
+ rect: Rect;
73
+ }
74
+
75
+ export interface EmptyRowSlot {
76
+ type: 'empty-row';
77
+ rect: Rect;
78
+ }
79
+
80
+ export interface EmptyColumnSlot {
81
+ type: 'empty-column';
82
+ rowId: string;
83
+ columnIndex: number;
84
+ rect: Rect;
85
+ }
86
+
87
+ export type LayoutSlot = ColumnSlot | ColumnEdgeSlot | RowGapSlot | EmptyRowSlot | EmptyColumnSlot;
88
+
89
+ /**
90
+ * 列内插入的配置
91
+ */
92
+ export interface ColumnInsertConfig {
93
+ /** 高亮区域的高度(像素) */
94
+ height?: number;
95
+ /** 垂直偏移(像素),正数向下,负数向上 */
96
+ offsetTop?: number;
97
+ }
98
+
99
+ /**
100
+ * 列边缘的配置
101
+ */
102
+ export interface ColumnEdgeConfig {
103
+ /** 高亮区域的宽度(像素) */
104
+ width?: number;
105
+ /** 水平偏移(像素),正数向右,负数向左 */
106
+ offsetLeft?: number;
107
+ }
108
+
109
+ /**
110
+ * 行间隙的配置
111
+ */
112
+ export interface RowGapConfig {
113
+ /** 高亮区域的高度(像素) */
114
+ height?: number;
115
+ /** 垂直偏移(像素),正数向下,负数向上 */
116
+ offsetTop?: number;
117
+ }
118
+
119
+ /**
120
+ * 拖拽高亮区域的全局配置
121
+ */
122
+ export interface DragOverlayConfig {
123
+ /** 列内插入(before 表示在区块上方插入,after 表示在区块下方插入) */
124
+ columnInsert?: {
125
+ before?: ColumnInsertConfig;
126
+ after?: ColumnInsertConfig;
127
+ };
128
+ /** 列边缘(left 表示在左侧新建列,right 表示在右侧新建列) */
129
+ columnEdge?: {
130
+ left?: ColumnEdgeConfig;
131
+ right?: ColumnEdgeConfig;
132
+ };
133
+ /** 行间隙(above 表示在行上方插入,below 表示在行下方插入) */
134
+ rowGap?: {
135
+ above?: RowGapConfig;
136
+ below?: RowGapConfig;
137
+ };
138
+ }
139
+
140
+ export interface LayoutSnapshot {
141
+ slots: LayoutSlot[];
142
+ containerRect: Rect;
143
+ }
144
+
145
+ export interface BuildLayoutSnapshotOptions {
146
+ container: HTMLElement | null;
147
+ }
148
+
149
+ const toRect = (domRect: DOMRect): Rect => ({
150
+ top: domRect.top,
151
+ left: domRect.left,
152
+ width: domRect.width,
153
+ height: domRect.height,
154
+ });
155
+
156
+ const clampSlotHeight = (value: number) => Math.max(MIN_SLOT_THICKNESS, Math.min(MAX_SLOT_THICKNESS, value));
157
+
158
+ const createRect = ({ top, left, width, height }: Rect): Rect => ({
159
+ top,
160
+ left,
161
+ width,
162
+ height,
163
+ });
164
+
165
+ const offsetRect = (rect: Rect, offsets: Partial<Rect>): Rect => ({
166
+ top: offsets.top ?? rect.top,
167
+ left: offsets.left ?? rect.left,
168
+ width: offsets.width ?? rect.width,
169
+ height: offsets.height ?? rect.height,
170
+ });
171
+
172
+ const createRowGapRect = (source: Rect, position: 'above' | 'below', containerRect: Rect): Rect => {
173
+ const baseHeight = clampSlotHeight(source.height * ROW_GAP_HEIGHT_RATIO);
174
+ if (position === 'above') {
175
+ const available = source.top - containerRect.top;
176
+ const height = clampSlotHeight(Math.max(baseHeight, available));
177
+ return createRect({
178
+ top: source.top - height,
179
+ left: containerRect.left,
180
+ width: containerRect.width,
181
+ height,
182
+ });
183
+ }
184
+
185
+ const available = containerRect.top + containerRect.height - (source.top + source.height);
186
+ const height = clampSlotHeight(Math.max(baseHeight, available));
187
+ return createRect({
188
+ top: source.top + source.height,
189
+ left: containerRect.left,
190
+ width: containerRect.width,
191
+ height,
192
+ });
193
+ };
194
+
195
+ const createColumnEdgeRect = (source: Rect, side: 'left' | 'right'): Rect => {
196
+ const width = Math.min(
197
+ Math.max(COLUMN_EDGE_MIN_WIDTH, source.width * COLUMN_EDGE_WIDTH_RATIO),
198
+ COLUMN_EDGE_MAX_WIDTH,
199
+ );
200
+ return createRect({
201
+ top: source.top,
202
+ left: side === 'left' ? source.left : source.left + source.width - width,
203
+ width,
204
+ height: source.height,
205
+ });
206
+ };
207
+
208
+ const createColumnInsertRect = (itemRect: Rect, position: 'before' | 'after'): Rect => {
209
+ const thickness = clampSlotHeight(itemRect.height * COLUMN_INSERT_THICKNESS_RATIO);
210
+ if (position === 'before') {
211
+ return createRect({
212
+ top: itemRect.top,
213
+ left: itemRect.left,
214
+ width: itemRect.width,
215
+ height: thickness,
216
+ });
217
+ }
218
+ return createRect({
219
+ top: itemRect.top + itemRect.height - thickness,
220
+ left: itemRect.left,
221
+ width: itemRect.width,
222
+ height: thickness,
223
+ });
224
+ };
225
+
226
+ const expandColumnRect = (columnRect: Rect): Rect => ({
227
+ top: columnRect.top,
228
+ left: columnRect.left,
229
+ width: columnRect.width,
230
+ height: Math.max(columnRect.height, MIN_SLOT_THICKNESS),
231
+ });
232
+
233
+ export const buildLayoutSnapshot = ({ container }: BuildLayoutSnapshotOptions): LayoutSnapshot => {
234
+ if (!container) {
235
+ return {
236
+ slots: [],
237
+ containerRect: { top: 0, left: 0, width: 0, height: 0 },
238
+ };
239
+ }
240
+
241
+ const containerRect = toRect(container.getBoundingClientRect());
242
+ const slots: LayoutSlot[] = [];
243
+
244
+ // 获取所有行元素,但只保留直接属于当前容器的(不在子 Grid 中的)
245
+ const allRowElements = Array.from(container.querySelectorAll('[data-grid-row-id]'));
246
+ const rowElements = allRowElements.filter((el) => {
247
+ const htmlEl = el as HTMLElement;
248
+ // 查找该元素最近的带 data-grid-row-id 的祖先容器
249
+ let parent = htmlEl.parentElement;
250
+ while (parent && parent !== container) {
251
+ if (parent.hasAttribute('data-grid-row-id')) {
252
+ // 说明这个元素在另一个 Grid 行内,是嵌套的
253
+ return false;
254
+ }
255
+ parent = parent.parentElement;
256
+ }
257
+ // 如果遍历到 container 都没遇到其他 grid-row,说明是直接子元素
258
+ return true;
259
+ }) as HTMLElement[];
260
+
261
+ if (rowElements.length === 0) {
262
+ slots.push({
263
+ type: 'empty-row',
264
+ rect: createRect({
265
+ top: containerRect.top,
266
+ left: containerRect.left,
267
+ width: containerRect.width,
268
+ height: Math.max(containerRect.height, MIN_SLOT_THICKNESS),
269
+ }),
270
+ });
271
+ return { slots, containerRect };
272
+ }
273
+
274
+ rowElements.forEach((rowElement, rowIndex) => {
275
+ const rowId = rowElement.dataset.gridRowId;
276
+ if (!rowId) {
277
+ return;
278
+ }
279
+ const rowRect = toRect(rowElement.getBoundingClientRect());
280
+
281
+ if (rowIndex === 0) {
282
+ slots.push({
283
+ type: 'row-gap',
284
+ targetRowId: rowId,
285
+ position: 'above',
286
+ rect: createRowGapRect(rowRect, 'above', containerRect),
287
+ });
288
+ }
289
+
290
+ const columnElements = Array.from(
291
+ container.querySelectorAll(`[data-grid-column-row-id="${rowId}"][data-grid-column-index]`),
292
+ ) as HTMLElement[];
293
+
294
+ const sortedColumns = columnElements.sort((a, b) => {
295
+ const indexA = Number(a.dataset.gridColumnIndex || 0);
296
+ const indexB = Number(b.dataset.gridColumnIndex || 0);
297
+ return indexA - indexB;
298
+ });
299
+
300
+ sortedColumns.forEach((columnElement) => {
301
+ const columnIndex = Number(columnElement.dataset.gridColumnIndex || 0);
302
+ const columnRect = toRect(columnElement.getBoundingClientRect());
303
+
304
+ slots.push({
305
+ type: 'column-edge',
306
+ rowId,
307
+ columnIndex,
308
+ direction: 'left',
309
+ rect: createColumnEdgeRect(columnRect, 'left'),
310
+ });
311
+
312
+ slots.push({
313
+ type: 'column-edge',
314
+ rowId,
315
+ columnIndex,
316
+ direction: 'right',
317
+ rect: createColumnEdgeRect(columnRect, 'right'),
318
+ });
319
+
320
+ const itemElements = Array.from(
321
+ columnElement.querySelectorAll(`[data-grid-item-row-id="${rowId}"][data-grid-column-index="${columnIndex}"]`),
322
+ ) as HTMLElement[];
323
+
324
+ const sortedItems = itemElements.sort((a, b) => {
325
+ const indexA = Number(a.dataset.gridItemIndex || 0);
326
+ const indexB = Number(b.dataset.gridItemIndex || 0);
327
+ return indexA - indexB;
328
+ });
329
+
330
+ if (sortedItems.length === 0) {
331
+ slots.push({
332
+ type: 'empty-column',
333
+ rowId,
334
+ columnIndex,
335
+ rect: expandColumnRect(columnRect),
336
+ });
337
+ return;
338
+ }
339
+
340
+ const firstItemRect = toRect(sortedItems[0].getBoundingClientRect());
341
+ slots.push({
342
+ type: 'column',
343
+ rowId,
344
+ columnIndex,
345
+ insertIndex: 0,
346
+ position: 'before',
347
+ rect: createColumnInsertRect(firstItemRect, 'before'),
348
+ });
349
+
350
+ sortedItems.forEach((itemElement, itemIndex) => {
351
+ const itemRect = toRect(itemElement.getBoundingClientRect());
352
+ slots.push({
353
+ type: 'column',
354
+ rowId,
355
+ columnIndex,
356
+ insertIndex: itemIndex + 1,
357
+ position: 'after',
358
+ rect: createColumnInsertRect(itemRect, 'after'),
359
+ });
360
+ });
361
+ });
362
+
363
+ slots.push({
364
+ type: 'row-gap',
365
+ targetRowId: rowId,
366
+ position: 'below',
367
+ rect: createRowGapRect(rowRect, 'below', containerRect),
368
+ });
369
+ });
370
+
371
+ return {
372
+ slots,
373
+ containerRect,
374
+ };
375
+ };
376
+
377
+ export const getSlotKey = (slot: LayoutSlot): string => {
378
+ switch (slot.type) {
379
+ case 'column':
380
+ return `${slot.type}:${slot.rowId}:${slot.columnIndex}:${slot.insertIndex}:${slot.position}`;
381
+ case 'column-edge':
382
+ return `${slot.type}:${slot.rowId}:${slot.columnIndex}:${slot.direction}`;
383
+ case 'row-gap':
384
+ return `${slot.type}:${slot.targetRowId}:${slot.position}`;
385
+ case 'empty-row':
386
+ return `${slot.type}`;
387
+ case 'empty-column':
388
+ return `${slot.type}:${slot.rowId}:${slot.columnIndex}`;
389
+ }
390
+ };
391
+
392
+ const isPointInsideRect = (point: Point, rect: Rect): boolean => {
393
+ return (
394
+ point.x >= rect.left &&
395
+ point.x <= rect.left + rect.width &&
396
+ point.y >= rect.top &&
397
+ point.y <= rect.top + rect.height
398
+ );
399
+ };
400
+
401
+ const distanceToRect = (point: Point, rect: Rect): number => {
402
+ const dx = Math.max(rect.left - point.x, 0, point.x - (rect.left + rect.width));
403
+ const dy = Math.max(rect.top - point.y, 0, point.y - (rect.top + rect.height));
404
+ return Math.sqrt(dx * dx + dy * dy);
405
+ };
406
+
407
+ export const resolveDropIntent = (point: Point, slots: LayoutSlot[]): LayoutSlot | null => {
408
+ if (!slots.length) {
409
+ return null;
410
+ }
411
+
412
+ const insideSlot = slots.find((slot) => isPointInsideRect(point, slot.rect));
413
+ if (insideSlot) {
414
+ return insideSlot;
415
+ }
416
+
417
+ let closest: LayoutSlot | null = null;
418
+ let minDistance = Number.POSITIVE_INFINITY;
419
+ slots.forEach((slot) => {
420
+ const distance = distanceToRect(point, slot.rect);
421
+ if (distance < minDistance) {
422
+ minDistance = distance;
423
+ closest = slot;
424
+ }
425
+ });
426
+
427
+ return closest;
428
+ };
429
+
430
+ const findUidPosition = (rows: Record<string, string[][]>, uidValue: string) => {
431
+ for (const [rowId, columns] of Object.entries(rows)) {
432
+ for (let columnIndex = 0; columnIndex < columns.length; columnIndex += 1) {
433
+ const column = columns[columnIndex];
434
+ const itemIndex = column.indexOf(uidValue);
435
+ if (itemIndex !== -1) {
436
+ return { rowId, columnIndex, itemIndex };
437
+ }
438
+ }
439
+ }
440
+ return null;
441
+ };
442
+
443
+ const removeItemFromLayout = (layout: GridLayoutData, uidValue: string) => {
444
+ const position = findUidPosition(layout.rows, uidValue);
445
+ if (!position) {
446
+ return;
447
+ }
448
+
449
+ const { rowId, columnIndex, itemIndex } = position;
450
+ const columns = layout.rows[rowId];
451
+ const column = columns?.[columnIndex];
452
+ if (!column) {
453
+ return;
454
+ }
455
+
456
+ column.splice(itemIndex, 1);
457
+
458
+ if (column.length === 0) {
459
+ columns.splice(columnIndex, 1);
460
+ if (layout.sizes[rowId]) {
461
+ layout.sizes[rowId].splice(columnIndex, 1);
462
+ }
463
+ }
464
+
465
+ if (columns.length === 0) {
466
+ delete layout.rows[rowId];
467
+ delete layout.sizes[rowId];
468
+ return;
469
+ }
470
+
471
+ normalizeRowSizes(rowId, layout);
472
+ };
473
+
474
+ const toIntSizes = (weights: number[], count: number): number[] => {
475
+ if (count === 0) {
476
+ return [];
477
+ }
478
+
479
+ const normalizedWeights = weights.map((weight) => (Number.isFinite(weight) && weight > 0 ? weight : 1));
480
+ const total = normalizedWeights.reduce((sum, weight) => sum + weight, 0) || count;
481
+ const ratios = normalizedWeights.map((weight) => weight / total);
482
+ const raw = ratios.map((ratio) => ratio * DEFAULT_GRID_COLUMNS);
483
+ const floors = raw.map((value) => Math.max(1, Math.floor(value)));
484
+ let remainder = DEFAULT_GRID_COLUMNS - floors.reduce((sum, value) => sum + value, 0);
485
+
486
+ if (remainder > 0) {
487
+ const decimals = raw
488
+ .map((value, index) => ({ index, decimal: value - Math.floor(value) }))
489
+ .sort((a, b) => b.decimal - a.decimal);
490
+ let pointer = 0;
491
+ while (remainder > 0 && decimals.length) {
492
+ const target = decimals[pointer % decimals.length].index;
493
+ floors[target] += 1;
494
+ remainder -= 1;
495
+ pointer += 1;
496
+ }
497
+ } else if (remainder < 0) {
498
+ const decimals = raw
499
+ .map((value, index) => ({ index, decimal: value - Math.floor(value) }))
500
+ .sort((a, b) => a.decimal - b.decimal);
501
+ let pointer = 0;
502
+ while (remainder < 0 && decimals.length) {
503
+ const target = decimals[pointer % decimals.length].index;
504
+ if (floors[target] > 1) {
505
+ floors[target] -= 1;
506
+ remainder += 1;
507
+ }
508
+ pointer += 1;
509
+ }
510
+ }
511
+
512
+ const diff = DEFAULT_GRID_COLUMNS - floors.reduce((sum, value) => sum + value, 0);
513
+ if (diff !== 0 && floors.length) {
514
+ floors[floors.length - 1] += diff;
515
+ }
516
+
517
+ return floors;
518
+ };
519
+
520
+ const normalizeRowSizes = (rowId: string, layout: GridLayoutData) => {
521
+ const columns = layout.rows[rowId];
522
+ if (!columns || columns.length === 0) {
523
+ delete layout.sizes[rowId];
524
+ return;
525
+ }
526
+
527
+ const current = layout.sizes[rowId] || new Array(columns.length).fill(DEFAULT_GRID_COLUMNS / columns.length);
528
+ const weights =
529
+ current.length === columns.length ? current : new Array(columns.length).fill(DEFAULT_GRID_COLUMNS / columns.length);
530
+ layout.sizes[rowId] = toIntSizes(weights, columns.length);
531
+ };
532
+
533
+ const insertRow = (
534
+ rows: Record<string, string[][]>,
535
+ referenceRowId: string,
536
+ newRowId: string,
537
+ position: 'before' | 'after',
538
+ value: string[][],
539
+ ): Record<string, string[][]> => {
540
+ const entries = Object.entries(rows);
541
+ const result: Record<string, string[][]> = {};
542
+ let inserted = false;
543
+ entries.forEach(([rowId, rowValue]) => {
544
+ if (!inserted && position === 'before' && rowId === referenceRowId) {
545
+ result[newRowId] = value;
546
+ inserted = true;
547
+ }
548
+ result[rowId] = rowValue;
549
+ if (!inserted && position === 'after' && rowId === referenceRowId) {
550
+ result[newRowId] = value;
551
+ inserted = true;
552
+ }
553
+ });
554
+
555
+ if (!inserted) {
556
+ result[newRowId] = value;
557
+ }
558
+
559
+ return result;
560
+ };
561
+
562
+ const distributeSizesWithNewColumn = (
563
+ sizes: number[] | undefined,
564
+ insertIndex: number,
565
+ columnCount: number,
566
+ ): number[] => {
567
+ if (!sizes || sizes.length === 0) {
568
+ return toIntSizes(new Array(columnCount).fill(1), columnCount);
569
+ }
570
+
571
+ const normalized = sizes.map((size) => (Number.isFinite(size) && size > 0 ? size : 1));
572
+ const referenceIndex = Math.max(0, Math.min(insertIndex, normalized.length - 1));
573
+ const reference = normalized[referenceIndex] ?? 1;
574
+ const weights = [...normalized];
575
+ weights.splice(insertIndex, 0, reference);
576
+ return toIntSizes(weights, columnCount);
577
+ };
578
+
579
+ export interface SimulateLayoutOptions {
580
+ slot: LayoutSlot;
581
+ sourceUid: string;
582
+ layout: GridLayoutData;
583
+ generateRowId?: () => string;
584
+ }
585
+
586
+ export const simulateLayoutForSlot = ({
587
+ slot,
588
+ sourceUid,
589
+ layout,
590
+ generateRowId,
591
+ }: SimulateLayoutOptions): GridLayoutData => {
592
+ const cloned: GridLayoutData = {
593
+ rows: _.cloneDeep(layout.rows),
594
+ sizes: _.cloneDeep(layout.sizes),
595
+ };
596
+
597
+ removeItemFromLayout(cloned, sourceUid);
598
+
599
+ const createRowId = generateRowId ?? uid;
600
+
601
+ switch (slot.type) {
602
+ case 'column': {
603
+ const columns = cloned.rows[slot.rowId] || [];
604
+ if (!cloned.rows[slot.rowId]) {
605
+ cloned.rows[slot.rowId] = columns;
606
+ }
607
+ if (!columns[slot.columnIndex]) {
608
+ columns[slot.columnIndex] = [];
609
+ }
610
+ const targetColumn = columns[slot.columnIndex];
611
+ targetColumn.splice(slot.insertIndex, 0, sourceUid);
612
+ normalizeRowSizes(slot.rowId, cloned);
613
+ break;
614
+ }
615
+ case 'empty-column': {
616
+ const columns = cloned.rows[slot.rowId] || [];
617
+ if (!cloned.rows[slot.rowId]) {
618
+ cloned.rows[slot.rowId] = columns;
619
+ }
620
+ if (!columns[slot.columnIndex]) {
621
+ columns[slot.columnIndex] = [];
622
+ }
623
+ columns[slot.columnIndex] = [sourceUid];
624
+ normalizeRowSizes(slot.rowId, cloned);
625
+ break;
626
+ }
627
+ case 'column-edge': {
628
+ const columns = cloned.rows[slot.rowId] || [];
629
+ if (!cloned.rows[slot.rowId]) {
630
+ cloned.rows[slot.rowId] = columns;
631
+ }
632
+ const insertIndex = slot.direction === 'left' ? slot.columnIndex : slot.columnIndex + 1;
633
+ columns.splice(insertIndex, 0, [sourceUid]);
634
+ cloned.sizes[slot.rowId] = distributeSizesWithNewColumn(cloned.sizes[slot.rowId], insertIndex, columns.length);
635
+ normalizeRowSizes(slot.rowId, cloned);
636
+ break;
637
+ }
638
+ case 'row-gap': {
639
+ const newRowId = createRowId();
640
+ const rowPosition: 'before' | 'after' = slot.position === 'above' ? 'before' : 'after';
641
+ cloned.rows = insertRow(cloned.rows, slot.targetRowId, newRowId, rowPosition, [[sourceUid]]);
642
+ cloned.sizes[newRowId] = [DEFAULT_GRID_COLUMNS];
643
+ break;
644
+ }
645
+ case 'empty-row': {
646
+ const newRowId = createRowId();
647
+ cloned.rows = {
648
+ ...cloned.rows,
649
+ [newRowId]: [[sourceUid]],
650
+ };
651
+ cloned.sizes[newRowId] = [DEFAULT_GRID_COLUMNS];
652
+ break;
653
+ }
654
+ default:
655
+ break;
656
+ }
657
+
658
+ return cloned;
659
+ };
@@ -15,8 +15,8 @@ import { FlowModel } from '../../models';
15
15
  import { useFlowEngine } from '../../provider';
16
16
  import { PersistOptions } from '../../types';
17
17
 
18
- export * from './getMousePositionOnElement';
19
- export * from './moveBlock';
18
+ export * from './findModelUidPosition';
19
+ export * from './gridDragPlanner';
20
20
 
21
21
  export const EMPTY_COLUMN_UID = 'EMPTY_COLUMN';
22
22
 
@@ -25,7 +25,7 @@ export const DragHandler: FC<{ model: FlowModel; children: React.ReactNode }> =
25
25
  model,
26
26
  children = <DragOutlined />,
27
27
  }) => {
28
- const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id: model.uid });
28
+ const { attributes, listeners, setNodeRef } = useDraggable({ id: model.uid });
29
29
  return (
30
30
  <span
31
31
  ref={setNodeRef}
@@ -132,7 +132,7 @@ const FlowsDropdownButtonWithModel: React.FC<ModelProvidedProps> = observer(
132
132
  // 如果step使用了action,也获取action的uiSchema
133
133
  let actionUiSchema = {};
134
134
  if (actionStep.use) {
135
- const action = model.flowEngine?.getAction?.(actionStep.use);
135
+ const action = model.getAction?.(actionStep.use);
136
136
  if (action && action.uiSchema) {
137
137
  actionUiSchema = action.uiSchema;
138
138
  }