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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +91 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +6 -4
  6. package/lib/JSRunner.d.ts +6 -0
  7. package/lib/JSRunner.js +27 -1
  8. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  9. package/lib/ViewScopedFlowEngine.js +18 -1
  10. package/lib/acl/Acl.d.ts +12 -12
  11. package/lib/acl/Acl.js +88 -30
  12. package/lib/components/DynamicFlowsEditor.js +2 -4
  13. package/lib/components/FieldModelRenderer.js +17 -9
  14. package/lib/components/FieldSkeleton.d.ts +10 -0
  15. package/lib/components/FieldSkeleton.js +64 -0
  16. package/lib/components/FlowContextSelector.js +19 -3
  17. package/lib/components/FlowModelRenderer.d.ts +4 -6
  18. package/lib/components/FlowModelRenderer.js +35 -53
  19. package/lib/components/FormItem.js +5 -1
  20. package/lib/components/MobilePopup.d.ts +20 -0
  21. package/lib/components/MobilePopup.js +102 -0
  22. package/lib/components/MobilePopup.style.d.ts +17 -0
  23. package/lib/components/MobilePopup.style.js +186 -0
  24. package/lib/components/common/withFlowDesignMode.d.ts +1 -1
  25. package/lib/components/common/withFlowDesignMode.js +5 -5
  26. package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
  27. package/lib/components/dnd/gridDragPlanner.js +53 -1
  28. package/lib/components/index.d.ts +1 -0
  29. package/lib/components/index.js +3 -1
  30. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
  31. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
  32. package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
  33. package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
  34. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
  35. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
  36. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
  37. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  38. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
  39. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
  40. package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
  41. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
  42. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
  43. package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
  44. package/lib/components/subModel/AddSubModelButton.js +78 -8
  45. package/lib/components/subModel/LazyDropdown.js +14 -15
  46. package/lib/components/subModel/utils.d.ts +1 -1
  47. package/lib/components/subModel/utils.js +21 -11
  48. package/lib/components/variables/VariableInput.js +26 -6
  49. package/lib/components/variables/VariableTag.js +43 -2
  50. package/lib/components/variables/types.d.ts +2 -0
  51. package/lib/components/variables/utils.js +4 -2
  52. package/lib/data-source/index.d.ts +23 -4
  53. package/lib/data-source/index.js +135 -14
  54. package/lib/data-source/jioToJoiSchema.js +1 -0
  55. package/lib/emitter.d.ts +6 -0
  56. package/lib/emitter.js +12 -0
  57. package/lib/executor/FlowExecutor.d.ts +6 -6
  58. package/lib/executor/FlowExecutor.js +302 -99
  59. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  60. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  61. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  62. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  63. package/lib/flowContext.d.ts +105 -6
  64. package/lib/flowContext.js +447 -139
  65. package/lib/flowEngine.d.ts +71 -1
  66. package/lib/flowEngine.js +319 -16
  67. package/lib/flowSettings.d.ts +4 -3
  68. package/lib/flowSettings.js +45 -21
  69. package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
  70. package/lib/hooks/useApplyAutoFlows.js +3 -2
  71. package/lib/index.d.ts +14 -3
  72. package/lib/index.js +54 -7
  73. package/lib/locale/de-DE.json +62 -0
  74. package/lib/locale/en-US.json +57 -45
  75. package/lib/locale/es-ES.json +62 -0
  76. package/lib/locale/fr-FR.json +62 -0
  77. package/lib/locale/hu-HU.json +62 -0
  78. package/lib/locale/id-ID.json +62 -0
  79. package/lib/locale/index.d.ts +114 -90
  80. package/lib/locale/it-IT.json +62 -0
  81. package/lib/locale/ja-JP.json +62 -0
  82. package/lib/locale/ko-KR.json +62 -0
  83. package/lib/locale/nl-NL.json +62 -0
  84. package/lib/locale/pt-BR.json +62 -0
  85. package/lib/locale/ru-RU.json +62 -0
  86. package/lib/locale/tr-TR.json +62 -0
  87. package/lib/locale/uk-UA.json +62 -0
  88. package/lib/locale/vi-VN.json +62 -0
  89. package/lib/locale/zh-CN.json +58 -46
  90. package/lib/locale/zh-TW.json +62 -0
  91. package/lib/models/CollectionFieldModel.d.ts +7 -2
  92. package/lib/models/CollectionFieldModel.js +63 -16
  93. package/lib/models/flowModel.d.ts +76 -32
  94. package/lib/models/flowModel.js +300 -112
  95. package/lib/models/forkFlowModel.d.ts +8 -4
  96. package/lib/models/forkFlowModel.js +38 -8
  97. package/lib/provider.d.ts +3 -1
  98. package/lib/provider.js +14 -11
  99. package/lib/reactive/index.d.ts +10 -0
  100. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
  101. package/lib/reactive/observer.d.ts +19 -0
  102. package/lib/reactive/observer.js +109 -0
  103. package/lib/resources/baseRecordResource.d.ts +6 -0
  104. package/lib/resources/baseRecordResource.js +38 -3
  105. package/lib/resources/multiRecordResource.d.ts +5 -2
  106. package/lib/resources/multiRecordResource.js +26 -10
  107. package/lib/resources/singleRecordResource.js +8 -3
  108. package/lib/resources/sqlResource.d.ts +5 -3
  109. package/lib/resources/sqlResource.js +30 -28
  110. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  111. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
  112. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  113. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  114. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  115. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  116. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  117. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  118. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  119. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  120. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  121. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  122. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  123. package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
  124. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  125. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  126. package/lib/runjs-context/contexts/base.d.ts +9 -0
  127. package/lib/runjs-context/contexts/base.js +879 -0
  128. package/lib/runjs-context/contributions.d.ts +33 -0
  129. package/lib/runjs-context/contributions.js +88 -0
  130. package/lib/runjs-context/helpers.d.ts +5 -2
  131. package/lib/runjs-context/helpers.js +36 -27
  132. package/lib/runjs-context/registry.d.ts +7 -4
  133. package/lib/runjs-context/registry.js +10 -42
  134. package/lib/runjs-context/setup.d.ts +9 -0
  135. package/lib/runjs-context/setup.js +88 -0
  136. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  137. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  138. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  139. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  140. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  141. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  142. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  143. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  144. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  145. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  146. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  148. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  149. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  150. package/lib/runjs-context/snippets/index.d.ts +24 -3
  151. package/lib/runjs-context/snippets/index.js +183 -40
  152. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  154. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  158. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  159. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  161. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  163. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  165. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  167. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  169. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  170. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  171. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  172. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  173. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  174. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  175. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  176. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  177. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  178. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  179. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  180. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  181. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  182. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  183. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  184. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  185. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  186. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  187. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  188. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  189. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  190. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  191. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  192. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  193. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  194. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  195. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  196. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  197. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  198. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  199. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  200. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  201. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  202. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  203. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  204. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  205. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  206. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  207. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  208. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  209. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  210. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  211. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  212. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  213. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  214. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  215. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  216. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  217. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  218. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  219. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  220. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  221. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  222. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  223. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  224. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  225. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  227. package/lib/runjs-context/snippets/types.d.ts +9 -1
  228. package/lib/runjsLibs.d.ts +28 -0
  229. package/lib/runjsLibs.js +532 -0
  230. package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
  231. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  232. package/lib/types.d.ts +66 -7
  233. package/lib/types.js +4 -3
  234. package/lib/utils/associationObjectVariable.d.ts +32 -0
  235. package/lib/utils/associationObjectVariable.js +157 -0
  236. package/lib/utils/createCollectionContextMeta.d.ts +1 -1
  237. package/lib/utils/createCollectionContextMeta.js +9 -4
  238. package/lib/utils/createEphemeralContext.d.ts +13 -0
  239. package/lib/utils/createEphemeralContext.js +140 -0
  240. package/lib/utils/flows.d.ts +10 -0
  241. package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
  242. package/lib/utils/index.d.ts +9 -3
  243. package/lib/utils/index.js +30 -2
  244. package/lib/utils/jsxTransform.d.ts +15 -0
  245. package/lib/utils/jsxTransform.js +68 -0
  246. package/lib/utils/params-resolvers.js +19 -12
  247. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  248. package/lib/utils/parsePathnameToViewParams.js +41 -5
  249. package/lib/utils/pruneFilter.d.ts +21 -0
  250. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  251. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  252. package/lib/utils/resolveModuleUrl.js +65 -0
  253. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  254. package/lib/utils/runjsModuleLoader.js +422 -0
  255. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  256. package/lib/utils/runjsTemplateCompat.js +743 -0
  257. package/lib/utils/safeGlobals.d.ts +6 -8
  258. package/lib/utils/safeGlobals.js +169 -14
  259. package/lib/utils/schema-utils.d.ts +6 -0
  260. package/lib/utils/schema-utils.js +71 -6
  261. package/lib/utils/serverContextParams.d.ts +4 -0
  262. package/lib/utils/serverContextParams.js +2 -0
  263. package/lib/utils/translation.d.ts +4 -1
  264. package/lib/utils/translation.js +6 -2
  265. package/lib/utils/variablesParams.d.ts +22 -5
  266. package/lib/utils/variablesParams.js +141 -61
  267. package/lib/views/DialogComponent.js +1 -5
  268. package/lib/views/DrawerComponent.js +18 -9
  269. package/lib/views/PageComponent.js +5 -5
  270. package/lib/views/ViewNavigation.d.ts +11 -15
  271. package/lib/views/ViewNavigation.js +37 -19
  272. package/lib/views/createViewMeta.d.ts +27 -5
  273. package/lib/views/createViewMeta.js +338 -72
  274. package/lib/views/index.d.ts +1 -1
  275. package/lib/views/index.js +4 -0
  276. package/lib/views/useDialog.d.ts +10 -9
  277. package/lib/views/useDialog.js +46 -34
  278. package/lib/views/useDrawer.d.ts +10 -9
  279. package/lib/views/useDrawer.js +74 -48
  280. package/lib/views/usePage.d.ts +14 -9
  281. package/lib/views/usePage.js +82 -33
  282. package/lib/views/usePopover.js +4 -1
  283. package/lib/views/viewEvents.d.ts +17 -0
  284. package/lib/views/viewEvents.js +90 -0
  285. package/package.json +6 -3
  286. package/src/BlockScopedFlowEngine.ts +85 -0
  287. package/src/FlowContextProvider.tsx +4 -2
  288. package/src/JSRunner.ts +39 -1
  289. package/src/ViewScopedFlowEngine.ts +21 -1
  290. package/src/__tests__/JSRunner.test.ts +125 -52
  291. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  292. package/src/__tests__/createViewMeta.popup.test.ts +203 -0
  293. package/src/__tests__/flow-engine.test.ts +3 -0
  294. package/src/__tests__/flowContext.test.ts +160 -0
  295. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  296. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  297. package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
  298. package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
  299. package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
  300. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  301. package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
  302. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  303. package/src/__tests__/flowSettings.open.test.tsx +71 -15
  304. package/src/__tests__/flowSettings.test.ts +2 -0
  305. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  306. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  307. package/src/__tests__/objectVariable.test.ts +464 -0
  308. package/src/__tests__/provider.test.tsx +0 -5
  309. package/src/__tests__/runjsContext.test.ts +219 -35
  310. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  311. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  312. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  313. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  314. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  315. package/src/__tests__/runjsLocales.test.ts +39 -0
  316. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  317. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  318. package/src/__tests__/runjsSnippets.test.ts +140 -0
  319. package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
  320. package/src/acl/Acl.tsx +85 -31
  321. package/src/acl/__tests__/Acl.test.tsx +43 -1
  322. package/src/components/DynamicFlowsEditor.tsx +0 -10
  323. package/src/components/FieldModelRenderer.tsx +22 -9
  324. package/src/components/FieldSkeleton.tsx +27 -0
  325. package/src/components/FlowContextSelector.tsx +20 -2
  326. package/src/components/FlowModelRenderer.tsx +52 -84
  327. package/src/components/FormItem.tsx +8 -1
  328. package/src/components/MobilePopup.style.ts +220 -0
  329. package/src/components/MobilePopup.tsx +86 -0
  330. package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
  331. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  332. package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
  333. package/src/components/common/withFlowDesignMode.tsx +5 -5
  334. package/src/components/dnd/gridDragPlanner.ts +60 -0
  335. package/src/components/index.ts +1 -0
  336. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
  337. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
  338. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
  339. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  340. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
  341. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
  342. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
  343. package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
  344. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
  345. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
  346. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
  347. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
  348. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
  349. package/src/components/subModel/AddSubModelButton.tsx +104 -9
  350. package/src/components/subModel/LazyDropdown.tsx +14 -14
  351. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
  352. package/src/components/subModel/__tests__/utils.test.ts +12 -12
  353. package/src/components/subModel/utils.ts +25 -6
  354. package/src/components/variables/VariableInput.tsx +32 -6
  355. package/src/components/variables/VariableTag.tsx +54 -2
  356. package/src/components/variables/types.ts +2 -0
  357. package/src/components/variables/utils.ts +7 -3
  358. package/src/data-source/index.ts +143 -12
  359. package/src/data-source/jioToJoiSchema.ts +1 -0
  360. package/src/emitter.ts +14 -0
  361. package/src/executor/FlowExecutor.ts +383 -119
  362. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  363. package/src/executor/__tests__/flowExecutor.test.ts +217 -5
  364. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  365. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  366. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  367. package/src/flowContext.ts +646 -158
  368. package/src/flowEngine.ts +385 -14
  369. package/src/flowSettings.ts +59 -30
  370. package/src/hooks/useApplyAutoFlows.ts +5 -3
  371. package/src/index.ts +26 -3
  372. package/src/locale/de-DE.json +62 -0
  373. package/src/locale/en-US.json +57 -45
  374. package/src/locale/es-ES.json +62 -0
  375. package/src/locale/fr-FR.json +62 -0
  376. package/src/locale/hu-HU.json +62 -0
  377. package/src/locale/id-ID.json +62 -0
  378. package/src/locale/it-IT.json +62 -0
  379. package/src/locale/ja-JP.json +62 -0
  380. package/src/locale/ko-KR.json +62 -0
  381. package/src/locale/nl-NL.json +62 -0
  382. package/src/locale/pt-BR.json +62 -0
  383. package/src/locale/ru-RU.json +62 -0
  384. package/src/locale/tr-TR.json +62 -0
  385. package/src/locale/uk-UA.json +62 -0
  386. package/src/locale/vi-VN.json +62 -0
  387. package/src/locale/zh-CN.json +58 -46
  388. package/src/locale/zh-TW.json +62 -0
  389. package/src/models/CollectionFieldModel.tsx +82 -18
  390. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  391. package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
  392. package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
  393. package/src/models/__tests__/flowModel.clone.test.ts +416 -0
  394. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  395. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  396. package/src/models/__tests__/flowModel.test.ts +296 -119
  397. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  398. package/src/models/flowModel.tsx +426 -148
  399. package/src/models/forkFlowModel.ts +48 -8
  400. package/src/provider.tsx +18 -14
  401. package/src/reactive/__tests__/observer.test.tsx +211 -0
  402. package/src/reactive/index.ts +11 -0
  403. package/src/reactive/observer.tsx +101 -0
  404. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  405. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  406. package/src/resources/baseRecordResource.ts +46 -3
  407. package/src/resources/multiRecordResource.ts +28 -12
  408. package/src/resources/singleRecordResource.ts +9 -3
  409. package/src/resources/sqlResource.ts +33 -32
  410. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
  411. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
  412. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  413. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  414. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  415. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  416. package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
  417. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  418. package/src/runjs-context/contexts/base.ts +871 -0
  419. package/src/runjs-context/contributions.ts +88 -0
  420. package/src/runjs-context/helpers.ts +32 -30
  421. package/src/runjs-context/registry.ts +16 -47
  422. package/src/runjs-context/setup.ts +57 -0
  423. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  424. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  425. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  426. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  427. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  428. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  429. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  430. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  431. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  432. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  433. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  434. package/src/runjs-context/snippets/index.ts +212 -39
  435. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  436. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  437. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  438. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  439. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  440. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  441. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  442. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  443. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  444. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  445. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  446. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  447. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  448. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  449. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  450. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  451. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  452. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  453. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  454. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  455. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  456. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  457. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  458. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  459. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  460. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  461. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  462. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  463. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  464. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  465. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  466. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  467. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  468. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  469. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  470. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  471. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  472. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  473. package/src/runjs-context/snippets/types.ts +5 -1
  474. package/src/runjsLibs.ts +622 -0
  475. package/src/scheduler/ModelOperationScheduler.ts +306 -0
  476. package/src/types.ts +86 -5
  477. package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
  478. package/src/utils/__tests__/flows.test.ts +65 -0
  479. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  480. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  481. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  482. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  483. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  484. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  485. package/src/utils/__tests__/safeGlobals.test.ts +79 -2
  486. package/src/utils/__tests__/utils.test.ts +114 -15
  487. package/src/utils/__tests__/variablesParams.test.ts +120 -0
  488. package/src/utils/associationObjectVariable.ts +180 -0
  489. package/src/utils/createCollectionContextMeta.ts +9 -3
  490. package/src/utils/createEphemeralContext.ts +142 -0
  491. package/src/utils/flows.ts +23 -0
  492. package/src/utils/index.ts +17 -3
  493. package/src/utils/jsxTransform.ts +39 -0
  494. package/src/utils/params-resolvers.ts +25 -11
  495. package/src/utils/parsePathnameToViewParams.ts +50 -6
  496. package/src/utils/pruneFilter.ts +41 -0
  497. package/src/utils/resolveModuleUrl.ts +91 -0
  498. package/src/utils/runjsModuleLoader.ts +553 -0
  499. package/src/utils/runjsTemplateCompat.ts +828 -0
  500. package/src/utils/safeGlobals.ts +181 -15
  501. package/src/utils/schema-utils.ts +81 -3
  502. package/src/utils/serverContextParams.ts +6 -0
  503. package/src/utils/translation.ts +7 -2
  504. package/src/utils/variablesParams.ts +164 -72
  505. package/src/views/DialogComponent.tsx +1 -4
  506. package/src/views/DrawerComponent.tsx +19 -7
  507. package/src/views/PageComponent.tsx +3 -5
  508. package/src/views/ViewNavigation.ts +49 -43
  509. package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
  510. package/src/views/__tests__/ViewNavigation.test.ts +54 -34
  511. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
  512. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  513. package/src/views/createViewMeta.ts +402 -73
  514. package/src/views/index.tsx +1 -1
  515. package/src/views/useDialog.tsx +52 -31
  516. package/src/views/useDrawer.tsx +99 -55
  517. package/src/views/usePage.tsx +101 -33
  518. package/src/views/usePopover.tsx +4 -1
  519. package/src/views/viewEvents.ts +55 -0
  520. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  521. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  522. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  523. package/lib/runjs-context/index.d.ts +0 -19
  524. package/lib/runjs-context/index.js +0 -57
  525. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  526. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  527. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  528. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  529. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  530. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  531. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  532. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  533. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  534. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  535. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  536. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  537. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  538. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  539. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  540. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  541. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  542. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  543. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  544. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  545. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  546. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  547. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  548. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  549. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  550. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  551. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  552. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  553. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  554. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  555. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  556. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  557. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  558. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  559. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  560. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  561. package/src/runjs-context/index.ts +0 -20
  562. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  563. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  564. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  565. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  566. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  567. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  568. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  569. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  570. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  571. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  572. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  573. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  574. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  575. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  576. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  577. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  578. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  579. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  580. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  581. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  582. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  583. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  584. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  585. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  586. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  587. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  588. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  589. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -16,6 +16,7 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
16
16
  protected _data = observable.ref<TDataItem[]>([]);
17
17
  protected _meta = observable.ref<Record<string, any>>({});
18
18
  private refreshTimer: NodeJS.Timeout | null = null;
19
+ private refreshWaiters: Array<{ resolve: () => void; reject: (error: any) => void }> = [];
19
20
  protected createActionOptions = {};
20
21
  protected updateActionOptions = {};
21
22
  protected _refreshActionName = 'list';
@@ -110,10 +111,15 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
110
111
  }
111
112
  }
112
113
 
113
- async create(data: TDataItem, options?: AxiosRequestConfig): Promise<void> {
114
+ async create(data: TDataItem, options?: AxiosRequestConfig & { refresh?: boolean }): Promise<void> {
114
115
  const config = this.mergeRequestConfig({ data }, this.createActionOptions, options);
115
- await this.runAction('create', config);
116
- await this.refresh();
116
+ const res = await this.runAction('create', config);
117
+ this.markDataSourceDirty();
118
+ this.emit('saved', data);
119
+ if (options?.refresh !== false) {
120
+ await this.refresh();
121
+ }
122
+ return res;
117
123
  }
118
124
 
119
125
  async get(filterByTk: any): Promise<TDataItem | undefined> {
@@ -129,17 +135,20 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
129
135
  }
130
136
 
131
137
  async update(filterByTk: string | number, data: Partial<TDataItem>, options?: AxiosRequestConfig): Promise<void> {
138
+ const result = data;
132
139
  const config = this.mergeRequestConfig(
133
140
  {
134
141
  params: {
135
142
  filterByTk,
136
143
  },
137
- data,
144
+ data: result,
138
145
  },
139
146
  this.updateActionOptions,
140
147
  options,
141
148
  );
142
149
  await this.runAction('update', config);
150
+ this.markDataSourceDirty();
151
+ this.emit('saved', data);
143
152
  await this.refresh();
144
153
  }
145
154
 
@@ -152,20 +161,24 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
152
161
  }
153
162
 
154
163
  async destroy(
155
- filterByTk: string | number | string[] | number[] | TDataItem | TDataItem[],
164
+ filterByTk: string | number | string[] | number[] | TDataItem | TDataItem[] | object,
156
165
  options?: AxiosRequestConfig,
157
166
  ): Promise<void> {
158
167
  const config = this.mergeRequestConfig(
159
168
  {
160
169
  params: {
161
- filterByTk: _.castArray(filterByTk).map((item) => {
162
- return typeof item === 'object' ? item['id'] : item; // TODO: ID 字段还需要根据实际情况更改
163
- }),
170
+ filterByTk: this.jsonStringify(filterByTk),
164
171
  },
165
172
  },
166
173
  options,
167
174
  );
168
175
  await this.runAction('destroy', config);
176
+ this.markDataSourceDirty();
177
+ const currentPage = this.getPage();
178
+ const lastPage = Math.ceil((this.getCount() - _.castArray(filterByTk).length) / this.getPageSize());
179
+ if (currentPage > lastPage) {
180
+ this.setPage(lastPage || 1);
181
+ }
169
182
  await this.refresh();
170
183
  }
171
184
 
@@ -188,7 +201,11 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
188
201
 
189
202
  // 设置新的定时器,在下一个事件循环执行
190
203
  return new Promise<void>((resolve, reject) => {
204
+ this.refreshWaiters.push({ resolve, reject });
191
205
  this.refreshTimer = setTimeout(async () => {
206
+ const waiters = this.refreshWaiters;
207
+ this.refreshWaiters = [];
208
+ this.refreshTimer = null;
192
209
  try {
193
210
  this.clearError();
194
211
  this.loading = true;
@@ -204,13 +221,12 @@ export class MultiRecordResource<TDataItem = any> extends BaseRecordResource<TDa
204
221
  this.setPageSize(meta.pageSize);
205
222
  }
206
223
  this.emit('refresh');
207
- this.loading = false;
208
- resolve();
224
+ waiters.forEach((w) => w.resolve());
209
225
  } catch (error) {
210
226
  this.setError(error);
211
- reject(error instanceof Error ? error : new Error(String(error)));
227
+ const err = error instanceof Error ? error : new Error(String(error));
228
+ waiters.forEach((w) => w.reject(err));
212
229
  } finally {
213
- this.refreshTimer = null;
214
230
  this.loading = false;
215
231
  }
216
232
  });
@@ -33,31 +33,37 @@ export class SingleRecordResource<TData = any> extends BaseRecordResource<TData>
33
33
  async save(data: TData, options?: AxiosRequestConfig & { refresh?: boolean }): Promise<void> {
34
34
  const config = this.mergeRequestConfig(this.saveActionOptions, _.omit(options, ['refresh']));
35
35
  let actionName = 'create';
36
+ const result = data;
36
37
  // 如果有 filterByTk,则表示是更新操作
37
38
  if (!this.isNewRecord) {
38
39
  config.params = config.params || {};
39
40
  config.params.filterByTk = this.getFilterByTk();
40
41
  actionName = 'update';
41
42
  }
42
- await this.runAction(actionName, {
43
+ const res = await this.runAction(actionName, {
43
44
  ...config,
44
- data,
45
+ data: result,
45
46
  });
47
+ // Mark as dirty before emitting/refreshing so other views can refresh when activated.
48
+ this.markDataSourceDirty();
49
+ this.emit('saved', data);
46
50
  if (options?.refresh !== false) {
47
51
  await this.refresh();
48
52
  }
53
+ return res;
49
54
  }
50
55
 
51
56
  async destroy(options?: AxiosRequestConfig): Promise<void> {
52
57
  const config = this.mergeRequestConfig(
53
58
  {
54
59
  params: {
55
- filterByTk: this.request.params.filterByTk,
60
+ filterByTk: this.jsonStringify(this.request.params.filterByTk),
56
61
  },
57
62
  },
58
63
  options,
59
64
  );
60
65
  await this.runAction('destroy', config);
66
+ this.markDataSourceDirty();
61
67
  this.setData(null);
62
68
  }
63
69
 
@@ -11,6 +11,7 @@ import { observable } from '@formily/reactive';
11
11
  import _ from 'lodash';
12
12
  import { FlowContext, FlowEngineContext } from '../flowContext';
13
13
  import { BaseRecordResource } from './baseRecordResource';
14
+ import { parseLiquidContext, transformSQL } from '@nocobase/utils/client';
14
15
 
15
16
  type SQLRunOptions = {
16
17
  bind?: Record<string, any>;
@@ -25,25 +26,11 @@ type SQLSaveOptions = {
25
26
  dataSourceKey?: string;
26
27
  };
27
28
 
28
- function transformSQL(template: string) {
29
- let index = 1;
30
- const bind = {};
31
-
32
- const sql = template.replace(/{{\s*([^}]+)\s*}}/g, (_, expr) => {
33
- const key = `__var${index}`;
34
- bind[key] = `{{${expr.trim()}}}`;
35
- index++;
36
- return `$${key}`;
37
- });
38
-
39
- return { sql, bind };
40
- }
41
-
42
29
  export class FlowSQLRepository {
43
- protected ctx: FlowEngineContext;
30
+ protected ctx: FlowContext;
44
31
 
45
- constructor(ctx: FlowEngineContext) {
46
- this.ctx = new FlowContext() as FlowEngineContext;
32
+ constructor(ctx: FlowContext) {
33
+ this.ctx = new FlowContext();
47
34
  this.ctx.addDelegate(ctx);
48
35
  this.ctx.defineProperty('offset', {
49
36
  get: () => 0,
@@ -56,16 +43,17 @@ export class FlowSQLRepository {
56
43
  }
57
44
 
58
45
  async run(sql: string, options: SQLRunOptions = {}) {
59
- const result = transformSQL(sql);
60
- const bind = await this.ctx.resolveJsonTemplate(result.bind);
46
+ const { sql: transformedSQL, bind, liquidContext } = await transformSQL(sql);
47
+ const resolved = await this.ctx.resolveJsonTemplate({ bind, liquidContext });
48
+ const parsedSQL = await parseLiquidContext(transformedSQL, resolved.liquidContext);
61
49
  const { data } = await this.ctx.api.request({
62
50
  method: 'POST',
63
51
  url: 'flowSql:run',
64
52
  data: {
65
- sql: result.sql,
53
+ sql: parsedSQL,
66
54
  ...options,
67
55
  bind: {
68
- ...bind,
56
+ ...resolved.bind,
69
57
  ...options.bind,
70
58
  },
71
59
  },
@@ -91,7 +79,7 @@ export class FlowSQLRepository {
91
79
  uid,
92
80
  },
93
81
  });
94
- const bind = await this.ctx.resolveJsonTemplate(response.data.data || {});
82
+ const { bind, liquidContext } = await this.ctx.resolveJsonTemplate(response.data.data || {});
95
83
  const { data } = await this.ctx.api.request({
96
84
  method: 'POST',
97
85
  url: 'flowSql:runById',
@@ -100,8 +88,9 @@ export class FlowSQLRepository {
100
88
  ...options,
101
89
  bind: {
102
90
  ...bind,
103
- ...options.bind,
91
+ ...options?.bind,
104
92
  },
93
+ liquidContext,
105
94
  },
106
95
  });
107
96
  return data?.data;
@@ -121,6 +110,7 @@ export class SQLResource<TData = any> extends BaseRecordResource<TData> {
121
110
  protected _data = observable.ref<TData>(null);
122
111
  protected _meta = observable.ref<Record<string, any>>({});
123
112
  private refreshTimer: NodeJS.Timeout | null = null;
113
+ private refreshWaiters: Array<{ resolve: () => void; reject: (error: any) => void }> = [];
124
114
  private _debugEnabled = false;
125
115
  private _sql: string;
126
116
 
@@ -233,20 +223,25 @@ export class SQLResource<TData = any> extends BaseRecordResource<TData> {
233
223
  return this;
234
224
  }
235
225
 
226
+ setLiquidContext(liquidContext: Record<string, any>) {
227
+ this.request.data.liquidContext = liquidContext;
228
+ return this;
229
+ }
230
+
236
231
  async run() {
237
232
  return this._debugEnabled ? await this.runBySQL() : await this.runById();
238
233
  }
239
234
 
240
235
  async runBySQL() {
241
236
  const sql = this._sql;
242
- const result = transformSQL(sql);
243
- const bind = await this.context.resolveJsonTemplate(result.bind);
237
+ const { sql: transformedSQL, bind, liquidContext } = await transformSQL(sql);
238
+ const resolved = await this.context.resolveJsonTemplate({ bind, liquidContext });
244
239
  const options = _.cloneDeep({
245
240
  method: 'post',
246
241
  ...this.getRefreshRequestOptions(),
247
242
  });
248
- options.data.bind = bind;
249
- options.data.sql = result.sql;
243
+ options.data.sql = await parseLiquidContext(transformedSQL, resolved.liquidContext);
244
+ options.data.bind = resolved.bind;
250
245
  return await this.runAction<TData, any>('run', options);
251
246
  }
252
247
 
@@ -257,8 +252,9 @@ export class SQLResource<TData = any> extends BaseRecordResource<TData> {
257
252
  uid: this.request.data.uid,
258
253
  },
259
254
  });
260
- const bind = await this.context.resolveJsonTemplate(data);
255
+ const { bind, liquidContext } = await this.context.resolveJsonTemplate(data);
261
256
  this.setBind(bind);
257
+ this.setLiquidContext(liquidContext);
262
258
  return await this.runAction<TData, any>('runById', {
263
259
  method: 'post',
264
260
  ...this.getRefreshRequestOptions(),
@@ -277,20 +273,25 @@ export class SQLResource<TData = any> extends BaseRecordResource<TData> {
277
273
 
278
274
  // 设置新的定时器,在下一个事件循环执行
279
275
  return new Promise<void>((resolve, reject) => {
276
+ this.refreshWaiters.push({ resolve, reject });
280
277
  this.refreshTimer = setTimeout(async () => {
278
+ const waiters = this.refreshWaiters;
279
+ this.refreshWaiters = [];
280
+ this.refreshTimer = null;
281
281
  try {
282
282
  this.clearError();
283
283
  this.loading = true;
284
+ this.emit('loading');
284
285
  const { data, meta } = await this.run();
285
286
  this.setData(data).setMeta(meta);
286
- this.emit('refresh');
287
287
  this.loading = false;
288
- resolve();
288
+ this.emit('refresh');
289
+ waiters.forEach((w) => w.resolve());
289
290
  } catch (error) {
290
291
  this.setError(error);
291
- reject(error instanceof Error ? error : new Error(String(error)));
292
+ const err = error instanceof Error ? error : new Error(String(error));
293
+ waiters.forEach((w) => w.reject(err));
292
294
  } finally {
293
- this.refreshTimer = null;
294
295
  this.loading = false;
295
296
  }
296
297
  });
@@ -7,33 +7,50 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { FlowRunJSContext } from './FlowRunJSContext';
11
- import { createSafeDocument, createSafeWindow } from '../../utils';
10
+ import { FlowRunJSContext } from '../../flowContext';
12
11
 
13
- export class FormJSFieldItemRunJSContext extends FlowRunJSContext {
14
- static injectDefaultGlobals() {
15
- return { window: createSafeWindow(), document: createSafeDocument() };
16
- }
17
- constructor(delegate: any) {
18
- super(delegate);
19
- this.defineProperty('element', { get: () => (this as any)._delegate['element'] });
20
- this.defineProperty('record', { get: () => (this as any)._delegate['record'] });
21
- this.defineProperty('value', { get: () => (this as any)._delegate['value'] });
22
- }
23
- }
12
+ export class FormJSFieldItemRunJSContext extends FlowRunJSContext {}
24
13
 
25
14
  FormJSFieldItemRunJSContext.define({
26
15
  label: 'FormJSFieldItem RunJS context',
27
16
  properties: {
28
- element: 'ElementProxy,表单字段容器',
29
- value: '字段值(读/受控场景需通过 setProps 修改)',
30
- record: '当前记录(只读)',
17
+ element: `ElementProxy instance providing a safe DOM container for form field rendering.
18
+ Supports innerHTML, append, and other DOM manipulation methods.`,
19
+ value: `Current field value (read-only in display mode; in controlled scenarios, use setProps to modify).`,
20
+ record: `Current record data object (read-only).
21
+ Contains all field values of the parent record.`,
22
+ formValues: {
23
+ description: 'Snapshot of current form values (object). Available in form contexts (CreateForm/EditForm).',
24
+ detail: 'Record<string, any>',
25
+ examples: ['const { name, status } = ctx.formValues || {};'],
26
+ },
31
27
  },
32
28
  methods: {
33
- onRefReady: '容器就绪回调',
34
- setProps: '设置表单项属性:`setProps(fieldModel, { value })`(由联动/表单上下文提供)',
35
- },
36
- snipastes: {
37
- 显示字段值: { $ref: 'scene/jsfield/innerHTML-value', prefix: 'sn-form-value' },
29
+ onRefReady: `Wait for form field container DOM element to be ready before executing callback.
30
+ Parameters: (ref: React.RefObject, callback: (element: HTMLElement) => void, timeout?: number) => void`,
31
+ setProps: `Set form field properties programmatically.
32
+ Parameters: (fieldModel: any, props: { value?: any, disabled?: boolean, visible?: boolean }) => void
33
+ Example: ctx.setProps(fieldModel, { value: "new value" })`,
38
34
  },
39
35
  });
36
+
37
+ FormJSFieldItemRunJSContext.define(
38
+ {
39
+ label: '表单 JS 字段项 RunJS 上下文',
40
+ properties: {
41
+ element: 'ElementProxy,表单字段容器',
42
+ value: '字段值(展示模式为只读;受控场景用 setProps 修改)',
43
+ record: '当前记录(只读)',
44
+ formValues: {
45
+ description: '当前表单值快照(对象)。仅表单相关上下文可用(Create/Edit Form)。',
46
+ detail: 'Record<string, any>',
47
+ examples: ['const { name, status } = ctx.formValues || {};'],
48
+ },
49
+ },
50
+ methods: {
51
+ onRefReady: '容器就绪回调',
52
+ setProps: '设置表单项属性:`setProps(fieldModel, { value })`(由联动/表单上下文提供)',
53
+ },
54
+ },
55
+ { locale: 'zh-CN' },
56
+ );
@@ -7,46 +7,62 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { FlowRunJSContext } from './FlowRunJSContext';
11
- import { createSafeDocument, createSafeWindow } from '../../utils';
10
+ import { FlowRunJSContext } from '../../flowContext';
12
11
 
13
- export class JSBlockRunJSContext extends FlowRunJSContext {
14
- static injectDefaultGlobals() {
15
- return { window: createSafeWindow(), document: createSafeDocument() };
16
- }
17
- constructor(delegate: any) {
18
- super(delegate);
19
- // 显式暴露本场景所需属性
20
- this.defineProperty('element', { get: () => (this as any)._delegate['element'] });
21
- this.defineProperty('record', { get: () => (this as any)._delegate['record'] });
22
- this.defineProperty('value', { get: () => (this as any)._delegate['value'] });
23
- }
24
- }
12
+ export class JSBlockRunJSContext extends FlowRunJSContext {}
25
13
 
26
14
  JSBlockRunJSContext.define({
27
- label: 'JSBlock RunJS context',
15
+ label: 'RunJS context',
28
16
  properties: {
29
- element: 'ElementProxy,安全 DOM 容器。支持 innerHTML/append 等',
30
- record: '当前记录(只读,存在于数据块/详情等场景)',
31
- value: '当前值(若存在)',
32
- React: 'React(已注入)',
33
- antd: 'AntD(已注入)',
17
+ element: {
18
+ description: `ElementProxy instance providing a safe DOM container.
19
+ Supports innerHTML, append, and other DOM manipulation methods.
20
+ Use this to render content in the JS block.`,
21
+ detail: 'ElementProxy',
22
+ properties: {
23
+ innerHTML: 'Set or read the HTML content of the container element.',
24
+ },
25
+ },
26
+ record: `Current record data object (read-only).
27
+ Available when the JS block is within a data block or detail view context.`,
28
+ value: 'Current value of the field or component, if available in the current context.',
29
+ React: 'React library',
30
+ antd: 'Ant Design library',
34
31
  },
35
32
  methods: {
36
- onRefReady: 'Container ref ready callback:\n```js\nctx.onRefReady(ctx.ref, el => { /* ... */ })\n```',
33
+ onRefReady: `Wait for container DOM element to be ready before executing callback.
34
+ Parameters: (ref: React.RefObject, callback: (element: HTMLElement) => void, timeout?: number) => void
35
+ Example: ctx.onRefReady(ctx.ref, (el) => { el.innerHTML = "Ready!" })`,
37
36
  requireAsync: 'Load external library: `const lib = await ctx.requireAsync(url)`',
38
- },
39
- snipastes: {
40
- 'Render HTML': { $ref: 'scene/jsblock/render-basic', prefix: 'sn-jsb-html' },
41
- 'Render React': { $ref: 'scene/jsblock/render-react', prefix: 'sn-jsb-react' },
42
- 'Init ECharts': { $ref: 'libs/echarts-init', prefix: 'sn-echarts' },
43
- 'Render card': { $ref: 'scene/jsblock/render-card', prefix: 'sn-jsb-card' },
44
- 'Button handler': { $ref: 'scene/jsblock/render-button-handler', prefix: 'sn-jsb-button' },
45
- 'JSX mount': { $ref: 'scene/jsblock/jsx-mount', prefix: 'sn-jsx-mount' },
46
- 'JSX unmount': { $ref: 'scene/jsblock/jsx-unmount', prefix: 'sn-jsx-unmount' },
47
- Notification: { $ref: 'global/notification-open', prefix: 'sn-notify' },
48
- 'Window open': { $ref: 'global/window-open', prefix: 'sn-window-open' },
49
- 'Add click listener': { $ref: 'scene/jsblock/add-event-listener', prefix: 'sn-jsb-click' },
50
- 'Append style': { $ref: 'scene/jsblock/append-style', prefix: 'sn-jsb-style' },
37
+ importAsync:
38
+ 'Dynamically import an ESM module by URL: `const mod = await ctx.importAsync(url)`.\n' +
39
+ 'Note: if the module has only a default export, ctx.importAsync returns that default value directly (no `.default`).',
51
40
  },
52
41
  });
42
+
43
+ JSBlockRunJSContext.define(
44
+ {
45
+ label: 'RunJS 上下文',
46
+ properties: {
47
+ element: {
48
+ description: 'ElementProxy,安全的 DOM 容器,支持 innerHTML/append 等',
49
+ detail: 'ElementProxy',
50
+ properties: {
51
+ innerHTML: '读取或设置容器的 HTML 内容',
52
+ },
53
+ },
54
+ record: '当前记录(只读,用于数据区块/详情等场景)',
55
+ value: '当前值(若存在)',
56
+ React: 'React 库',
57
+ antd: 'Ant Design 库',
58
+ },
59
+ methods: {
60
+ onRefReady: '容器 ref 就绪回调:\n```js\nctx.onRefReady(ctx.ref, el => { /* ... */ })\n```',
61
+ requireAsync: '加载外部库:`const lib = await ctx.requireAsync(url)`',
62
+ importAsync:
63
+ '按 URL 动态导入 ESM 模块:`const mod = await ctx.importAsync(url)`。\n' +
64
+ '注意:当模块只有 default 一个导出时,ctx.importAsync 会直接返回 default 值(无需再写 `.default`)。',
65
+ },
66
+ },
67
+ { locale: 'zh-CN' },
68
+ );
@@ -7,26 +7,25 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { FlowRunJSContext } from './FlowRunJSContext';
10
+ import { FlowRunJSContext } from '../../flowContext';
11
11
 
12
- export class JSCollectionActionRunJSContext extends FlowRunJSContext {
13
- constructor(delegate: any) {
14
- super(delegate);
15
- this.defineProperty('resource', { get: () => (this as any)._delegate['resource'] });
16
- }
17
- }
12
+ export class JSCollectionActionRunJSContext extends FlowRunJSContext {}
18
13
 
19
14
  JSCollectionActionRunJSContext.define({
20
15
  label: 'JSCollectionAction RunJS context',
21
16
  properties: {
22
- resource: '列表资源(选中行/分页等)',
23
- },
24
- methods: {
25
- runAction: 'Run action',
26
- message: 'Message API',
27
- },
28
- snipastes: {
29
- 'Selected count': { $ref: 'scene/actions/collection-selected-count', prefix: 'sn-act-selected-count' },
30
- 'Iterate selected rows': { $ref: 'scene/actions/iterate-selected-rows', prefix: 'sn-act-iterate' },
17
+ resource: `Collection resource instance providing access to selected rows, pagination, and data operations.
18
+ Use ctx.resource.selectedRows to get selected records.
19
+ Use ctx.resource.pagination for page info.`,
31
20
  },
32
21
  });
22
+
23
+ JSCollectionActionRunJSContext.define(
24
+ {
25
+ label: 'JS 集合动作 RunJS 上下文',
26
+ properties: {
27
+ resource: '列表资源(包含选中行/分页信息等)',
28
+ },
29
+ },
30
+ { locale: 'zh-CN' },
31
+ );
@@ -0,0 +1,58 @@
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 { FlowRunJSContext } from '../../flowContext';
11
+
12
+ /**
13
+ * RunJS context for JSColumnModel (table custom column).
14
+ * Focused on per-row rendering with access to current record and cell element.
15
+ */
16
+ export class JSColumnRunJSContext extends FlowRunJSContext {}
17
+
18
+ JSColumnRunJSContext.define({
19
+ label: 'JSColumn RunJS context',
20
+ properties: {
21
+ element:
22
+ 'ElementProxy instance providing a safe DOM container for the current table cell. Supports innerHTML/append and basic DOM APIs.',
23
+ record: 'Current row record object (read-only).',
24
+ recordIndex: 'Index of the current row in the page (0-based).',
25
+ collection: 'Collection definition metadata (read-only).',
26
+ viewer:
27
+ 'View controller providing dialog/drawer/embed helpers for interactions initiated from the cell (e.g., open details).',
28
+ React: 'React library',
29
+ antd: 'Ant Design library',
30
+ },
31
+ methods: {
32
+ onRefReady:
33
+ 'Wait for cell DOM element to be ready before executing callback. Parameters: (ref, callback, timeout?) => void',
34
+ requireAsync: 'Load external library by URL: `const lib = await ctx.requireAsync(url)`',
35
+ importAsync: 'Dynamically import ESM module by URL: `const mod = await ctx.importAsync(url)`',
36
+ },
37
+ });
38
+
39
+ JSColumnRunJSContext.define(
40
+ {
41
+ label: 'JS 列 RunJS 上下文',
42
+ properties: {
43
+ element: 'ElementProxy,表格单元格的安全 DOM 容器,支持 innerHTML/append 等',
44
+ record: '当前行记录对象(只读)',
45
+ recordIndex: '当前行索引(从 0 开始)',
46
+ collection: '集合定义元数据(只读)',
47
+ viewer: '视图控制器,可用于在单元格中触发抽屉/对话框/内嵌等交互',
48
+ React: 'React 库',
49
+ antd: 'Ant Design 库',
50
+ },
51
+ methods: {
52
+ onRefReady: '等待单元格 DOM 就绪后执行回调。参数:(ref, callback, timeout?)',
53
+ requireAsync: '按 URL 异步加载外部库:`const lib = await ctx.requireAsync(url)`',
54
+ importAsync: '按 URL 动态导入 ESM 模块:`const mod = await ctx.importAsync(url)`',
55
+ },
56
+ },
57
+ { locale: 'zh-CN' },
58
+ );