@nocobase/flow-engine 2.1.0-alpha.1 → 2.1.0-alpha.2

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 (252) 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/dnd/gridDragPlanner.d.ts +1 -0
  9. package/lib/components/dnd/gridDragPlanner.js +53 -1
  10. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +2 -1
  11. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +76 -15
  12. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +24 -4
  13. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +5 -1
  14. package/lib/components/variables/VariableInput.js +9 -4
  15. package/lib/components/variables/VariableTag.js +46 -39
  16. package/lib/components/variables/utils.d.ts +7 -0
  17. package/lib/components/variables/utils.js +42 -2
  18. package/lib/data-source/index.d.ts +7 -27
  19. package/lib/data-source/index.js +84 -51
  20. package/lib/executor/FlowExecutor.d.ts +2 -1
  21. package/lib/executor/FlowExecutor.js +163 -22
  22. package/lib/flowContext.d.ts +230 -7
  23. package/lib/flowContext.js +2267 -148
  24. package/lib/flowEngine.d.ts +21 -0
  25. package/lib/flowEngine.js +55 -13
  26. package/lib/flowI18n.js +6 -4
  27. package/lib/flowSettings.js +17 -11
  28. package/lib/index.d.ts +7 -1
  29. package/lib/index.js +21 -0
  30. package/lib/locale/en-US.json +9 -2
  31. package/lib/locale/index.d.ts +14 -0
  32. package/lib/locale/zh-CN.json +8 -1
  33. package/lib/models/CollectionFieldModel.d.ts +1 -0
  34. package/lib/models/CollectionFieldModel.js +3 -2
  35. package/lib/models/flowModel.d.ts +7 -0
  36. package/lib/models/flowModel.js +66 -1
  37. package/lib/provider.js +7 -6
  38. package/lib/resources/baseRecordResource.d.ts +5 -0
  39. package/lib/resources/baseRecordResource.js +24 -0
  40. package/lib/resources/multiRecordResource.d.ts +1 -0
  41. package/lib/resources/multiRecordResource.js +11 -4
  42. package/lib/resources/singleRecordResource.js +2 -0
  43. package/lib/resources/sqlResource.d.ts +4 -3
  44. package/lib/resources/sqlResource.js +8 -3
  45. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +12 -2
  46. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +2 -2
  47. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  48. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  49. package/lib/runjs-context/contexts/JSItemRunJSContext.js +12 -2
  50. package/lib/runjs-context/contexts/base.js +706 -41
  51. package/lib/runjs-context/contributions.d.ts +33 -0
  52. package/lib/runjs-context/contributions.js +88 -0
  53. package/lib/runjs-context/helpers.js +12 -1
  54. package/lib/runjs-context/setup.js +6 -0
  55. package/lib/runjs-context/snippets/global/api-request.snippet.js +3 -3
  56. package/lib/runjs-context/snippets/global/import-esm.snippet.js +2 -3
  57. package/lib/runjs-context/snippets/global/query-selector.snippet.js +8 -3
  58. package/lib/runjs-context/snippets/global/require-amd.snippet.js +1 -1
  59. package/lib/runjs-context/snippets/index.d.ts +11 -1
  60. package/lib/runjs-context/snippets/index.js +61 -40
  61. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.js +10 -7
  62. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +3 -3
  63. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +2 -2
  64. package/lib/runjs-context/snippets/scene/block/echarts-init.snippet.js +2 -2
  65. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +2 -2
  66. package/lib/runjs-context/snippets/scene/block/render-react.snippet.js +1 -1
  67. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +1 -1
  68. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +1 -1
  69. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +5 -5
  70. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +6 -6
  71. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +3 -4
  72. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.js +1 -1
  73. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.js +20 -3
  74. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.js +1 -1
  75. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.js +1 -1
  76. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +3 -3
  77. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +3 -3
  78. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +2 -2
  79. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +1 -1
  80. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.js +2 -2
  81. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +6 -3
  82. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +3 -1
  83. package/lib/runjsLibs.d.ts +28 -0
  84. package/lib/runjsLibs.js +532 -0
  85. package/lib/scheduler/ModelOperationScheduler.d.ts +2 -0
  86. package/lib/scheduler/ModelOperationScheduler.js +25 -21
  87. package/lib/types.d.ts +27 -0
  88. package/lib/utils/associationObjectVariable.d.ts +2 -2
  89. package/lib/utils/createCollectionContextMeta.js +1 -0
  90. package/lib/utils/createEphemeralContext.js +2 -2
  91. package/lib/utils/dateVariable.d.ts +16 -0
  92. package/lib/utils/dateVariable.js +380 -0
  93. package/lib/utils/exceptions.d.ts +7 -0
  94. package/lib/utils/exceptions.js +10 -0
  95. package/lib/utils/index.d.ts +8 -3
  96. package/lib/utils/index.js +45 -0
  97. package/lib/utils/params-resolvers.js +16 -9
  98. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  99. package/lib/utils/resolveModuleUrl.js +65 -0
  100. package/lib/utils/resolveRunJSObjectValues.d.ts +16 -0
  101. package/lib/utils/resolveRunJSObjectValues.js +61 -0
  102. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  103. package/lib/utils/runjsModuleLoader.js +422 -0
  104. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  105. package/lib/utils/runjsTemplateCompat.js +743 -0
  106. package/lib/utils/runjsValue.d.ts +29 -0
  107. package/lib/utils/runjsValue.js +275 -0
  108. package/lib/utils/safeGlobals.d.ts +18 -8
  109. package/lib/utils/safeGlobals.js +164 -17
  110. package/lib/utils/schema-utils.d.ts +10 -0
  111. package/lib/utils/schema-utils.js +61 -0
  112. package/lib/views/createViewMeta.d.ts +0 -7
  113. package/lib/views/createViewMeta.js +19 -70
  114. package/lib/views/index.d.ts +1 -2
  115. package/lib/views/index.js +4 -3
  116. package/lib/views/useDialog.js +8 -3
  117. package/lib/views/useDrawer.js +7 -2
  118. package/lib/views/usePage.d.ts +4 -0
  119. package/lib/views/usePage.js +43 -6
  120. package/lib/views/usePopover.js +4 -1
  121. package/lib/views/viewEvents.d.ts +17 -0
  122. package/lib/views/viewEvents.js +90 -0
  123. package/package.json +4 -4
  124. package/src/BlockScopedFlowEngine.ts +2 -5
  125. package/src/JSRunner.ts +44 -2
  126. package/src/ViewScopedFlowEngine.ts +4 -0
  127. package/src/__tests__/JSRunner.test.ts +64 -0
  128. package/src/__tests__/createViewMeta.popup.test.ts +62 -1
  129. package/src/__tests__/flowContext.test.ts +693 -1
  130. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  131. package/src/__tests__/flowModel.openView.navigation.test.ts +28 -0
  132. package/src/__tests__/flowRunJSContextDefine.test.ts +63 -0
  133. package/src/__tests__/flowRuntimeContext.test.ts +2 -1
  134. package/src/__tests__/flowSettings.open.test.tsx +123 -19
  135. package/src/__tests__/provider.test.tsx +0 -5
  136. package/src/__tests__/runjsContext.test.ts +10 -7
  137. package/src/__tests__/runjsContextImplementations.test.ts +34 -3
  138. package/src/__tests__/runjsContextRuntime.test.ts +3 -3
  139. package/src/__tests__/runjsContributions.test.ts +89 -0
  140. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  141. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  142. package/src/__tests__/runjsLocales.test.ts +4 -1
  143. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  144. package/src/__tests__/runjsRuntimeFeatures.test.ts +166 -0
  145. package/src/__tests__/runjsSnippets.test.ts +40 -3
  146. package/src/acl/Acl.tsx +3 -3
  147. package/src/components/FlowContextSelector.tsx +208 -12
  148. package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
  149. package/src/components/dnd/gridDragPlanner.ts +60 -0
  150. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +2 -1
  151. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  152. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +109 -16
  153. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +41 -7
  154. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -2
  155. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +157 -5
  156. package/src/components/variables/VariableInput.tsx +12 -4
  157. package/src/components/variables/VariableTag.tsx +54 -45
  158. package/src/components/variables/__tests__/FlowContextSelector.test.tsx +260 -3
  159. package/src/components/variables/__tests__/VariableTag.test.tsx +50 -0
  160. package/src/components/variables/__tests__/utils.test.ts +81 -3
  161. package/src/components/variables/utils.ts +67 -6
  162. package/src/data-source/index.ts +88 -110
  163. package/src/executor/FlowExecutor.ts +200 -23
  164. package/src/executor/__tests__/flowExecutor.test.ts +66 -0
  165. package/src/flowContext.ts +2986 -211
  166. package/src/flowEngine.ts +58 -13
  167. package/src/flowI18n.ts +7 -5
  168. package/src/flowSettings.ts +18 -12
  169. package/src/index.ts +14 -1
  170. package/src/locale/en-US.json +9 -2
  171. package/src/locale/zh-CN.json +8 -1
  172. package/src/models/CollectionFieldModel.tsx +3 -1
  173. package/src/models/__tests__/dispatchEvent.when.test.ts +554 -0
  174. package/src/models/__tests__/flowModel.clone.test.ts +416 -0
  175. package/src/models/__tests__/flowModel.test.ts +20 -4
  176. package/src/models/flowModel.tsx +94 -1
  177. package/src/provider.tsx +9 -7
  178. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  179. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  180. package/src/resources/baseRecordResource.ts +31 -0
  181. package/src/resources/multiRecordResource.ts +11 -4
  182. package/src/resources/singleRecordResource.ts +3 -0
  183. package/src/resources/sqlResource.ts +11 -6
  184. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +10 -0
  185. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +6 -2
  186. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  187. package/src/runjs-context/contexts/JSItemRunJSContext.ts +10 -0
  188. package/src/runjs-context/contexts/base.ts +715 -44
  189. package/src/runjs-context/contributions.ts +88 -0
  190. package/src/runjs-context/helpers.ts +11 -1
  191. package/src/runjs-context/setup.ts +6 -0
  192. package/src/runjs-context/snippets/global/api-request.snippet.ts +3 -3
  193. package/src/runjs-context/snippets/global/import-esm.snippet.ts +2 -3
  194. package/src/runjs-context/snippets/global/query-selector.snippet.ts +8 -3
  195. package/src/runjs-context/snippets/global/require-amd.snippet.ts +1 -1
  196. package/src/runjs-context/snippets/index.ts +75 -41
  197. package/src/runjs-context/snippets/scene/block/add-event-listener.snippet.ts +11 -13
  198. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +3 -3
  199. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +2 -2
  200. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +2 -2
  201. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +2 -2
  202. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +1 -1
  203. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +1 -1
  204. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +1 -1
  205. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +6 -11
  206. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +6 -6
  207. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +3 -4
  208. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +1 -1
  209. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +20 -3
  210. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +1 -1
  211. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +1 -1
  212. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +3 -3
  213. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +3 -3
  214. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +2 -2
  215. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +1 -1
  216. package/src/runjs-context/snippets/scene/form/render-basic.snippet.ts +3 -8
  217. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +6 -3
  218. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +3 -1
  219. package/src/runjsLibs.ts +622 -0
  220. package/src/scheduler/ModelOperationScheduler.ts +27 -21
  221. package/src/types.ts +38 -1
  222. package/src/utils/__tests__/dateVariable.test.ts +101 -0
  223. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  224. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  225. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  226. package/src/utils/__tests__/runjsValue.test.ts +44 -0
  227. package/src/utils/__tests__/safeGlobals.test.ts +57 -2
  228. package/src/utils/__tests__/utils.test.ts +95 -0
  229. package/src/utils/associationObjectVariable.ts +2 -2
  230. package/src/utils/createCollectionContextMeta.ts +1 -0
  231. package/src/utils/createEphemeralContext.ts +5 -4
  232. package/src/utils/dateVariable.ts +397 -0
  233. package/src/utils/exceptions.ts +11 -0
  234. package/src/utils/index.ts +37 -3
  235. package/src/utils/params-resolvers.ts +23 -9
  236. package/src/utils/resolveModuleUrl.ts +91 -0
  237. package/src/utils/resolveRunJSObjectValues.ts +46 -0
  238. package/src/utils/runjsModuleLoader.ts +553 -0
  239. package/src/utils/runjsTemplateCompat.ts +828 -0
  240. package/src/utils/runjsValue.ts +287 -0
  241. package/src/utils/safeGlobals.ts +188 -17
  242. package/src/utils/schema-utils.ts +79 -0
  243. package/src/views/__tests__/FlowView.usePage.test.tsx +54 -1
  244. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +35 -8
  245. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  246. package/src/views/createViewMeta.ts +22 -75
  247. package/src/views/index.tsx +1 -2
  248. package/src/views/useDialog.tsx +9 -2
  249. package/src/views/useDrawer.tsx +8 -1
  250. package/src/views/usePage.tsx +51 -5
  251. package/src/views/usePopover.tsx +4 -1
  252. package/src/views/viewEvents.ts +55 -0
@@ -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
  });
@@ -42,7 +42,12 @@ FormJSFieldItemRunJSContext.define({
42
42
  Supports innerHTML, append, and other DOM manipulation methods.`,
43
43
  value: `Current field value (read-only in display mode; in controlled scenarios, use setProps to modify).`,
44
44
  record: `Current record data object (read-only).
45
- Contains all field values of the parent record.`
45
+ Contains all field values of the parent record.`,
46
+ formValues: {
47
+ description: "Snapshot of current form values (object). Available in form contexts (CreateForm/EditForm).",
48
+ detail: "Record<string, any>",
49
+ examples: ["const { name, status } = ctx.formValues || {};"]
50
+ }
46
51
  },
47
52
  methods: {
48
53
  onRefReady: `Wait for form field container DOM element to be ready before executing callback.
@@ -58,7 +63,12 @@ FormJSFieldItemRunJSContext.define(
58
63
  properties: {
59
64
  element: "ElementProxy\uFF0C\u8868\u5355\u5B57\u6BB5\u5BB9\u5668",
60
65
  value: "\u5B57\u6BB5\u503C\uFF08\u5C55\u793A\u6A21\u5F0F\u4E3A\u53EA\u8BFB\uFF1B\u53D7\u63A7\u573A\u666F\u7528 setProps \u4FEE\u6539\uFF09",
61
- record: "\u5F53\u524D\u8BB0\u5F55\uFF08\u53EA\u8BFB\uFF09"
66
+ record: "\u5F53\u524D\u8BB0\u5F55\uFF08\u53EA\u8BFB\uFF09",
67
+ formValues: {
68
+ description: "\u5F53\u524D\u8868\u5355\u503C\u5FEB\u7167\uFF08\u5BF9\u8C61\uFF09\u3002\u4EC5\u8868\u5355\u76F8\u5173\u4E0A\u4E0B\u6587\u53EF\u7528\uFF08Create/Edit Form\uFF09\u3002",
69
+ detail: "Record<string, any>",
70
+ examples: ["const { name, status } = ctx.formValues || {};"]
71
+ }
62
72
  },
63
73
  methods: {
64
74
  onRefReady: "\u5BB9\u5668\u5C31\u7EEA\u56DE\u8C03",
@@ -58,7 +58,7 @@ JSBlockRunJSContext.define({
58
58
  Parameters: (ref: React.RefObject, callback: (element: HTMLElement) => void, timeout?: number) => void
59
59
  Example: ctx.onRefReady(ctx.ref, (el) => { el.innerHTML = "Ready!" })`,
60
60
  requireAsync: "Load external library: `const lib = await ctx.requireAsync(url)`",
61
- importAsync: "Dynamically import ESM module: `const mod = await ctx.importAsync(url)`"
61
+ importAsync: "Dynamically import an ESM module by URL: `const mod = await ctx.importAsync(url)`.\nNote: if the module has only a default export, ctx.importAsync returns that default value directly (no `.default`)."
62
62
  }
63
63
  });
64
64
  JSBlockRunJSContext.define(
@@ -80,7 +80,7 @@ JSBlockRunJSContext.define(
80
80
  methods: {
81
81
  onRefReady: "\u5BB9\u5668 ref \u5C31\u7EEA\u56DE\u8C03\uFF1A\n```js\nctx.onRefReady(ctx.ref, el => { /* ... */ })\n```",
82
82
  requireAsync: "\u52A0\u8F7D\u5916\u90E8\u5E93\uFF1A`const lib = await ctx.requireAsync(url)`",
83
- importAsync: "\u6309 URL \u52A8\u6001\u5BFC\u5165 ESM \u6A21\u5757\uFF1A`const mod = await ctx.importAsync(url)`"
83
+ importAsync: "\u6309 URL \u52A8\u6001\u5BFC\u5165 ESM \u6A21\u5757\uFF1A`const mod = await ctx.importAsync(url)`\u3002\n\u6CE8\u610F\uFF1A\u5F53\u6A21\u5757\u53EA\u6709 default \u4E00\u4E2A\u5BFC\u51FA\u65F6\uFF0Cctx.importAsync \u4F1A\u76F4\u63A5\u8FD4\u56DE default \u503C\uFF08\u65E0\u9700\u518D\u5199 `.default`\uFF09\u3002"
84
84
  }
85
85
  },
86
86
  { locale: "zh-CN" }
@@ -0,0 +1,16 @@
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 { FlowRunJSContext } from '../../flowContext';
10
+ /**
11
+ * RunJS context for JSEditableFieldModel (form editable custom field).
12
+ * NOTE: Some APIs (e.g., getValue/setValue/element) are provided by the model's runtime handler.
13
+ * This doc is used for editor autocomplete and AI coding assistance.
14
+ */
15
+ export declare class JSEditableFieldRunJSContext extends FlowRunJSContext {
16
+ }
@@ -0,0 +1,125 @@
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 JSEditableFieldRunJSContext_exports = {};
29
+ __export(JSEditableFieldRunJSContext_exports, {
30
+ JSEditableFieldRunJSContext: () => JSEditableFieldRunJSContext
31
+ });
32
+ module.exports = __toCommonJS(JSEditableFieldRunJSContext_exports);
33
+ var import_flowContext = require("../../flowContext");
34
+ const _JSEditableFieldRunJSContext = class _JSEditableFieldRunJSContext extends import_flowContext.FlowRunJSContext {
35
+ };
36
+ __name(_JSEditableFieldRunJSContext, "JSEditableFieldRunJSContext");
37
+ let JSEditableFieldRunJSContext = _JSEditableFieldRunJSContext;
38
+ JSEditableFieldRunJSContext.define({
39
+ label: "JSEditableField RunJS context",
40
+ properties: {
41
+ element: {
42
+ description: "ElementProxy instance providing a safe DOM container for field rendering. In editable mode this container is typically a <span> element.",
43
+ detail: "ElementProxy"
44
+ },
45
+ value: {
46
+ description: "Current field value (read-only snapshot). In editable scenarios, prefer ctx.getValue()/ctx.setValue(v) for two-way binding.",
47
+ detail: "any",
48
+ examples: ["const v = ctx.getValue?.() ?? ctx.value;", 'ctx.setValue?.("new value");']
49
+ },
50
+ record: {
51
+ description: "Current record data object (read-only). Available in forms that are bound to a record.",
52
+ detail: "Record<string, any>"
53
+ },
54
+ form: {
55
+ description: 'Ant Design Form instance for reading/writing other fields. Example: ctx.form.getFieldValue("name")',
56
+ detail: "FormInstance"
57
+ },
58
+ formValues: {
59
+ description: "Snapshot of current form values (object). Prefer ctx.form.getFieldsValue() when you need the latest values.",
60
+ detail: "Record<string, any>"
61
+ },
62
+ namePath: {
63
+ description: "Field namePath in the form (array). Useful for advanced Form operations.",
64
+ detail: "Array<string | number>"
65
+ },
66
+ disabled: "Whether the field is disabled (boolean).",
67
+ readOnly: "Whether the field is read-only (boolean)."
68
+ },
69
+ methods: {
70
+ getValue: {
71
+ description: "Get current field value (recommended for editable custom fields).",
72
+ detail: "() => any",
73
+ completion: { insertText: "ctx.getValue?.()" }
74
+ },
75
+ setValue: {
76
+ description: "Set current field value (two-way binding with the form).",
77
+ detail: "(value: any) => void",
78
+ completion: { insertText: "ctx.setValue?.(value)" },
79
+ examples: ["ctx.setValue?.(e.target.value);"]
80
+ }
81
+ }
82
+ });
83
+ JSEditableFieldRunJSContext.define(
84
+ {
85
+ label: "JS \u53EF\u7F16\u8F91\u5B57\u6BB5 RunJS \u4E0A\u4E0B\u6587",
86
+ properties: {
87
+ element: {
88
+ description: "ElementProxy\uFF0C\u5B57\u6BB5\u6E32\u67D3\u7684\u5B89\u5168\u5BB9\u5668\uFF08\u901A\u5E38\u4E3A <span> \u5BB9\u5668\uFF09\u3002",
89
+ detail: "ElementProxy"
90
+ },
91
+ value: {
92
+ description: "\u5B57\u6BB5\u5F53\u524D\u503C\uFF08\u53EA\u8BFB\u5FEB\u7167\uFF09\u3002\u53EF\u7F16\u8F91\u573A\u666F\u5EFA\u8BAE\u4F7F\u7528 ctx.getValue()/ctx.setValue(v) \u505A\u53CC\u5411\u7ED1\u5B9A\u3002",
93
+ detail: "any",
94
+ examples: ["const v = ctx.getValue?.() ?? ctx.value;", 'ctx.setValue?.("\u65B0\u503C");']
95
+ },
96
+ record: { description: "\u5F53\u524D\u8BB0\u5F55\u5BF9\u8C61\uFF08\u53EA\u8BFB\uFF1B\u8868\u5355\u7ED1\u5B9A\u8BB0\u5F55\u65F6\u53EF\u7528\uFF09\u3002", detail: "Record<string, any>" },
97
+ form: { description: "Ant Design Form \u5B9E\u4F8B\uFF0C\u53EF\u8BFB\u5199\u5176\u5B83\u5B57\u6BB5\u3002", detail: "FormInstance" },
98
+ formValues: {
99
+ description: "\u5F53\u524D\u8868\u5355\u503C\u5FEB\u7167\uFF08\u5BF9\u8C61\uFF09\u3002\u9700\u8981\u6700\u65B0\u503C\u53EF\u7528 ctx.form.getFieldsValue()\u3002",
100
+ detail: "Record<string, any>"
101
+ },
102
+ namePath: { description: "\u5B57\u6BB5\u5728\u8868\u5355\u4E2D\u7684 namePath\uFF08\u6570\u7EC4\uFF09\u3002", detail: "Array<string | number>" },
103
+ disabled: "\u662F\u5426\u7981\u7528\uFF08boolean\uFF09",
104
+ readOnly: "\u662F\u5426\u53EA\u8BFB\uFF08boolean\uFF09"
105
+ },
106
+ methods: {
107
+ getValue: {
108
+ description: "\u83B7\u53D6\u5B57\u6BB5\u5F53\u524D\u503C\uFF08\u53EF\u7F16\u8F91\u5B57\u6BB5\u63A8\u8350\u4F7F\u7528\uFF09\u3002",
109
+ detail: "() => any",
110
+ completion: { insertText: "ctx.getValue?.()" }
111
+ },
112
+ setValue: {
113
+ description: "\u8BBE\u7F6E\u5B57\u6BB5\u5F53\u524D\u503C\uFF08\u4E0E\u8868\u5355\u53CC\u5411\u7ED1\u5B9A\uFF09\u3002",
114
+ detail: "(value: any) => void",
115
+ completion: { insertText: "ctx.setValue?.(value)" },
116
+ examples: ["ctx.setValue?.(e.target.value);"]
117
+ }
118
+ }
119
+ },
120
+ { locale: "zh-CN" }
121
+ );
122
+ // Annotate the CommonJS export names for ESM import in node:
123
+ 0 && (module.exports = {
124
+ JSEditableFieldRunJSContext
125
+ });
@@ -43,7 +43,12 @@ JSItemRunJSContext.define({
43
43
  resource: `Current resource instance (read-only).
44
44
  Provides access to the data resource associated with the current form context.`,
45
45
  record: `Current record data object (read-only).
46
- Contains all field values of the parent record.`
46
+ Contains all field values of the parent record.`,
47
+ formValues: {
48
+ description: "Snapshot of current form values (object). Available in form contexts (CreateForm/EditForm).",
49
+ detail: "Record<string, any>",
50
+ examples: ["const { name, status } = ctx.formValues || {};"]
51
+ }
47
52
  },
48
53
  methods: {
49
54
  onRefReady: `Wait for form item container DOM element to be ready before executing callback.
@@ -56,7 +61,12 @@ JSItemRunJSContext.define(
56
61
  properties: {
57
62
  element: "ElementProxy\uFF0C\u8868\u5355\u9879\u6E32\u67D3\u5BB9\u5668\uFF0C\u652F\u6301 innerHTML/append \u7B49 DOM \u64CD\u4F5C",
58
63
  resource: "\u5F53\u524D\u8D44\u6E90\uFF08\u53EA\u8BFB\uFF09",
59
- record: "\u5F53\u524D\u8BB0\u5F55\uFF08\u53EA\u8BFB\uFF09"
64
+ record: "\u5F53\u524D\u8BB0\u5F55\uFF08\u53EA\u8BFB\uFF09",
65
+ formValues: {
66
+ description: "\u5F53\u524D\u8868\u5355\u503C\u5FEB\u7167\uFF08\u5BF9\u8C61\uFF09\u3002\u4EC5\u8868\u5355\u76F8\u5173\u4E0A\u4E0B\u6587\u53EF\u7528\uFF08Create/Edit Form\uFF09\u3002",
67
+ detail: "Record<string, any>",
68
+ examples: ["const { name, status } = ctx.formValues || {};"]
69
+ }
60
70
  },
61
71
  methods: {
62
72
  onRefReady: "\u5BB9\u5668\u5C31\u7EEA\u540E\u6267\u884C\u56DE\u8C03\u3002\u53C2\u6570\uFF1A(ref, callback, timeout?)"