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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +90 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +4 -2
  6. package/lib/JSRunner.js +3 -0
  7. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  8. package/lib/ViewScopedFlowEngine.js +12 -0
  9. package/lib/acl/Acl.d.ts +1 -0
  10. package/lib/acl/Acl.js +11 -0
  11. package/lib/components/FieldModelRenderer.js +14 -6
  12. package/lib/components/FieldSkeleton.d.ts +10 -0
  13. package/lib/components/FieldSkeleton.js +64 -0
  14. package/lib/components/FlowContextSelector.js +7 -2
  15. package/lib/components/FlowModelRenderer.d.ts +3 -6
  16. package/lib/components/FlowModelRenderer.js +16 -47
  17. package/lib/components/FormItem.js +5 -1
  18. package/lib/components/MobilePopup.d.ts +20 -0
  19. package/lib/components/MobilePopup.js +102 -0
  20. package/lib/components/MobilePopup.style.d.ts +17 -0
  21. package/lib/components/MobilePopup.style.js +186 -0
  22. package/lib/components/index.d.ts +1 -0
  23. package/lib/components/index.js +3 -1
  24. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  25. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  26. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  27. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  28. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +35 -6
  29. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  30. package/lib/components/variables/VariableInput.js +19 -5
  31. package/lib/components/variables/VariableTag.js +43 -2
  32. package/lib/components/variables/types.d.ts +2 -0
  33. package/lib/data-source/index.d.ts +15 -4
  34. package/lib/data-source/index.js +42 -13
  35. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  36. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  37. package/lib/emitter.d.ts +6 -0
  38. package/lib/emitter.js +12 -0
  39. package/lib/executor/FlowExecutor.d.ts +4 -5
  40. package/lib/executor/FlowExecutor.js +168 -99
  41. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  42. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  43. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  44. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  45. package/lib/flowContext.d.ts +37 -5
  46. package/lib/flowContext.js +224 -87
  47. package/lib/flowEngine.d.ts +24 -1
  48. package/lib/flowEngine.js +81 -8
  49. package/lib/flowSettings.d.ts +2 -1
  50. package/lib/flowSettings.js +16 -8
  51. package/lib/hooks/useApplyAutoFlows.js +2 -1
  52. package/lib/index.d.ts +7 -1
  53. package/lib/index.js +32 -3
  54. package/lib/locale/en-US.json +4 -2
  55. package/lib/locale/index.d.ts +4 -0
  56. package/lib/locale/zh-CN.json +4 -2
  57. package/lib/models/CollectionFieldModel.d.ts +3 -0
  58. package/lib/models/CollectionFieldModel.js +52 -6
  59. package/lib/models/flowModel.d.ts +30 -29
  60. package/lib/models/flowModel.js +153 -100
  61. package/lib/models/forkFlowModel.d.ts +8 -4
  62. package/lib/models/forkFlowModel.js +38 -8
  63. package/lib/provider.d.ts +3 -1
  64. package/lib/provider.js +7 -5
  65. package/lib/resources/multiRecordResource.js +25 -1
  66. package/lib/resources/singleRecordResource.js +19 -1
  67. package/lib/resources/sqlResource.d.ts +1 -0
  68. package/lib/resources/sqlResource.js +20 -24
  69. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  70. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  71. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  72. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  73. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  74. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  75. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  76. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  77. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  78. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  79. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  80. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  81. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  82. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  83. package/lib/runjs-context/contexts/base.d.ts +9 -0
  84. package/lib/runjs-context/contexts/base.js +205 -0
  85. package/lib/runjs-context/helpers.d.ts +5 -2
  86. package/lib/runjs-context/helpers.js +36 -27
  87. package/lib/runjs-context/registry.d.ts +7 -4
  88. package/lib/runjs-context/registry.js +10 -42
  89. package/lib/runjs-context/setup.d.ts +9 -0
  90. package/lib/runjs-context/setup.js +82 -0
  91. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  92. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  93. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  94. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  95. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  96. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  97. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  98. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  99. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  100. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  101. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  102. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  103. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  104. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  105. package/lib/runjs-context/snippets/index.d.ts +14 -3
  106. package/lib/runjs-context/snippets/index.js +162 -40
  107. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  109. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  111. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  113. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  114. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  115. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  116. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  117. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  118. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  119. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  120. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  121. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  122. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  123. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  124. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  125. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  126. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  127. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  128. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  129. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  130. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  131. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  132. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  133. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  134. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  135. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  136. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  137. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  138. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  139. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  140. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  141. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  142. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  143. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  144. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  145. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  146. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  148. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  149. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  150. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  151. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  152. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  154. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  158. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  159. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  160. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  161. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  162. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  163. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  164. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  165. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  166. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  167. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  168. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  169. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  170. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  171. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  172. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  173. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  174. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  175. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  176. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  177. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  178. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  179. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  180. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  181. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  182. package/lib/runjs-context/snippets/types.d.ts +9 -1
  183. package/lib/scheduler/ModelOperationScheduler.d.ts +51 -0
  184. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  185. package/lib/types.d.ts +28 -3
  186. package/lib/types.js +4 -3
  187. package/lib/utils/associationObjectVariable.d.ts +32 -0
  188. package/lib/utils/associationObjectVariable.js +157 -0
  189. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  190. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  191. package/lib/utils/createEphemeralContext.d.ts +13 -0
  192. package/lib/utils/createEphemeralContext.js +140 -0
  193. package/lib/utils/flows.d.ts +10 -0
  194. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → utils/flows.js} +21 -15
  195. package/lib/utils/index.d.ts +7 -2
  196. package/lib/utils/index.js +21 -2
  197. package/lib/utils/jsxTransform.d.ts +15 -0
  198. package/lib/utils/jsxTransform.js +68 -0
  199. package/lib/utils/params-resolvers.js +3 -3
  200. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  201. package/lib/utils/parsePathnameToViewParams.js +41 -5
  202. package/lib/utils/pruneFilter.d.ts +21 -0
  203. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  204. package/lib/utils/safeGlobals.d.ts +5 -3
  205. package/lib/utils/safeGlobals.js +40 -0
  206. package/lib/utils/schema-utils.js +2 -2
  207. package/lib/utils/serverContextParams.d.ts +1 -0
  208. package/lib/utils/translation.d.ts +4 -1
  209. package/lib/utils/translation.js +6 -2
  210. package/lib/utils/variablesParams.d.ts +22 -5
  211. package/lib/utils/variablesParams.js +132 -36
  212. package/lib/views/DrawerComponent.js +21 -2
  213. package/lib/views/PageComponent.js +2 -1
  214. package/lib/views/ViewNavigation.d.ts +3 -9
  215. package/lib/views/ViewNavigation.js +16 -2
  216. package/lib/views/createViewMeta.d.ts +29 -1
  217. package/lib/views/createViewMeta.js +338 -72
  218. package/lib/views/index.d.ts +1 -0
  219. package/lib/views/index.js +3 -0
  220. package/lib/views/useDialog.d.ts +9 -8
  221. package/lib/views/useDialog.js +19 -14
  222. package/lib/views/useDrawer.d.ts +9 -8
  223. package/lib/views/useDrawer.js +54 -35
  224. package/lib/views/usePage.d.ts +9 -8
  225. package/lib/views/usePage.js +20 -14
  226. package/package.json +6 -3
  227. package/src/BlockScopedFlowEngine.ts +86 -0
  228. package/src/FlowContextProvider.tsx +4 -2
  229. package/src/JSRunner.ts +3 -0
  230. package/src/ViewScopedFlowEngine.ts +15 -1
  231. package/src/__tests__/JSRunner.test.ts +62 -53
  232. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  233. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  234. package/src/__tests__/flow-engine.test.ts +3 -0
  235. package/src/__tests__/flowContext.test.ts +52 -0
  236. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  237. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  238. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  239. package/src/__tests__/flowSettings.open.test.tsx +2 -0
  240. package/src/__tests__/flowSettings.test.ts +2 -0
  241. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  242. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  243. package/src/__tests__/objectVariable.test.ts +464 -0
  244. package/src/__tests__/runjsContext.test.ts +216 -35
  245. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  246. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  247. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  248. package/src/__tests__/runjsLocales.test.ts +36 -0
  249. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  250. package/src/__tests__/runjsSnippets.test.ts +140 -0
  251. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  252. package/src/acl/Acl.tsx +14 -0
  253. package/src/acl/__tests__/Acl.test.tsx +43 -0
  254. package/src/components/DynamicFlowsEditor.tsx +3 -4
  255. package/src/components/FieldModelRenderer.tsx +20 -7
  256. package/src/components/FieldSkeleton.tsx +27 -0
  257. package/src/components/FlowContextSelector.tsx +6 -2
  258. package/src/components/FlowModelRenderer.tsx +33 -81
  259. package/src/components/FormItem.tsx +8 -1
  260. package/src/components/MobilePopup.style.ts +220 -0
  261. package/src/components/MobilePopup.tsx +86 -0
  262. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  263. package/src/components/index.ts +1 -0
  264. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  265. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  266. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  267. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +39 -10
  268. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  269. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +425 -0
  270. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  271. package/src/components/variables/VariableInput.tsx +25 -5
  272. package/src/components/variables/VariableTag.tsx +54 -2
  273. package/src/components/variables/types.ts +2 -0
  274. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  275. package/src/data-source/index.ts +42 -11
  276. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  277. package/src/emitter.ts +14 -0
  278. package/src/executor/FlowExecutor.ts +213 -119
  279. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  280. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  281. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  282. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  283. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  284. package/src/flowContext.ts +303 -104
  285. package/src/flowEngine.ts +96 -6
  286. package/src/flowSettings.ts +12 -4
  287. package/src/hooks/useApplyAutoFlows.ts +3 -1
  288. package/src/index.ts +12 -1
  289. package/src/locale/en-US.json +4 -2
  290. package/src/locale/zh-CN.json +4 -2
  291. package/src/models/CollectionFieldModel.tsx +60 -8
  292. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  293. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  294. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  295. package/src/models/__tests__/flowModel.test.ts +234 -111
  296. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  297. package/src/models/flowModel.tsx +197 -132
  298. package/src/models/forkFlowModel.ts +48 -8
  299. package/src/provider.tsx +10 -7
  300. package/src/resources/multiRecordResource.ts +28 -1
  301. package/src/resources/singleRecordResource.ts +19 -1
  302. package/src/resources/sqlResource.ts +20 -25
  303. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  304. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  305. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  306. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  307. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  308. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  309. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  310. package/src/runjs-context/contexts/base.ts +196 -0
  311. package/src/runjs-context/helpers.ts +32 -30
  312. package/src/runjs-context/registry.ts +16 -47
  313. package/src/runjs-context/setup.ts +51 -0
  314. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  315. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  316. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  317. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  318. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  319. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  320. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  321. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  322. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  323. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  324. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  325. package/src/runjs-context/snippets/index.ts +178 -39
  326. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  327. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  328. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  329. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  330. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  331. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  332. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  333. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  334. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  335. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  336. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  337. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  338. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  339. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  340. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  341. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  342. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  343. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  344. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  345. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  346. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  347. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  348. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  349. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  350. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  351. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  352. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  353. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  354. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  355. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  356. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  357. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  358. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  359. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  360. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  361. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  362. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  363. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  364. package/src/runjs-context/snippets/types.ts +5 -1
  365. package/src/scheduler/ModelOperationScheduler.ts +304 -0
  366. package/src/types.ts +34 -0
  367. package/src/utils/__tests__/flows.test.ts +65 -0
  368. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  369. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  370. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  371. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  372. package/src/utils/__tests__/variablesParams.test.ts +63 -0
  373. package/src/utils/associationObjectVariable.ts +180 -0
  374. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  375. package/src/utils/createEphemeralContext.ts +142 -0
  376. package/src/utils/flows.ts +23 -0
  377. package/src/utils/index.ts +11 -2
  378. package/src/utils/jsxTransform.ts +39 -0
  379. package/src/utils/params-resolvers.ts +2 -2
  380. package/src/utils/parsePathnameToViewParams.ts +50 -6
  381. package/src/utils/pruneFilter.ts +41 -0
  382. package/src/utils/safeGlobals.ts +49 -3
  383. package/src/utils/schema-utils.ts +1 -1
  384. package/src/utils/serverContextParams.ts +1 -0
  385. package/src/utils/translation.ts +7 -2
  386. package/src/utils/variablesParams.ts +156 -38
  387. package/src/views/DrawerComponent.tsx +21 -2
  388. package/src/views/PageComponent.tsx +1 -1
  389. package/src/views/ViewNavigation.ts +20 -12
  390. package/src/views/__tests__/ViewNavigation.test.ts +10 -0
  391. package/src/views/createViewMeta.ts +393 -70
  392. package/src/views/index.tsx +1 -0
  393. package/src/views/useDialog.tsx +24 -18
  394. package/src/views/useDrawer.tsx +74 -45
  395. package/src/views/usePage.tsx +26 -17
  396. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  397. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  398. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  399. package/lib/runjs-context/index.d.ts +0 -19
  400. package/lib/runjs-context/index.js +0 -57
  401. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  402. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  403. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  404. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  405. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  406. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  407. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  408. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  409. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  410. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  411. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  412. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  413. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  414. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  415. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  416. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  417. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  418. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  419. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  420. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  421. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  422. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  423. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  424. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  425. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  426. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  427. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  428. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  429. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  430. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  431. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  432. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  433. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  434. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  435. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  436. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  437. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  438. package/src/runjs-context/index.ts +0 -20
  439. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  440. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  441. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  442. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  443. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  444. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  445. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  446. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  447. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  448. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  449. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  450. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  451. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  452. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  453. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  454. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  455. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  456. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  457. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  458. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  459. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  460. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  461. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  462. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  463. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  464. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  465. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  466. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -9,22 +9,51 @@
9
9
 
10
10
  import * as React from 'react';
11
11
  import DOMPurify from 'dompurify';
12
- import { observer } from '..';
12
+ import { autorun, observable, observer } from '..';
13
13
  import { FlowContext, FlowEngineContext } from '../flowContext';
14
14
  import { FlowViewContextProvider } from '../FlowContextProvider';
15
- import { createViewMeta } from './createViewMeta';
15
+ import { registerPopupVariable } from './createViewMeta';
16
16
  import DrawerComponent from './DrawerComponent';
17
17
  import usePatchElement from './usePatchElement';
18
18
  import { FlowEngineProvider } from '../provider';
19
19
  import { createViewScopedEngine } from '../ViewScopedFlowEngine';
20
-
21
- let uuid = 0;
20
+ import { createViewRecordResolveOnServer, getViewRecordFromParent } from '../utils/variablesParams';
22
21
 
23
22
  export function useDrawer() {
24
23
  const holderRef = React.useRef(null);
24
+ const drawerList = React.useMemo(() => observable.shallow({ value: [] }), []);
25
+
26
+ const RenderNestedDrawer = React.memo((props: { index: number }) => {
27
+ const { index } = props;
28
+ const [RenderDrawer, setRenderDrawer] = React.useState<React.ComponentType | null>(null);
29
+
30
+ React.useEffect(() => {
31
+ autorun(() => {
32
+ const list = drawerList.value;
33
+ if (list[index] && RenderDrawer !== list[index]) {
34
+ setRenderDrawer(list[index]);
35
+ }
36
+
37
+ if (!list[index]) {
38
+ setRenderDrawer(null);
39
+ }
40
+ });
41
+ }, [RenderDrawer, index]);
42
+
43
+ if (!RenderDrawer) {
44
+ return null;
45
+ }
46
+
47
+ return (
48
+ <RenderDrawer>
49
+ <RenderNestedDrawer index={index + 1} />
50
+ </RenderDrawer>
51
+ );
52
+ });
53
+
54
+ RenderNestedDrawer.displayName = 'RenderNestedDrawer';
25
55
 
26
56
  const open = (config, flowContext: FlowEngineContext) => {
27
- uuid += 1;
28
57
  const drawerRef = React.createRef<{
29
58
  destroy: () => void;
30
59
  update: (config: any) => void;
@@ -44,7 +73,7 @@ export function useDrawer() {
44
73
  let currentHeader: any = null;
45
74
 
46
75
  // Footer 组件实现
47
- const FooterComponent = ({ children, ...props }) => {
76
+ const FooterComponent: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
48
77
  React.useEffect(() => {
49
78
  currentFooter = children;
50
79
  drawerRef.current?.setFooter(children);
@@ -59,10 +88,10 @@ export function useDrawer() {
59
88
  };
60
89
 
61
90
  // Header 组件实现
62
- const HeaderComponent = ({ ...props }) => {
91
+ const HeaderComponent: React.FC<{ title?: React.ReactNode; extra?: React.ReactNode }> = (props) => {
63
92
  React.useEffect(() => {
64
93
  currentHeader = props;
65
- drawerRef.current?.setHeader(props as any);
94
+ drawerRef.current?.setHeader(props);
66
95
 
67
96
  return () => {
68
97
  currentHeader = null;
@@ -73,9 +102,21 @@ export function useDrawer() {
73
102
  return null; // Header 组件本身不渲染内容
74
103
  };
75
104
 
105
+ const ctx = new FlowContext();
106
+ // 为当前视图创建作用域引擎(隔离实例与缓存)
107
+ const scopedEngine = createViewScopedEngine(flowContext.engine);
108
+ // 先将引擎暴露给视图上下文,再按需继承父上下文
109
+ ctx.defineProperty('engine', { value: scopedEngine });
110
+ ctx.addDelegate(scopedEngine.context);
111
+ if (config.inheritContext !== false) {
112
+ ctx.addDelegate(flowContext);
113
+ } else {
114
+ ctx.addDelegate(flowContext.engine.context);
115
+ }
116
+
76
117
  // 构造 currentDrawer 实例
77
118
  const currentDrawer = {
78
- type: 'drawer',
119
+ type: 'drawer' as const,
79
120
  inputArgs: config.inputArgs || {},
80
121
  preventClose: !!config.preventClose,
81
122
  destroy: () => drawerRef.current?.destroy(),
@@ -99,28 +140,22 @@ export function useDrawer() {
99
140
  drawerRef.current?.setHeader(header);
100
141
  },
101
142
  navigation: config.inputArgs?.navigation,
143
+ get record() {
144
+ return getViewRecordFromParent(flowContext, ctx);
145
+ },
102
146
  };
103
147
 
104
- const ctx = new FlowContext();
105
148
  ctx.defineProperty('view', {
106
149
  get: () => currentDrawer,
107
- meta: createViewMeta(ctx, () => currentDrawer),
108
- resolveOnServer: (p: string) => p === 'record' || p.startsWith('record.'),
150
+ // meta: createViewMeta(ctx),
151
+ resolveOnServer: createViewRecordResolveOnServer(ctx, () => getViewRecordFromParent(flowContext, ctx)),
109
152
  });
110
- // 为当前视图创建作用域引擎(隔离实例与缓存)
111
- const scopedEngine = createViewScopedEngine(flowContext.engine);
112
- // 先将引擎暴露给视图上下文,再按需继承父上下文
113
- ctx.defineProperty('engine', { value: scopedEngine });
114
- ctx.addDelegate(scopedEngine.context);
115
- if (config.inheritContext !== false) {
116
- ctx.addDelegate(flowContext);
117
- } else {
118
- ctx.addDelegate(flowContext.engine.context);
119
- }
153
+ // 顶层 popup 变量:弹窗记录/数据源/上级弹窗链(去重封装)
154
+ registerPopupVariable(ctx, currentDrawer);
120
155
 
121
156
  // 内部组件,在 Provider 内部计算 content
122
- const DrawerWithContext: React.FC = observer(
123
- (props) => {
157
+ const DrawerWithContext: React.FC = React.memo(
158
+ observer((props) => {
124
159
  // eslint-disable-next-line react-hooks/rules-of-hooks
125
160
  const mountedRef = React.useRef(false);
126
161
  const rawContent = typeof config.content === 'function' ? config.content(currentDrawer, ctx) : config.content;
@@ -147,7 +182,7 @@ export function useDrawer() {
147
182
  ref={drawerRef}
148
183
  {...config}
149
184
  footer={currentFooter}
150
- header={currentHeader}
185
+ header={config.header || currentHeader}
151
186
  hidden={config.inputArgs?.hidden?.value}
152
187
  afterClose={() => {
153
188
  closeFunc?.();
@@ -156,48 +191,42 @@ export function useDrawer() {
156
191
  // 关闭时修正 previous/next 指针
157
192
  scopedEngine.unlinkFromStack();
158
193
  }}
194
+ isMobile={ctx.isMobileLayout}
159
195
  >
160
196
  {content}
161
197
  {props.children}
162
198
  </DrawerComponent>
163
199
  );
164
- },
165
- {
166
- displayName: 'DrawerWithContext',
167
- },
200
+ }),
168
201
  );
169
202
 
170
- const renderDrawer = (children: React.ReactNode) => (
203
+ DrawerWithContext.displayName = 'DrawerWithContext';
204
+
205
+ const RenderDrawer = React.memo(({ children }) => (
171
206
  <FlowEngineProvider engine={scopedEngine}>
172
207
  <FlowViewContextProvider context={ctx}>
173
208
  <DrawerWithContext>{children}</DrawerWithContext>
174
209
  </FlowViewContextProvider>
175
210
  </FlowEngineProvider>
176
- );
211
+ ));
212
+
213
+ RenderDrawer.displayName = 'RenderDrawer';
177
214
 
178
- closeFunc = holderRef.current?.patchElement(renderDrawer);
215
+ closeFunc = holderRef.current?.patchElement(RenderDrawer);
179
216
  return Object.assign(promise, currentDrawer);
180
217
  };
181
218
 
182
219
  const api = React.useMemo(() => ({ open }), []);
183
220
  const ElementsHolder = React.memo(
184
221
  React.forwardRef((props, ref) => {
185
- const [elements, patchElement] = usePatchElement<(children: React.ReactNode) => React.ReactElement>();
222
+ const [elements, patchElement] = usePatchElement<React.ElementType>();
186
223
  React.useImperativeHandle(ref, () => ({ patchElement }), [patchElement]);
187
224
 
188
- // 嵌套渲染:后面的元素是前一个元素的子元素
189
- const renderNestedElements = () => {
190
- if (elements.length === 0) {
191
- return null;
192
- }
193
-
194
- // 从最后一个元素开始,向前递归渲染
195
- return elements.reduceRight((children: React.ReactNode, renderElement) => {
196
- return renderElement(children);
197
- }, null as React.ReactNode);
198
- };
225
+ React.useEffect(() => {
226
+ drawerList.value = elements;
227
+ }, [elements]);
199
228
 
200
- return <>{renderNestedElements()}</>;
229
+ return <RenderNestedDrawer index={0} />;
201
230
  }),
202
231
  );
203
232
 
@@ -12,11 +12,12 @@ import ReactDOM from 'react-dom';
12
12
  import { observer } from '..';
13
13
  import { FlowContext } from '../flowContext';
14
14
  import { FlowViewContextProvider } from '../FlowContextProvider';
15
- import { createViewMeta } from './createViewMeta';
15
+ import { registerPopupVariable } from './createViewMeta';
16
16
  import { PageComponent } from './PageComponent';
17
17
  import usePatchElement from './usePatchElement';
18
18
  import { FlowEngineProvider } from '../provider';
19
19
  import { createViewScopedEngine } from '../ViewScopedFlowEngine';
20
+ import { createViewRecordResolveOnServer, getViewRecordFromParent } from '../utils/variablesParams';
20
21
 
21
22
  let uuid = 0;
22
23
 
@@ -48,7 +49,7 @@ export function usePage() {
48
49
  });
49
50
 
50
51
  // Footer 组件实现
51
- const FooterComponent = ({ children, ...props }) => {
52
+ const FooterComponent: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
52
53
  React.useEffect(() => {
53
54
  pageRef.current?.setFooter(children);
54
55
 
@@ -61,9 +62,9 @@ export function usePage() {
61
62
  };
62
63
 
63
64
  // Header 组件实现
64
- const HeaderComponent = ({ ...props }) => {
65
+ const HeaderComponent: React.FC<{ title?: React.ReactNode; extra?: React.ReactNode }> = (props) => {
65
66
  React.useEffect(() => {
66
- pageRef.current?.setHeader(props as any);
67
+ pageRef.current?.setHeader(props);
67
68
 
68
69
  return () => {
69
70
  pageRef.current?.setHeader(null);
@@ -75,9 +76,20 @@ export function usePage() {
75
76
 
76
77
  const { target, content, preventClose, inheritContext = true, ...restConfig } = config;
77
78
 
79
+ const ctx = new FlowContext();
80
+ // 为当前视图创建作用域引擎(隔离实例与缓存)
81
+ const scopedEngine = createViewScopedEngine(flowContext.engine);
82
+ ctx.defineProperty('engine', { value: scopedEngine });
83
+ ctx.addDelegate(scopedEngine.context);
84
+ if (inheritContext) {
85
+ ctx.addDelegate(flowContext);
86
+ } else {
87
+ ctx.addDelegate(flowContext.engine.context);
88
+ }
89
+
78
90
  // 构造 currentPage 实例
79
91
  const currentPage = {
80
- type: 'embed',
92
+ type: 'embed' as const,
81
93
  inputArgs: config.inputArgs || {},
82
94
  preventClose: !!config.preventClose,
83
95
  destroy: () => pageRef.current?.destroy(),
@@ -99,23 +111,20 @@ export function usePage() {
99
111
  pageRef.current?.setHeader(header);
100
112
  },
101
113
  navigation: config.inputArgs?.navigation,
114
+ get record() {
115
+ // 当视图正在查看与父 record 同一条记录时,复用父记录深拷贝;否则走服务端解析
116
+ return getViewRecordFromParent(flowContext, ctx);
117
+ },
102
118
  };
103
119
 
104
- const ctx = new FlowContext();
105
120
  ctx.defineProperty('view', {
106
121
  get: () => currentPage,
107
- meta: createViewMeta(ctx, () => currentPage),
108
- resolveOnServer: (p: string) => p === 'record' || p.startsWith('record.'),
122
+ // meta: createViewMeta(ctx),
123
+ // 仅当访问关联字段或前端无本地记录数据时,才交给服务端解析
124
+ resolveOnServer: createViewRecordResolveOnServer(ctx, () => getViewRecordFromParent(flowContext, ctx)),
109
125
  });
110
- // 为当前视图创建作用域引擎(隔离实例与缓存)
111
- const scopedEngine = createViewScopedEngine(flowContext.engine);
112
- ctx.defineProperty('engine', { value: scopedEngine });
113
- ctx.addDelegate(scopedEngine.context);
114
- if (inheritContext) {
115
- ctx.addDelegate(flowContext);
116
- } else {
117
- ctx.addDelegate(flowContext.engine.context);
118
- }
126
+ // 顶层 popup 变量:弹窗记录/数据源/上级弹窗链(去重封装)
127
+ registerPopupVariable(ctx, currentPage);
119
128
 
120
129
  const PageWithContext = observer(
121
130
  () => {
@@ -1,38 +0,0 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
- import type { FlowContext } from '../../flowContext';
10
- export type RunJSVersion = 'v1' | (string & {});
11
- export type RunJSContextCtor = new (delegate: FlowContext) => FlowRunJSContext;
12
- export type RunJSDocMeta = {
13
- label?: string;
14
- properties?: Record<string, any>;
15
- methods?: Record<string, any>;
16
- snipastes?: Record<string, any>;
17
- };
18
- export declare class FlowRunJSContext {
19
- #private;
20
- protected _delegate: FlowContext;
21
- [key: string]: any;
22
- static allow?: {
23
- keys?: ReadonlyArray<string>;
24
- facades?: Record<string, ReadonlyArray<string>>;
25
- };
26
- constructor(delegate: FlowContext);
27
- defineProperty(key: string, options: {
28
- get?: (ctx: any) => any;
29
- value?: any;
30
- }): void;
31
- defineMethod(name: string, fn: (...args: any[]) => any): void;
32
- static injectDefaultGlobals?(): {
33
- window?: any;
34
- document?: any;
35
- } | void;
36
- static define(meta: RunJSDocMeta): void;
37
- static getDoc(): RunJSDocMeta;
38
- }
@@ -1,217 +0,0 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
-
10
- var __create = Object.create;
11
- var __defProp = Object.defineProperty;
12
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
- var __getOwnPropNames = Object.getOwnPropertyNames;
14
- var __getProtoOf = Object.getPrototypeOf;
15
- var __hasOwnProp = Object.prototype.hasOwnProperty;
16
- var __typeError = (msg) => {
17
- throw TypeError(msg);
18
- };
19
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
20
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
21
- var __export = (target, all) => {
22
- for (var name in all)
23
- __defProp(target, name, { get: all[name], enumerable: true });
24
- };
25
- var __copyProps = (to, from, except, desc) => {
26
- if (from && typeof from === "object" || typeof from === "function") {
27
- for (let key of __getOwnPropNames(from))
28
- if (!__hasOwnProp.call(to, key) && key !== except)
29
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
30
- }
31
- return to;
32
- };
33
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
34
- // If the importer is in node compatibility mode or this is not an ESM
35
- // file that has been converted to a CommonJS file using a Babel-
36
- // compatible transform (i.e. "__esModule" has not been set), then set
37
- // "default" to the CommonJS "module.exports" for node compatibility.
38
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
39
- mod
40
- ));
41
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
42
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
43
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
44
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
45
- var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
46
- var FlowRunJSContext_exports = {};
47
- __export(FlowRunJSContext_exports, {
48
- FlowRunJSContext: () => FlowRunJSContext
49
- });
50
- module.exports = __toCommonJS(FlowRunJSContext_exports);
51
- var antd = __toESM(require("antd"));
52
- var import_react = __toESM(require("react"));
53
- var ReactDOMClient = __toESM(require("react-dom/client"));
54
- var _FlowRunJSContext_instances, exposeProps_fn, exposeMethods_fn;
55
- const classMeta = /* @__PURE__ */ new WeakMap();
56
- const classDocCache = /* @__PURE__ */ new WeakMap();
57
- function deepMerge(base, patch) {
58
- if (patch === null) return void 0;
59
- if (Array.isArray(base) || Array.isArray(patch) || typeof base !== "object" || typeof patch !== "object") {
60
- return patch ?? base;
61
- }
62
- const out = { ...base };
63
- for (const k of Object.keys(patch)) {
64
- const v = deepMerge(base == null ? void 0 : base[k], patch[k]);
65
- if (typeof v === "undefined") delete out[k];
66
- else out[k] = v;
67
- }
68
- return out;
69
- }
70
- __name(deepMerge, "deepMerge");
71
- const _FlowRunJSContext = class _FlowRunJSContext {
72
- constructor(delegate) {
73
- __privateAdd(this, _FlowRunJSContext_instances);
74
- __publicField(this, "_delegate");
75
- this._delegate = delegate;
76
- const self = this;
77
- self.React = import_react.default;
78
- self.react = import_react.default;
79
- self.antd = antd;
80
- self.ReactDOM = ReactDOMClient;
81
- self.dispatchModelEvent = async (modelOrUid, eventName, inputArgs) => {
82
- var _a, _b, _c, _d, _e, _f, _g, _h;
83
- let model = null;
84
- const engine = this._delegate.engine;
85
- if (typeof modelOrUid === "string") {
86
- model = await ((_a = engine == null ? void 0 : engine.loadModel) == null ? void 0 : _a.call(engine, { uid: modelOrUid }));
87
- } else if (modelOrUid && typeof modelOrUid === "object" && typeof modelOrUid.dispatchEvent === "function") {
88
- model = modelOrUid;
89
- }
90
- if (model) {
91
- (_c = (_b = model.context) == null ? void 0 : _b.addDelegate) == null ? void 0 : _c.call(_b, self);
92
- model.dispatchEvent(eventName, {
93
- navigation: false,
94
- ...((_e = (_d = self.model) == null ? void 0 : _d["getInputArgs"]) == null ? void 0 : _e.call(_d)) || {},
95
- ...inputArgs || {}
96
- });
97
- } else {
98
- (_h = (_f = self.message) == null ? void 0 : _f.error) == null ? void 0 : _h.call(
99
- _f,
100
- ((_g = self.t) == null ? void 0 : _g.call(self, "Model with ID {{uid}} not found", { uid: String(modelOrUid) })) || "Model not found"
101
- );
102
- }
103
- };
104
- __privateMethod(this, _FlowRunJSContext_instances, exposeProps_fn).call(this, [
105
- "message",
106
- "notification",
107
- "logger",
108
- "resource",
109
- "urlSearchParams",
110
- "token",
111
- "role",
112
- "auth",
113
- "api",
114
- "ref",
115
- "model"
116
- ]);
117
- __privateMethod(this, _FlowRunJSContext_instances, exposeMethods_fn).call(this, ["t", "requireAsync", "copyToClipboard", "resolveJsonTemplate", "runAction", "onRefReady"]);
118
- }
119
- // 供子类/外部一致使用的定义 API(与 FlowContext 的接口保持一致风格)
120
- defineProperty(key, options) {
121
- if (options && typeof options.get === "function") {
122
- Object.defineProperty(this, key, {
123
- configurable: true,
124
- enumerable: true,
125
- get: /* @__PURE__ */ __name(() => {
126
- var _a;
127
- return (_a = options.get) == null ? void 0 : _a.call(options, this);
128
- }, "get")
129
- });
130
- return;
131
- }
132
- Object.defineProperty(this, key, {
133
- configurable: true,
134
- enumerable: true,
135
- writable: false,
136
- value: options == null ? void 0 : options.value
137
- });
138
- }
139
- defineMethod(name, fn) {
140
- Object.defineProperty(this, name, {
141
- configurable: true,
142
- enumerable: false,
143
- writable: false,
144
- value: fn.bind(this)
145
- });
146
- }
147
- static define(meta) {
148
- const prev = classMeta.get(this) || {};
149
- classMeta.set(this, deepMerge(prev, meta));
150
- classDocCache.delete(this);
151
- }
152
- static getDoc() {
153
- const self = this;
154
- if (classDocCache.has(self)) return classDocCache.get(self);
155
- const chain = [];
156
- let cur = self;
157
- while (cur && cur.prototype) {
158
- chain.unshift(cur);
159
- cur = Object.getPrototypeOf(cur);
160
- }
161
- let merged = {};
162
- for (const cls of chain) merged = deepMerge(merged, classMeta.get(cls) || {});
163
- classDocCache.set(self, merged);
164
- return merged;
165
- }
166
- };
167
- _FlowRunJSContext_instances = new WeakSet();
168
- // 工具:将委托上的属性以 getter 暴露
169
- exposeProps_fn = /* @__PURE__ */ __name(function(names) {
170
- for (const k of names) {
171
- if (Object.prototype.hasOwnProperty.call(this, k)) continue;
172
- this.defineProperty(k, { get: /* @__PURE__ */ __name(() => this._delegate[k], "get") });
173
- }
174
- }, "#exposeProps");
175
- // 工具:将委托上的同名方法绑定暴露
176
- exposeMethods_fn = /* @__PURE__ */ __name(function(names) {
177
- for (const k of names) {
178
- if (Object.prototype.hasOwnProperty.call(this, k)) continue;
179
- const src = this._delegate[k];
180
- if (typeof src === "function") {
181
- this.defineMethod(k, src.bind(this._delegate));
182
- }
183
- }
184
- }, "#exposeMethods");
185
- __name(_FlowRunJSContext, "FlowRunJSContext");
186
- __publicField(_FlowRunJSContext, "allow");
187
- let FlowRunJSContext = _FlowRunJSContext;
188
- FlowRunJSContext.define({
189
- label: "RunJS base",
190
- properties: {
191
- t: "\u56FD\u9645\u5316\u51FD\u6570\u3002\u793A\u4F8B\uFF1A`ctx.t('Hello {name}', { name: 'World' })`",
192
- logger: "Pino logger \u5B50\u5B9E\u4F8B\u3002`ctx.logger.info({ foo: 1 }, 'msg')`",
193
- message: "AntD \u5168\u5C40\u6D88\u606F\u3002`ctx.message.success('done')`",
194
- notification: "AntD \u901A\u77E5\u3002`ctx.notification.open({ message: 'Hi' })`",
195
- requireAsync: "\u5F02\u6B65\u52A0\u8F7D\u5916\u90E8\u5E93\u3002`const x = await ctx.requireAsync(url)`",
196
- copyToClipboard: "\u590D\u5236\u6587\u672C\u5230\u526A\u8D34\u677F\u3002`await ctx.copyToClipboard(text)`",
197
- resolveJsonTemplate: "\u89E3\u6790\u542B {{ }} \u7684\u6A21\u677F/\u8868\u8FBE\u5F0F",
198
- runAction: "\u8FD0\u884C\u5F53\u524D\u6A21\u578B\u52A8\u4F5C\u3002`await ctx.runAction(name, params)`",
199
- resource: "\u6570\u636E\u8D44\u6E90\uFF08\u6309\u59D4\u6258\u53EF\u89C1\uFF09",
200
- urlSearchParams: "URL \u67E5\u8BE2\u53C2\u6570\u5BF9\u8C61",
201
- token: "API Token",
202
- role: "\u5F53\u524D\u89D2\u8272",
203
- auth: "\u8BA4\u8BC1\u4FE1\u606F\uFF08locale/role/user/token\uFF09",
204
- api: "APIClient \u5B9E\u4F8B",
205
- React: "React \u547D\u540D\u7A7A\u95F4\uFF08RunJS \u73AF\u5883\u53EF\u7528\uFF09",
206
- react: "React \u522B\u540D\uFF08\u5C0F\u5199\uFF09",
207
- ReactDOM: "ReactDOM \u5BA2\u6237\u7AEF\uFF08\u542B createRoot\uFF09",
208
- antd: "AntD \u7EC4\u4EF6\u5E93\uFF08RunJS \u73AF\u5883\u53EF\u7528\uFF09"
209
- },
210
- methods: {
211
- dispatchModelEvent: "\u89E6\u53D1\u6A21\u578B\u4E8B\u4EF6\uFF1A`await ctx.dispatchModelEvent(modelUid, 'click', { ... })`"
212
- }
213
- });
214
- // Annotate the CommonJS export names for ESM import in node:
215
- 0 && (module.exports = {
216
- FlowRunJSContext
217
- });
@@ -1,62 +0,0 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
-
10
- var __defProp = Object.defineProperty;
11
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
- var __getOwnPropNames = Object.getOwnPropertyNames;
13
- var __hasOwnProp = Object.prototype.hasOwnProperty;
14
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
- var __export = (target, all) => {
16
- for (var name in all)
17
- __defProp(target, name, { get: all[name], enumerable: true });
18
- };
19
- var __copyProps = (to, from, except, desc) => {
20
- if (from && typeof from === "object" || typeof from === "function") {
21
- for (let key of __getOwnPropNames(from))
22
- if (!__hasOwnProp.call(to, key) && key !== except)
23
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
- }
25
- return to;
26
- };
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
- var LinkageRunJSContext_exports = {};
29
- __export(LinkageRunJSContext_exports, {
30
- LinkageRunJSContext: () => LinkageRunJSContext
31
- });
32
- module.exports = __toCommonJS(LinkageRunJSContext_exports);
33
- var import_FlowRunJSContext = require("./FlowRunJSContext");
34
- const _LinkageRunJSContext = class _LinkageRunJSContext extends import_FlowRunJSContext.FlowRunJSContext {
35
- constructor(delegate) {
36
- super(delegate);
37
- this.defineProperty("model", { get: /* @__PURE__ */ __name(() => this._delegate["model"], "get") });
38
- this.defineProperty("fields", { get: /* @__PURE__ */ __name(() => this._delegate["fields"], "get") });
39
- }
40
- };
41
- __name(_LinkageRunJSContext, "LinkageRunJSContext");
42
- let LinkageRunJSContext = _LinkageRunJSContext;
43
- LinkageRunJSContext.define({
44
- label: "Linkage RunJS context",
45
- properties: {
46
- model: "\u5F53\u524D\u5757/\u5B57\u6BB5\u6A21\u578B\uFF08\u53EA\u8BFB\u8BBF\u95EE\uFF09",
47
- fields: "\u53EF\u8BBF\u95EE\u7684\u5B57\u6BB5\u96C6\u5408\uFF08\u53EA\u8BFB\uFF09"
48
- },
49
- methods: {
50
- message: "Message API"
51
- },
52
- snipastes: {
53
- "Set field value": { $ref: "scene/linkage/set-field-value", prefix: "sn-link-set" },
54
- "Toggle visible": { $ref: "scene/linkage/toggle-visible", prefix: "sn-link-visibility" },
55
- "Set disabled": { $ref: "scene/linkage/set-disabled", prefix: "sn-link-disable" },
56
- "Set required": { $ref: "scene/linkage/set-required", prefix: "sn-link-required" }
57
- }
58
- });
59
- // Annotate the CommonJS export names for ESM import in node:
60
- 0 && (module.exports = {
61
- LinkageRunJSContext
62
- });
@@ -1,19 +0,0 @@
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
- export * from './registry';
10
- export * from './helpers';
11
- export * from './contexts/FlowRunJSContext';
12
- export * from './contexts/JSBlockRunJSContext';
13
- export * from './contexts/JSFieldRunJSContext';
14
- export * from './contexts/JSItemRunJSContext';
15
- export * from './contexts/FormJSFieldItemRunJSContext';
16
- export * from './contexts/JSRecordActionRunJSContext';
17
- export * from './contexts/JSCollectionActionRunJSContext';
18
- export * from './contexts/LinkageRunJSContext';
19
- export { engineSnippets } from './snippets';