@nocobase/flow-engine 2.0.0-alpha.2 → 2.0.0-alpha.20

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 (387) 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 +2 -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/wrappers/contextual/StepSettingsDialog.js +7 -1
  22. package/lib/components/variables/VariableInput.js +16 -2
  23. package/lib/components/variables/VariableTag.js +43 -2
  24. package/lib/components/variables/types.d.ts +2 -0
  25. package/lib/data-source/index.d.ts +12 -4
  26. package/lib/data-source/index.js +18 -12
  27. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  28. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  29. package/lib/executor/FlowExecutor.d.ts +4 -5
  30. package/lib/executor/FlowExecutor.js +122 -94
  31. package/lib/flowContext.d.ts +33 -5
  32. package/lib/flowContext.js +145 -74
  33. package/lib/flowEngine.d.ts +8 -1
  34. package/lib/flowEngine.js +12 -2
  35. package/lib/flowSettings.d.ts +2 -1
  36. package/lib/flowSettings.js +7 -3
  37. package/lib/hooks/useApplyAutoFlows.js +2 -1
  38. package/lib/index.d.ts +6 -1
  39. package/lib/index.js +29 -3
  40. package/lib/models/CollectionFieldModel.d.ts +2 -0
  41. package/lib/models/CollectionFieldModel.js +43 -3
  42. package/lib/models/flowModel.d.ts +28 -29
  43. package/lib/models/flowModel.js +110 -88
  44. package/lib/models/forkFlowModel.d.ts +2 -2
  45. package/lib/models/forkFlowModel.js +29 -6
  46. package/lib/provider.d.ts +3 -1
  47. package/lib/provider.js +7 -5
  48. package/lib/resources/multiRecordResource.js +2 -0
  49. package/lib/resources/singleRecordResource.js +1 -0
  50. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  51. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  52. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  53. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  54. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  55. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  56. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  57. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  58. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  60. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  62. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  64. package/lib/runjs-context/contexts/base.d.ts +9 -0
  65. package/lib/runjs-context/contexts/base.js +169 -0
  66. package/lib/runjs-context/helpers.d.ts +5 -2
  67. package/lib/runjs-context/helpers.js +36 -27
  68. package/lib/runjs-context/registry.d.ts +7 -4
  69. package/lib/runjs-context/registry.js +10 -42
  70. package/lib/runjs-context/setup.d.ts +9 -0
  71. package/lib/runjs-context/setup.js +82 -0
  72. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  73. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  74. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  75. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  76. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  77. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  78. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  79. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  80. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  81. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  82. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  83. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  84. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  85. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  86. package/lib/runjs-context/snippets/index.d.ts +14 -3
  87. package/lib/runjs-context/snippets/index.js +160 -40
  88. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  89. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  90. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  92. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  93. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  94. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  95. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  96. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +12 -6
  97. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  98. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  99. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  100. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +72 -0
  101. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  102. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +12 -11
  103. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +100 -0
  105. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +85 -0
  107. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  109. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  111. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  113. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  115. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  117. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  119. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  121. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  123. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  125. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  127. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  129. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  131. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  133. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  135. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  137. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  139. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  141. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  143. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  145. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  147. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  149. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  151. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  153. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  155. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  157. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  159. package/lib/runjs-context/snippets/types.d.ts +9 -1
  160. package/lib/types.d.ts +15 -3
  161. package/lib/types.js +4 -3
  162. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  163. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  164. package/lib/utils/index.d.ts +3 -2
  165. package/lib/utils/index.js +5 -2
  166. package/lib/utils/params-resolvers.js +2 -2
  167. package/lib/utils/safeGlobals.d.ts +5 -3
  168. package/lib/utils/safeGlobals.js +40 -0
  169. package/lib/utils/serverContextParams.d.ts +1 -0
  170. package/lib/utils/variablesParams.d.ts +9 -5
  171. package/lib/utils/variablesParams.js +47 -36
  172. package/lib/views/PageComponent.js +2 -1
  173. package/lib/views/createViewMeta.d.ts +29 -1
  174. package/lib/views/createViewMeta.js +321 -72
  175. package/lib/views/index.d.ts +1 -0
  176. package/lib/views/index.js +3 -0
  177. package/lib/views/useDialog.d.ts +8 -8
  178. package/lib/views/useDialog.js +8 -7
  179. package/lib/views/useDrawer.d.ts +8 -8
  180. package/lib/views/useDrawer.js +40 -26
  181. package/lib/views/usePage.d.ts +8 -8
  182. package/lib/views/usePage.js +8 -7
  183. package/package.json +4 -3
  184. package/src/BlockScopedFlowEngine.ts +86 -0
  185. package/src/FlowContextProvider.tsx +4 -2
  186. package/src/JSRunner.ts +3 -0
  187. package/src/ViewScopedFlowEngine.ts +1 -1
  188. package/src/__tests__/JSRunner.test.ts +62 -53
  189. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  190. package/src/__tests__/flow-engine.test.ts +3 -0
  191. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  192. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  193. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  194. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  195. package/src/__tests__/runjsContext.test.ts +216 -35
  196. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  197. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  198. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  199. package/src/__tests__/runjsLocales.test.ts +36 -0
  200. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  201. package/src/__tests__/runjsSnippets.test.ts +140 -0
  202. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  203. package/src/components/DynamicFlowsEditor.tsx +3 -4
  204. package/src/components/FieldModelRenderer.tsx +16 -5
  205. package/src/components/FieldSkeleton.tsx +27 -0
  206. package/src/components/FlowContextSelector.tsx +6 -2
  207. package/src/components/FlowModelRenderer.tsx +30 -78
  208. package/src/components/FormItem.tsx +8 -1
  209. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  210. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  211. package/src/components/dnd/README.md +149 -0
  212. package/src/components/dnd/findModelUidPosition.ts +26 -0
  213. package/src/components/dnd/gridDragPlanner.ts +659 -0
  214. package/src/components/dnd/index.tsx +3 -3
  215. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  216. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +1 -0
  217. package/src/components/variables/VariableInput.tsx +22 -2
  218. package/src/components/variables/VariableTag.tsx +54 -2
  219. package/src/components/variables/types.ts +2 -0
  220. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  221. package/src/data-source/index.ts +16 -10
  222. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  223. package/src/executor/FlowExecutor.ts +160 -114
  224. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  225. package/src/flowContext.ts +196 -93
  226. package/src/flowEngine.ts +13 -2
  227. package/src/flowSettings.ts +8 -3
  228. package/src/hooks/useApplyAutoFlows.ts +3 -1
  229. package/src/index.ts +11 -1
  230. package/src/models/CollectionFieldModel.tsx +43 -4
  231. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  232. package/src/models/__tests__/flowModel.test.ts +218 -95
  233. package/src/models/flowModel.tsx +146 -122
  234. package/src/models/forkFlowModel.ts +37 -5
  235. package/src/provider.tsx +10 -7
  236. package/src/resources/multiRecordResource.ts +2 -0
  237. package/src/resources/singleRecordResource.ts +1 -0
  238. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  239. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  240. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  241. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  242. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  243. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  244. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  245. package/src/runjs-context/contexts/base.ts +155 -0
  246. package/src/runjs-context/helpers.ts +32 -30
  247. package/src/runjs-context/registry.ts +16 -47
  248. package/src/runjs-context/setup.ts +51 -0
  249. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  250. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  251. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  252. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  253. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  254. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  255. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  256. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  257. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  258. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  259. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  260. package/src/runjs-context/snippets/index.ts +176 -39
  261. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  262. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  263. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  264. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  265. package/src/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.ts +15 -6
  266. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  267. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +53 -0
  268. package/src/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.ts +15 -11
  269. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +81 -0
  270. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +66 -0
  271. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  272. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  273. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  274. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  275. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  276. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  277. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  278. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  279. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  280. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  281. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  282. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  283. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  284. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  285. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  286. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  287. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  288. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  289. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  290. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  291. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  292. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  293. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  294. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  295. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  296. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  297. package/src/runjs-context/snippets/types.ts +5 -1
  298. package/src/types.ts +13 -0
  299. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  300. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  301. package/src/utils/index.ts +2 -2
  302. package/src/utils/params-resolvers.ts +1 -1
  303. package/src/utils/safeGlobals.ts +49 -3
  304. package/src/utils/serverContextParams.ts +1 -0
  305. package/src/utils/variablesParams.ts +50 -38
  306. package/src/views/PageComponent.tsx +1 -1
  307. package/src/views/createViewMeta.ts +372 -70
  308. package/src/views/index.tsx +1 -0
  309. package/src/views/useDialog.tsx +12 -10
  310. package/src/views/useDrawer.tsx +60 -36
  311. package/src/views/usePage.tsx +13 -10
  312. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  313. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  314. package/lib/components/dnd/moveBlock.d.ts +0 -33
  315. package/lib/components/dnd/moveBlock.js +0 -302
  316. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  317. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  318. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  319. package/lib/runjs-context/index.d.ts +0 -19
  320. package/lib/runjs-context/index.js +0 -57
  321. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  322. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  323. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  324. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  325. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  326. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  327. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  328. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  329. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  330. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  331. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  332. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  333. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  334. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  335. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  336. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  337. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  338. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  339. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  340. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  341. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  342. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  343. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  344. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  345. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  346. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  347. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.js +0 -45
  348. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  349. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  350. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  351. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  352. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  353. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  354. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  355. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  356. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  357. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  358. package/src/components/dnd/moveBlock.ts +0 -379
  359. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  360. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  361. package/src/runjs-context/index.ts +0 -20
  362. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  363. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  364. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  365. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  366. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  367. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  368. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  369. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  370. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  371. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  372. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  373. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  374. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  375. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  376. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  377. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  378. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  379. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  380. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  381. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  382. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  383. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  384. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  385. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  386. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  387. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -7,53 +7,190 @@
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-button-handler': () => import('./scene/block/render-button-handler.snippet'),
31
+ 'scene/block/add-event-listener': () => import('./scene/block/add-event-listener.snippet'),
32
+ 'scene/block/chartjs-bar': () => import('./scene/block/chartjs-bar.snippet'),
33
+ 'scene/block/vue-component': () => import('./scene/block/vue-component.snippet'),
34
+ 'scene/block/resource-example': () => import('./scene/block/resource-example.snippet'),
35
+ 'scene/block/api-fetch-render-list': () => import('./scene/block/api-fetch-render-list.snippet'),
36
+ 'scene/block/render-info-card': () => import('./scene/block/render-info-card.snippet'),
37
+ 'scene/block/render-statistics': () => import('./scene/block/render-statistics.snippet'),
38
+ 'scene/block/render-timeline': () => import('./scene/block/render-timeline.snippet'),
39
+ 'scene/block/render-iframe': () => import('./scene/block/render-iframe.snippet'),
40
+ // scene/detail
41
+ 'scene/detail/innerHTML-value': () => import('./scene/detail/innerHTML-value.snippet'),
42
+ 'scene/detail/format-number': () => import('./scene/detail/format-number.snippet'),
43
+ 'scene/detail/color-by-value': () => import('./scene/detail/color-by-value.snippet'),
44
+ 'scene/detail/copy-to-clipboard': () => import('./scene/detail/copy-to-clipboard.snippet'),
45
+ 'scene/detail/status-tag': () => import('./scene/detail/status-tag.snippet'),
46
+ 'scene/detail/relative-time': () => import('./scene/detail/relative-time.snippet'),
47
+ 'scene/detail/percentage-bar': () => import('./scene/detail/percentage-bar.snippet'),
48
+ // scene/form
49
+ 'scene/form/render-basic': () => import('./scene/form/render-basic.snippet'),
50
+ 'scene/form/set-field-value': () => import('./scene/form/set-field-value.snippet'),
51
+ 'scene/form/toggle-visible': () => import('./scene/form/toggle-visible.snippet'),
52
+ 'scene/form/set-disabled': () => import('./scene/form/set-disabled.snippet'),
53
+ 'scene/form/set-required': () => import('./scene/form/set-required.snippet'),
54
+ 'scene/form/calculate-total': () => import('./scene/form/calculate-total.snippet'),
55
+ 'scene/form/conditional-required': () => import('./scene/form/conditional-required.snippet'),
56
+ 'scene/form/cascade-select': () => import('./scene/form/cascade-select.snippet'),
57
+ 'scene/form/toggle-multiple-fields': () => import('./scene/form/toggle-multiple-fields.snippet'),
58
+ 'scene/form/copy-field-values': () => import('./scene/form/copy-field-values.snippet'),
59
+ // scene/table
60
+ 'scene/table/cell-open-dialog': () => import('./scene/table/cell-open-dialog.snippet'),
61
+ 'scene/table/concat-fields': () => import('./scene/table/concat-fields.snippet'),
62
+ 'scene/table/collection-selected-count': () => import('./scene/table/collection-selected-count.snippet'),
63
+ 'scene/table/iterate-selected-rows': () => import('./scene/table/iterate-selected-rows.snippet'),
64
+ 'scene/table/destroy-selected': () => import('./scene/table/destroy-selected.snippet'),
65
+ 'scene/table/export-selected-json': () => import('./scene/table/export-selected-json.snippet'),
57
66
  };
58
67
 
59
- export default engineSnippets;
68
+ export default snippets;
69
+
70
+ // Cohesive snippet helpers for clients (editor, etc.)
71
+ type EngineSnippetEntry = {
72
+ name: string;
73
+ prefix?: string;
74
+ description?: string;
75
+ body: string;
76
+ ref: string;
77
+ group?: string;
78
+ groups?: string[];
79
+ scenes?: string[];
80
+ };
81
+
82
+ function deriveNameFromKey(key: string): string {
83
+ const parts = key.split('/');
84
+ return parts[parts.length - 1] || key;
85
+ }
86
+
87
+ function normalizeScenes(def: any, key: string): string[] {
88
+ if (Array.isArray(def?.scenes) && def.scenes.length) {
89
+ return def.scenes.map((scene: any) => String(scene).trim()).filter((scene: string) => scene.length > 0);
90
+ }
91
+ const parts = key.split('/');
92
+ if (parts[0] === 'scene' && parts[1]) {
93
+ return [parts[1]];
94
+ }
95
+ return [];
96
+ }
97
+
98
+ function computeGroups(def: any, key: string): string[] {
99
+ const scenes = normalizeScenes(def, key);
100
+ if (scenes.length) {
101
+ return scenes.map((scene) => `scene/${scene}`);
102
+ }
103
+ const parts = key.split('/');
104
+ if (!parts.length) return [];
105
+ const first = parts[0];
106
+ if (first === 'global' || first === 'libs') return [first];
107
+ if (first === 'scene' && parts.length >= 2) return [`${first}/${parts[1]}`];
108
+ if (parts.length >= 2) return [`${parts[0]}/${parts[1]}`];
109
+ return [parts[0]];
110
+ }
111
+
112
+ function resolveLocaleMeta(def: any, locale?: string) {
113
+ if (!locale || !def?.locales) return {};
114
+ const exact = def.locales[locale];
115
+ if (exact) return exact;
116
+ const normalized = locale.toLowerCase();
117
+ if (normalized !== locale && def.locales[normalized]) return def.locales[normalized];
118
+ const base = locale.split('-')[0];
119
+ if (base && def.locales[base]) return def.locales[base];
120
+ if (base) {
121
+ const lowerBase = base.toLowerCase();
122
+ if (def.locales[lowerBase]) return def.locales[lowerBase];
123
+ }
124
+ return {};
125
+ }
126
+
127
+ export async function getSnippetBody(ref: string): Promise<string> {
128
+ const loader = (snippets as any)[ref];
129
+ if (!loader) throw new Error(`[flow-engine] snippet not found: ${ref}`);
130
+ const mod = await loader();
131
+ const def = mod?.default;
132
+ // engine snippet modules export a SnippetModule as default
133
+ const content = def?.content ?? mod?.content ?? mod?.body ?? '';
134
+ return typeof content === 'string' ? content : String(content ?? '');
135
+ }
136
+
137
+ export async function listSnippetsForContext(
138
+ ctxClassName: string,
139
+ version = 'v1',
140
+ locale?: string,
141
+ ): Promise<EngineSnippetEntry[]> {
142
+ const entries: EngineSnippetEntry[] = [];
143
+ const allowedContextNames = new Set<string>();
144
+ if (typeof ctxClassName === 'string' && ctxClassName) allowedContextNames.add(ctxClassName);
145
+ try {
146
+ const resolvedCtor = RunJSContextRegistry['resolve'](version as any, ctxClassName);
147
+ if (resolvedCtor?.name) allowedContextNames.add(resolvedCtor.name);
148
+ } catch (_) {
149
+ // ignore resolution failure
150
+ }
151
+ await Promise.all(
152
+ Object.entries(snippets).map(async ([key, loader]) => {
153
+ const mod = await (loader as any)();
154
+ const def = mod?.default || {};
155
+ const body: any = def?.content ?? mod?.content;
156
+ if (typeof body !== 'string') return;
157
+ let ok = true;
158
+ if (Array.isArray(def?.contexts) && def.contexts.length) {
159
+ const ctxNames = def.contexts.map((item: any) => {
160
+ if (item === '*') return '*';
161
+ if (typeof item === 'string') return item;
162
+ if (typeof item === 'function') return item.name || '*';
163
+ if (item && typeof item === 'object' && typeof item.name === 'string') return item.name;
164
+ return String(item ?? '');
165
+ });
166
+ if (ctxClassName === '*') {
167
+ // '*' means return all snippets without filtering by context
168
+ ok = true;
169
+ } else {
170
+ ok = ctxNames.includes('*') || ctxNames.some((name: string) => allowedContextNames.has(name));
171
+ }
172
+ }
173
+ if (ok && Array.isArray(def?.versions) && def.versions.length) {
174
+ ok = def.versions.includes('*') || def.versions.includes(version);
175
+ }
176
+ if (!ok) return;
177
+ const localeMeta = resolveLocaleMeta(def, locale);
178
+ const name = localeMeta.label || def?.label || deriveNameFromKey(key);
179
+ const description = localeMeta.description ?? def?.description;
180
+ const prefix = def?.prefix || name;
181
+ const groups = computeGroups(def, key);
182
+ const scenes = normalizeScenes(def, key);
183
+ entries.push({
184
+ name,
185
+ prefix,
186
+ description,
187
+ body,
188
+ ref: key,
189
+ group: groups[0],
190
+ groups,
191
+ scenes,
192
+ });
193
+ }),
194
+ );
195
+ return entries;
196
+ }
@@ -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;
@@ -7,18 +7,27 @@
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-button',
13
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
+ },
14
24
  content: `
15
25
  const { React, ReactDOM, antd } = ctx;
16
26
  const { Button } = antd;
17
27
 
18
- if (ctx.__reactRoot?.unmount) { try { ctx.__reactRoot.unmount(); } catch(_) {} ctx.__reactRoot = undefined; }
19
28
  const node = React.createElement(Button, { type: 'primary', onClick: () => ctx.message.success(ctx.t('Clicked!')) }, ctx.t('Button'));
20
- const root = ReactDOM.createRoot(ctx.element);
21
- root.render(node);
22
- ctx.__reactRoot = root;
29
+ ReactDOM.createRoot(ctx.element).render(node);
23
30
  `,
24
31
  };
32
+
33
+ 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,53 @@
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, Typography } = ctx.antd;
26
+ const { createElement: h } = ctx.React;
27
+
28
+ if (!ctx.record) {
29
+ ctx.element.innerHTML = '<div style="padding:16px;color:#999;">' + ctx.t('No record data') + '</div>';
30
+ return;
31
+ }
32
+
33
+ const record = ctx.record;
34
+
35
+ ctx.ReactDOM.createRoot(ctx.element).render(
36
+ h(Card, { title: ctx.t('Record Details'), bordered: true, style: { margin: 0 } },
37
+ h(Descriptions, { column: 2, size: 'small' },
38
+ h(Descriptions.Item, { label: ctx.t('ID') }, record.id || '-'),
39
+ h(Descriptions.Item, { label: ctx.t('Status') },
40
+ h(Tag, { color: record.status === 'active' ? 'green' : 'default' }, record.status || '-')
41
+ ),
42
+ h(Descriptions.Item, { label: ctx.t('Title') }, record.title || '-'),
43
+ h(Descriptions.Item, { label: ctx.t('Created At') },
44
+ record.createdAt ? new Date(record.createdAt).toLocaleString() : '-'
45
+ )
46
+ )
47
+ )
48
+ );
49
+
50
+ `,
51
+ };
52
+
53
+ export default snippet;
@@ -7,28 +7,32 @@
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-react',
13
16
  label: 'Render React',
17
+ description: 'Render a React element inside the block container',
18
+ locales: {
19
+ 'zh-CN': {
20
+ label: '渲染 React',
21
+ description: '在区块容器中渲染 React 组件',
22
+ },
23
+ },
14
24
  content: `
15
25
  // Render a React element into ctx.element via ReactDOM
16
26
  const { React, ReactDOM, antd } = ctx;
17
27
  const { Button } = antd;
18
28
 
19
- // Unmount previous render to allow repeated runs
20
- if (ctx.__reactRoot?.unmount) {
21
- try { ctx.__reactRoot.unmount(); } catch(_) {}
22
- ctx.__reactRoot = undefined;
23
- }
24
-
25
29
  const node = React.createElement(
26
30
  'div',
27
31
  { style: { padding: 12 } },
28
32
  React.createElement(Button, { type: 'primary', onClick: () => ctx.message.success(ctx.t('Clicked!')) }, ctx.t('Click')),
29
33
  );
30
- const root = ReactDOM.createRoot(ctx.element);
31
- root.render(node);
32
- ctx.__reactRoot = root;
34
+ ReactDOM.createRoot(ctx.element).render(node);
33
35
  `,
34
36
  };
37
+
38
+ export default snippet;