@nocobase/flow-engine 2.1.0-alpha.4 → 2.1.0-alpha.45

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 (209) hide show
  1. package/LICENSE +201 -661
  2. package/README.md +79 -10
  3. package/lib/FlowContextProvider.d.ts +5 -1
  4. package/lib/FlowContextProvider.js +9 -2
  5. package/lib/JSRunner.d.ts +10 -1
  6. package/lib/JSRunner.js +50 -5
  7. package/lib/ViewScopedFlowEngine.js +5 -1
  8. package/lib/components/FieldModelRenderer.js +2 -2
  9. package/lib/components/FlowModelRenderer.d.ts +3 -1
  10. package/lib/components/FlowModelRenderer.js +12 -6
  11. package/lib/components/FormItem.d.ts +6 -0
  12. package/lib/components/FormItem.js +11 -3
  13. package/lib/components/MobilePopup.js +6 -5
  14. package/lib/components/dnd/gridDragPlanner.d.ts +59 -2
  15. package/lib/components/dnd/gridDragPlanner.js +613 -21
  16. package/lib/components/dnd/index.d.ts +31 -2
  17. package/lib/components/dnd/index.js +244 -23
  18. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +2 -1
  19. package/lib/components/settings/wrappers/component/SelectWithTitle.js +14 -12
  20. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.d.ts +3 -0
  21. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +76 -11
  22. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +23 -43
  23. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +352 -295
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +16 -2
  25. package/lib/components/settings/wrappers/contextual/useFloatToolbarPortal.d.ts +36 -0
  26. package/lib/components/settings/wrappers/contextual/useFloatToolbarPortal.js +274 -0
  27. package/lib/components/settings/wrappers/contextual/useFloatToolbarVisibility.d.ts +30 -0
  28. package/lib/components/settings/wrappers/contextual/useFloatToolbarVisibility.js +315 -0
  29. package/lib/components/subModel/AddSubModelButton.js +27 -1
  30. package/lib/components/subModel/LazyDropdown.js +293 -52
  31. package/lib/components/subModel/index.d.ts +1 -0
  32. package/lib/components/subModel/index.js +19 -0
  33. package/lib/components/subModel/utils.d.ts +1 -1
  34. package/lib/components/subModel/utils.js +9 -3
  35. package/lib/components/variables/VariableHybridInput.d.ts +27 -0
  36. package/lib/components/variables/VariableHybridInput.js +499 -0
  37. package/lib/components/variables/index.d.ts +2 -0
  38. package/lib/components/variables/index.js +3 -0
  39. package/lib/data-source/index.d.ts +84 -0
  40. package/lib/data-source/index.js +259 -5
  41. package/lib/executor/FlowExecutor.js +32 -9
  42. package/lib/flow-registry/DetachedFlowRegistry.d.ts +21 -0
  43. package/lib/flow-registry/DetachedFlowRegistry.js +80 -0
  44. package/lib/flow-registry/index.d.ts +1 -0
  45. package/lib/flow-registry/index.js +3 -1
  46. package/lib/flowContext.d.ts +3 -0
  47. package/lib/flowContext.js +46 -1
  48. package/lib/flowEngine.d.ts +151 -1
  49. package/lib/flowEngine.js +392 -18
  50. package/lib/flowI18n.js +2 -1
  51. package/lib/flowSettings.d.ts +14 -6
  52. package/lib/flowSettings.js +34 -6
  53. package/lib/index.d.ts +2 -0
  54. package/lib/index.js +7 -0
  55. package/lib/lazy-helper.d.ts +14 -0
  56. package/lib/lazy-helper.js +71 -0
  57. package/lib/locale/en-US.json +1 -0
  58. package/lib/locale/index.d.ts +2 -0
  59. package/lib/locale/zh-CN.json +1 -0
  60. package/lib/models/DisplayItemModel.d.ts +1 -1
  61. package/lib/models/EditableItemModel.d.ts +1 -1
  62. package/lib/models/FilterableItemModel.d.ts +1 -1
  63. package/lib/models/flowModel.d.ts +13 -10
  64. package/lib/models/flowModel.js +81 -21
  65. package/lib/provider.js +38 -23
  66. package/lib/reactive/observer.js +46 -16
  67. package/lib/runjs-context/registry.d.ts +1 -1
  68. package/lib/runjs-context/setup.js +20 -12
  69. package/lib/runjs-context/snippets/index.js +13 -2
  70. package/lib/runjs-context/snippets/scene/detail/set-field-style.snippet.d.ts +11 -0
  71. package/lib/runjs-context/snippets/scene/detail/set-field-style.snippet.js +50 -0
  72. package/lib/runjs-context/snippets/scene/table/set-cell-style.snippet.d.ts +11 -0
  73. package/lib/runjs-context/snippets/scene/table/set-cell-style.snippet.js +54 -0
  74. package/lib/scheduler/ModelOperationScheduler.d.ts +5 -1
  75. package/lib/scheduler/ModelOperationScheduler.js +3 -2
  76. package/lib/types.d.ts +50 -2
  77. package/lib/types.js +1 -0
  78. package/lib/utils/createCollectionContextMeta.js +6 -2
  79. package/lib/utils/index.d.ts +3 -2
  80. package/lib/utils/index.js +7 -0
  81. package/lib/utils/parsePathnameToViewParams.d.ts +5 -1
  82. package/lib/utils/parsePathnameToViewParams.js +29 -5
  83. package/lib/utils/randomId.d.ts +39 -0
  84. package/lib/utils/randomId.js +45 -0
  85. package/lib/utils/runjsTemplateCompat.js +1 -1
  86. package/lib/utils/runjsValue.js +41 -11
  87. package/lib/utils/schema-utils.d.ts +7 -1
  88. package/lib/utils/schema-utils.js +19 -0
  89. package/lib/views/FlowView.d.ts +7 -1
  90. package/lib/views/FlowView.js +11 -1
  91. package/lib/views/PageComponent.js +8 -6
  92. package/lib/views/ViewNavigation.d.ts +12 -2
  93. package/lib/views/ViewNavigation.js +28 -9
  94. package/lib/views/createViewMeta.js +114 -50
  95. package/lib/views/inheritLayoutContext.d.ts +10 -0
  96. package/lib/views/inheritLayoutContext.js +50 -0
  97. package/lib/views/runViewBeforeClose.d.ts +10 -0
  98. package/lib/views/runViewBeforeClose.js +45 -0
  99. package/lib/views/useDialog.d.ts +2 -1
  100. package/lib/views/useDialog.js +22 -3
  101. package/lib/views/useDrawer.d.ts +2 -1
  102. package/lib/views/useDrawer.js +22 -3
  103. package/lib/views/usePage.d.ts +5 -11
  104. package/lib/views/usePage.js +304 -144
  105. package/package.json +6 -5
  106. package/src/FlowContextProvider.tsx +9 -1
  107. package/src/JSRunner.ts +68 -4
  108. package/src/ViewScopedFlowEngine.ts +4 -0
  109. package/src/__tests__/JSRunner.test.ts +27 -1
  110. package/src/__tests__/createViewMeta.popup.test.ts +115 -1
  111. package/src/__tests__/flow-engine.test.ts +166 -0
  112. package/src/__tests__/flowContext.test.ts +82 -1
  113. package/src/__tests__/flowEngine.modelLoaders.test.ts +245 -0
  114. package/src/__tests__/flowEngine.removeModel.test.ts +47 -3
  115. package/src/__tests__/flowSettings.test.ts +94 -15
  116. package/src/__tests__/objectVariable.test.ts +24 -0
  117. package/src/__tests__/provider.test.tsx +24 -2
  118. package/src/__tests__/renderHiddenInConfig.test.tsx +6 -6
  119. package/src/__tests__/runjsContext.test.ts +16 -0
  120. package/src/__tests__/runjsContextRuntime.test.ts +2 -0
  121. package/src/__tests__/runjsPreprocessDefault.test.ts +23 -0
  122. package/src/__tests__/runjsSnippets.test.ts +21 -0
  123. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  124. package/src/components/FieldModelRenderer.tsx +2 -1
  125. package/src/components/FlowModelRenderer.tsx +18 -6
  126. package/src/components/FormItem.tsx +7 -1
  127. package/src/components/MobilePopup.tsx +4 -2
  128. package/src/components/__tests__/FlowModelRenderer.test.tsx +65 -2
  129. package/src/components/__tests__/FormItem.test.tsx +25 -0
  130. package/src/components/__tests__/dnd.test.ts +44 -0
  131. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +20 -10
  132. package/src/components/__tests__/gridDragPlanner.test.ts +558 -3
  133. package/src/components/dnd/__tests__/DndProvider.test.tsx +98 -0
  134. package/src/components/dnd/gridDragPlanner.ts +758 -19
  135. package/src/components/dnd/index.tsx +305 -28
  136. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +21 -9
  137. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +99 -11
  138. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +487 -440
  139. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +18 -2
  140. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +194 -5
  141. package/src/components/settings/wrappers/contextual/__tests__/FlowsFloatContextMenu.test.tsx +778 -0
  142. package/src/components/settings/wrappers/contextual/useFloatToolbarPortal.ts +360 -0
  143. package/src/components/settings/wrappers/contextual/useFloatToolbarVisibility.ts +361 -0
  144. package/src/components/subModel/AddSubModelButton.tsx +32 -2
  145. package/src/components/subModel/LazyDropdown.tsx +332 -56
  146. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +522 -37
  147. package/src/components/subModel/__tests__/utils.test.ts +24 -0
  148. package/src/components/subModel/index.ts +1 -0
  149. package/src/components/subModel/utils.ts +7 -1
  150. package/src/components/variables/VariableHybridInput.tsx +531 -0
  151. package/src/components/variables/index.ts +2 -0
  152. package/src/data-source/__tests__/collection.test.ts +41 -2
  153. package/src/data-source/__tests__/index.test.ts +68 -1
  154. package/src/data-source/index.ts +322 -6
  155. package/src/executor/FlowExecutor.ts +35 -10
  156. package/src/executor/__tests__/flowExecutor.test.ts +85 -0
  157. package/src/flow-registry/DetachedFlowRegistry.ts +46 -0
  158. package/src/flow-registry/__tests__/detachedFlowRegistry.test.ts +47 -0
  159. package/src/flow-registry/index.ts +1 -0
  160. package/src/flowContext.ts +50 -3
  161. package/src/flowEngine.ts +449 -14
  162. package/src/flowI18n.ts +2 -1
  163. package/src/flowSettings.ts +40 -6
  164. package/src/index.ts +2 -0
  165. package/src/lazy-helper.tsx +57 -0
  166. package/src/locale/en-US.json +1 -0
  167. package/src/locale/zh-CN.json +1 -0
  168. package/src/models/DisplayItemModel.tsx +1 -1
  169. package/src/models/EditableItemModel.tsx +1 -1
  170. package/src/models/FilterableItemModel.tsx +1 -1
  171. package/src/models/__tests__/dispatchEvent.when.test.ts +214 -0
  172. package/src/models/__tests__/flowEngine.resolveUse.test.ts +0 -15
  173. package/src/models/__tests__/flowModel.test.ts +80 -37
  174. package/src/models/flowModel.tsx +122 -36
  175. package/src/provider.tsx +41 -25
  176. package/src/reactive/__tests__/observer.test.tsx +82 -0
  177. package/src/reactive/observer.tsx +87 -25
  178. package/src/runjs-context/registry.ts +1 -1
  179. package/src/runjs-context/setup.ts +22 -12
  180. package/src/runjs-context/snippets/index.ts +12 -1
  181. package/src/runjs-context/snippets/scene/detail/set-field-style.snippet.ts +30 -0
  182. package/src/runjs-context/snippets/scene/table/set-cell-style.snippet.ts +34 -0
  183. package/src/scheduler/ModelOperationScheduler.ts +14 -3
  184. package/src/types.ts +62 -0
  185. package/src/utils/__tests__/createCollectionContextMeta.test.ts +48 -0
  186. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +28 -0
  187. package/src/utils/__tests__/runjsValue.test.ts +11 -0
  188. package/src/utils/__tests__/utils.test.ts +62 -0
  189. package/src/utils/createCollectionContextMeta.ts +6 -2
  190. package/src/utils/index.ts +5 -1
  191. package/src/utils/parsePathnameToViewParams.ts +47 -7
  192. package/src/utils/randomId.ts +48 -0
  193. package/src/utils/runjsTemplateCompat.ts +1 -1
  194. package/src/utils/runjsValue.ts +50 -11
  195. package/src/utils/schema-utils.ts +30 -1
  196. package/src/views/FlowView.tsx +22 -2
  197. package/src/views/PageComponent.tsx +7 -4
  198. package/src/views/ViewNavigation.ts +46 -9
  199. package/src/views/__tests__/FlowView.usePage.test.tsx +243 -3
  200. package/src/views/__tests__/ViewNavigation.test.ts +52 -0
  201. package/src/views/__tests__/inheritLayoutContext.test.ts +53 -0
  202. package/src/views/__tests__/runViewBeforeClose.test.ts +30 -0
  203. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +13 -12
  204. package/src/views/createViewMeta.ts +106 -34
  205. package/src/views/inheritLayoutContext.ts +26 -0
  206. package/src/views/runViewBeforeClose.ts +19 -0
  207. package/src/views/useDialog.tsx +27 -3
  208. package/src/views/useDrawer.tsx +27 -3
  209. package/src/views/usePage.tsx +367 -179
@@ -67,19 +67,27 @@ async function setupRunJSContexts() {
67
67
  import("./contexts/JSRecordActionRunJSContext"),
68
68
  import("./contexts/JSCollectionActionRunJSContext")
69
69
  ]);
70
- const v1 = "v1";
71
- import_registry.RunJSContextRegistry.register(v1, "*", import_flowContext.FlowRunJSContext);
72
- import_registry.RunJSContextRegistry.register(v1, "JSBlockModel", JSBlockRunJSContext, { scenes: ["block"] });
73
- import_registry.RunJSContextRegistry.register(v1, "JSFieldModel", JSFieldRunJSContext, { scenes: ["detail"] });
74
- import_registry.RunJSContextRegistry.register(v1, "JSEditableFieldModel", JSEditableFieldRunJSContext, { scenes: ["form"] });
75
- import_registry.RunJSContextRegistry.register(v1, "JSItemModel", JSItemRunJSContext, { scenes: ["form"] });
76
- import_registry.RunJSContextRegistry.register(v1, "JSColumnModel", JSColumnRunJSContext, { scenes: ["table"] });
77
- import_registry.RunJSContextRegistry.register(v1, "FormJSFieldItemModel", FormJSFieldItemRunJSContext, { scenes: ["form"] });
78
- import_registry.RunJSContextRegistry.register(v1, "JSRecordActionModel", JSRecordActionRunJSContext, { scenes: ["table"] });
79
- import_registry.RunJSContextRegistry.register(v1, "JSCollectionActionModel", JSCollectionActionRunJSContext, { scenes: ["table"] });
80
- await (0, import_contributions.applyRunJSContextContributions)(v1);
70
+ const registerBuiltins = /* @__PURE__ */ __name((version) => {
71
+ import_registry.RunJSContextRegistry.register(version, "*", import_flowContext.FlowRunJSContext);
72
+ import_registry.RunJSContextRegistry.register(version, "JSBlockModel", JSBlockRunJSContext, { scenes: ["block"] });
73
+ import_registry.RunJSContextRegistry.register(version, "JSFieldModel", JSFieldRunJSContext, { scenes: ["detail"] });
74
+ import_registry.RunJSContextRegistry.register(version, "JSEditableFieldModel", JSEditableFieldRunJSContext, { scenes: ["form"] });
75
+ import_registry.RunJSContextRegistry.register(version, "JSItemModel", JSItemRunJSContext, { scenes: ["form"] });
76
+ import_registry.RunJSContextRegistry.register(version, "JSItemActionModel", JSItemRunJSContext, { scenes: ["table"] });
77
+ import_registry.RunJSContextRegistry.register(version, "JSColumnModel", JSColumnRunJSContext, { scenes: ["table"] });
78
+ import_registry.RunJSContextRegistry.register(version, "FormJSFieldItemModel", FormJSFieldItemRunJSContext, { scenes: ["form"] });
79
+ import_registry.RunJSContextRegistry.register(version, "JSRecordActionModel", JSRecordActionRunJSContext, { scenes: ["table"] });
80
+ import_registry.RunJSContextRegistry.register(version, "JSCollectionActionModel", JSCollectionActionRunJSContext, {
81
+ scenes: ["table"]
82
+ });
83
+ }, "registerBuiltins");
84
+ const versions = ["v1", "v2"];
85
+ for (const version of versions) {
86
+ registerBuiltins(version);
87
+ await (0, import_contributions.applyRunJSContextContributions)(version);
88
+ (0, import_contributions.markRunJSContextsSetupDone)(version);
89
+ }
81
90
  done = true;
82
- (0, import_contributions.markRunJSContextsSetupDone)(v1);
83
91
  }
84
92
  __name(setupRunJSContexts, "setupRunJSContexts");
85
93
  // Annotate the CommonJS export names for ESM import in node:
@@ -81,6 +81,7 @@ const snippets = {
81
81
  "scene/detail/status-tag": /* @__PURE__ */ __name(() => import("./scene/detail/status-tag.snippet"), "scene/detail/status-tag"),
82
82
  "scene/detail/relative-time": /* @__PURE__ */ __name(() => import("./scene/detail/relative-time.snippet"), "scene/detail/relative-time"),
83
83
  "scene/detail/percentage-bar": /* @__PURE__ */ __name(() => import("./scene/detail/percentage-bar.snippet"), "scene/detail/percentage-bar"),
84
+ "scene/detail/set-field-style": /* @__PURE__ */ __name(() => import("./scene/detail/set-field-style.snippet"), "scene/detail/set-field-style"),
84
85
  // scene/form
85
86
  "scene/form/render-basic": /* @__PURE__ */ __name(() => import("./scene/form/render-basic.snippet"), "scene/form/render-basic"),
86
87
  "scene/form/set-field-value": /* @__PURE__ */ __name(() => import("./scene/form/set-field-value.snippet"), "scene/form/set-field-value"),
@@ -98,7 +99,8 @@ const snippets = {
98
99
  "scene/table/collection-selected-count": /* @__PURE__ */ __name(() => import("./scene/table/collection-selected-count.snippet"), "scene/table/collection-selected-count"),
99
100
  "scene/table/iterate-selected-rows": /* @__PURE__ */ __name(() => import("./scene/table/iterate-selected-rows.snippet"), "scene/table/iterate-selected-rows"),
100
101
  "scene/table/destroy-selected": /* @__PURE__ */ __name(() => import("./scene/table/destroy-selected.snippet"), "scene/table/destroy-selected"),
101
- "scene/table/export-selected-json": /* @__PURE__ */ __name(() => import("./scene/table/export-selected-json.snippet"), "scene/table/export-selected-json")
102
+ "scene/table/export-selected-json": /* @__PURE__ */ __name(() => import("./scene/table/export-selected-json.snippet"), "scene/table/export-selected-json"),
103
+ "scene/table/set-cell-style": /* @__PURE__ */ __name(() => import("./scene/table/set-cell-style.snippet"), "scene/table/set-cell-style")
102
104
  };
103
105
  var snippets_default = snippets;
104
106
  function registerRunJSSnippet(ref, loader, options) {
@@ -131,10 +133,19 @@ function normalizeScenes(def, key) {
131
133
  return [];
132
134
  }
133
135
  __name(normalizeScenes, "normalizeScenes");
136
+ function normalizeSceneGroup(scene) {
137
+ const mapping = {
138
+ detailFieldEvent: "detail",
139
+ tableFieldEvent: "table",
140
+ formFieldEvent: "form"
141
+ };
142
+ return mapping[scene] || scene;
143
+ }
144
+ __name(normalizeSceneGroup, "normalizeSceneGroup");
134
145
  function computeGroups(def, key) {
135
146
  const scenes = normalizeScenes(def, key);
136
147
  if (scenes.length) {
137
- return scenes.map((scene) => `scene/${scene}`);
148
+ return Array.from(new Set(scenes.map((scene) => `scene/${normalizeSceneGroup(scene)}`)));
138
149
  }
139
150
  const parts = key.split("/");
140
151
  if (!parts.length) return [];
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { SnippetModule } from '../../types';
10
+ declare const snippet: SnippetModule;
11
+ export default snippet;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var set_field_style_snippet_exports = {};
28
+ __export(set_field_style_snippet_exports, {
29
+ default: () => set_field_style_snippet_default
30
+ });
31
+ module.exports = __toCommonJS(set_field_style_snippet_exports);
32
+ const snippet = {
33
+ contexts: ["*"],
34
+ scenes: ["detailFieldEvent", "formFieldEvent"],
35
+ prefix: "sn-item-style",
36
+ label: "Set form item/details item style",
37
+ description: "Customize form item and details item container styles",
38
+ locales: {
39
+ "zh-CN": {
40
+ label: "\u8BBE\u7F6E\u8868\u5355\u9879/\u8BE6\u60C5\u9879\u6837\u5F0F",
41
+ description: "\u81EA\u5B9A\u4E49\u8868\u5355\u9879\u548C\u8BE6\u60C5\u9879\u5BB9\u5668\u6837\u5F0F"
42
+ }
43
+ },
44
+ content: `
45
+ ctx.model.props.style = {
46
+ background: 'red',
47
+ };
48
+ `
49
+ };
50
+ var set_field_style_snippet_default = snippet;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { SnippetModule } from '../../types';
10
+ declare const snippet: SnippetModule;
11
+ export default snippet;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var set_cell_style_snippet_exports = {};
28
+ __export(set_cell_style_snippet_exports, {
29
+ default: () => set_cell_style_snippet_default
30
+ });
31
+ module.exports = __toCommonJS(set_cell_style_snippet_exports);
32
+ const snippet = {
33
+ contexts: ["*"],
34
+ scenes: ["tableFieldEvent"],
35
+ prefix: "sn-table-cell-style",
36
+ label: "Set table cell style",
37
+ description: "Customize table field cell styles with onCell",
38
+ locales: {
39
+ "zh-CN": {
40
+ label: "\u8868\u683C\u5B57\u6BB5\u6837\u5F0F\u8BBE\u7F6E",
41
+ description: "\u901A\u8FC7 onCell \u81EA\u5B9A\u4E49\u8868\u683C\u5B57\u6BB5\u5355\u5143\u683C\u6837\u5F0F"
42
+ }
43
+ },
44
+ content: `
45
+ ctx.model.props.onCell = (record, rowIndex) => {
46
+ return {
47
+ style: {
48
+ background: 'red',
49
+ },
50
+ };
51
+ };
52
+ `
53
+ };
54
+ var set_cell_style_snippet_default = snippet;
@@ -9,7 +9,10 @@
9
9
  import type { FlowEngine } from '../flowEngine';
10
10
  import type { FlowModel } from '../models/flowModel';
11
11
  type LifecycleType = 'created' | 'mounted' | 'unmounted' | 'destroyed' | `event:${string}:start` | `event:${string}:end` | `event:${string}:error`;
12
- export type ScheduleWhen = LifecycleType | ((e: LifecycleEvent) => boolean);
12
+ type EventPredicateWhen = ((e: LifecycleEvent) => boolean) & {
13
+ __eventType?: string;
14
+ };
15
+ export type ScheduleWhen = LifecycleType | EventPredicateWhen;
13
16
  export interface ScheduleOptions {
14
17
  when?: ScheduleWhen;
15
18
  }
@@ -22,6 +25,7 @@ export interface LifecycleEvent {
22
25
  error?: any;
23
26
  inputArgs?: Record<string, any>;
24
27
  result?: any;
28
+ aborted?: boolean;
25
29
  flowKey?: string;
26
30
  stepKey?: string;
27
31
  }
@@ -171,8 +171,9 @@ const _ModelOperationScheduler = class _ModelOperationScheduler {
171
171
  this.unbindHandlers.push(() => emitter.off("model:destroyed", onDestroyed));
172
172
  }
173
173
  ensureEventSubscriptionIfNeeded(when) {
174
- if (!when || typeof when !== "string") return;
175
- const parsed = this.parseEventWhen(when);
174
+ const eventType = typeof when === "string" ? when : typeof when === "function" ? when.__eventType : void 0;
175
+ if (!eventType) return;
176
+ const parsed = this.parseEventWhen(eventType);
176
177
  if (!parsed) return;
177
178
  const { name } = parsed;
178
179
  if (this.subscribedEventNames.has(name)) return;
package/lib/types.d.ts CHANGED
@@ -120,7 +120,9 @@ export declare enum ActionScene {
120
120
  /** 按钮级联动规则可用 */
121
121
  ACTION_LINKAGE_RULES = 5,
122
122
  /** 动态事件流可用 */
123
- DYNAMIC_EVENT_FLOW = 6
123
+ DYNAMIC_EVENT_FLOW = 6,
124
+ /** 菜单项联动规则可用 */
125
+ MENU_LINKAGE_RULES = 7
124
126
  }
125
127
  /**
126
128
  * Defines a reusable action with generic model type support.
@@ -177,7 +179,7 @@ export interface ActionDefinition<TModel extends FlowModel = FlowModel, TCtx ext
177
179
  * - 收录内置常用事件,便于智能提示;
178
180
  * - 允许扩展字符串以保持向后兼容。
179
181
  */
180
- export type FlowEventName = 'click' | 'submit' | 'reset' | 'remove' | 'openView' | 'dropdownOpen' | 'popupScroll' | 'search' | 'customRequest' | 'collapseToggle' | (string & {});
182
+ export type FlowEventName = 'click' | 'close' | 'submit' | 'reset' | 'remove' | 'openView' | 'dropdownOpen' | 'popupScroll' | 'search' | 'customRequest' | 'collapseToggle' | (string & {});
181
183
  /**
182
184
  * 事件流的执行时机(phase)。
183
185
  *
@@ -303,6 +305,52 @@ export interface CreateModelOptions {
303
305
  delegateToParent?: boolean;
304
306
  [key: string]: any;
305
307
  }
308
+ /**
309
+ * FlowModel loader result.
310
+ * Supports returning the model constructor directly, a default export, or a module object containing the named export.
311
+ */
312
+ export type FlowModelLoaderResult = ModelConstructor | {
313
+ default?: ModelConstructor;
314
+ [key: string]: unknown;
315
+ } | Record<string, unknown>;
316
+ /**
317
+ * FlowModel loader function.
318
+ */
319
+ export type FlowModelLoader = () => Promise<FlowModelLoaderResult>;
320
+ /**
321
+ * FlowModel loader entry (normalized internal form).
322
+ */
323
+ export interface FlowModelLoaderEntry {
324
+ loader: FlowModelLoader;
325
+ extends?: string[];
326
+ }
327
+ /**
328
+ * FlowModel loader input (user-facing form for registerModelLoaders).
329
+ * The `extends` field accepts flexible formats that will be normalized to `string[]` at registration time.
330
+ */
331
+ export interface FlowModelLoaderInput {
332
+ loader: FlowModelLoader;
333
+ extends?: string | ModelConstructor | (string | ModelConstructor)[];
334
+ }
335
+ /**
336
+ * FlowModel loader entry map (normalized internal form).
337
+ */
338
+ export type FlowModelLoaderMap = Record<string, FlowModelLoaderEntry>;
339
+ /**
340
+ * FlowModel loader input map (user-facing form for registerModelLoaders).
341
+ */
342
+ export type FlowModelLoaderInputMap = Record<string, FlowModelLoaderInput>;
343
+ /**
344
+ * Batch ensure result.
345
+ */
346
+ export interface EnsureBatchResult {
347
+ requested: string[];
348
+ loaded: string[];
349
+ failed: Array<{
350
+ name: string;
351
+ error?: unknown;
352
+ }>;
353
+ }
306
354
  export interface IFlowModelRepository<T extends FlowModel = FlowModel> {
307
355
  findOne(query: Record<string, any>): Promise<Record<string, any> | null>;
308
356
  save(model: T, options?: {
package/lib/types.js CHANGED
@@ -36,6 +36,7 @@ var ActionScene = /* @__PURE__ */ ((ActionScene2) => {
36
36
  ActionScene2[ActionScene2["DETAILS_FIELD_LINKAGE_RULES"] = 4] = "DETAILS_FIELD_LINKAGE_RULES";
37
37
  ActionScene2[ActionScene2["ACTION_LINKAGE_RULES"] = 5] = "ACTION_LINKAGE_RULES";
38
38
  ActionScene2[ActionScene2["DYNAMIC_EVENT_FLOW"] = 6] = "DYNAMIC_EVENT_FLOW";
39
+ ActionScene2[ActionScene2["MENU_LINKAGE_RULES"] = 7] = "MENU_LINKAGE_RULES";
39
40
  return ActionScene2;
40
41
  })(ActionScene || {});
41
42
  // Annotate the CommonJS export names for ESM import in node:
@@ -32,6 +32,10 @@ __export(createCollectionContextMeta_exports, {
32
32
  module.exports = __toCommonJS(createCollectionContextMeta_exports);
33
33
  const RELATION_FIELD_TYPES = ["belongsTo", "hasOne", "hasMany", "belongsToMany", "belongsToArray"];
34
34
  const NUMERIC_FIELD_TYPES = ["integer", "float", "double", "decimal"];
35
+ function shouldShowFieldInMeta(field, includeNonFilterable) {
36
+ return Boolean(field.interface && (includeNonFilterable || field.filterable));
37
+ }
38
+ __name(shouldShowFieldInMeta, "shouldShowFieldInMeta");
35
39
  function createFieldMetadata(field, includeNonFilterable) {
36
40
  const baseProperties = createMetaBaseProperties(field);
37
41
  if (field.isAssociationField()) {
@@ -49,7 +53,7 @@ function createFieldMetadata(field, includeNonFilterable) {
49
53
  properties: /* @__PURE__ */ __name(async () => {
50
54
  const subProperties = {};
51
55
  targetCollection.fields.forEach((subField) => {
52
- if (includeNonFilterable || subField.filterable) {
56
+ if (shouldShowFieldInMeta(subField, includeNonFilterable)) {
53
57
  subProperties[subField.name] = createFieldMetadata(subField, includeNonFilterable);
54
58
  }
55
59
  });
@@ -104,7 +108,7 @@ function createCollectionContextMeta(collectionOrFactory, title, includeNonFilte
104
108
  properties: /* @__PURE__ */ __name(async () => {
105
109
  const properties = {};
106
110
  collection.fields.forEach((field) => {
107
- if (includeNonFilterable || field.filterable) {
111
+ if (shouldShowFieldInMeta(field, includeNonFilterable)) {
108
112
  properties[field.name] = createFieldMetadata(field, includeNonFilterable);
109
113
  }
110
114
  });
@@ -8,11 +8,11 @@
8
8
  */
9
9
  export { BLOCK_GROUP_CONFIGS, BLOCK_TYPES, FLOW_ENGINE_NAMESPACE, MENU_KEYS, type BlockBuilderConfig, } from './constants';
10
10
  export { escapeT, getT, tExpr } from './translation';
11
- export { FlowCancelSaveException, FlowExitException } from './exceptions';
11
+ export { FlowCancelSaveException, FlowExitAllException, FlowExitException } from './exceptions';
12
12
  export { defineAction } from './flow-definitions';
13
13
  export { isInheritedFrom } from './inheritance';
14
14
  export { resolveCreateModelOptions, resolveDefaultParams, resolveExpressions } from './params-resolvers';
15
- export { compileUiSchema, resolveStepUiSchema, resolveStepDisabledInSettings, resolveUiMode, shouldHideStepInSettings, } from './schema-utils';
15
+ export { compileUiSchema, resolveStepUiSchema, resolveStepDisabledInSettings, resolveUiMode, shouldHideEventInSettings, shouldHideStepInSettings, } from './schema-utils';
16
16
  export { setupRuntimeContextSteps } from './setupRuntimeContextSteps';
17
17
  export { createCollectionContextMeta } from './createCollectionContextMeta';
18
18
  export { createAssociationAwareObjectMetaFactory, createAssociationSubpathResolver } from './associationObjectVariable';
@@ -29,3 +29,4 @@ export { createEphemeralContext } from './createEphemeralContext';
29
29
  export { pruneFilter } from './pruneFilter';
30
30
  export { isBeforeRenderFlow } from './flows';
31
31
  export { resolveModuleUrl, isCssFile } from './resolveModuleUrl';
32
+ export { randomId } from './randomId';
@@ -30,6 +30,7 @@ __export(utils_exports, {
30
30
  BLOCK_TYPES: () => import_constants.BLOCK_TYPES,
31
31
  FLOW_ENGINE_NAMESPACE: () => import_constants.FLOW_ENGINE_NAMESPACE,
32
32
  FlowCancelSaveException: () => import_exceptions.FlowCancelSaveException,
33
+ FlowExitAllException: () => import_exceptions.FlowExitAllException,
33
34
  FlowExitException: () => import_exceptions.FlowExitException,
34
35
  MENU_KEYS: () => import_constants.MENU_KEYS,
35
36
  buildRecordMeta: () => import_variablesParams.buildRecordMeta,
@@ -73,6 +74,7 @@ __export(utils_exports, {
73
74
  prepareRunJsCode: () => import_runjsTemplateCompat.prepareRunJsCode,
74
75
  preprocessRunJsTemplates: () => import_runjsTemplateCompat.preprocessRunJsTemplates,
75
76
  pruneFilter: () => import_pruneFilter.pruneFilter,
77
+ randomId: () => import_randomId.randomId,
76
78
  resolveCreateModelOptions: () => import_params_resolvers.resolveCreateModelOptions,
77
79
  resolveCtxDatePath: () => import_dateVariable.resolveCtxDatePath,
78
80
  resolveDefaultParams: () => import_params_resolvers.resolveDefaultParams,
@@ -86,6 +88,7 @@ __export(utils_exports, {
86
88
  serializeCtxDateValue: () => import_dateVariable.serializeCtxDateValue,
87
89
  setAutoFlowError: () => import_autoFlowError.setAutoFlowError,
88
90
  setupRuntimeContextSteps: () => import_setupRuntimeContextSteps.setupRuntimeContextSteps,
91
+ shouldHideEventInSettings: () => import_schema_utils.shouldHideEventInSettings,
89
92
  shouldHideStepInSettings: () => import_schema_utils.shouldHideStepInSettings,
90
93
  tExpr: () => import_translation.tExpr
91
94
  });
@@ -113,12 +116,14 @@ var import_createEphemeralContext = require("./createEphemeralContext");
113
116
  var import_pruneFilter = require("./pruneFilter");
114
117
  var import_flows = require("./flows");
115
118
  var import_resolveModuleUrl = require("./resolveModuleUrl");
119
+ var import_randomId = require("./randomId");
116
120
  // Annotate the CommonJS export names for ESM import in node:
117
121
  0 && (module.exports = {
118
122
  BLOCK_GROUP_CONFIGS,
119
123
  BLOCK_TYPES,
120
124
  FLOW_ENGINE_NAMESPACE,
121
125
  FlowCancelSaveException,
126
+ FlowExitAllException,
122
127
  FlowExitException,
123
128
  MENU_KEYS,
124
129
  buildRecordMeta,
@@ -162,6 +167,7 @@ var import_resolveModuleUrl = require("./resolveModuleUrl");
162
167
  prepareRunJsCode,
163
168
  preprocessRunJsTemplates,
164
169
  pruneFilter,
170
+ randomId,
165
171
  resolveCreateModelOptions,
166
172
  resolveCtxDatePath,
167
173
  resolveDefaultParams,
@@ -175,6 +181,7 @@ var import_resolveModuleUrl = require("./resolveModuleUrl");
175
181
  serializeCtxDateValue,
176
182
  setAutoFlowError,
177
183
  setupRuntimeContextSteps,
184
+ shouldHideEventInSettings,
178
185
  shouldHideStepInSettings,
179
186
  tExpr
180
187
  });
@@ -16,6 +16,10 @@ export interface ViewParam {
16
16
  /** source Id */
17
17
  sourceId?: string;
18
18
  }
19
+ export interface ParsePathnameToViewParamsOptions {
20
+ rootPrefix?: string;
21
+ basePath?: string;
22
+ }
19
23
  /**
20
24
  * 解析路径名为视图参数数组
21
25
  *
@@ -31,4 +35,4 @@ export interface ViewParam {
31
35
  * parsePathnameToViewParams('/admin/xxx/view/yyy') // [{ viewUid: 'xxx' }, { viewUid: 'yyy' }]
32
36
  * ```
33
37
  */
34
- export declare const parsePathnameToViewParams: (pathname: string) => ViewParam[];
38
+ export declare const parsePathnameToViewParams: (pathname: string, options?: ParsePathnameToViewParamsOptions) => ViewParam[];
@@ -30,20 +30,44 @@ __export(parsePathnameToViewParams_exports, {
30
30
  parsePathnameToViewParams: () => parsePathnameToViewParams
31
31
  });
32
32
  module.exports = __toCommonJS(parsePathnameToViewParams_exports);
33
- const parsePathnameToViewParams = /* @__PURE__ */ __name((pathname) => {
33
+ const normalizePathname = /* @__PURE__ */ __name((pathname) => {
34
+ if (!pathname || pathname === "/") {
35
+ return "/";
36
+ }
37
+ return `/${pathname.replace(/^\/+/, "").replace(/\/+$/, "")}`;
38
+ }, "normalizePathname");
39
+ const normalizeBasePath = /* @__PURE__ */ __name((basePath) => `/${basePath.replace(/^\/+/, "").replace(/\/+$/, "")}`, "normalizeBasePath");
40
+ const stripBasePath = /* @__PURE__ */ __name((pathname, basePath) => {
41
+ const normalizedPathname = normalizePathname(pathname);
42
+ const normalizedBasePath = normalizeBasePath(basePath);
43
+ if (normalizedPathname === normalizedBasePath) {
44
+ return "";
45
+ }
46
+ if (normalizedPathname.startsWith(`${normalizedBasePath}/`)) {
47
+ return normalizedPathname.slice(normalizedBasePath.length + 1);
48
+ }
49
+ return "";
50
+ }, "stripBasePath");
51
+ const parsePathnameToViewParams = /* @__PURE__ */ __name((pathname, options = {}) => {
34
52
  if (!pathname || pathname === "/") {
35
53
  return [];
36
54
  }
37
- const segments = pathname.replace(/^\/+/, "").split("/").filter(Boolean);
38
- if (segments.length < 2) {
55
+ const rootPrefix = options.rootPrefix || "admin";
56
+ const relativePath = options.basePath ? stripBasePath(pathname, options.basePath) : "";
57
+ const segments = (options.basePath ? relativePath : pathname).replace(/^\/+/, "").split("/").filter(Boolean);
58
+ if (segments.length < (options.basePath ? 1 : 2)) {
39
59
  return [];
40
60
  }
41
61
  const result = [];
42
62
  let currentView = null;
43
63
  let i = 0;
64
+ if (options.basePath) {
65
+ currentView = { viewUid: segments[0] };
66
+ i = 1;
67
+ }
44
68
  while (i < segments.length) {
45
69
  const segment = segments[i];
46
- if (segment === "admin" || segment === "view") {
70
+ if (segment === rootPrefix || segment === "view") {
47
71
  if (currentView) {
48
72
  result.push(currentView);
49
73
  }
@@ -92,7 +116,7 @@ const parsePathnameToViewParams = /* @__PURE__ */ __name((pathname) => {
92
116
  } catch (_) {
93
117
  parsed = decoded;
94
118
  }
95
- } else if (decoded && decoded.includes("=") && decoded.includes("&")) {
119
+ } else if (decoded && /^[^=&]+=[^=&]*(?:&[^=&]+=[^=&]*)*$/.test(decoded)) {
96
120
  parsed = parseKeyValuePairs(decoded);
97
121
  }
98
122
  currentView.filterByTk = parsed;
@@ -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
+ * Generate a random base36 identifier with an optional semantic prefix.
11
+ *
12
+ * Equivalent in shape to v1's `uid()` from `@formily/shared` (11 chars
13
+ * of `[0-9a-z]`), with an opt-in prefix appended at the front. v2 forbids
14
+ * direct `@formily/*` imports in `src/client-v2/`, so this helper is the
15
+ * single substitute the rest of the codebase should reach for.
16
+ *
17
+ * Common semantic prefixes observed across the codebase — pass the one
18
+ * that matches your domain rather than relying on a default, so the
19
+ * intent is explicit at the call site:
20
+ *
21
+ * - `s_` — service / settings record (authenticators, channels, …)
22
+ * - `v_` — verifier / variable / LLM service
23
+ * - `f_` — field
24
+ * - `t_` — through table
25
+ *
26
+ * Example:
27
+ *
28
+ * ```ts
29
+ * import { randomId } from '@nocobase/flow-engine';
30
+ *
31
+ * name: randomId('s_'), // → 's_keeoaui1ubi'
32
+ * name: randomId('v_'), // → 'v_a8f3kp2x9qm'
33
+ * name: randomId(), // → 'a8f3kp2x9qm'
34
+ * ```
35
+ *
36
+ * Not cryptographically secure — uses `Math.random()`. Good enough for
37
+ * unique form names / schema keys, NOT for security tokens.
38
+ */
39
+ export declare function randomId(prefix?: string, length?: number): string;
@@ -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
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var randomId_exports = {};
29
+ __export(randomId_exports, {
30
+ randomId: () => randomId
31
+ });
32
+ module.exports = __toCommonJS(randomId_exports);
33
+ const CHARSET = "0123456789abcdefghijklmnopqrstuvwxyz";
34
+ function randomId(prefix = "", length = 11) {
35
+ let id = "";
36
+ for (let i = 0; i < length; i++) {
37
+ id += CHARSET[Math.random() * CHARSET.length | 0];
38
+ }
39
+ return `${prefix}${id}`;
40
+ }
41
+ __name(randomId, "randomId");
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ randomId
45
+ });
@@ -527,8 +527,8 @@ function extractUsedCtxLibKeys(code) {
527
527
  }
528
528
  __name(extractUsedCtxLibKeys, "extractUsedCtxLibKeys");
529
529
  function injectEnsureLibsPreamble(code) {
530
- if (!CTX_LIBS_MARKER_RE.test(code)) return code;
531
530
  if (ENSURE_LIBS_MARKER_RE.test(code)) return code;
531
+ if (!CTX_LIBS_MARKER_RE.test(code)) return code;
532
532
  const keys = extractUsedCtxLibKeys(code);
533
533
  if (!keys.length) return code;
534
534
  return `/* __runjs_ensure_libs */