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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +90 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +4 -2
  6. package/lib/JSRunner.js +3 -0
  7. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  8. package/lib/components/FieldModelRenderer.js +10 -4
  9. package/lib/components/FieldSkeleton.d.ts +10 -0
  10. package/lib/components/FieldSkeleton.js +64 -0
  11. package/lib/components/FlowContextSelector.js +7 -2
  12. package/lib/components/FlowModelRenderer.d.ts +2 -5
  13. package/lib/components/FlowModelRenderer.js +16 -47
  14. package/lib/components/FormItem.js +5 -1
  15. package/lib/{runjs-context/snippets/global/requireAsync.snippet.d.ts → components/dnd/findModelUidPosition.d.ts} +4 -7
  16. package/lib/{runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js → components/dnd/findModelUidPosition.js} +23 -19
  17. package/lib/components/dnd/gridDragPlanner.d.ts +130 -0
  18. package/lib/components/dnd/gridDragPlanner.js +497 -0
  19. package/lib/components/dnd/index.d.ts +2 -2
  20. package/lib/components/dnd/index.js +5 -5
  21. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  22. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  23. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  25. package/lib/components/variables/VariableInput.js +16 -2
  26. package/lib/components/variables/VariableTag.js +43 -2
  27. package/lib/components/variables/types.d.ts +2 -0
  28. package/lib/data-source/index.d.ts +12 -4
  29. package/lib/data-source/index.js +19 -13
  30. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  31. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  32. package/lib/executor/FlowExecutor.d.ts +4 -5
  33. package/lib/executor/FlowExecutor.js +135 -100
  34. package/lib/flowContext.d.ts +33 -5
  35. package/lib/flowContext.js +193 -76
  36. package/lib/flowEngine.d.ts +8 -1
  37. package/lib/flowEngine.js +18 -6
  38. package/lib/flowSettings.d.ts +2 -1
  39. package/lib/flowSettings.js +12 -8
  40. package/lib/hooks/useApplyAutoFlows.js +2 -1
  41. package/lib/index.d.ts +7 -1
  42. package/lib/index.js +32 -3
  43. package/lib/locale/en-US.json +4 -2
  44. package/lib/locale/index.d.ts +4 -0
  45. package/lib/locale/zh-CN.json +4 -2
  46. package/lib/models/CollectionFieldModel.d.ts +2 -0
  47. package/lib/models/CollectionFieldModel.js +43 -3
  48. package/lib/models/flowModel.d.ts +28 -29
  49. package/lib/models/flowModel.js +114 -92
  50. package/lib/models/forkFlowModel.d.ts +4 -4
  51. package/lib/models/forkFlowModel.js +32 -8
  52. package/lib/provider.d.ts +3 -1
  53. package/lib/provider.js +7 -5
  54. package/lib/resources/multiRecordResource.js +2 -0
  55. package/lib/resources/singleRecordResource.js +1 -0
  56. package/lib/resources/sqlResource.d.ts +1 -0
  57. package/lib/resources/sqlResource.js +20 -24
  58. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  60. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  62. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  64. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  65. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  66. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  67. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  68. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  69. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  70. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  71. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  72. package/lib/runjs-context/contexts/base.d.ts +9 -0
  73. package/lib/runjs-context/contexts/base.js +183 -0
  74. package/lib/runjs-context/helpers.d.ts +5 -2
  75. package/lib/runjs-context/helpers.js +36 -27
  76. package/lib/runjs-context/registry.d.ts +7 -4
  77. package/lib/runjs-context/registry.js +10 -42
  78. package/lib/runjs-context/setup.d.ts +9 -0
  79. package/lib/runjs-context/setup.js +82 -0
  80. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  81. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  82. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  83. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  84. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  85. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  86. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  87. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  88. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  89. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  90. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  92. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  93. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  94. package/lib/runjs-context/snippets/index.d.ts +14 -3
  95. package/lib/runjs-context/snippets/index.js +161 -40
  96. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  97. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  98. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  99. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  100. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  101. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  102. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  103. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  105. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  107. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  109. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  111. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  113. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  115. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  117. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  119. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  121. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  123. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  125. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  127. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  129. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  131. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  133. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  135. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  137. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  139. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  141. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  143. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  145. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  147. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  149. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  151. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  153. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  155. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  157. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  159. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  161. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  163. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  165. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  167. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  169. package/lib/runjs-context/snippets/types.d.ts +9 -1
  170. package/lib/types.d.ts +28 -3
  171. package/lib/types.js +4 -3
  172. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  173. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  174. package/lib/utils/createEphemeralContext.d.ts +13 -0
  175. package/lib/utils/createEphemeralContext.js +140 -0
  176. package/lib/utils/index.d.ts +3 -2
  177. package/lib/utils/index.js +5 -2
  178. package/lib/utils/jsxTransform.d.ts +15 -0
  179. package/lib/utils/jsxTransform.js +68 -0
  180. package/lib/utils/params-resolvers.js +3 -3
  181. package/lib/utils/safeGlobals.d.ts +5 -3
  182. package/lib/utils/safeGlobals.js +40 -0
  183. package/lib/utils/schema-utils.js +2 -2
  184. package/lib/utils/serverContextParams.d.ts +1 -0
  185. package/lib/utils/variablesParams.d.ts +9 -5
  186. package/lib/utils/variablesParams.js +47 -36
  187. package/lib/views/PageComponent.js +2 -1
  188. package/lib/views/createViewMeta.d.ts +29 -1
  189. package/lib/views/createViewMeta.js +338 -72
  190. package/lib/views/index.d.ts +1 -0
  191. package/lib/views/index.js +3 -0
  192. package/lib/views/useDialog.d.ts +8 -8
  193. package/lib/views/useDialog.js +8 -7
  194. package/lib/views/useDrawer.d.ts +8 -8
  195. package/lib/views/useDrawer.js +40 -26
  196. package/lib/views/usePage.d.ts +8 -8
  197. package/lib/views/usePage.js +8 -7
  198. package/package.json +5 -3
  199. package/src/BlockScopedFlowEngine.ts +86 -0
  200. package/src/FlowContextProvider.tsx +4 -2
  201. package/src/JSRunner.ts +3 -0
  202. package/src/ViewScopedFlowEngine.ts +1 -1
  203. package/src/__tests__/JSRunner.test.ts +62 -53
  204. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  205. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  206. package/src/__tests__/flow-engine.test.ts +3 -0
  207. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  208. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  209. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  210. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  211. package/src/__tests__/runjsContext.test.ts +216 -35
  212. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  213. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  214. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  215. package/src/__tests__/runjsLocales.test.ts +36 -0
  216. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  217. package/src/__tests__/runjsSnippets.test.ts +140 -0
  218. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  219. package/src/components/DynamicFlowsEditor.tsx +3 -4
  220. package/src/components/FieldModelRenderer.tsx +16 -5
  221. package/src/components/FieldSkeleton.tsx +27 -0
  222. package/src/components/FlowContextSelector.tsx +6 -2
  223. package/src/components/FlowModelRenderer.tsx +30 -78
  224. package/src/components/FormItem.tsx +8 -1
  225. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  226. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  227. package/src/components/dnd/README.md +149 -0
  228. package/src/components/dnd/findModelUidPosition.ts +26 -0
  229. package/src/components/dnd/gridDragPlanner.ts +659 -0
  230. package/src/components/dnd/index.tsx +3 -3
  231. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  232. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  233. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  234. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  235. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +424 -0
  236. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  237. package/src/components/variables/VariableInput.tsx +22 -2
  238. package/src/components/variables/VariableTag.tsx +54 -2
  239. package/src/components/variables/types.ts +2 -0
  240. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  241. package/src/data-source/index.ts +17 -11
  242. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  243. package/src/executor/FlowExecutor.ts +178 -121
  244. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  245. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  246. package/src/flowContext.ts +266 -97
  247. package/src/flowEngine.ts +21 -6
  248. package/src/flowSettings.ts +9 -4
  249. package/src/hooks/useApplyAutoFlows.ts +3 -1
  250. package/src/index.ts +12 -1
  251. package/src/locale/en-US.json +4 -2
  252. package/src/locale/zh-CN.json +4 -2
  253. package/src/models/CollectionFieldModel.tsx +43 -4
  254. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  255. package/src/models/__tests__/flowModel.test.ts +234 -111
  256. package/src/models/__tests__/forkFlowModel.test.ts +22 -7
  257. package/src/models/flowModel.tsx +149 -125
  258. package/src/models/forkFlowModel.ts +41 -8
  259. package/src/provider.tsx +10 -7
  260. package/src/resources/multiRecordResource.ts +2 -0
  261. package/src/resources/singleRecordResource.ts +1 -0
  262. package/src/resources/sqlResource.ts +20 -25
  263. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  264. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  265. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  266. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  267. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  268. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  269. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  270. package/src/runjs-context/contexts/base.ts +171 -0
  271. package/src/runjs-context/helpers.ts +32 -30
  272. package/src/runjs-context/registry.ts +16 -47
  273. package/src/runjs-context/setup.ts +51 -0
  274. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  275. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  276. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  277. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  278. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  279. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  280. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  281. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  282. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  283. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  284. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  285. package/src/runjs-context/snippets/index.ts +177 -39
  286. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  287. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  288. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  289. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  290. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  291. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  292. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  293. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  294. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  295. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  296. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  297. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  298. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  299. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  300. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  301. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  302. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  303. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  304. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  305. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  306. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  307. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  308. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  309. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  310. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  311. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  312. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  313. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  314. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  315. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  316. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  317. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  318. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  319. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  320. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  321. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  322. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  323. package/src/runjs-context/snippets/types.ts +5 -1
  324. package/src/types.ts +34 -0
  325. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  326. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  327. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  328. package/src/utils/createEphemeralContext.ts +142 -0
  329. package/src/utils/index.ts +2 -2
  330. package/src/utils/jsxTransform.ts +39 -0
  331. package/src/utils/params-resolvers.ts +2 -2
  332. package/src/utils/safeGlobals.ts +49 -3
  333. package/src/utils/schema-utils.ts +1 -1
  334. package/src/utils/serverContextParams.ts +1 -0
  335. package/src/utils/variablesParams.ts +50 -38
  336. package/src/views/PageComponent.tsx +1 -1
  337. package/src/views/createViewMeta.ts +393 -70
  338. package/src/views/index.tsx +1 -0
  339. package/src/views/useDialog.tsx +12 -10
  340. package/src/views/useDrawer.tsx +60 -36
  341. package/src/views/usePage.tsx +13 -10
  342. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  343. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  344. package/lib/components/dnd/moveBlock.d.ts +0 -33
  345. package/lib/components/dnd/moveBlock.js +0 -302
  346. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  347. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  348. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  349. package/lib/runjs-context/index.d.ts +0 -19
  350. package/lib/runjs-context/index.js +0 -57
  351. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  352. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  353. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  354. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  355. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  356. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  357. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  358. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  359. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  360. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  361. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  362. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  363. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  364. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  365. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  366. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  367. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  368. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  369. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  370. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  371. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  372. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  373. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  374. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  375. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  376. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  377. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  378. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  379. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  380. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  381. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  382. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  383. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  384. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  385. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  386. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  387. package/src/components/dnd/moveBlock.ts +0 -379
  388. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  389. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  390. package/src/runjs-context/index.ts +0 -20
  391. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  392. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  393. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  394. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  395. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  396. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  397. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  398. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  399. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  400. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  401. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  402. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  403. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  404. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  405. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  406. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  407. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  408. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  409. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  410. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  411. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  412. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  413. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  414. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  415. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  416. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  417. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  418. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../types';
11
+
12
+ const snippet: SnippetModule = {
13
+ contexts: ['*'],
14
+ prefix: 'sn-require',
15
+ label: 'Load AMD module',
16
+ description: 'Dynamically load an AMD/RequireJS module by URL',
17
+ locales: {
18
+ 'zh-CN': {
19
+ label: '加载 AMD 模块',
20
+ description: '通过 RequireJS 按 URL 动态加载 AMD 模块',
21
+ },
22
+ },
23
+ content: `
24
+ // Load an external library (AMD/RequireJS)
25
+ const dayjs = await ctx.requireAsync('https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js');
26
+ console.log('dayjs loaded:', dayjs?.default || dayjs);
27
+ `,
28
+ };
29
+
30
+ export default snippet;
@@ -7,13 +7,23 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- export default {
10
+ import type { SnippetModule } from '../types';
11
+
12
+ const snippet: SnippetModule = {
11
13
  contexts: ['*'],
12
14
  prefix: 'sn-window-open',
13
15
  label: 'Open new window',
14
16
  description: 'Safely open a new browser window/tab',
17
+ locales: {
18
+ 'zh-CN': {
19
+ label: '打开新窗口',
20
+ description: '安全地打开一个新的浏览器窗口或标签页',
21
+ },
22
+ },
15
23
  content: `
16
24
  // Open a new window/tab
17
25
  window.open('https://example.com', '_blank');
18
26
  `,
19
27
  };
28
+
29
+ export default snippet;
@@ -7,53 +7,191 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- export type EngineSnippetMap = Record<string, () => Promise<any>>;
10
+ import { RunJSContextRegistry } from '../registry';
11
11
 
12
- export const engineSnippets: EngineSnippetMap = {
12
+ // Simple manual exports - no build-time magic needed
13
+ const snippets: Record<string, () => Promise<any>> = {
13
14
  // global
14
15
  'global/message-success': () => import('./global/message-success.snippet'),
15
16
  'global/message-error': () => import('./global/message-error.snippet'),
16
- 'global/copy-to-clipboard': () => import('./global/copy-to-clipboard.snippet'),
17
- 'global/copy-record-json': () => import('./global/copy-record-json.snippet'),
18
- 'global/log-json-record': () => import('./global/log-json-record.snippet'),
19
- 'global/api-request-get': () => import('./global/api-request-get.snippet'),
20
- 'global/api-request-post': () => import('./global/api-request-post.snippet'),
21
- 'global/requireAsync': () => import('./global/requireAsync.snippet'),
22
- 'global/try-catch-async': () => import('./global/try-catch-async.snippet'),
23
- 'global/sleep': () => import('./global/sleep.snippet'),
17
+ 'global/api-request': () => import('./global/api-request.snippet'),
18
+ 'global/require-amd': () => import('./global/require-amd.snippet'),
19
+ 'global/import-esm': () => import('./global/import-esm.snippet'),
24
20
  'global/notification-open': () => import('./global/notification-open.snippet'),
25
21
  'global/window-open': () => import('./global/window-open.snippet'),
26
- 'global/console-log-ctx': () => import('./global/console-log-ctx.snippet'),
27
22
  'global/open-view-drawer': () => import('./global/open-view-drawer.snippet'),
28
23
  'global/open-view-dialog': () => import('./global/open-view-dialog.snippet'),
29
- 'global/view-navigation-push': () => import('./global/view-navigation-push.snippet'),
24
+ 'global/query-selector': () => import('./global/query-selector.snippet'),
25
+ 'global/clipboard-copy-text': () => import('./global/clipboard-copy-text.snippet'),
30
26
  // libs
31
- 'libs/echarts-init': () => import('./libs/echarts-init.snippet'),
32
- // scene/jsblock
33
- 'scene/jsblock/render-basic': () => import('./scene/jsblock/render-basic.snippet'),
34
- 'scene/jsblock/render-react': () => import('./scene/jsblock/render-react.snippet'),
35
- 'scene/jsblock/render-card': () => import('./scene/jsblock/render-card.snippet'),
36
- 'scene/jsblock/render-button-handler': () => import('./scene/jsblock/render-button-handler.snippet'),
37
- 'scene/jsblock/jsx-mount': () => import('./scene/jsblock/jsx-mount.snippet'),
38
- 'scene/jsblock/jsx-unmount': () => import('./scene/jsblock/jsx-unmount.snippet'),
39
- 'scene/jsblock/add-event-listener': () => import('./scene/jsblock/add-event-listener.snippet'),
40
- 'scene/jsblock/append-style': () => import('./scene/jsblock/append-style.snippet'),
41
- // scene/jsfield
42
- 'scene/jsfield/innerHTML-value': () => import('./scene/jsfield/innerHTML-value.snippet'),
43
- 'scene/jsfield/format-number': () => import('./scene/jsfield/format-number.snippet'),
44
- 'scene/jsfield/color-by-value': () => import('./scene/jsfield/color-by-value.snippet'),
45
- // scene/jsitem
46
- 'scene/jsitem/render-basic': () => import('./scene/jsitem/render-basic.snippet'),
47
- // scene/actions
48
- 'scene/actions/record-id-message': () => import('./scene/actions/record-id-message.snippet'),
49
- 'scene/actions/run-action-basic': () => import('./scene/actions/run-action-basic.snippet'),
50
- 'scene/actions/collection-selected-count': () => import('./scene/actions/collection-selected-count.snippet'),
51
- 'scene/actions/iterate-selected-rows': () => import('./scene/actions/iterate-selected-rows.snippet'),
52
- // scene/linkage
53
- 'scene/linkage/set-field-value': () => import('./scene/linkage/set-field-value.snippet'),
54
- 'scene/linkage/toggle-visible': () => import('./scene/linkage/toggle-visible.snippet'),
55
- 'scene/linkage/set-disabled': () => import('./scene/linkage/set-disabled.snippet'),
56
- 'scene/linkage/set-required': () => import('./scene/linkage/set-required.snippet'),
27
+ 'scene/block/echarts-init': () => import('./scene/block/echarts-init.snippet'),
28
+ // scene/block
29
+ 'scene/block/render-react': () => import('./scene/block/render-react.snippet'),
30
+ 'scene/block/render-react-jsx': () => import('./scene/block/render-react-jsx.snippet'),
31
+ 'scene/block/render-button-handler': () => import('./scene/block/render-button-handler.snippet'),
32
+ 'scene/block/add-event-listener': () => import('./scene/block/add-event-listener.snippet'),
33
+ 'scene/block/chartjs-bar': () => import('./scene/block/chartjs-bar.snippet'),
34
+ 'scene/block/vue-component': () => import('./scene/block/vue-component.snippet'),
35
+ 'scene/block/resource-example': () => import('./scene/block/resource-example.snippet'),
36
+ 'scene/block/api-fetch-render-list': () => import('./scene/block/api-fetch-render-list.snippet'),
37
+ 'scene/block/render-info-card': () => import('./scene/block/render-info-card.snippet'),
38
+ 'scene/block/render-statistics': () => import('./scene/block/render-statistics.snippet'),
39
+ 'scene/block/render-timeline': () => import('./scene/block/render-timeline.snippet'),
40
+ 'scene/block/render-iframe': () => import('./scene/block/render-iframe.snippet'),
41
+ // scene/detail
42
+ 'scene/detail/innerHTML-value': () => import('./scene/detail/innerHTML-value.snippet'),
43
+ 'scene/detail/format-number': () => import('./scene/detail/format-number.snippet'),
44
+ 'scene/detail/color-by-value': () => import('./scene/detail/color-by-value.snippet'),
45
+ 'scene/detail/copy-to-clipboard': () => import('./scene/detail/copy-to-clipboard.snippet'),
46
+ 'scene/detail/status-tag': () => import('./scene/detail/status-tag.snippet'),
47
+ 'scene/detail/relative-time': () => import('./scene/detail/relative-time.snippet'),
48
+ 'scene/detail/percentage-bar': () => import('./scene/detail/percentage-bar.snippet'),
49
+ // scene/form
50
+ 'scene/form/render-basic': () => import('./scene/form/render-basic.snippet'),
51
+ 'scene/form/set-field-value': () => import('./scene/form/set-field-value.snippet'),
52
+ 'scene/form/toggle-visible': () => import('./scene/form/toggle-visible.snippet'),
53
+ 'scene/form/set-disabled': () => import('./scene/form/set-disabled.snippet'),
54
+ 'scene/form/set-required': () => import('./scene/form/set-required.snippet'),
55
+ 'scene/form/calculate-total': () => import('./scene/form/calculate-total.snippet'),
56
+ 'scene/form/conditional-required': () => import('./scene/form/conditional-required.snippet'),
57
+ 'scene/form/cascade-select': () => import('./scene/form/cascade-select.snippet'),
58
+ 'scene/form/toggle-multiple-fields': () => import('./scene/form/toggle-multiple-fields.snippet'),
59
+ 'scene/form/copy-field-values': () => import('./scene/form/copy-field-values.snippet'),
60
+ // scene/table
61
+ 'scene/table/cell-open-dialog': () => import('./scene/table/cell-open-dialog.snippet'),
62
+ 'scene/table/concat-fields': () => import('./scene/table/concat-fields.snippet'),
63
+ 'scene/table/collection-selected-count': () => import('./scene/table/collection-selected-count.snippet'),
64
+ 'scene/table/iterate-selected-rows': () => import('./scene/table/iterate-selected-rows.snippet'),
65
+ 'scene/table/destroy-selected': () => import('./scene/table/destroy-selected.snippet'),
66
+ 'scene/table/export-selected-json': () => import('./scene/table/export-selected-json.snippet'),
57
67
  };
58
68
 
59
- export default engineSnippets;
69
+ export default snippets;
70
+
71
+ // Cohesive snippet helpers for clients (editor, etc.)
72
+ type EngineSnippetEntry = {
73
+ name: string;
74
+ prefix?: string;
75
+ description?: string;
76
+ body: string;
77
+ ref: string;
78
+ group?: string;
79
+ groups?: string[];
80
+ scenes?: string[];
81
+ };
82
+
83
+ function deriveNameFromKey(key: string): string {
84
+ const parts = key.split('/');
85
+ return parts[parts.length - 1] || key;
86
+ }
87
+
88
+ function normalizeScenes(def: any, key: string): string[] {
89
+ if (Array.isArray(def?.scenes) && def.scenes.length) {
90
+ return def.scenes.map((scene: any) => String(scene).trim()).filter((scene: string) => scene.length > 0);
91
+ }
92
+ const parts = key.split('/');
93
+ if (parts[0] === 'scene' && parts[1]) {
94
+ return [parts[1]];
95
+ }
96
+ return [];
97
+ }
98
+
99
+ function computeGroups(def: any, key: string): string[] {
100
+ const scenes = normalizeScenes(def, key);
101
+ if (scenes.length) {
102
+ return scenes.map((scene) => `scene/${scene}`);
103
+ }
104
+ const parts = key.split('/');
105
+ if (!parts.length) return [];
106
+ const first = parts[0];
107
+ if (first === 'global' || first === 'libs') return [first];
108
+ if (first === 'scene' && parts.length >= 2) return [`${first}/${parts[1]}`];
109
+ if (parts.length >= 2) return [`${parts[0]}/${parts[1]}`];
110
+ return [parts[0]];
111
+ }
112
+
113
+ function resolveLocaleMeta(def: any, locale?: string) {
114
+ if (!locale || !def?.locales) return {};
115
+ const exact = def.locales[locale];
116
+ if (exact) return exact;
117
+ const normalized = locale.toLowerCase();
118
+ if (normalized !== locale && def.locales[normalized]) return def.locales[normalized];
119
+ const base = locale.split('-')[0];
120
+ if (base && def.locales[base]) return def.locales[base];
121
+ if (base) {
122
+ const lowerBase = base.toLowerCase();
123
+ if (def.locales[lowerBase]) return def.locales[lowerBase];
124
+ }
125
+ return {};
126
+ }
127
+
128
+ export async function getSnippetBody(ref: string): Promise<string> {
129
+ const loader = (snippets as any)[ref];
130
+ if (!loader) throw new Error(`[flow-engine] snippet not found: ${ref}`);
131
+ const mod = await loader();
132
+ const def = mod?.default;
133
+ // engine snippet modules export a SnippetModule as default
134
+ const content = def?.content ?? mod?.content ?? mod?.body ?? '';
135
+ return typeof content === 'string' ? content : String(content ?? '');
136
+ }
137
+
138
+ export async function listSnippetsForContext(
139
+ ctxClassName: string,
140
+ version = 'v1',
141
+ locale?: string,
142
+ ): Promise<EngineSnippetEntry[]> {
143
+ const entries: EngineSnippetEntry[] = [];
144
+ const allowedContextNames = new Set<string>();
145
+ if (typeof ctxClassName === 'string' && ctxClassName) allowedContextNames.add(ctxClassName);
146
+ try {
147
+ const resolvedCtor = RunJSContextRegistry['resolve'](version as any, ctxClassName);
148
+ if (resolvedCtor?.name) allowedContextNames.add(resolvedCtor.name);
149
+ } catch (_) {
150
+ // ignore resolution failure
151
+ }
152
+ await Promise.all(
153
+ Object.entries(snippets).map(async ([key, loader]) => {
154
+ const mod = await (loader as any)();
155
+ const def = mod?.default || {};
156
+ const body: any = def?.content ?? mod?.content;
157
+ if (typeof body !== 'string') return;
158
+ let ok = true;
159
+ if (Array.isArray(def?.contexts) && def.contexts.length) {
160
+ const ctxNames = def.contexts.map((item: any) => {
161
+ if (item === '*') return '*';
162
+ if (typeof item === 'string') return item;
163
+ if (typeof item === 'function') return item.name || '*';
164
+ if (item && typeof item === 'object' && typeof item.name === 'string') return item.name;
165
+ return String(item ?? '');
166
+ });
167
+ if (ctxClassName === '*') {
168
+ // '*' means return all snippets without filtering by context
169
+ ok = true;
170
+ } else {
171
+ ok = ctxNames.includes('*') || ctxNames.some((name: string) => allowedContextNames.has(name));
172
+ }
173
+ }
174
+ if (ok && Array.isArray(def?.versions) && def.versions.length) {
175
+ ok = def.versions.includes('*') || def.versions.includes(version);
176
+ }
177
+ if (!ok) return;
178
+ const localeMeta = resolveLocaleMeta(def, locale);
179
+ const name = localeMeta.label || def?.label || deriveNameFromKey(key);
180
+ const description = localeMeta.description ?? def?.description;
181
+ const prefix = def?.prefix || name;
182
+ const groups = computeGroups(def, key);
183
+ const scenes = normalizeScenes(def, key);
184
+ entries.push({
185
+ name,
186
+ prefix,
187
+ description,
188
+ body,
189
+ ref: key,
190
+ group: groups[0],
191
+ groups,
192
+ scenes,
193
+ });
194
+ }),
195
+ );
196
+ return entries;
197
+ }
@@ -7,10 +7,20 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- export default {
11
- contexts: ['JSBlockRunJSContext'],
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
12
15
  prefix: 'sn-jsb-click',
13
16
  label: 'Add click listener',
17
+ description: 'Render a button and bind a click event handler',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '添加点击监听',
21
+ description: '渲染按钮并绑定点击事件处理',
22
+ },
23
+ },
14
24
  content:
15
25
  `
16
26
  // Render a button and bind a click handler
@@ -27,3 +37,5 @@ if (btn) {
27
37
  }
28
38
  `,
29
39
  };
40
+
41
+ export default snippet;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-jsb-fetch-list',
16
+ label: 'Fetch & render list',
17
+ description: 'Fetch a small list via ctx.api and render basic HTML',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '拉取并渲染列表',
21
+ description: '使用 ctx.api 拉取少量数据,并渲染基础 HTML 列表',
22
+ },
23
+ },
24
+ content: `
25
+ // Fetch users
26
+ const { data } = await ctx.api.request({
27
+ url: 'users:list',
28
+ method: 'get',
29
+ params: { pageSize: 5 },
30
+ });
31
+ const rows = Array.isArray(data?.data) ? data.data : (Array.isArray(data) ? data : []);
32
+
33
+ // Render as a simple HTML list
34
+ ctx.element.innerHTML = [
35
+ '<div style="padding:12px">',
36
+ '<h4 style="margin:0 0 8px">' + ctx.t('Users') + '</h4>',
37
+ '<ul style="margin:0; padding-left:20px">',
38
+ ...rows.map((r, i) => '<li>#' + (i + 1) + ': ' + String((r && (r.nickname ?? r.username ?? r.id)) ?? '') + '</li>'),
39
+ '</ul>',
40
+ '</div>'
41
+ ].join('');
42
+ `,
43
+ };
44
+
45
+ export default snippet;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-jsb-chartjs',
16
+ label: 'Render Chart.js bar chart',
17
+ description: 'Load Chart.js from CDN and render a basic bar chart inside the block',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '渲染 Chart.js 柱状图',
21
+ description: '通过 CDN 引入 Chart.js 并在区块中渲染基础柱状图',
22
+ },
23
+ },
24
+ content: `
25
+ const wrapper = document.createElement('div');
26
+ wrapper.style.padding = '16px';
27
+ wrapper.style.background = '#fff';
28
+ wrapper.style.borderRadius = '8px';
29
+ wrapper.style.boxShadow = '0 2px 8px rgba(0,0,0,0.05)';
30
+
31
+ const canvas = document.createElement('canvas');
32
+ canvas.width = 480;
33
+ canvas.height = 320;
34
+ wrapper.appendChild(canvas);
35
+ ctx.element.replaceChildren(wrapper);
36
+
37
+ async function renderChart() {
38
+ const loaded = await ctx.requireAsync('https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js');
39
+ const Chart = loaded?.Chart || loaded?.default?.Chart || loaded?.default;
40
+ if (!Chart) {
41
+ throw new Error('Chart.js is not available');
42
+ }
43
+
44
+ const labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'];
45
+ const data = [12, 18, 9, 15, 22];
46
+
47
+ new Chart(canvas.getContext('2d'), {
48
+ type: 'bar',
49
+ data: {
50
+ labels,
51
+ datasets: [
52
+ {
53
+ label: ctx.t('Daily visits'),
54
+ data,
55
+ backgroundColor: 'rgba(24, 144, 255, 0.6)',
56
+ borderColor: '#1890ff',
57
+ borderWidth: 1,
58
+ },
59
+ ],
60
+ },
61
+ options: {
62
+ plugins: {
63
+ legend: { display: true },
64
+ title: {
65
+ display: true,
66
+ text: ctx.t('Weekly overview'),
67
+ },
68
+ },
69
+ },
70
+ });
71
+ }
72
+
73
+ renderChart().catch((error) => {
74
+ console.error('[RunJS] failed to render chart', error);
75
+ wrapper.innerHTML = '<div style="color:#c00;">' + (error?.message || ctx.t('Chart initialization failed')) + '</div>';
76
+ });
77
+ `,
78
+ };
79
+
80
+ export default snippet;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
11
+ import { SnippetModule } from '../../types';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-echarts',
16
+ label: 'Init ECharts',
17
+ description: 'Load ECharts and render a simple chart inside the block',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '初始化 ECharts',
21
+ description: '加载 ECharts 并在区块内渲染示例图表',
22
+ },
23
+ },
24
+ content: `
25
+ const container = document.createElement('div');
26
+ container.style.height = '400px';
27
+ container.style.width = '100%';
28
+ ctx.element.replaceChildren(container);
29
+ const echarts = await ctx.requireAsync('https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js');
30
+ if (!echarts) {
31
+ throw new Error('ECharts library not loaded');
32
+ }
33
+
34
+ const chart = echarts.init(container);
35
+ chart.setOption({
36
+ title: { text: ctx.t('ECharts') },
37
+ series: [{ type: 'pie', data: [{ value: 1, name: ctx.t('A') }] }],
38
+ });
39
+
40
+ chart.resize();
41
+ `,
42
+ };
43
+
44
+ export default snippet;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-jsb-button',
16
+ label: 'Render button handler',
17
+ description: 'Render a button and handle click events inside the block',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '按钮事件处理',
21
+ description: '在区块中渲染按钮并绑定点击处理逻辑',
22
+ },
23
+ },
24
+ content: `
25
+ const { Button } = ctx.antd;
26
+
27
+ ctx.render(
28
+ <Button type="primary" onClick={() => ctx.message.success(ctx.t('Clicked!'))}>
29
+ {ctx.t('Button')}
30
+ </Button>
31
+ );
32
+ `,
33
+ };
34
+
35
+ export default snippet;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-jsb-iframe',
16
+ label: 'Render iframe',
17
+ description: 'Embed example.com as a sandboxed iframe inside the block element',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '渲染 iframe',
21
+ description: '在区块中以 sandbox 限制嵌入 example.com 页面',
22
+ },
23
+ },
24
+ content: `
25
+ // Create an iframe that fills the current block container
26
+ const iframe = document.createElement('iframe');
27
+ iframe.src = 'https://example.com';
28
+ iframe.setAttribute('sandbox', 'allow-scripts');
29
+ iframe.style.width = '100%';
30
+ iframe.style.height = '100%';
31
+ iframe.style.border = 'none';
32
+
33
+ // Replace existing children so the iframe is the only content
34
+ ctx.element.replaceChildren(iframe);
35
+ `,
36
+ };
37
+
38
+ export default snippet;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-jsb-info-card',
16
+ label: 'Render record info card',
17
+ description: 'Display current record information in an Ant Design card',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '渲染记录信息卡片',
21
+ description: '使用 Ant Design 卡片显示当前记录的关键信息',
22
+ },
23
+ },
24
+ content: `
25
+ const { Card, Descriptions, Tag } = ctx.antd;
26
+
27
+ if (!ctx.record) {
28
+ ctx.render('<div style="padding:16px;color:#999;">' + ctx.t('No record data') + '</div>');
29
+ return;
30
+ }
31
+
32
+ const record = ctx.record;
33
+
34
+ ctx.render(
35
+ <Card title={ctx.t('Record Details')} bordered style={{ margin: 0 }}>
36
+ <Descriptions column={2} size="small">
37
+ <Descriptions.Item label={ctx.t('ID')}>{record.id || '-'}</Descriptions.Item>
38
+ <Descriptions.Item label={ctx.t('Status')}>
39
+ <Tag color={record.status === 'active' ? 'green' : 'default'}>{record.status || '-'}</Tag>
40
+ </Descriptions.Item>
41
+ <Descriptions.Item label={ctx.t('Title')}>{record.title || '-'}</Descriptions.Item>
42
+ <Descriptions.Item label={ctx.t('Created At')}>
43
+ {record.createdAt ? new Date(record.createdAt).toLocaleString() : '-'}
44
+ </Descriptions.Item>
45
+ </Descriptions>
46
+ </Card>
47
+ );
48
+
49
+ `,
50
+ };
51
+
52
+ export default snippet;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { SnippetModule } from '../../types';
11
+ import { JSBlockRunJSContext } from '../../../contexts/JSBlockRunJSContext';
12
+
13
+ const snippet: SnippetModule = {
14
+ contexts: [JSBlockRunJSContext],
15
+ prefix: 'sn-react-jsx',
16
+ label: 'Render React (JSX)',
17
+ description: 'Render a simple React component using JSX syntax',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '渲染 React(JSX)',
21
+ description: '使用 JSX 语法渲染一个简单的 React 组件',
22
+ },
23
+ },
24
+ content: `
25
+ // Render a React component with JSX
26
+ const { React } = ctx;
27
+
28
+ const App = () => (
29
+ <div style={{ padding: 12 }}>
30
+ <h3 style={{ margin: 0, color: '#1890ff' }}>Hello JSX</h3>
31
+ <div style={{ color: '#555' }}>This block is rendered by JSX.</div>
32
+ </div>
33
+ );
34
+
35
+ ctx.render(<App />);
36
+ `,
37
+ };
38
+
39
+ export default snippet;