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

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 (462) 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 +215 -87
  47. package/lib/flowEngine.d.ts +24 -1
  48. package/lib/flowEngine.js +56 -6
  49. package/lib/flowSettings.d.ts +2 -1
  50. package/lib/flowSettings.js +12 -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 +48 -5
  59. package/lib/models/flowModel.d.ts +30 -29
  60. package/lib/models/flowModel.js +135 -98
  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 +183 -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 +161 -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-button-handler.snippet.d.ts +11 -0
  115. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  116. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  117. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  118. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  119. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  120. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  121. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  122. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  123. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  124. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  125. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  126. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  127. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  128. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  129. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  130. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  131. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  132. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  133. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  134. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  135. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  136. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  137. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  138. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  139. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  140. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  141. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  142. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  143. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  144. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  145. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  146. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  148. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  149. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  150. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  151. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  152. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  154. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  156. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  158. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  159. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  160. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  161. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  162. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  163. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  164. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  165. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  166. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  167. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  168. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  169. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  170. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  171. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  172. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  173. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  174. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  175. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  176. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  177. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  178. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  179. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  180. package/lib/runjs-context/snippets/types.d.ts +9 -1
  181. package/lib/scheduler/ModelOperationScheduler.d.ts +51 -0
  182. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  183. package/lib/types.d.ts +28 -3
  184. package/lib/types.js +4 -3
  185. package/lib/utils/associationObjectVariable.d.ts +32 -0
  186. package/lib/utils/associationObjectVariable.js +157 -0
  187. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  188. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  189. package/lib/utils/createEphemeralContext.d.ts +13 -0
  190. package/lib/utils/createEphemeralContext.js +140 -0
  191. package/lib/utils/flows.d.ts +10 -0
  192. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → utils/flows.js} +21 -15
  193. package/lib/utils/index.d.ts +7 -2
  194. package/lib/utils/index.js +19 -2
  195. package/lib/utils/jsxTransform.d.ts +15 -0
  196. package/lib/utils/jsxTransform.js +68 -0
  197. package/lib/utils/params-resolvers.js +3 -3
  198. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  199. package/lib/utils/parsePathnameToViewParams.js +41 -5
  200. package/lib/utils/pruneFilter.d.ts +21 -0
  201. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  202. package/lib/utils/safeGlobals.d.ts +5 -3
  203. package/lib/utils/safeGlobals.js +40 -0
  204. package/lib/utils/schema-utils.js +2 -2
  205. package/lib/utils/serverContextParams.d.ts +1 -0
  206. package/lib/utils/translation.d.ts +4 -1
  207. package/lib/utils/translation.js +6 -2
  208. package/lib/utils/variablesParams.d.ts +9 -5
  209. package/lib/utils/variablesParams.js +47 -36
  210. package/lib/views/DrawerComponent.js +21 -2
  211. package/lib/views/PageComponent.js +2 -1
  212. package/lib/views/ViewNavigation.d.ts +3 -9
  213. package/lib/views/ViewNavigation.js +16 -2
  214. package/lib/views/createViewMeta.d.ts +29 -1
  215. package/lib/views/createViewMeta.js +338 -72
  216. package/lib/views/index.d.ts +1 -0
  217. package/lib/views/index.js +3 -0
  218. package/lib/views/useDialog.d.ts +8 -8
  219. package/lib/views/useDialog.js +8 -7
  220. package/lib/views/useDrawer.d.ts +8 -8
  221. package/lib/views/useDrawer.js +43 -28
  222. package/lib/views/usePage.d.ts +8 -8
  223. package/lib/views/usePage.js +8 -7
  224. package/package.json +6 -3
  225. package/src/BlockScopedFlowEngine.ts +86 -0
  226. package/src/FlowContextProvider.tsx +4 -2
  227. package/src/JSRunner.ts +3 -0
  228. package/src/ViewScopedFlowEngine.ts +15 -1
  229. package/src/__tests__/JSRunner.test.ts +62 -53
  230. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  231. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  232. package/src/__tests__/flow-engine.test.ts +3 -0
  233. package/src/__tests__/flowContext.test.ts +52 -0
  234. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  235. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  236. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  237. package/src/__tests__/flowSettings.open.test.tsx +2 -0
  238. package/src/__tests__/flowSettings.test.ts +2 -0
  239. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  240. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  241. package/src/__tests__/objectVariable.test.ts +464 -0
  242. package/src/__tests__/runjsContext.test.ts +216 -35
  243. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  244. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  245. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  246. package/src/__tests__/runjsLocales.test.ts +36 -0
  247. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  248. package/src/__tests__/runjsSnippets.test.ts +140 -0
  249. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  250. package/src/acl/Acl.tsx +14 -0
  251. package/src/acl/__tests__/Acl.test.tsx +43 -0
  252. package/src/components/DynamicFlowsEditor.tsx +3 -4
  253. package/src/components/FieldModelRenderer.tsx +20 -7
  254. package/src/components/FieldSkeleton.tsx +27 -0
  255. package/src/components/FlowContextSelector.tsx +6 -2
  256. package/src/components/FlowModelRenderer.tsx +33 -81
  257. package/src/components/FormItem.tsx +8 -1
  258. package/src/components/MobilePopup.style.ts +220 -0
  259. package/src/components/MobilePopup.tsx +86 -0
  260. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  261. package/src/components/index.ts +1 -0
  262. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  263. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  264. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  265. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +39 -10
  266. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  267. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +425 -0
  268. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  269. package/src/components/variables/VariableInput.tsx +25 -5
  270. package/src/components/variables/VariableTag.tsx +54 -2
  271. package/src/components/variables/types.ts +2 -0
  272. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  273. package/src/data-source/index.ts +42 -11
  274. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  275. package/src/emitter.ts +14 -0
  276. package/src/executor/FlowExecutor.ts +213 -119
  277. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  278. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  279. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  280. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  281. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  282. package/src/flowContext.ts +290 -104
  283. package/src/flowEngine.ts +74 -6
  284. package/src/flowSettings.ts +9 -4
  285. package/src/hooks/useApplyAutoFlows.ts +3 -1
  286. package/src/index.ts +12 -1
  287. package/src/locale/en-US.json +4 -2
  288. package/src/locale/zh-CN.json +4 -2
  289. package/src/models/CollectionFieldModel.tsx +56 -7
  290. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  291. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  292. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  293. package/src/models/__tests__/flowModel.test.ts +234 -111
  294. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  295. package/src/models/flowModel.tsx +180 -132
  296. package/src/models/forkFlowModel.ts +48 -8
  297. package/src/provider.tsx +10 -7
  298. package/src/resources/multiRecordResource.ts +28 -1
  299. package/src/resources/singleRecordResource.ts +19 -1
  300. package/src/resources/sqlResource.ts +20 -25
  301. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  302. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  303. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  304. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  305. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  306. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  307. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  308. package/src/runjs-context/contexts/base.ts +171 -0
  309. package/src/runjs-context/helpers.ts +32 -30
  310. package/src/runjs-context/registry.ts +16 -47
  311. package/src/runjs-context/setup.ts +51 -0
  312. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  313. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  314. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  315. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  316. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  317. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  318. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  319. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  320. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  321. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  322. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  323. package/src/runjs-context/snippets/index.ts +177 -39
  324. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  325. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  326. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  327. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  328. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  329. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  330. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  331. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  332. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  333. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  334. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  335. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  336. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  337. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  338. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  339. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  340. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  341. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  342. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  343. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  344. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  345. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  346. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  347. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  348. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  349. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  350. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  351. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  352. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  353. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  354. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  355. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  356. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  357. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  358. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  359. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  360. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  361. package/src/runjs-context/snippets/types.ts +5 -1
  362. package/src/scheduler/ModelOperationScheduler.ts +304 -0
  363. package/src/types.ts +34 -0
  364. package/src/utils/__tests__/flows.test.ts +65 -0
  365. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  366. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  367. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  368. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  369. package/src/utils/associationObjectVariable.ts +180 -0
  370. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  371. package/src/utils/createEphemeralContext.ts +142 -0
  372. package/src/utils/flows.ts +23 -0
  373. package/src/utils/index.ts +10 -2
  374. package/src/utils/jsxTransform.ts +39 -0
  375. package/src/utils/params-resolvers.ts +2 -2
  376. package/src/utils/parsePathnameToViewParams.ts +50 -6
  377. package/src/utils/pruneFilter.ts +41 -0
  378. package/src/utils/safeGlobals.ts +49 -3
  379. package/src/utils/schema-utils.ts +1 -1
  380. package/src/utils/serverContextParams.ts +1 -0
  381. package/src/utils/translation.ts +7 -2
  382. package/src/utils/variablesParams.ts +50 -38
  383. package/src/views/DrawerComponent.tsx +21 -2
  384. package/src/views/PageComponent.tsx +1 -1
  385. package/src/views/ViewNavigation.ts +20 -12
  386. package/src/views/__tests__/ViewNavigation.test.ts +10 -0
  387. package/src/views/createViewMeta.ts +393 -70
  388. package/src/views/index.tsx +1 -0
  389. package/src/views/useDialog.tsx +12 -10
  390. package/src/views/useDrawer.tsx +62 -37
  391. package/src/views/usePage.tsx +13 -10
  392. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  393. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  394. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  395. package/lib/runjs-context/index.d.ts +0 -19
  396. package/lib/runjs-context/index.js +0 -57
  397. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  398. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  399. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  400. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  401. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  402. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  403. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  404. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  405. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  406. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  407. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  408. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  409. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  410. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  411. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  412. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  413. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  414. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  415. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  416. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  417. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  418. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  419. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  420. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  421. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  422. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  423. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  424. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  425. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  426. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  427. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  428. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  429. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  430. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  431. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  432. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  433. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  434. package/src/runjs-context/index.ts +0 -20
  435. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  436. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  437. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  438. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  439. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  440. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  441. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  442. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  443. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  444. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  445. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  446. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  447. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  448. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  449. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  450. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  451. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  452. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  453. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  454. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  455. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  456. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  457. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  458. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  459. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  460. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  461. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  462. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -44,8 +44,8 @@ __export(params_resolvers_exports, {
44
44
  resolveExpressions: () => resolveExpressions
45
45
  });
46
46
  module.exports = __toCommonJS(params_resolvers_exports);
47
+ var import_shared = require("@nocobase/shared");
47
48
  var import_lodash = __toESM(require("lodash"));
48
- var import_client = require("@nocobase/utils/client");
49
49
  async function resolveDefaultParams(defaultParams, ctx) {
50
50
  if (!defaultParams) {
51
51
  return {};
@@ -275,9 +275,9 @@ async function compileExpression(expression, ctx) {
275
275
  if (!first) return void 0;
276
276
  const base = await ctx[first];
277
277
  if (segs.length === 0) return base;
278
- return (0, import_client.getValuesByPath)(base, segs.join("."));
278
+ return (0, import_shared.getValuesByPath)(base, segs.join("."));
279
279
  }, "resolveDotOnlyPath");
280
- const singleMatch = expression.match(/^\{\{\s*(.+)\s*\}\}$/);
280
+ const singleMatch = expression.match(/^\s*\{\{\s*([^{}]+?)\s*\}\}\s*$/);
281
281
  if (singleMatch) {
282
282
  const inner = singleMatch[1];
283
283
  const dotPath = matchDotOnly(inner);
@@ -12,7 +12,7 @@ export interface ViewParam {
12
12
  /** 标签页唯一标识符 */
13
13
  tabUid?: string;
14
14
  /** 弹窗记录的 id */
15
- filterByTk?: string;
15
+ filterByTk?: string | Record<string, string | number>;
16
16
  /** source Id */
17
17
  sourceId?: string;
18
18
  }
@@ -54,16 +54,52 @@ const parsePathnameToViewParams = /* @__PURE__ */ __name((pathname) => {
54
54
  break;
55
55
  }
56
56
  } else if (currentView && i + 1 < segments.length) {
57
- const value = segments[i + 1];
57
+ const rawValue = segments[i + 1];
58
+ let decoded = rawValue;
59
+ try {
60
+ decoded = decodeURIComponent(rawValue);
61
+ } catch (_) {
62
+ }
58
63
  switch (segment) {
59
64
  case "tab":
60
- currentView.tabUid = value;
65
+ currentView.tabUid = decoded;
61
66
  break;
62
- case "filterbytk":
63
- currentView.filterByTk = value;
67
+ case "filterbytk": {
68
+ const parseKeyValuePairs = /* @__PURE__ */ __name((s) => {
69
+ const obj = {};
70
+ s.split("&").forEach((pair) => {
71
+ const [k, v = ""] = pair.split("=");
72
+ if (!k) return;
73
+ try {
74
+ const key = decodeURIComponent(k);
75
+ const val = decodeURIComponent(v);
76
+ obj[key] = val;
77
+ } catch (_) {
78
+ obj[k] = v;
79
+ }
80
+ });
81
+ return obj;
82
+ }, "parseKeyValuePairs");
83
+ let parsed = decoded;
84
+ if (decoded && (decoded.startsWith("{") || decoded.startsWith("["))) {
85
+ try {
86
+ const maybe = JSON.parse(decoded);
87
+ if (maybe && typeof maybe === "object" && !Array.isArray(maybe)) {
88
+ parsed = maybe;
89
+ } else {
90
+ parsed = decoded;
91
+ }
92
+ } catch (_) {
93
+ parsed = decoded;
94
+ }
95
+ } else if (decoded && decoded.includes("=") && decoded.includes("&")) {
96
+ parsed = parseKeyValuePairs(decoded);
97
+ }
98
+ currentView.filterByTk = parsed;
64
99
  break;
100
+ }
65
101
  case "sourceid":
66
- currentView.sourceId = value;
102
+ currentView.sourceId = decoded;
67
103
  break;
68
104
  default:
69
105
  break;
@@ -0,0 +1,21 @@
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
+ * 递归清理筛选对象中的“空值”。
11
+ *
12
+ * 规则:
13
+ * - 移除:`null`、`undefined`、空字符串 `''`、空数组 `[]`、空对象 `{}`;
14
+ * - 保留:`false`、`0` 等有意义的“假值”。
15
+ *
16
+ * 注意:当清理后整体变为空结构时,返回 `undefined`,用于表示无需下发该条件。
17
+ *
18
+ * @param input 任意筛选对象/数组/原始值
19
+ * @returns 清理后的对象;若为空则返回 `undefined`
20
+ */
21
+ export declare function pruneFilter<T = any>(input: T): T | undefined;
@@ -11,6 +11,7 @@ var __defProp = Object.defineProperty;
11
11
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
12
  var __getOwnPropNames = Object.getOwnPropertyNames;
13
13
  var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
14
15
  var __export = (target, all) => {
15
16
  for (var name in all)
16
17
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -24,21 +25,28 @@ var __copyProps = (to, from, except, desc) => {
24
25
  return to;
25
26
  };
26
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
- var try_catch_async_snippet_exports = {};
28
- __export(try_catch_async_snippet_exports, {
29
- default: () => try_catch_async_snippet_default
28
+ var pruneFilter_exports = {};
29
+ __export(pruneFilter_exports, {
30
+ pruneFilter: () => pruneFilter
30
31
  });
31
- module.exports = __toCommonJS(try_catch_async_snippet_exports);
32
- var try_catch_async_snippet_default = {
33
- contexts: ["*"],
34
- prefix: "sn-try",
35
- label: "Try/catch template",
36
- description: "Async try/catch template with toast message",
37
- content: `
38
- try {
39
- // await some async work
40
- } catch (e) {
41
- ctx.message.error(ctx.t('Operation failed: {{msg}}', { msg: String(e?.message || e) }));
32
+ module.exports = __toCommonJS(pruneFilter_exports);
33
+ function pruneFilter(input) {
34
+ if (Array.isArray(input)) {
35
+ const arr = input.map((v) => pruneFilter(v)).filter((v) => v !== void 0);
36
+ return arr.length ? arr : void 0;
37
+ }
38
+ if (input && typeof input === "object") {
39
+ const out = {};
40
+ Object.keys(input).forEach((k) => {
41
+ const v = pruneFilter(input[k]);
42
+ if (v !== void 0) out[k] = v;
43
+ });
44
+ return Object.keys(out).length ? out : void 0;
45
+ }
46
+ return input === null || input === void 0 || typeof input === "string" && input === "" ? void 0 : input;
42
47
  }
43
- `
44
- };
48
+ __name(pruneFilter, "pruneFilter");
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ pruneFilter
52
+ });
@@ -7,10 +7,12 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  /**
10
- * 统一的安全全局对象代理:window/document
11
- * - 默认仅允许常用的定时器、console、Math、Date、addEventListener(绑定原 window)
12
- * - document 仅允许 createElement/querySelector/querySelectorAll
10
+ * 统一的安全全局对象代理:window/document/navigator
11
+ * - window:仅允许常用的定时器、console、Math、Date、addEventListener、open(安全包装)、location(安全代理)
12
+ * - document:仅允许 createElement/querySelector/querySelectorAll
13
+ * - navigator:仅提供极少量低风险能力(clipboard.writeText、onLine、language、languages)
13
14
  * - 不允许随意访问未声明的属性,最小权限原则
14
15
  */
15
16
  export declare function createSafeWindow(extra?: Record<string, any>): {};
16
17
  export declare function createSafeDocument(extra?: Record<string, any>): {};
18
+ export declare function createSafeNavigator(extra?: Record<string, any>): {};
@@ -28,6 +28,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
28
28
  var safeGlobals_exports = {};
29
29
  __export(safeGlobals_exports, {
30
30
  createSafeDocument: () => createSafeDocument,
31
+ createSafeNavigator: () => createSafeNavigator,
31
32
  createSafeWindow: () => createSafeWindow
32
33
  });
33
34
  module.exports = __toCommonJS(safeGlobals_exports);
@@ -172,8 +173,47 @@ function createSafeDocument(extra) {
172
173
  );
173
174
  }
174
175
  __name(createSafeDocument, "createSafeDocument");
176
+ function createSafeNavigator(extra) {
177
+ var _a;
178
+ const nav = typeof window !== "undefined" && window.navigator || void 0;
179
+ const clipboard = {};
180
+ const writeText = (_a = nav == null ? void 0 : nav.clipboard) == null ? void 0 : _a.writeText;
181
+ if (typeof writeText === "function") {
182
+ clipboard.writeText = writeText.bind(nav.clipboard);
183
+ }
184
+ const allowed = {
185
+ clipboard
186
+ };
187
+ Object.defineProperty(allowed, "onLine", {
188
+ get: /* @__PURE__ */ __name(() => !!(nav == null ? void 0 : nav.onLine), "get"),
189
+ enumerable: true,
190
+ configurable: false
191
+ });
192
+ Object.defineProperty(allowed, "language", {
193
+ get: /* @__PURE__ */ __name(() => nav == null ? void 0 : nav.language, "get"),
194
+ enumerable: true,
195
+ configurable: false
196
+ });
197
+ Object.defineProperty(allowed, "languages", {
198
+ get: /* @__PURE__ */ __name(() => (nav == null ? void 0 : nav.languages) ? [...nav.languages] : void 0, "get"),
199
+ enumerable: true,
200
+ configurable: false
201
+ });
202
+ Object.assign(allowed, extra || {});
203
+ return new Proxy(
204
+ {},
205
+ {
206
+ get(_t, prop) {
207
+ if (prop in allowed) return allowed[prop];
208
+ throw new Error(`Access to navigator property "${String(prop)}" is not allowed.`);
209
+ }
210
+ }
211
+ );
212
+ }
213
+ __name(createSafeNavigator, "createSafeNavigator");
175
214
  // Annotate the CommonJS export names for ESM import in node:
176
215
  0 && (module.exports = {
177
216
  createSafeDocument,
217
+ createSafeNavigator,
178
218
  createSafeWindow
179
219
  });
@@ -131,14 +131,14 @@ function compileUiSchema(scope, uiSchema, options = {}) {
131
131
  }
132
132
  __name(compileUiSchema, "compileUiSchema");
133
133
  async function resolveStepUiSchema(model, flow, step) {
134
- var _a, _b;
134
+ var _a;
135
135
  const flowRuntimeContext = new import_flowContext.FlowRuntimeContext(model, flow.key, "settings");
136
136
  (0, import_setupRuntimeContextSteps.setupRuntimeContextSteps)(flowRuntimeContext, flow.steps, model, flow.key);
137
137
  flowRuntimeContext.defineProperty("currentStep", { value: step });
138
138
  let stepUiSchema = step.uiSchema;
139
139
  if (step.use) {
140
140
  try {
141
- const action = (_b = (_a = model.flowEngine) == null ? void 0 : _a.getAction) == null ? void 0 : _b.call(_a, step.use);
141
+ const action = (_a = model.getAction) == null ? void 0 : _a.call(model, step.use);
142
142
  if (action && action.uiSchema) {
143
143
  stepUiSchema = stepUiSchema || action.uiSchema;
144
144
  }
@@ -12,6 +12,7 @@ export type RecordRef = {
12
12
  id?: any;
13
13
  filterByTk?: any;
14
14
  dataSourceKey?: string;
15
+ sourceId?: any;
15
16
  fields?: string[];
16
17
  appends?: string[];
17
18
  record?: any;
@@ -14,5 +14,8 @@ import type { FlowModel } from '../models';
14
14
  * @returns 翻译函数,自动使用 flow-engine 命名空间
15
15
  */
16
16
  export declare function getT(model: FlowModel): (key: string, options?: any) => string;
17
+ export declare function tExpr(text: TFuncKey | TFuncKey[], options?: TOptions): string;
18
+ /**
19
+ * @deprecated use tExpr from `@nocobase/flow-engine` instead
20
+ */
17
21
  export declare function escapeT(text: TFuncKey | TFuncKey[], options?: TOptions): string;
18
- export { escapeT as tExpr };
@@ -29,7 +29,7 @@ var translation_exports = {};
29
29
  __export(translation_exports, {
30
30
  escapeT: () => escapeT,
31
31
  getT: () => getT,
32
- tExpr: () => escapeT
32
+ tExpr: () => tExpr
33
33
  });
34
34
  module.exports = __toCommonJS(translation_exports);
35
35
  var import_constants = require("./constants");
@@ -43,12 +43,16 @@ function getT(model) {
43
43
  return (key) => key;
44
44
  }
45
45
  __name(getT, "getT");
46
- function escapeT(text, options) {
46
+ function tExpr(text, options) {
47
47
  if (options) {
48
48
  return `{{t(${JSON.stringify(text)}, ${JSON.stringify(options)})}}`;
49
49
  }
50
50
  return `{{t(${JSON.stringify(text)})}}`;
51
51
  }
52
+ __name(tExpr, "tExpr");
53
+ function escapeT(text, options) {
54
+ return tExpr(text, options);
55
+ }
52
56
  __name(escapeT, "escapeT");
53
57
  // Annotate the CommonJS export names for ESM import in node:
54
58
  0 && (module.exports = {
@@ -6,11 +6,13 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
- import type { FlowContext, PropertyMeta, PropertyMetaFactory } from '../flowContext';
10
- import type { JSONValue } from './params-resolvers';
9
+ import { extractUsedVariableNames as _extractUsedVariableNames, extractUsedVariablePaths as _extractUsedVariablePaths } from '@nocobase/shared';
11
10
  import type { Collection } from '../data-source';
11
+ import type { FlowContext, PropertyMeta, PropertyMetaFactory } from '../flowContext';
12
12
  import { type RecordRef, type ServerContextParams } from '../utils/serverContextParams';
13
+ import type { JSONValue } from './params-resolvers';
13
14
  export declare function inferRecordRef(ctx: FlowContext): RecordRef | undefined;
15
+ export declare function inferViewRecordRef(ctx: FlowContext): RecordRef | undefined;
14
16
  export declare function inferParentRecordRef(ctx: FlowContext): RecordRef | undefined;
15
17
  export type RecordParamsBuilder = (ctx: FlowContext) => RecordRef | Promise<RecordRef> | undefined;
16
18
  /**
@@ -27,12 +29,14 @@ export declare function createRecordMetaFactory(collectionAccessor: () => Collec
27
29
  * - Title: t('Current record')
28
30
  * - Params: inferRecordRef(ctx)
29
31
  */
30
- export declare function createCurrentRecordMetaFactory(ctx: FlowContext, collectionAccessor: () => Collection | null): PropertyMetaFactory;
32
+ export declare function createCurrentRecordMetaFactory(ctx: FlowContext, collectionAccessor: () => Collection | null, options?: {
33
+ title?: string;
34
+ }): PropertyMetaFactory;
31
35
  /**
32
36
  * Extract top-level ctx variable names used inside a JSON template.
33
37
  * Supports dot and bracket notations, e.g. {{ ctx.record.id }}, {{ ctx['parentRecord'].name }}.
34
38
  */
35
- export declare const extractUsedVariableNames: any;
39
+ export declare const extractUsedVariableNames: typeof _extractUsedVariableNames;
36
40
  /**
37
41
  * Extract used top-level ctx variables with their subpaths.
38
42
  * Returns a map: varName -> string[] subPaths
@@ -42,7 +46,7 @@ export declare const extractUsedVariableNames: any;
42
46
  * - {{ ctx.view.record.id }} => { view: ['record.id'] }
43
47
  * - {{ ctx.twice(21) }} => { twice: [''] } // method call -> empty subPath
44
48
  */
45
- export declare const extractUsedVariablePaths: any;
49
+ export declare const extractUsedVariablePaths: typeof _extractUsedVariablePaths;
46
50
  /**
47
51
  * 根据模板中用到的 ctx 变量,收集并构建服务端解析所需的 contextParams。
48
52
  * - 通过 FlowContext 的 PropertyMeta.buildVariablesParams 收集 RecordRef
@@ -34,12 +34,13 @@ __export(variablesParams_exports, {
34
34
  extractUsedVariableNames: () => extractUsedVariableNames,
35
35
  extractUsedVariablePaths: () => extractUsedVariablePaths,
36
36
  inferParentRecordRef: () => inferParentRecordRef,
37
- inferRecordRef: () => inferRecordRef
37
+ inferRecordRef: () => inferRecordRef,
38
+ inferViewRecordRef: () => inferViewRecordRef
38
39
  });
39
40
  module.exports = __toCommonJS(variablesParams_exports);
40
- var import_createCollectionContextMeta = require("./createCollectionContextMeta");
41
+ var import_shared = require("@nocobase/shared");
41
42
  var import_serverContextParams = require("../utils/serverContextParams");
42
- var import_client = require("@nocobase/utils/client");
43
+ var import_createCollectionContextMeta = require("./createCollectionContextMeta");
43
44
  function isObject(value) {
44
45
  return typeof value === "object" && value !== null;
45
46
  }
@@ -71,14 +72,27 @@ function inferRecordRef(ctx) {
71
72
  return { collection, dataSourceKey, filterByTk };
72
73
  }
73
74
  __name(inferRecordRef, "inferRecordRef");
75
+ function inferViewRecordRef(ctx) {
76
+ var _a, _b, _c;
77
+ const view = ctx.view;
78
+ if (!view) return void 0;
79
+ const inputArgs = (view == null ? void 0 : view.inputArgs) || {};
80
+ const collection = (inputArgs == null ? void 0 : inputArgs.collectionName) || ((_a = view == null ? void 0 : view.record) == null ? void 0 : _a.collection);
81
+ const dataSourceKey = (inputArgs == null ? void 0 : inputArgs.dataSourceKey) || ((_b = view == null ? void 0 : view.record) == null ? void 0 : _b.dataSourceKey) || "main";
82
+ const filterByTk = (inputArgs == null ? void 0 : inputArgs.filterByTk) || ((_c = view == null ? void 0 : view.record) == null ? void 0 : _c.filterByTk);
83
+ const sourceId = inputArgs == null ? void 0 : inputArgs.sourceId;
84
+ if (!collection || typeof filterByTk === "undefined" || filterByTk === null) return void 0;
85
+ return { collection, dataSourceKey, filterByTk, sourceId };
86
+ }
87
+ __name(inferViewRecordRef, "inferViewRecordRef");
74
88
  function inferParentRecordRef(ctx) {
75
89
  var _a, _b, _c, _d;
76
90
  const resource = getResource(ctx);
77
91
  const dataSourceKey = ((_a = getCollection(ctx)) == null ? void 0 : _a.dataSourceKey) || ((_b = resource == null ? void 0 : resource.getDataSourceKey) == null ? void 0 : _b.call(resource));
78
- const rn = (_c = resource == null ? void 0 : resource.getResourceName) == null ? void 0 : _c.call(resource);
92
+ const resourceName = (_c = resource == null ? void 0 : resource.getResourceName) == null ? void 0 : _c.call(resource);
79
93
  const sourceId = (_d = resource == null ? void 0 : resource.getSourceId) == null ? void 0 : _d.call(resource);
80
- if (!rn || typeof sourceId === "undefined" || sourceId === null) return void 0;
81
- const parts = String(rn).split(".");
94
+ if (!resourceName || typeof sourceId === "undefined" || sourceId === null) return void 0;
95
+ const parts = String(resourceName).split(".");
82
96
  if (parts.length < 2) return void 0;
83
97
  return { collection: parts[0], dataSourceKey, filterByTk: sourceId };
84
98
  }
@@ -98,43 +112,39 @@ function createRecordMetaFactory(collectionAccessor, title, paramsBuilder) {
98
112
  return factory;
99
113
  }
100
114
  __name(createRecordMetaFactory, "createRecordMetaFactory");
101
- function createCurrentRecordMetaFactory(ctx, collectionAccessor) {
102
- var _a;
103
- const title = ((_a = ctx == null ? void 0 : ctx.t) == null ? void 0 : _a.call(ctx, "Current record")) || "Current record";
115
+ function createCurrentRecordMetaFactory(ctx, collectionAccessor, options) {
116
+ var _a, _b;
117
+ const title = (options == null ? void 0 : options.title) ? ((_a = ctx.t) == null ? void 0 : _a.call(ctx, options.title)) || options.title : ((_b = ctx.t) == null ? void 0 : _b.call(ctx, "Current record")) || "Current record";
104
118
  return createRecordMetaFactory(collectionAccessor, title, (c) => inferRecordRef(c));
105
119
  }
106
120
  __name(createCurrentRecordMetaFactory, "createCurrentRecordMetaFactory");
107
- const extractUsedVariableNames = import_client.extractUsedVariableNames;
108
- const extractUsedVariablePaths = import_client.extractUsedVariablePaths;
121
+ const extractUsedVariableNames = import_shared.extractUsedVariableNames;
122
+ const extractUsedVariablePaths = import_shared.extractUsedVariablePaths;
109
123
  async function collectContextParamsForTemplate(ctx, template) {
110
124
  var _a;
111
- try {
112
- const usage = (0, import_client.extractUsedVariablePaths)(template) || {};
113
- const varNames = Object.keys(usage);
114
- if (!varNames.length) return void 0;
115
- const input = {};
116
- for (const key of varNames) {
117
- const opt = (_a = ctx.getPropertyOptions) == null ? void 0 : _a.call(ctx, key);
118
- const meta = opt == null ? void 0 : opt.meta;
119
- if (!meta) continue;
120
- let built;
121
- try {
122
- const resolvedMeta = typeof meta === "function" ? await meta() : meta;
123
- const builder = resolvedMeta == null ? void 0 : resolvedMeta.buildVariablesParams;
124
- if (typeof builder === "function") {
125
- built = await builder(ctx);
126
- }
127
- } catch (err) {
128
- continue;
129
- }
130
- if (built) {
131
- input[key] = built;
125
+ const usage = (0, import_shared.extractUsedVariablePaths)(template) || {};
126
+ const varNames = Object.keys(usage);
127
+ if (!varNames.length) return void 0;
128
+ const input = {};
129
+ for (const key of varNames) {
130
+ const opt = (_a = ctx.getPropertyOptions) == null ? void 0 : _a.call(ctx, key);
131
+ const meta = opt == null ? void 0 : opt.meta;
132
+ if (!meta) continue;
133
+ let built;
134
+ try {
135
+ const resolvedMeta = typeof meta === "function" ? await meta() : meta;
136
+ const builder = resolvedMeta == null ? void 0 : resolvedMeta.buildVariablesParams;
137
+ if (typeof builder === "function") {
138
+ built = await builder(ctx);
132
139
  }
140
+ } catch (err) {
141
+ continue;
142
+ }
143
+ if (built) {
144
+ input[key] = built;
133
145
  }
134
- return (0, import_serverContextParams.buildServerContextParams)(ctx, input);
135
- } catch (_) {
136
- return void 0;
137
146
  }
147
+ return (0, import_serverContextParams.buildServerContextParams)(ctx, input);
138
148
  }
139
149
  __name(collectContextParamsForTemplate, "collectContextParamsForTemplate");
140
150
  // Annotate the CommonJS export names for ESM import in node:
@@ -146,5 +156,6 @@ __name(collectContextParamsForTemplate, "collectContextParamsForTemplate");
146
156
  extractUsedVariableNames,
147
157
  extractUsedVariablePaths,
148
158
  inferParentRecordRef,
149
- inferRecordRef
159
+ inferRecordRef,
160
+ inferViewRecordRef
150
161
  });
@@ -42,12 +42,13 @@ __export(DrawerComponent_exports, {
42
42
  module.exports = __toCommonJS(DrawerComponent_exports);
43
43
  var import_antd = require("antd");
44
44
  var React = __toESM(require("react"));
45
+ var import_MobilePopup = require("../components/MobilePopup");
45
46
  const DrawerComponent = React.forwardRef((props, ref) => {
46
47
  var _a;
47
- const { children, footer: initialFooter, title, extra, hidden, ...drawerProps } = props;
48
+ const { children, footer: initialFooter, title, extra, hidden, isMobile, ...drawerProps } = props;
48
49
  const [open, setOpen] = React.useState(true);
49
50
  const [footer, setFooter] = React.useState(() => initialFooter);
50
- const [header, setHeader] = React.useState({ title, extra });
51
+ const [header, setHeader] = React.useState({ title, extra, ...drawerProps.header });
51
52
  React.useImperativeHandle(
52
53
  ref,
53
54
  () => ({
@@ -75,6 +76,24 @@ const DrawerComponent = React.forwardRef((props, ref) => {
75
76
  const container = React.useMemo(() => {
76
77
  return document.querySelector("#nocobase-app-container");
77
78
  }, []);
79
+ if (isMobile) {
80
+ return /* @__PURE__ */ React.createElement(
81
+ import_MobilePopup.MobilePopup,
82
+ {
83
+ className: hidden ? "nb-hidden" : "",
84
+ visible: open,
85
+ ...drawerProps,
86
+ footer,
87
+ ...header,
88
+ onClose: () => {
89
+ var _a2;
90
+ setOpen(false);
91
+ (_a2 = drawerProps.afterClose) == null ? void 0 : _a2.call(drawerProps);
92
+ }
93
+ },
94
+ children
95
+ );
96
+ }
78
97
  return /* @__PURE__ */ React.createElement(
79
98
  import_antd.Drawer,
80
99
  {
@@ -56,7 +56,8 @@ const PageComponent = (0, import_react.forwardRef)((props, ref) => {
56
56
  hidden,
57
57
  title: _title,
58
58
  styles = {},
59
- zIndex
59
+ zIndex = 4
60
+ // 这个默认值是为了防止表格的阴影显示到子页面上面
60
61
  } = mergedProps;
61
62
  const closedRef = (0, import_react.useRef)(false);
62
63
  const flowEngine = (0, import_provider.useFlowEngine)();
@@ -7,16 +7,10 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  import { FlowEngineContext } from '../flowContext';
10
- interface ViewParam {
11
- /** 视图唯一标识符,一般为某个 Model 实例的 uid */
10
+ import { ViewParam as SharedViewParam } from '../utils';
11
+ type ViewParam = Omit<SharedViewParam, 'viewUid'> & {
12
12
  viewUid?: string;
13
- /** 标签页唯一标识符 */
14
- tabUid?: string;
15
- /** 弹窗记录的 id */
16
- filterByTk?: string;
17
- /** source Id */
18
- sourceId?: string;
19
- }
13
+ };
20
14
  /**
21
15
  * 将 ViewParam 数组转换为 pathname
22
16
  *
@@ -31,6 +31,17 @@ __export(ViewNavigation_exports, {
31
31
  generatePathnameFromViewParams: () => generatePathnameFromViewParams
32
32
  });
33
33
  module.exports = __toCommonJS(ViewNavigation_exports);
34
+ function encodeFilterByTk(val) {
35
+ if (val === void 0 || val === null) return "";
36
+ if (val && typeof val === "object" && !Array.isArray(val)) {
37
+ const pairs = Object.entries(val).map(([k, v]) => {
38
+ return `${encodeURIComponent(String(k))}=${encodeURIComponent(String(v))}`;
39
+ });
40
+ return encodeURIComponent(pairs.join("&"));
41
+ }
42
+ return encodeURIComponent(String(val));
43
+ }
44
+ __name(encodeFilterByTk, "encodeFilterByTk");
34
45
  function generatePathnameFromViewParams(viewParams) {
35
46
  if (!viewParams || viewParams.length === 0) {
36
47
  return "/admin";
@@ -44,8 +55,11 @@ function generatePathnameFromViewParams(viewParams) {
44
55
  if (viewParam.tabUid) {
45
56
  segments.push("tab", viewParam.tabUid);
46
57
  }
47
- if (viewParam.filterByTk) {
48
- segments.push("filterbytk", viewParam.filterByTk);
58
+ if (viewParam.filterByTk != null) {
59
+ const encoded = encodeFilterByTk(viewParam.filterByTk);
60
+ if (encoded) {
61
+ segments.push("filterbytk", encoded);
62
+ }
49
63
  }
50
64
  if (viewParam.sourceId) {
51
65
  segments.push("sourceid", viewParam.sourceId);
@@ -7,10 +7,38 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  import type { FlowContext, PropertyMetaFactory } from '../flowContext';
10
+ import type { FlowView } from './FlowView';
10
11
  /**
11
12
  * Create a meta factory for ctx.view that includes:
12
13
  * - buildVariablesParams: { record } via inferRecordRef
13
14
  * - properties.record: full collection meta via buildRecordMeta
14
15
  * - type/preventClose/inputArgs/navigation fields for better variable selection UX
15
16
  */
16
- export declare function createViewMeta(ctx: FlowContext, getView: () => any): PropertyMetaFactory;
17
+ export declare function createViewMeta(ctx: FlowContext): PropertyMetaFactory;
18
+ /**
19
+ * 为 ctx.popup 构建元信息:
20
+ * - popup.record:当前弹窗记录(服务端解析)
21
+ * - popup.resource:数据源信息(前端解析)
22
+ * - popup.parent:上级弹窗(无限级,前端解析;不存在则禁用/为空)
23
+ */
24
+ export declare function createPopupMeta(ctx: FlowContext, anchorView?: FlowView): PropertyMetaFactory;
25
+ /**
26
+ * 根据视图堆栈构建 popup 运行时值(resource + parent 链)
27
+ */
28
+ interface PopupNodeResource {
29
+ dataSourceKey: string;
30
+ collectionName?: string;
31
+ filterByTk?: any;
32
+ sourceId?: any;
33
+ }
34
+ interface PopupNode {
35
+ uid?: string;
36
+ resource: PopupNodeResource;
37
+ parent?: PopupNode;
38
+ }
39
+ export declare function buildPopupRuntime(ctx: FlowContext, view: FlowView): Promise<PopupNode | undefined>;
40
+ /**
41
+ * 在视图上下文中注册 popup 变量(统一消除重复)
42
+ */
43
+ export declare function registerPopupVariable(ctx: FlowContext, view: FlowView): void;
44
+ export {};