@nocobase/flow-engine 2.0.0-beta.9 → 2.0.1

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 (245) hide show
  1. package/lib/BlockScopedFlowEngine.js +0 -1
  2. package/lib/FlowDefinition.d.ts +2 -0
  3. package/lib/JSRunner.d.ts +6 -0
  4. package/lib/JSRunner.js +32 -2
  5. package/lib/ViewScopedFlowEngine.js +3 -0
  6. package/lib/acl/Acl.js +13 -3
  7. package/lib/components/FlowContextSelector.js +155 -10
  8. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +2 -1
  9. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +76 -15
  10. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +24 -4
  11. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +5 -1
  12. package/lib/components/variables/VariableInput.js +9 -4
  13. package/lib/components/variables/VariableTag.js +46 -39
  14. package/lib/components/variables/utils.d.ts +7 -0
  15. package/lib/components/variables/utils.js +42 -2
  16. package/lib/data-source/index.d.ts +7 -27
  17. package/lib/data-source/index.js +81 -51
  18. package/lib/executor/FlowExecutor.d.ts +2 -1
  19. package/lib/executor/FlowExecutor.js +163 -22
  20. package/lib/flowContext.d.ts +230 -7
  21. package/lib/flowContext.js +2267 -148
  22. package/lib/flowEngine.d.ts +21 -0
  23. package/lib/flowEngine.js +56 -8
  24. package/lib/flowI18n.js +6 -4
  25. package/lib/flowSettings.js +17 -11
  26. package/lib/index.d.ts +7 -1
  27. package/lib/index.js +21 -0
  28. package/lib/locale/en-US.json +9 -2
  29. package/lib/locale/index.d.ts +14 -0
  30. package/lib/locale/zh-CN.json +8 -1
  31. package/lib/models/CollectionFieldModel.d.ts +1 -0
  32. package/lib/models/CollectionFieldModel.js +3 -2
  33. package/lib/models/flowModel.js +12 -1
  34. package/lib/provider.js +5 -5
  35. package/lib/resources/baseRecordResource.d.ts +5 -0
  36. package/lib/resources/baseRecordResource.js +24 -0
  37. package/lib/resources/multiRecordResource.d.ts +1 -0
  38. package/lib/resources/multiRecordResource.js +11 -4
  39. package/lib/resources/singleRecordResource.js +2 -0
  40. package/lib/resources/sqlResource.d.ts +4 -3
  41. package/lib/resources/sqlResource.js +8 -3
  42. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +12 -2
  43. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +2 -2
  44. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  45. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  46. package/lib/runjs-context/contexts/JSItemRunJSContext.js +12 -2
  47. package/lib/runjs-context/contexts/base.js +706 -41
  48. package/lib/runjs-context/contributions.d.ts +33 -0
  49. package/lib/runjs-context/contributions.js +88 -0
  50. package/lib/runjs-context/helpers.js +12 -1
  51. package/lib/runjs-context/setup.js +6 -0
  52. package/lib/runjs-context/snippets/global/api-request.snippet.js +3 -3
  53. package/lib/runjs-context/snippets/global/import-esm.snippet.js +2 -3
  54. package/lib/runjs-context/snippets/global/query-selector.snippet.js +8 -3
  55. package/lib/runjs-context/snippets/global/require-amd.snippet.js +1 -1
  56. package/lib/runjs-context/snippets/index.d.ts +11 -1
  57. package/lib/runjs-context/snippets/index.js +61 -40
  58. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.js +10 -7
  59. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +3 -3
  60. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +2 -2
  61. package/lib/runjs-context/snippets/scene/block/echarts-init.snippet.js +2 -2
  62. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +2 -2
  63. package/lib/runjs-context/snippets/scene/block/render-react.snippet.js +1 -1
  64. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +1 -1
  65. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +1 -1
  66. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +5 -5
  67. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +6 -6
  68. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +3 -4
  69. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.js +1 -1
  70. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.js +20 -3
  71. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.js +1 -1
  72. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.js +1 -1
  73. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +3 -3
  74. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +3 -3
  75. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +2 -2
  76. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +1 -1
  77. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.js +2 -2
  78. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +6 -3
  79. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +3 -1
  80. package/lib/runjsLibs.d.ts +28 -0
  81. package/lib/runjsLibs.js +532 -0
  82. package/lib/scheduler/ModelOperationScheduler.d.ts +2 -0
  83. package/lib/scheduler/ModelOperationScheduler.js +25 -21
  84. package/lib/types.d.ts +27 -0
  85. package/lib/utils/associationObjectVariable.d.ts +2 -2
  86. package/lib/utils/createCollectionContextMeta.js +1 -0
  87. package/lib/utils/createEphemeralContext.js +2 -2
  88. package/lib/utils/dateVariable.d.ts +16 -0
  89. package/lib/utils/dateVariable.js +380 -0
  90. package/lib/utils/exceptions.d.ts +7 -0
  91. package/lib/utils/exceptions.js +10 -0
  92. package/lib/utils/index.d.ts +8 -3
  93. package/lib/utils/index.js +45 -0
  94. package/lib/utils/params-resolvers.js +16 -9
  95. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  96. package/lib/utils/resolveModuleUrl.js +65 -0
  97. package/lib/utils/resolveRunJSObjectValues.d.ts +16 -0
  98. package/lib/utils/resolveRunJSObjectValues.js +61 -0
  99. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  100. package/lib/utils/runjsModuleLoader.js +422 -0
  101. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  102. package/lib/utils/runjsTemplateCompat.js +743 -0
  103. package/lib/utils/runjsValue.d.ts +29 -0
  104. package/lib/utils/runjsValue.js +275 -0
  105. package/lib/utils/safeGlobals.d.ts +18 -8
  106. package/lib/utils/safeGlobals.js +164 -17
  107. package/lib/utils/schema-utils.d.ts +10 -0
  108. package/lib/utils/schema-utils.js +61 -0
  109. package/lib/views/createViewMeta.d.ts +0 -7
  110. package/lib/views/createViewMeta.js +19 -70
  111. package/lib/views/index.d.ts +1 -2
  112. package/lib/views/index.js +4 -3
  113. package/lib/views/useDialog.js +7 -2
  114. package/lib/views/useDrawer.js +7 -2
  115. package/lib/views/usePage.d.ts +4 -0
  116. package/lib/views/usePage.js +43 -6
  117. package/lib/views/usePopover.js +4 -1
  118. package/lib/views/viewEvents.d.ts +17 -0
  119. package/lib/views/viewEvents.js +90 -0
  120. package/package.json +4 -4
  121. package/src/BlockScopedFlowEngine.ts +2 -5
  122. package/src/JSRunner.ts +44 -2
  123. package/src/ViewScopedFlowEngine.ts +4 -0
  124. package/src/__tests__/JSRunner.test.ts +64 -0
  125. package/src/__tests__/createViewMeta.popup.test.ts +62 -1
  126. package/src/__tests__/flowContext.test.ts +693 -1
  127. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  128. package/src/__tests__/flowModel.openView.navigation.test.ts +28 -0
  129. package/src/__tests__/flowRunJSContextDefine.test.ts +63 -0
  130. package/src/__tests__/flowRuntimeContext.test.ts +2 -1
  131. package/src/__tests__/flowSettings.open.test.tsx +123 -19
  132. package/src/__tests__/runjsContext.test.ts +10 -7
  133. package/src/__tests__/runjsContextImplementations.test.ts +34 -3
  134. package/src/__tests__/runjsContextRuntime.test.ts +3 -3
  135. package/src/__tests__/runjsContributions.test.ts +89 -0
  136. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  137. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  138. package/src/__tests__/runjsLocales.test.ts +4 -1
  139. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  140. package/src/__tests__/runjsRuntimeFeatures.test.ts +166 -0
  141. package/src/__tests__/runjsSnippets.test.ts +40 -3
  142. package/src/acl/Acl.tsx +3 -3
  143. package/src/components/FlowContextSelector.tsx +208 -12
  144. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +2 -1
  145. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  146. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +109 -16
  147. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +41 -7
  148. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -2
  149. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +157 -5
  150. package/src/components/variables/VariableInput.tsx +12 -4
  151. package/src/components/variables/VariableTag.tsx +54 -45
  152. package/src/components/variables/__tests__/FlowContextSelector.test.tsx +260 -3
  153. package/src/components/variables/__tests__/VariableTag.test.tsx +50 -0
  154. package/src/components/variables/__tests__/utils.test.ts +81 -3
  155. package/src/components/variables/utils.ts +67 -6
  156. package/src/data-source/index.ts +85 -110
  157. package/src/executor/FlowExecutor.ts +200 -23
  158. package/src/executor/__tests__/flowExecutor.test.ts +66 -0
  159. package/src/flowContext.ts +2986 -211
  160. package/src/flowEngine.ts +59 -8
  161. package/src/flowI18n.ts +7 -5
  162. package/src/flowSettings.ts +18 -12
  163. package/src/index.ts +14 -1
  164. package/src/locale/en-US.json +9 -2
  165. package/src/locale/zh-CN.json +8 -1
  166. package/src/models/CollectionFieldModel.tsx +3 -1
  167. package/src/models/__tests__/dispatchEvent.when.test.ts +554 -0
  168. package/src/models/__tests__/flowModel.test.ts +20 -4
  169. package/src/models/flowModel.tsx +13 -1
  170. package/src/provider.tsx +7 -6
  171. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  172. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  173. package/src/resources/baseRecordResource.ts +31 -0
  174. package/src/resources/multiRecordResource.ts +11 -4
  175. package/src/resources/singleRecordResource.ts +3 -0
  176. package/src/resources/sqlResource.ts +11 -6
  177. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +10 -0
  178. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +6 -2
  179. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  180. package/src/runjs-context/contexts/JSItemRunJSContext.ts +10 -0
  181. package/src/runjs-context/contexts/base.ts +715 -44
  182. package/src/runjs-context/contributions.ts +88 -0
  183. package/src/runjs-context/helpers.ts +11 -1
  184. package/src/runjs-context/setup.ts +6 -0
  185. package/src/runjs-context/snippets/global/api-request.snippet.ts +3 -3
  186. package/src/runjs-context/snippets/global/import-esm.snippet.ts +2 -3
  187. package/src/runjs-context/snippets/global/query-selector.snippet.ts +8 -3
  188. package/src/runjs-context/snippets/global/require-amd.snippet.ts +1 -1
  189. package/src/runjs-context/snippets/index.ts +75 -41
  190. package/src/runjs-context/snippets/scene/block/add-event-listener.snippet.ts +11 -13
  191. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +3 -3
  192. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +2 -2
  193. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +2 -2
  194. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +2 -2
  195. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +1 -1
  196. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +1 -1
  197. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +1 -1
  198. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +6 -11
  199. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +6 -6
  200. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +3 -4
  201. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +1 -1
  202. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +20 -3
  203. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +1 -1
  204. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +1 -1
  205. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +3 -3
  206. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +3 -3
  207. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +2 -2
  208. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +1 -1
  209. package/src/runjs-context/snippets/scene/form/render-basic.snippet.ts +3 -8
  210. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +6 -3
  211. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +3 -1
  212. package/src/runjsLibs.ts +622 -0
  213. package/src/scheduler/ModelOperationScheduler.ts +27 -21
  214. package/src/types.ts +38 -1
  215. package/src/utils/__tests__/dateVariable.test.ts +101 -0
  216. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  217. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  218. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  219. package/src/utils/__tests__/runjsValue.test.ts +44 -0
  220. package/src/utils/__tests__/safeGlobals.test.ts +57 -2
  221. package/src/utils/__tests__/utils.test.ts +95 -0
  222. package/src/utils/associationObjectVariable.ts +2 -2
  223. package/src/utils/createCollectionContextMeta.ts +1 -0
  224. package/src/utils/createEphemeralContext.ts +5 -4
  225. package/src/utils/dateVariable.ts +397 -0
  226. package/src/utils/exceptions.ts +11 -0
  227. package/src/utils/index.ts +37 -3
  228. package/src/utils/params-resolvers.ts +23 -9
  229. package/src/utils/resolveModuleUrl.ts +91 -0
  230. package/src/utils/resolveRunJSObjectValues.ts +46 -0
  231. package/src/utils/runjsModuleLoader.ts +553 -0
  232. package/src/utils/runjsTemplateCompat.ts +828 -0
  233. package/src/utils/runjsValue.ts +287 -0
  234. package/src/utils/safeGlobals.ts +188 -17
  235. package/src/utils/schema-utils.ts +79 -0
  236. package/src/views/__tests__/FlowView.usePage.test.tsx +54 -1
  237. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +35 -8
  238. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  239. package/src/views/createViewMeta.ts +22 -75
  240. package/src/views/index.tsx +1 -2
  241. package/src/views/useDialog.tsx +8 -1
  242. package/src/views/useDrawer.tsx +8 -1
  243. package/src/views/usePage.tsx +51 -5
  244. package/src/views/usePopover.tsx +4 -1
  245. package/src/views/viewEvents.ts +55 -0
@@ -84,6 +84,17 @@ export declare class FlowEngine {
84
84
  private _previousEngine?;
85
85
  private _nextEngine?;
86
86
  private _resources;
87
+ /**
88
+ * Data change registry used to coordinate "refresh on active" across view-scoped engines.
89
+ *
90
+ * Keyed by: dataSourceKey -> resourceName -> version.
91
+ * - mark: increments version
92
+ * - get: returns current version (default 0)
93
+ *
94
+ * NOTE: ViewScopedFlowEngine proxies delegate non-local fields/methods to parents, so this
95
+ * registry naturally lives on the root engine instance and is shared across the whole view stack.
96
+ */
97
+ private _dataSourceDirtyVersions;
87
98
  /**
88
99
  * 引擎事件总线(目前用于模型生命周期等事件)。
89
100
  * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
@@ -116,6 +127,16 @@ export declare class FlowEngine {
116
127
  getScheduler(): ModelOperationScheduler;
117
128
  /** 释放并清理当前引擎本地调度器(若存在) */
118
129
  disposeScheduler(): void;
130
+ /**
131
+ * Mark a data source resource as "dirty" (changed).
132
+ * This is used by data blocks to decide whether to refresh when a view becomes active.
133
+ */
134
+ markDataSourceDirty(dataSourceKey: string, resourceName: string): number;
135
+ /**
136
+ * Get current dirty version for a data source resource.
137
+ * Returns 0 when no writes have been recorded.
138
+ */
139
+ getDataSourceDirtyVersion(dataSourceKey: string, resourceName: string): number;
119
140
  /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
120
141
  scheduleModelOperation(fromModelOrUid: FlowModel | string, toUid: string, fn: (model: FlowModel) => Promise<void> | void, options?: ScheduleOptions): ScheduledCancel;
121
142
  /** 上一个引擎(根引擎为 undefined) */
package/lib/flowEngine.js CHANGED
@@ -120,6 +120,17 @@ const _FlowEngine = class _FlowEngine {
120
120
  __publicField(this, "_previousEngine");
121
121
  __publicField(this, "_nextEngine");
122
122
  __publicField(this, "_resources", /* @__PURE__ */ new Map());
123
+ /**
124
+ * Data change registry used to coordinate "refresh on active" across view-scoped engines.
125
+ *
126
+ * Keyed by: dataSourceKey -> resourceName -> version.
127
+ * - mark: increments version
128
+ * - get: returns current version (default 0)
129
+ *
130
+ * NOTE: ViewScopedFlowEngine proxies delegate non-local fields/methods to parents, so this
131
+ * registry naturally lives on the root engine instance and is shared across the whole view stack.
132
+ */
133
+ __publicField(this, "_dataSourceDirtyVersions", /* @__PURE__ */ new Map());
123
134
  /**
124
135
  * 引擎事件总线(目前用于模型生命周期等事件)。
125
136
  * ViewScopedFlowEngine 持有自己的实例,实现作用域隔离。
@@ -187,6 +198,33 @@ const _FlowEngine = class _FlowEngine {
187
198
  }
188
199
  }
189
200
  }
201
+ /**
202
+ * Mark a data source resource as "dirty" (changed).
203
+ * This is used by data blocks to decide whether to refresh when a view becomes active.
204
+ */
205
+ markDataSourceDirty(dataSourceKey, resourceName) {
206
+ const dsKey = String(dataSourceKey || "main");
207
+ const resName = String(resourceName || "");
208
+ if (!resName) return this.getDataSourceDirtyVersion(dsKey, resName);
209
+ const ds = this._dataSourceDirtyVersions.get(dsKey) || /* @__PURE__ */ new Map();
210
+ if (!this._dataSourceDirtyVersions.has(dsKey)) {
211
+ this._dataSourceDirtyVersions.set(dsKey, ds);
212
+ }
213
+ const next = (ds.get(resName) || 0) + 1;
214
+ ds.set(resName, next);
215
+ return next;
216
+ }
217
+ /**
218
+ * Get current dirty version for a data source resource.
219
+ * Returns 0 when no writes have been recorded.
220
+ */
221
+ getDataSourceDirtyVersion(dataSourceKey, resourceName) {
222
+ var _a;
223
+ const dsKey = String(dataSourceKey || "main");
224
+ const resName = String(resourceName || "");
225
+ if (!resName) return 0;
226
+ return ((_a = this._dataSourceDirtyVersions.get(dsKey)) == null ? void 0 : _a.get(resName)) || 0;
227
+ }
190
228
  /** 在目标模型生命周期达成时执行操作(仅在 View 引擎本地存储计划) */
191
229
  scheduleModelOperation(fromModelOrUid, toUid, fn, options) {
192
230
  return this.getScheduler().schedule(fromModelOrUid, toUid, fn, options);
@@ -724,16 +762,26 @@ const _FlowEngine = class _FlowEngine {
724
762
  */
725
763
  async loadModel(options) {
726
764
  if (!this.ensureModelRepository()) return;
727
- const model = this.findModelByParentId(options.parentId, options.subKey);
728
- if (model) {
729
- return model;
730
- }
731
- const hydrated = this.hydrateModelFromPreviousEngines(options);
732
- if (hydrated) {
733
- return hydrated;
765
+ const refresh = !!(options == null ? void 0 : options.refresh);
766
+ if (!refresh) {
767
+ const model = this.findModelByParentId(options.parentId, options.subKey);
768
+ if (model) {
769
+ return model;
770
+ }
771
+ const hydrated = this.hydrateModelFromPreviousEngines(options);
772
+ if (hydrated) {
773
+ return hydrated;
774
+ }
734
775
  }
735
776
  const data = await this._modelRepository.findOne(options);
736
- return (data == null ? void 0 : data.uid) ? this.createModel(data) : null;
777
+ if (!(data == null ? void 0 : data.uid)) return null;
778
+ if (refresh) {
779
+ const existing = this.getModel(data.uid);
780
+ if (existing) {
781
+ this.removeModelWithSubModels(existing.uid);
782
+ }
783
+ }
784
+ return this.createModel(data);
737
785
  }
738
786
  /**
739
787
  * Find a sub-model by parent model ID and subKey.
package/lib/flowI18n.js CHANGED
@@ -56,11 +56,13 @@ const _FlowI18n = class _FlowI18n {
56
56
  if (!keyOrTemplate || typeof keyOrTemplate !== "string") {
57
57
  return keyOrTemplate;
58
58
  }
59
- let result = this.translateKey(keyOrTemplate, options);
60
- if (this.isTemplate(result)) {
61
- result = this.compileTemplate(result);
59
+ if ((options == null ? void 0 : options.compareWith) && keyOrTemplate === options.compareWith) {
60
+ return keyOrTemplate;
61
+ }
62
+ if (this.isTemplate(keyOrTemplate)) {
63
+ return this.compileTemplate(keyOrTemplate);
62
64
  }
63
- return result;
65
+ return this.translateKey(keyOrTemplate, options);
64
66
  }
65
67
  /**
66
68
  * 内部翻译方法
@@ -62,7 +62,9 @@ var import_flowContext = require("./flowContext");
62
62
  var import__ = require(".");
63
63
  var import_useFlowSettingsContext = require("./hooks/useFlowSettingsContext");
64
64
  var import_utils = require("./utils");
65
+ var import_exceptions = require("./utils/exceptions");
65
66
  var import_useFlowStep = require("./hooks/useFlowStep");
67
+ var import_views = require("./views");
66
68
  var _forceEnabled, _emitter;
67
69
  const Panel = import_antd.Collapse.Panel;
68
70
  const _FlowSettings = class _FlowSettings {
@@ -536,12 +538,9 @@ const _FlowSettings = class _FlowSettings {
536
538
  };
537
539
  let modeProps = typeof resolvedUiMode === "object" && resolvedUiMode ? resolvedUiMode.props || {} : {};
538
540
  if (modeType === "embed") {
539
- const target = document.querySelector("#nocobase-embed-container");
541
+ const target = document.querySelector(`#${import_views.GLOBAL_EMBED_CONTAINER_ID}`);
540
542
  const onOpen = modeProps.onOpen;
541
543
  const onClose = modeProps.onClose;
542
- if (target) {
543
- target.innerHTML = "";
544
- }
545
544
  modeProps = {
546
545
  target,
547
546
  styles: {
@@ -551,15 +550,19 @@ const _FlowSettings = class _FlowSettings {
551
550
  },
552
551
  ...modeProps,
553
552
  onOpen() {
554
- target.style.width = modeProps.width || "33.3%";
555
- target.style.maxWidth = modeProps.maxWidth || "800px";
556
- target.style.minWidth = modeProps.minWidth || "0px";
553
+ if (target) {
554
+ target.style.width = modeProps.width || "33.3%";
555
+ target.style.maxWidth = modeProps.maxWidth || "800px";
556
+ target.style.minWidth = modeProps.minWidth || "0px";
557
+ }
557
558
  onOpen == null ? void 0 : onOpen();
558
559
  },
559
560
  onClose() {
560
- target.style.width = "auto";
561
- target.style.maxWidth = "none";
562
- target.style.minWidth = "auto";
561
+ if (target && target.dataset[import_views.EMBED_REPLACING_DATA_KEY] !== "1") {
562
+ target.style.width = "auto";
563
+ target.style.maxWidth = "none";
564
+ target.style.minWidth = "auto";
565
+ }
563
566
  onClose == null ? void 0 : onClose();
564
567
  }
565
568
  };
@@ -711,7 +714,10 @@ const _FlowSettings = class _FlowSettings {
711
714
  console.error("FlowSettings.open: onSaved callback error", cbErr);
712
715
  }
713
716
  } catch (err) {
714
- if (err instanceof import_utils.FlowExitException) {
717
+ if (err instanceof import_utils.FlowCancelSaveException) {
718
+ return;
719
+ }
720
+ if (err instanceof import_utils.FlowExitException || err instanceof import_exceptions.FlowExitAllException) {
715
721
  currentView.close();
716
722
  return;
717
723
  }
package/lib/index.d.ts CHANGED
@@ -9,6 +9,8 @@
9
9
  export * from './types';
10
10
  export * from './utils';
11
11
  export { compileRunJs } from './utils/jsxTransform';
12
+ export { registerRunJSLib } from './runjsLibs';
13
+ export type { RunJSLibCache, RunJSLibLoader } from './runjsLibs';
12
14
  export * from './resources';
13
15
  export * from './flowEngine';
14
16
  export * from './hooks';
@@ -25,8 +27,12 @@ export * from './JSRunner';
25
27
  export { getRunJSDocFor, createJSRunnerWithVersion, getRunJSScenesForModel, getRunJSScenesForContext, } from './runjs-context/helpers';
26
28
  export { RunJSContextRegistry, getModelClassName } from './runjs-context/registry';
27
29
  export { setupRunJSContexts } from './runjs-context/setup';
28
- export { getSnippetBody, listSnippetsForContext } from './runjs-context/snippets';
30
+ export type { RunJSContextContribution, RunJSContextContributionApi } from './runjs-context/contributions';
31
+ export { registerRunJSContextContribution } from './runjs-context/contributions';
32
+ export type { RunJSSnippetLoader } from './runjs-context/snippets';
33
+ export { getSnippetBody, listSnippetsForContext, registerRunJSSnippet } from './runjs-context/snippets';
29
34
  export * from './views';
35
+ export { DATA_SOURCE_DIRTY_EVENT, ENGINE_SCOPE_KEY, getEmitterViewActivatedVersion, VIEW_ACTIVATED_EVENT, VIEW_ACTIVATED_VERSION, VIEW_ENGINE_SCOPE, } from './views/viewEvents';
30
36
  export * from './FlowDefinition';
31
37
  export { createViewScopedEngine } from './ViewScopedFlowEngine';
32
38
  export { createBlockScopedEngine } from './BlockScopedFlowEngine';
package/lib/index.js CHANGED
@@ -27,23 +27,33 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
28
  var src_exports = {};
29
29
  __export(src_exports, {
30
+ DATA_SOURCE_DIRTY_EVENT: () => import_viewEvents.DATA_SOURCE_DIRTY_EVENT,
31
+ ENGINE_SCOPE_KEY: () => import_viewEvents.ENGINE_SCOPE_KEY,
30
32
  RunJSContextRegistry: () => import_registry.RunJSContextRegistry,
33
+ VIEW_ACTIVATED_EVENT: () => import_viewEvents.VIEW_ACTIVATED_EVENT,
34
+ VIEW_ACTIVATED_VERSION: () => import_viewEvents.VIEW_ACTIVATED_VERSION,
35
+ VIEW_ENGINE_SCOPE: () => import_viewEvents.VIEW_ENGINE_SCOPE,
31
36
  compileRunJs: () => import_jsxTransform.compileRunJs,
32
37
  createBlockScopedEngine: () => import_BlockScopedFlowEngine.createBlockScopedEngine,
33
38
  createJSRunnerWithVersion: () => import_helpers.createJSRunnerWithVersion,
34
39
  createViewScopedEngine: () => import_ViewScopedFlowEngine.createViewScopedEngine,
40
+ getEmitterViewActivatedVersion: () => import_viewEvents.getEmitterViewActivatedVersion,
35
41
  getModelClassName: () => import_registry.getModelClassName,
36
42
  getRunJSDocFor: () => import_helpers.getRunJSDocFor,
37
43
  getRunJSScenesForContext: () => import_helpers.getRunJSScenesForContext,
38
44
  getRunJSScenesForModel: () => import_helpers.getRunJSScenesForModel,
39
45
  getSnippetBody: () => import_snippets.getSnippetBody,
40
46
  listSnippetsForContext: () => import_snippets.listSnippetsForContext,
47
+ registerRunJSContextContribution: () => import_contributions.registerRunJSContextContribution,
48
+ registerRunJSLib: () => import_runjsLibs.registerRunJSLib,
49
+ registerRunJSSnippet: () => import_snippets.registerRunJSSnippet,
41
50
  setupRunJSContexts: () => import_setup.setupRunJSContexts
42
51
  });
43
52
  module.exports = __toCommonJS(src_exports);
44
53
  __reExport(src_exports, require("./types"), module.exports);
45
54
  __reExport(src_exports, require("./utils"), module.exports);
46
55
  var import_jsxTransform = require("./utils/jsxTransform");
56
+ var import_runjsLibs = require("./runjsLibs");
47
57
  __reExport(src_exports, require("./resources"), module.exports);
48
58
  __reExport(src_exports, require("./flowEngine"), module.exports);
49
59
  __reExport(src_exports, require("./hooks"), module.exports);
@@ -60,24 +70,35 @@ __reExport(src_exports, require("./JSRunner"), module.exports);
60
70
  var import_helpers = require("./runjs-context/helpers");
61
71
  var import_registry = require("./runjs-context/registry");
62
72
  var import_setup = require("./runjs-context/setup");
73
+ var import_contributions = require("./runjs-context/contributions");
63
74
  var import_snippets = require("./runjs-context/snippets");
64
75
  __reExport(src_exports, require("./views"), module.exports);
76
+ var import_viewEvents = require("./views/viewEvents");
65
77
  __reExport(src_exports, require("./FlowDefinition"), module.exports);
66
78
  var import_ViewScopedFlowEngine = require("./ViewScopedFlowEngine");
67
79
  var import_BlockScopedFlowEngine = require("./BlockScopedFlowEngine");
68
80
  // Annotate the CommonJS export names for ESM import in node:
69
81
  0 && (module.exports = {
82
+ DATA_SOURCE_DIRTY_EVENT,
83
+ ENGINE_SCOPE_KEY,
70
84
  RunJSContextRegistry,
85
+ VIEW_ACTIVATED_EVENT,
86
+ VIEW_ACTIVATED_VERSION,
87
+ VIEW_ENGINE_SCOPE,
71
88
  compileRunJs,
72
89
  createBlockScopedEngine,
73
90
  createJSRunnerWithVersion,
74
91
  createViewScopedEngine,
92
+ getEmitterViewActivatedVersion,
75
93
  getModelClassName,
76
94
  getRunJSDocFor,
77
95
  getRunJSScenesForContext,
78
96
  getRunJSScenesForModel,
79
97
  getSnippetBody,
80
98
  listSnippetsForContext,
99
+ registerRunJSContextContribution,
100
+ registerRunJSLib,
101
+ registerRunJSSnippet,
81
102
  setupRunJSContexts,
82
103
  ...require("./types"),
83
104
  ...require("./utils"),
@@ -62,6 +62,7 @@
62
62
  "This is likely a NocoBase internals bug. Please open an issue at": "This is likely a NocoBase internals bug. Please open an issue at",
63
63
  "This step has no configurable parameters": "This step has no configurable parameters",
64
64
  "This variable is not available": "This variable is not available",
65
+ "Use return to output value": "Use return to output value",
65
66
  "Try again": "Try again",
66
67
  "Template created": "Template created",
67
68
  "Template description": "Template description",
@@ -69,5 +70,11 @@
69
70
  "Template name is required": "Template name is required",
70
71
  "UID copied to clipboard": "UID copied to clipboard",
71
72
  "createModelOptions must specify use property": "createModelOptions must specify \"use\" property",
72
- "here": "here"
73
- }
73
+ "here": "here",
74
+ "RunJS deprecated warning": "[RunJS][Deprecated] {{api}} is deprecated{{location}}",
75
+ "RunJS deprecated warning with message": "[RunJS][Deprecated] {{api}} {{message}}{{location}}",
76
+ "RunJS deprecated separator": "; ",
77
+ "RunJS deprecated replacedBy": "Use {{replacedBy}} instead",
78
+ "RunJS deprecated since": "since {{since}}",
79
+ "RunJS deprecated removedIn": "will be removed in {{removedIn}}"
80
+ }
@@ -71,6 +71,7 @@ export declare const locales: {
71
71
  "This is likely a NocoBase internals bug. Please open an issue at": string;
72
72
  "This step has no configurable parameters": string;
73
73
  "This variable is not available": string;
74
+ "Use return to output value": string;
74
75
  "Try again": string;
75
76
  "Template created": string;
76
77
  "Template description": string;
@@ -79,6 +80,12 @@ export declare const locales: {
79
80
  "UID copied to clipboard": string;
80
81
  "createModelOptions must specify use property": string;
81
82
  here: string;
83
+ "RunJS deprecated warning": string;
84
+ "RunJS deprecated warning with message": string;
85
+ "RunJS deprecated separator": string;
86
+ "RunJS deprecated replacedBy": string;
87
+ "RunJS deprecated since": string;
88
+ "RunJS deprecated removedIn": string;
82
89
  };
83
90
  'zh-CN': {
84
91
  Add: string;
@@ -148,10 +155,17 @@ export declare const locales: {
148
155
  "This is likely a NocoBase internals bug. Please open an issue at": string;
149
156
  "This step has no configurable parameters": string;
150
157
  "This variable is not available": string;
158
+ "Use return to output value": string;
151
159
  "Try again": string;
152
160
  "UID copied to clipboard": string;
153
161
  "createModelOptions must specify use property": string;
154
162
  here: string;
163
+ "RunJS deprecated warning": string;
164
+ "RunJS deprecated warning with message": string;
165
+ "RunJS deprecated separator": string;
166
+ "RunJS deprecated replacedBy": string;
167
+ "RunJS deprecated since": string;
168
+ "RunJS deprecated removedIn": string;
155
169
  };
156
170
  };
157
171
  /**
@@ -66,8 +66,15 @@
66
66
  "This is likely a NocoBase internals bug. Please open an issue at": "这可能是 NocoBase 内部错误。请在以下地址提交问题",
67
67
  "This step has no configurable parameters": "此步骤没有可配置的参数",
68
68
  "This variable is not available": "此变量不可用",
69
+ "Use return to output value": "使用 return 返回最终值",
69
70
  "Try again": "重试",
70
71
  "UID copied to clipboard": "UID 已复制到剪贴板",
71
72
  "createModelOptions must specify use property": "createModelOptions 必须指定 \"use\" 属性",
72
- "here": "这里"
73
+ "here": "这里",
74
+ "RunJS deprecated warning": "[RunJS][已废弃] {{api}}{{location}}",
75
+ "RunJS deprecated warning with message": "[RunJS][已废弃] {{api}} {{message}}{{location}}",
76
+ "RunJS deprecated separator": ";",
77
+ "RunJS deprecated replacedBy": "建议使用:{{replacedBy}}",
78
+ "RunJS deprecated since": "自 {{since}} 起",
79
+ "RunJS deprecated removedIn": "将在 {{removedIn}} 移除"
73
80
  }
@@ -45,6 +45,7 @@ export declare class CollectionFieldModel<T extends DefaultStructure = DefaultSt
45
45
  }): BindingOptions | null;
46
46
  static bindModelToInterface(modelName: string, interfaceName: string | string[], options?: {
47
47
  isDefault?: boolean;
48
+ order?: number;
48
49
  defaultProps?: object | ((ctx: FlowEngineContext, fieldInstance: CollectionField) => object);
49
50
  when?: (ctx: FlowEngineContext, fieldInstance: CollectionField) => boolean;
50
51
  }): void;
@@ -182,7 +182,7 @@ const _CollectionFieldModel = class _CollectionFieldModel extends import_flowMod
182
182
  if (!this.bindings.has(interfaceName)) {
183
183
  return [];
184
184
  }
185
- const bindings = this.bindings.get(interfaceName);
185
+ const bindings = this.bindings.get(interfaceName).sort((a, b) => a.order - b.order);
186
186
  return bindings.filter(
187
187
  (binding) => ctx.engine.getModelClass(binding.modelName) && binding.when(ctx, collectionField)
188
188
  );
@@ -245,7 +245,8 @@ const _CollectionFieldModel = class _CollectionFieldModel extends import_flowMod
245
245
  modelName,
246
246
  isDefault: options.isDefault || false,
247
247
  defaultProps: options.defaultProps || null,
248
- when: options.when || defaultWhen
248
+ when: options.when || defaultWhen,
249
+ order: options.order
249
250
  });
250
251
  this.currentBindings.set(interfaceName, bindings);
251
252
  }
@@ -353,7 +353,18 @@ const _FlowModel = class _FlowModel {
353
353
  const meta = Cls.meta;
354
354
  const metaCreate = meta == null ? void 0 : meta.createModelOptions;
355
355
  if (metaCreate && typeof metaCreate === "object" && metaCreate.subModels) {
356
- mergedSubModels = import_lodash.default.merge({}, import_lodash.default.cloneDeep(metaCreate.subModels || {}), import_lodash.default.cloneDeep(subModels || {}));
356
+ const replaceArrays = /* @__PURE__ */ __name((objValue, srcValue) => {
357
+ if (Array.isArray(objValue) && Array.isArray(srcValue)) {
358
+ return srcValue;
359
+ }
360
+ return void 0;
361
+ }, "replaceArrays");
362
+ mergedSubModels = import_lodash.default.mergeWith(
363
+ {},
364
+ import_lodash.default.cloneDeep(metaCreate.subModels || {}),
365
+ import_lodash.default.cloneDeep(subModels || {}),
366
+ replaceArrays
367
+ );
357
368
  }
358
369
  } catch (e) {
359
370
  }
package/lib/provider.js CHANGED
@@ -79,17 +79,17 @@ const FlowEngineGlobalsContextProvider = /* @__PURE__ */ __name(({ children }) =
79
79
  cache: false,
80
80
  get: /* @__PURE__ */ __name((ctx) => new import_FlowView.FlowViewer(ctx, { drawer, embed, popover, dialog }), "get")
81
81
  });
82
- engine.context.defineProperty("themeToken", {
83
- get: /* @__PURE__ */ __name(() => token, "get"),
84
- observable: true,
85
- cache: true
86
- });
87
82
  for (const item of Object.entries(context)) {
88
83
  const [key, value] = item;
89
84
  if (value) {
90
85
  engine.context.defineProperty(key, { value });
91
86
  }
92
87
  }
88
+ engine.context.defineProperty("themeToken", {
89
+ get: /* @__PURE__ */ __name(() => token, "get"),
90
+ observable: true,
91
+ cache: true
92
+ });
93
93
  engine.reactView.refresh();
94
94
  }, [engine, drawer, modal, message, notification, config, popover, token, dialog, embed]);
95
95
  return /* @__PURE__ */ import_react.default.createElement(import_antd.ConfigProvider, { ...config, locale: (_a = engine.context.locales) == null ? void 0 : _a.antd, popupMatchSelectWidth: false }, children, contextHolder, popoverContextHolder, pageContextHolder, dialogContextHolder);
@@ -30,6 +30,11 @@ export declare abstract class BaseRecordResource<TData = any> extends APIResourc
30
30
  runAction<TData = any, TMeta = any>(action: string, options: any): Promise<any>;
31
31
  setResourceName(resourceName: string): this;
32
32
  getResourceName(): string;
33
+ /**
34
+ * Mark current resource as dirty on the root FlowEngine.
35
+ * Used to coordinate "refresh on active" across view stacks.
36
+ */
37
+ protected markDataSourceDirty(resourceName?: string): void;
33
38
  setSourceId(sourceId: string | number): this;
34
39
  getSourceId(): string | number;
35
40
  setDataSourceKey(dataSourceKey: string): this;
@@ -44,6 +44,7 @@ var import_lodash = __toESM(require("lodash"));
44
44
  var import_apiResource = require("./apiResource");
45
45
  var import_filterItem = require("./filterItem");
46
46
  var import_flowResource = require("./flowResource");
47
+ var import_viewEvents = require("../views/viewEvents");
47
48
  const _BaseRecordResource = class _BaseRecordResource extends import_apiResource.APIResource {
48
49
  resourceName;
49
50
  sourceId = null;
@@ -145,6 +146,29 @@ const _BaseRecordResource = class _BaseRecordResource extends import_apiResource
145
146
  getResourceName() {
146
147
  return this.resourceName;
147
148
  }
149
+ /**
150
+ * Mark current resource as dirty on the root FlowEngine.
151
+ * Used to coordinate "refresh on active" across view stacks.
152
+ */
153
+ markDataSourceDirty(resourceName) {
154
+ var _a, _b;
155
+ const engine = this.context.engine;
156
+ if (!engine) return;
157
+ const dataSourceKey = this.getDataSourceKey() || "main";
158
+ const resName = resourceName || this.getResourceName();
159
+ if (!resName) return;
160
+ const affectedResourceNames = /* @__PURE__ */ new Set([String(resName)]);
161
+ if (typeof resName === "string" && resName.includes(".")) {
162
+ affectedResourceNames.add(resName.split(".")[0]);
163
+ }
164
+ for (const name of affectedResourceNames) {
165
+ engine.markDataSourceDirty(dataSourceKey, name);
166
+ }
167
+ (_b = (_a = engine.emitter) == null ? void 0 : _a.emit) == null ? void 0 : _b.call(_a, import_viewEvents.DATA_SOURCE_DIRTY_EVENT, {
168
+ dataSourceKey,
169
+ resourceNames: Array.from(affectedResourceNames)
170
+ });
171
+ }
148
172
  setSourceId(sourceId) {
149
173
  this.sourceId = sourceId;
150
174
  return this;
@@ -16,6 +16,7 @@ export declare class MultiRecordResource<TDataItem = any> extends BaseRecordReso
16
16
  value: Record<string, any>;
17
17
  };
18
18
  private refreshTimer;
19
+ private refreshWaiters;
19
20
  protected createActionOptions: {};
20
21
  protected updateActionOptions: {};
21
22
  protected _refreshActionName: string;
@@ -47,6 +47,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
47
47
  _data = import_reactive.observable.ref([]);
48
48
  _meta = import_reactive.observable.ref({});
49
49
  refreshTimer = null;
50
+ refreshWaiters = [];
50
51
  createActionOptions = {};
51
52
  updateActionOptions = {};
52
53
  _refreshActionName = "list";
@@ -130,6 +131,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
130
131
  async create(data, options) {
131
132
  const config = this.mergeRequestConfig({ data }, this.createActionOptions, options);
132
133
  const res = await this.runAction("create", config);
134
+ this.markDataSourceDirty();
133
135
  this.emit("saved", data);
134
136
  if ((options == null ? void 0 : options.refresh) !== false) {
135
137
  await this.refresh();
@@ -160,6 +162,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
160
162
  options
161
163
  );
162
164
  await this.runAction("update", config);
165
+ this.markDataSourceDirty();
163
166
  this.emit("saved", data);
164
167
  await this.refresh();
165
168
  }
@@ -180,6 +183,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
180
183
  options
181
184
  );
182
185
  await this.runAction("destroy", config);
186
+ this.markDataSourceDirty();
183
187
  const currentPage = this.getPage();
184
188
  const lastPage = Math.ceil((this.getCount() - import_lodash.default.castArray(filterByTk).length) / this.getPageSize());
185
189
  if (currentPage > lastPage) {
@@ -202,7 +206,11 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
202
206
  clearTimeout(this.refreshTimer);
203
207
  }
204
208
  return new Promise((resolve, reject) => {
209
+ this.refreshWaiters.push({ resolve, reject });
205
210
  this.refreshTimer = setTimeout(async () => {
211
+ const waiters = this.refreshWaiters;
212
+ this.refreshWaiters = [];
213
+ this.refreshTimer = null;
206
214
  try {
207
215
  this.clearError();
208
216
  this.loading = true;
@@ -218,13 +226,12 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
218
226
  this.setPageSize(meta.pageSize);
219
227
  }
220
228
  this.emit("refresh");
221
- this.loading = false;
222
- resolve();
229
+ waiters.forEach((w) => w.resolve());
223
230
  } catch (error) {
224
231
  this.setError(error);
225
- reject(error instanceof Error ? error : new Error(String(error)));
232
+ const err = error instanceof Error ? error : new Error(String(error));
233
+ waiters.forEach((w) => w.reject(err));
226
234
  } finally {
227
- this.refreshTimer = null;
228
235
  this.loading = false;
229
236
  }
230
237
  });
@@ -70,6 +70,7 @@ const _SingleRecordResource = class _SingleRecordResource extends import_baseRec
70
70
  ...config,
71
71
  data: result
72
72
  });
73
+ this.markDataSourceDirty();
73
74
  this.emit("saved", data);
74
75
  if ((options == null ? void 0 : options.refresh) !== false) {
75
76
  await this.refresh();
@@ -86,6 +87,7 @@ const _SingleRecordResource = class _SingleRecordResource extends import_baseRec
86
87
  options
87
88
  );
88
89
  await this.runAction("destroy", config);
90
+ this.markDataSourceDirty();
89
91
  this.setData(null);
90
92
  }
91
93
  async refresh() {
@@ -6,7 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
- import { FlowEngineContext } from '../flowContext';
9
+ import { FlowContext, FlowEngineContext } from '../flowContext';
10
10
  import { BaseRecordResource } from './baseRecordResource';
11
11
  type SQLRunOptions = {
12
12
  bind?: Record<string, any>;
@@ -20,8 +20,8 @@ type SQLSaveOptions = {
20
20
  dataSourceKey?: string;
21
21
  };
22
22
  export declare class FlowSQLRepository {
23
- protected ctx: FlowEngineContext;
24
- constructor(ctx: FlowEngineContext);
23
+ protected ctx: FlowContext;
24
+ constructor(ctx: FlowContext);
25
25
  run(sql: string, options?: SQLRunOptions): Promise<any>;
26
26
  save(data: SQLSaveOptions): Promise<void>;
27
27
  runById(uid: string, options?: SQLRunOptions): Promise<any>;
@@ -35,6 +35,7 @@ export declare class SQLResource<TData = any> extends BaseRecordResource<TData>
35
35
  value: Record<string, any>;
36
36
  };
37
37
  private refreshTimer;
38
+ private refreshWaiters;
38
39
  private _debugEnabled;
39
40
  private _sql;
40
41
  protected request: {
@@ -126,6 +126,7 @@ const _SQLResource = class _SQLResource extends import_baseRecordResource.BaseRe
126
126
  _data = import_reactive.observable.ref(null);
127
127
  _meta = import_reactive.observable.ref({});
128
128
  refreshTimer = null;
129
+ refreshWaiters = [];
129
130
  _debugEnabled = false;
130
131
  _sql;
131
132
  // 请求配置 - 与 APIClient 接口保持一致
@@ -261,7 +262,11 @@ const _SQLResource = class _SQLResource extends import_baseRecordResource.BaseRe
261
262
  clearTimeout(this.refreshTimer);
262
263
  }
263
264
  return new Promise((resolve, reject) => {
265
+ this.refreshWaiters.push({ resolve, reject });
264
266
  this.refreshTimer = setTimeout(async () => {
267
+ const waiters = this.refreshWaiters;
268
+ this.refreshWaiters = [];
269
+ this.refreshTimer = null;
265
270
  try {
266
271
  this.clearError();
267
272
  this.loading = true;
@@ -270,12 +275,12 @@ const _SQLResource = class _SQLResource extends import_baseRecordResource.BaseRe
270
275
  this.setData(data).setMeta(meta);
271
276
  this.loading = false;
272
277
  this.emit("refresh");
273
- resolve();
278
+ waiters.forEach((w) => w.resolve());
274
279
  } catch (error) {
275
280
  this.setError(error);
276
- reject(error instanceof Error ? error : new Error(String(error)));
281
+ const err = error instanceof Error ? error : new Error(String(error));
282
+ waiters.forEach((w) => w.reject(err));
277
283
  } finally {
278
- this.refreshTimer = null;
279
284
  this.loading = false;
280
285
  }
281
286
  });