@nocobase/plugin-flow-engine 2.1.0-alpha.3 → 2.1.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/LICENSE +201 -661
  2. package/README.md +79 -9
  3. package/dist/ai/ai-employees/nathan/index.d.ts +10 -0
  4. package/dist/ai/ai-employees/nathan/index.js +42 -0
  5. package/dist/ai/ai-employees/nathan/prompt.md +168 -0
  6. package/dist/ai/ai-employees/nathan/skills/frontend-developer/SKILLS.md +86 -0
  7. package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextApis.js +2 -2
  8. package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextEnvs.js +2 -2
  9. package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextVars.js +2 -2
  10. package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/lintAndTestJS.js +6 -4
  11. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/patchJSCode.d.ts +10 -0
  12. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/patchJSCode.js +65 -0
  13. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/readJSCode.d.ts +10 -0
  14. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/readJSCode.js +61 -0
  15. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/writeJSCode.d.ts +10 -0
  16. package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/writeJSCode.js +65 -0
  17. package/dist/ai/docs/runjs/context/block-model.md +35 -35
  18. package/dist/ai/docs/runjs/context/collection-field.md +53 -51
  19. package/dist/ai/docs/runjs/context/collection.md +39 -39
  20. package/dist/ai/docs/runjs/context/data-source-manager.md +40 -30
  21. package/dist/ai/docs/runjs/context/data-source.md +52 -44
  22. package/dist/ai/docs/runjs/context/element.md +44 -38
  23. package/dist/ai/docs/runjs/context/exit-all.md +37 -35
  24. package/dist/ai/docs/runjs/context/exit.md +38 -35
  25. package/dist/ai/docs/runjs/context/filter-manager.md +36 -30
  26. package/dist/ai/docs/runjs/context/form.md +57 -57
  27. package/dist/ai/docs/runjs/context/get-model.md +22 -21
  28. package/dist/ai/docs/runjs/context/get-value.md +20 -19
  29. package/dist/ai/docs/runjs/context/get-var.md +61 -55
  30. package/dist/ai/docs/runjs/context/i18n.md +17 -14
  31. package/dist/ai/docs/runjs/context/import-async.md +333 -45
  32. package/dist/ai/docs/runjs/context/init-resource.md +20 -20
  33. package/dist/ai/docs/runjs/context/libs.md +31 -31
  34. package/dist/ai/docs/runjs/context/location.md +34 -31
  35. package/dist/ai/docs/runjs/context/logger.md +41 -40
  36. package/dist/ai/docs/runjs/context/make-resource.md +27 -26
  37. package/dist/ai/docs/runjs/context/message.md +42 -41
  38. package/dist/ai/docs/runjs/context/modal.md +44 -44
  39. package/dist/ai/docs/runjs/context/model.md +36 -33
  40. package/dist/ai/docs/runjs/context/notification.md +41 -40
  41. package/dist/ai/docs/runjs/context/off.md +14 -14
  42. package/dist/ai/docs/runjs/context/on.md +30 -29
  43. package/dist/ai/docs/runjs/context/open-view.md +40 -40
  44. package/dist/ai/docs/runjs/context/render.md +37 -32
  45. package/dist/ai/docs/runjs/context/request.md +46 -45
  46. package/dist/ai/docs/runjs/context/require-async.md +28 -25
  47. package/dist/ai/docs/runjs/context/resource.md +34 -34
  48. package/dist/ai/docs/runjs/context/route.md +36 -34
  49. package/dist/ai/docs/runjs/context/router.md +43 -31
  50. package/dist/ai/docs/runjs/context/set-value.md +18 -17
  51. package/dist/ai/docs/runjs/context/sql.md +7 -15
  52. package/dist/ai/docs/runjs/context/t.md +20 -17
  53. package/dist/ai/docs/runjs/context/view.md +49 -46
  54. package/dist/ai/docs/runjs/document.md +1 -0
  55. package/dist/ai/docs/runjs/import-modules.md +32 -32
  56. package/dist/ai/docs/runjs/index.md +13 -13
  57. package/dist/ai/docs/runjs/jsx.md +19 -19
  58. package/dist/ai/docs/runjs/model/form-block-model.md +1 -3
  59. package/dist/ai/docs/runjs/render.md +15 -15
  60. package/dist/ai/docs/runjs/resource/api-resource.md +53 -53
  61. package/dist/ai/docs/runjs/resource/multi-record-resource.md +64 -64
  62. package/dist/ai/docs/runjs/resource/single-record-resource.md +55 -55
  63. package/dist/ai/docs/runjs/resource/sql-resource.md +57 -57
  64. package/dist/ai/docs/runjs/window.md +5 -5
  65. package/dist/client/index.js +1 -1
  66. package/dist/externalVersion.js +12 -11
  67. package/dist/locale/en-US.json +1 -0
  68. package/dist/locale/index.d.ts +2 -0
  69. package/dist/locale/zh-CN.json +1 -0
  70. package/dist/node_modules/ses/dist/ses.cjs +1 -1
  71. package/dist/node_modules/ses/package.json +1 -1
  72. package/dist/node_modules/zod/index.cjs +1 -1
  73. package/dist/node_modules/zod/package.json +1 -1
  74. package/dist/server/collections/flowsql.js +1 -0
  75. package/dist/server/flow-surfaces/action-scope.d.ts +39 -0
  76. package/dist/server/flow-surfaces/action-scope.js +156 -0
  77. package/dist/server/flow-surfaces/apply/compiler.d.ts +13 -0
  78. package/dist/server/flow-surfaces/apply/compiler.js +971 -0
  79. package/dist/server/flow-surfaces/apply/layout.d.ts +34 -0
  80. package/dist/server/flow-surfaces/apply/layout.js +175 -0
  81. package/dist/server/flow-surfaces/apply/matching.d.ts +16 -0
  82. package/dist/server/flow-surfaces/apply/matching.js +181 -0
  83. package/dist/server/flow-surfaces/approval/blueprint-service.d.ts +84 -0
  84. package/dist/server/flow-surfaces/approval/blueprint-service.js +589 -0
  85. package/dist/server/flow-surfaces/approval/blueprint.d.ts +21 -0
  86. package/dist/server/flow-surfaces/approval/blueprint.js +187 -0
  87. package/dist/server/flow-surfaces/approval/builder.d.ts +225 -0
  88. package/dist/server/flow-surfaces/approval/builder.js +384 -0
  89. package/dist/server/flow-surfaces/approval/catalog-specs.d.ts +33 -0
  90. package/dist/server/flow-surfaces/approval/catalog-specs.js +156 -0
  91. package/dist/server/flow-surfaces/approval/index.d.ts +14 -0
  92. package/dist/server/flow-surfaces/approval/index.js +40 -0
  93. package/dist/server/flow-surfaces/approval/runtime-config.d.ts +44 -0
  94. package/dist/server/flow-surfaces/approval/runtime-config.js +299 -0
  95. package/dist/server/flow-surfaces/approval/semantic-use.d.ts +23 -0
  96. package/dist/server/flow-surfaces/approval/semantic-use.js +155 -0
  97. package/dist/server/flow-surfaces/association-interfaces.d.ts +10 -0
  98. package/dist/server/flow-surfaces/association-interfaces.js +39 -0
  99. package/dist/server/flow-surfaces/association-title-field.d.ts +20 -0
  100. package/dist/server/flow-surfaces/association-title-field.js +192 -0
  101. package/dist/server/flow-surfaces/blueprint/compile-blocks.d.ts +15 -0
  102. package/dist/server/flow-surfaces/blueprint/compile-blocks.js +1251 -0
  103. package/dist/server/flow-surfaces/blueprint/compile-plan.d.ts +14 -0
  104. package/dist/server/flow-surfaces/blueprint/compile-plan.js +308 -0
  105. package/dist/server/flow-surfaces/blueprint/compile-reaction.d.ts +11 -0
  106. package/dist/server/flow-surfaces/blueprint/compile-reaction.js +72 -0
  107. package/dist/server/flow-surfaces/blueprint/defaults.d.ts +26 -0
  108. package/dist/server/flow-surfaces/blueprint/defaults.js +133 -0
  109. package/dist/server/flow-surfaces/blueprint/index.d.ts +12 -0
  110. package/dist/server/flow-surfaces/blueprint/index.js +44 -0
  111. package/dist/server/flow-surfaces/blueprint/normalize-document.d.ts +10 -0
  112. package/dist/server/flow-surfaces/blueprint/normalize-document.js +407 -0
  113. package/dist/server/flow-surfaces/blueprint/private-utils.d.ts +25 -0
  114. package/dist/server/flow-surfaces/blueprint/private-utils.js +179 -0
  115. package/dist/server/flow-surfaces/blueprint/public-types.d.ts +201 -0
  116. package/dist/server/flow-surfaces/blueprint/public-types.js +24 -0
  117. package/dist/server/flow-surfaces/builder.d.ts +238 -0
  118. package/dist/server/flow-surfaces/builder.js +1261 -0
  119. package/dist/server/flow-surfaces/catalog-smart.d.ts +18 -0
  120. package/dist/server/flow-surfaces/catalog-smart.js +239 -0
  121. package/dist/server/flow-surfaces/catalog-smart.projector.d.ts +15 -0
  122. package/dist/server/flow-surfaces/catalog-smart.projector.js +157 -0
  123. package/dist/server/flow-surfaces/catalog-smart.types.d.ts +99 -0
  124. package/dist/server/flow-surfaces/catalog-smart.types.js +24 -0
  125. package/dist/server/flow-surfaces/catalog.d.ts +79 -0
  126. package/dist/server/flow-surfaces/catalog.js +3743 -0
  127. package/dist/server/flow-surfaces/chart-config.d.ts +121 -0
  128. package/dist/server/flow-surfaces/chart-config.js +1394 -0
  129. package/dist/server/flow-surfaces/compose-compiler.d.ts +115 -0
  130. package/dist/server/flow-surfaces/compose-compiler.js +174 -0
  131. package/dist/server/flow-surfaces/compose-runtime.d.ts +94 -0
  132. package/dist/server/flow-surfaces/compose-runtime.js +376 -0
  133. package/dist/server/flow-surfaces/configure-options.d.ts +23 -0
  134. package/dist/server/flow-surfaces/configure-options.js +904 -0
  135. package/dist/server/flow-surfaces/constants.d.ts +351 -0
  136. package/dist/server/flow-surfaces/constants.js +104 -0
  137. package/dist/server/flow-surfaces/context.d.ts +72 -0
  138. package/dist/server/flow-surfaces/context.js +556 -0
  139. package/dist/server/flow-surfaces/contract-guard.d.ts +19 -0
  140. package/dist/server/flow-surfaces/contract-guard.js +410 -0
  141. package/dist/server/flow-surfaces/core-field-default-bindings.d.ts +12 -0
  142. package/dist/server/flow-surfaces/core-field-default-bindings.js +157 -0
  143. package/dist/server/flow-surfaces/default-action-popup.d.ts +63 -0
  144. package/dist/server/flow-surfaces/default-action-popup.js +322 -0
  145. package/dist/server/flow-surfaces/default-block-actions.d.ts +32 -0
  146. package/dist/server/flow-surfaces/default-block-actions.js +210 -0
  147. package/dist/server/flow-surfaces/errors.d.ts +47 -0
  148. package/dist/server/flow-surfaces/errors.js +145 -0
  149. package/dist/server/flow-surfaces/executor.d.ts +23 -0
  150. package/dist/server/flow-surfaces/executor.js +132 -0
  151. package/dist/server/flow-surfaces/field-binding-registry.d.ts +24 -0
  152. package/dist/server/flow-surfaces/field-binding-registry.js +396 -0
  153. package/dist/server/flow-surfaces/field-semantics.d.ts +15 -0
  154. package/dist/server/flow-surfaces/field-semantics.js +84 -0
  155. package/dist/server/flow-surfaces/field-type-resolver.d.ts +45 -0
  156. package/dist/server/flow-surfaces/field-type-resolver.js +312 -0
  157. package/dist/server/flow-surfaces/filter-group.d.ts +15 -0
  158. package/dist/server/flow-surfaces/filter-group.js +94 -0
  159. package/dist/server/flow-surfaces/hidden-popup-calendar.d.ts +86 -0
  160. package/dist/server/flow-surfaces/hidden-popup-calendar.js +554 -0
  161. package/dist/server/flow-surfaces/hidden-popup-contract.d.ts +116 -0
  162. package/dist/server/flow-surfaces/hidden-popup-contract.js +611 -0
  163. package/dist/server/flow-surfaces/hidden-popup-kanban.d.ts +62 -0
  164. package/dist/server/flow-surfaces/hidden-popup-kanban.js +651 -0
  165. package/dist/server/flow-surfaces/index.d.ts +11 -0
  166. package/dist/server/flow-surfaces/index.js +302 -0
  167. package/dist/server/flow-surfaces/locator.d.ts +28 -0
  168. package/dist/server/flow-surfaces/locator.js +240 -0
  169. package/dist/server/flow-surfaces/node-use-sets.d.ts +15 -0
  170. package/dist/server/flow-surfaces/node-use-sets.js +135 -0
  171. package/dist/server/flow-surfaces/payload-shape.d.ts +9 -0
  172. package/dist/server/flow-surfaces/payload-shape.js +61 -0
  173. package/dist/server/flow-surfaces/placement.d.ts +33 -0
  174. package/dist/server/flow-surfaces/placement.js +199 -0
  175. package/dist/server/flow-surfaces/planning/action-specs.d.ts +179 -0
  176. package/dist/server/flow-surfaces/planning/action-specs.js +190 -0
  177. package/dist/server/flow-surfaces/planning/compiler.d.ts +37 -0
  178. package/dist/server/flow-surfaces/planning/compiler.js +376 -0
  179. package/dist/server/flow-surfaces/planning/context.d.ts +30 -0
  180. package/dist/server/flow-surfaces/planning/context.js +139 -0
  181. package/dist/server/flow-surfaces/planning/created-keys.d.ts +34 -0
  182. package/dist/server/flow-surfaces/planning/created-keys.js +375 -0
  183. package/dist/server/flow-surfaces/planning/key-kind.d.ts +11 -0
  184. package/dist/server/flow-surfaces/planning/key-kind.js +88 -0
  185. package/dist/server/flow-surfaces/planning/key-persistence.d.ts +34 -0
  186. package/dist/server/flow-surfaces/planning/key-persistence.js +148 -0
  187. package/dist/server/flow-surfaces/planning/key-registry.d.ts +40 -0
  188. package/dist/server/flow-surfaces/planning/key-registry.js +206 -0
  189. package/dist/server/flow-surfaces/planning/runtime.d.ts +37 -0
  190. package/dist/server/flow-surfaces/planning/runtime.js +259 -0
  191. package/dist/server/flow-surfaces/planning/step-link.d.ts +14 -0
  192. package/dist/server/flow-surfaces/planning/step-link.js +104 -0
  193. package/dist/server/flow-surfaces/planning/types.d.ts +55 -0
  194. package/dist/server/flow-surfaces/planning/types.js +24 -0
  195. package/dist/server/flow-surfaces/public-compatibility.d.ts +28 -0
  196. package/dist/server/flow-surfaces/public-compatibility.js +161 -0
  197. package/dist/server/flow-surfaces/public-data-surface-default-filter.d.ts +24 -0
  198. package/dist/server/flow-surfaces/public-data-surface-default-filter.js +152 -0
  199. package/dist/server/flow-surfaces/reaction/errors.d.ts +20 -0
  200. package/dist/server/flow-surfaces/reaction/errors.js +69 -0
  201. package/dist/server/flow-surfaces/reaction/field-value.d.ts +34 -0
  202. package/dist/server/flow-surfaces/reaction/field-value.js +181 -0
  203. package/dist/server/flow-surfaces/reaction/fingerprint.d.ts +16 -0
  204. package/dist/server/flow-surfaces/reaction/fingerprint.js +71 -0
  205. package/dist/server/flow-surfaces/reaction/linkage.d.ts +136 -0
  206. package/dist/server/flow-surfaces/reaction/linkage.js +882 -0
  207. package/dist/server/flow-surfaces/reaction/meta.d.ts +11 -0
  208. package/dist/server/flow-surfaces/reaction/meta.js +451 -0
  209. package/dist/server/flow-surfaces/reaction/registry.d.ts +156 -0
  210. package/dist/server/flow-surfaces/reaction/registry.js +206 -0
  211. package/dist/server/flow-surfaces/reaction/resolver.d.ts +22 -0
  212. package/dist/server/flow-surfaces/reaction/resolver.js +202 -0
  213. package/dist/server/flow-surfaces/reaction/types.d.ts +241 -0
  214. package/dist/server/flow-surfaces/reaction/types.js +24 -0
  215. package/dist/server/flow-surfaces/reaction/utils.d.ts +17 -0
  216. package/dist/server/flow-surfaces/reaction/utils.js +67 -0
  217. package/dist/server/flow-surfaces/reaction/value-expr.d.ts +15 -0
  218. package/dist/server/flow-surfaces/reaction/value-expr.js +209 -0
  219. package/dist/server/flow-surfaces/reference-guards.d.ts +19 -0
  220. package/dist/server/flow-surfaces/reference-guards.js +103 -0
  221. package/dist/server/flow-surfaces/route-sync.d.ts +47 -0
  222. package/dist/server/flow-surfaces/route-sync.js +392 -0
  223. package/dist/server/flow-surfaces/service-helpers.d.ts +42 -0
  224. package/dist/server/flow-surfaces/service-helpers.js +310 -0
  225. package/dist/server/flow-surfaces/service-utils.d.ts +120 -0
  226. package/dist/server/flow-surfaces/service-utils.js +878 -0
  227. package/dist/server/flow-surfaces/service.d.ts +894 -0
  228. package/dist/server/flow-surfaces/service.js +16200 -0
  229. package/dist/server/flow-surfaces/support-matrix.d.ts +31 -0
  230. package/dist/server/flow-surfaces/support-matrix.js +282 -0
  231. package/dist/server/flow-surfaces/surface-context.d.ts +52 -0
  232. package/dist/server/flow-surfaces/surface-context.js +440 -0
  233. package/dist/server/flow-surfaces/template-compatibility.d.ts +42 -0
  234. package/dist/server/flow-surfaces/template-compatibility.js +189 -0
  235. package/dist/server/flow-surfaces/template-display.d.ts +20 -0
  236. package/dist/server/flow-surfaces/template-display.js +289 -0
  237. package/dist/server/flow-surfaces/template-service-utils.d.ts +62 -0
  238. package/dist/server/flow-surfaces/template-service-utils.js +281 -0
  239. package/dist/server/flow-surfaces/types.d.ts +288 -0
  240. package/dist/server/flow-surfaces/types.js +24 -0
  241. package/dist/server/index.d.ts +1 -0
  242. package/dist/server/index.js +7 -2
  243. package/dist/server/plugin.d.ts +0 -1
  244. package/dist/server/plugin.js +9 -34
  245. package/dist/server/repository.js +0 -5
  246. package/dist/server/variables/resolve.d.ts +21 -0
  247. package/dist/server/variables/resolve.js +79 -0
  248. package/dist/swagger/flow-surfaces.d.ts +6106 -0
  249. package/dist/swagger/flow-surfaces.examples.d.ts +1577 -0
  250. package/dist/swagger/flow-surfaces.examples.js +1816 -0
  251. package/dist/swagger/flow-surfaces.js +5375 -0
  252. package/dist/swagger/flow-surfaces.template-action-docs.d.ts +62 -0
  253. package/dist/swagger/flow-surfaces.template-action-docs.js +121 -0
  254. package/dist/swagger/flow-surfaces.template-schemas.d.ts +239 -0
  255. package/dist/swagger/flow-surfaces.template-schemas.js +255 -0
  256. package/dist/swagger/index.d.ts +6111 -0
  257. package/dist/swagger/index.js +50 -0
  258. package/package.json +3 -3
  259. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextApis.d.ts +0 -0
  260. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextEnvs.d.ts +0 -0
  261. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextVars.d.ts +0 -0
  262. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/lintAndTestJS.d.ts +0 -0
@@ -1,86 +1,89 @@
1
1
  # ctx.exit()
2
2
 
3
- Stops the current event flow; later steps in that flow do not run. Often used when business conditions fail, the user cancels, or an unrecoverable error occurs.
3
+ Terminates the execution of the current event flow; subsequent steps will not run. It is commonly used when business conditions are not met, the user cancels, or an irrecoverable error occurs.
4
4
 
5
5
  ## Use Cases
6
6
 
7
- `ctx.exit()` is used in contexts that execute JS, such as:
7
+ `ctx.exit()` is generally used in the following contexts where JS can be executed:
8
8
 
9
9
  | Scenario | Description |
10
- |----------|-------------|
11
- | **Event flow** | In flows triggered by form submit, button click, etc., stop when conditions are not met |
12
- | **Linkage rules** | Field or filter linkage; stop when validation fails or execution should be skipped |
13
- | **Action events** | In custom actions (e.g. delete confirm, pre-save validation), exit when user cancels or validation fails |
10
+ |------|------|
11
+ | **Event Flow** | In event flows triggered by form submissions, button clicks, etc., terminates subsequent steps when conditions are not met. |
12
+ | **Linkage Rules** | In field linkages, filter linkages, etc., terminates the current event flow when validation fails or execution needs to be skipped. |
13
+ | **Action Events** | In custom actions (e.g., delete confirmation, pre-save validation), exits when the user cancels or validation fails. |
14
14
 
15
- > Difference from `ctx.exitAll()`: `ctx.exit()` only stops the **current** event flow; other flows for the same event still run. `ctx.exitAll()` also stops **subsequent** flows for that event.
15
+ > Difference from `ctx.exitAll()`: `ctx.exit()` only terminates the current event flow; other event flows under the same event are not affected. `ctx.exitAll()` terminates the current event flow as well as any subsequent event flows under the same event that have not yet been executed.
16
16
 
17
- ## Type
17
+ ## Type Definition
18
18
 
19
19
  ```ts
20
20
  exit(): never;
21
21
  ```
22
22
 
23
- Calling `ctx.exit()` throws an internal `FlowExitException`, which the event flow engine catches and uses to stop the current flow. Once called, the rest of the current JS does not run.
23
+ Calling `ctx.exit()` throws an internal `FlowExitException`, which is caught by the FlowEngine to stop the current event flow execution. Once called, the remaining statements in the current JS code will not execute.
24
24
 
25
25
  ## Comparison with ctx.exitAll()
26
26
 
27
- | Method | Scope |
28
- |--------|--------|
29
- | `ctx.exit()` | Stops only the current event flow; others unaffected |
30
- | `ctx.exitAll()` | Stops the current flow and **subsequent** flows for the same event |
27
+ | Method | Scope of Effect |
28
+ |------|----------|
29
+ | `ctx.exit()` | Terminates only the current event flow; subsequent event flows are unaffected. |
30
+ | `ctx.exitAll()` | Terminates the current event flow and aborts subsequent event flows under the same event that are set to **execute sequentially**. |
31
31
 
32
32
  ## Examples
33
33
 
34
- ### Exit on user cancel
34
+ ### Exit on User Cancellation
35
35
 
36
36
  ```ts
37
+ // In a confirmation modal, terminate the event flow if the user clicks cancel
37
38
  if (!confirmed) {
38
- ctx.message.info('Cancelled');
39
+ ctx.message.info('Operation cancelled');
39
40
  ctx.exit();
40
41
  }
41
42
  ```
42
43
 
43
- ### Exit on validation failure
44
+ ### Exit on Parameter Validation Failure
44
45
 
45
46
  ```ts
47
+ // Prompt and terminate when validation fails
46
48
  if (!params.value || params.value.length < 3) {
47
- ctx.message.error('Invalid: length must be at least 3');
49
+ ctx.message.error('Invalid parameters, length must be at least 3');
48
50
  ctx.exit();
49
51
  }
50
52
  ```
51
53
 
52
- ### Exit when business condition fails
54
+ ### Exit When Business Conditions Are Not Met
53
55
 
54
56
  ```ts
57
+ // Terminate if conditions are not met; subsequent steps will not execute
55
58
  const record = ctx.model?.getValue?.();
56
59
  if (!record || record.status !== 'draft') {
57
- ctx.notification.warning({ message: 'Only draft can be submitted' });
60
+ ctx.notification.warning({ message: 'Only drafts can be submitted' });
58
61
  ctx.exit();
59
62
  }
60
63
  ```
61
64
 
62
- ### When to use ctx.exit() vs ctx.exitAll()
65
+ ### Choosing Between ctx.exit() and ctx.exitAll()
63
66
 
64
67
  ```ts
65
- // Only this flow should stop → ctx.exit()
68
+ // Only the current event flow needs to exit Use ctx.exit()
66
69
  if (!params.valid) {
67
- ctx.message.error('Invalid params');
68
- ctx.exit();
70
+ ctx.message.error('Invalid parameters');
71
+ ctx.exit(); // Other event flows are unaffected
69
72
  }
70
73
 
71
- // Stop this and all subsequent flows for this event → ctx.exitAll()
74
+ // Need to terminate all subsequent event flows under the current event → Use ctx.exitAll()
72
75
  if (!ctx.model?.context?.getPermission?.()) {
73
- ctx.notification.warning({ message: 'No permission' });
74
- ctx.exitAll();
76
+ ctx.notification.warning({ message: 'Insufficient permissions' });
77
+ ctx.exitAll(); // Both the current event flow and subsequent event flows under the same event are terminated
75
78
  }
76
79
  ```
77
80
 
78
- ### Exit after modal confirm
81
+ ### Exit Based on User Choice After Modal Confirmation
79
82
 
80
83
  ```ts
81
84
  const ok = await ctx.modal?.confirm?.({
82
- title: 'Confirm delete',
83
- content: 'Cannot be recovered. Continue?',
85
+ title: 'Confirm Delete',
86
+ content: 'This action cannot be undone. Do you want to continue?',
84
87
  });
85
88
  if (!ok) {
86
89
  ctx.message.info('Cancelled');
@@ -90,12 +93,12 @@ if (!ok) {
90
93
 
91
94
  ## Notes
92
95
 
93
- - After `ctx.exit()`, the rest of the current JS does not run; use `ctx.message`, `ctx.notification`, or a dialog before calling to explain why.
94
- - You usually do not need to catch `FlowExitException`; the event flow engine handles it.
95
- - To stop all subsequent flows for the same event, use `ctx.exitAll()`.
96
+ - After calling `ctx.exit()`, subsequent code in the current JS will not execute; it is recommended to explain the reason to the user via `ctx.message`, `ctx.notification`, or a modal before calling it.
97
+ - There is usually no need to catch `FlowExitException` in business code; let the FlowEngine handle it.
98
+ - If you need to terminate all subsequent event flows under the current event, use `ctx.exitAll()`.
96
99
 
97
100
  ## Related
98
101
 
99
- - [ctx.exitAll()](./exit-all.md): stop current and subsequent flows for the event
100
- - [ctx.message](./message.md): message API
101
- - [ctx.modal](./modal.md): confirm dialog
102
+ - [ctx.exitAll()](./exit-all.md): Terminates the current event flow and subsequent event flows under the same event.
103
+ - [ctx.message](./message.md): Message prompts.
104
+ - [ctx.modal](./modal.md): Confirmation modals.
@@ -1,28 +1,28 @@
1
1
  # ctx.filterManager
2
2
 
3
- The filter connection manager that links filter forms (FilterForm) to data blocks (tables, lists, charts, etc.). Provided by `BlockGridModel`; only available in that context (e.g. pages with a filter form block).
3
+ The Filter Connection Manager is used to manage the filter associations between filter forms (FilterForm) and data blocks (tables, lists, charts, etc.). It is provided by `BlockGridModel` and is only available within its context (e.g., filter form blocks, data blocks).
4
4
 
5
5
  ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |----------|-------------|
9
- | **Filter form block** | Manage connections between filter items and target blocks; refresh targets when filters change |
10
- | **Data block (table/list)** | Act as filter target; bind filter conditions via `bindToTarget` |
11
- | **Linkage / custom FilterModel** | In `doFilter`, `doReset`, call `refreshTargetsByFilter` to refresh targets |
12
- | **Connection field config** | Use `getConnectFieldsConfig`, `saveConnectFieldsConfig` for filter–target field mapping |
8
+ |------|------|
9
+ | **Filter Form Block** | Manages connection configurations between filter items and target blocks; refreshes target data when filters change. |
10
+ | **Data Block (Table/List)** | Acts as a filter target, binding filter conditions via `bindToTarget`. |
11
+ | **Linkage Rules / Custom FilterModel** | Calls `refreshTargetsByFilter` within `doFilter` or `doReset` to trigger target refreshes. |
12
+ | **Connection Field Configuration** | Uses `getConnectFieldsConfig` and `saveConnectFieldsConfig` to maintain field mappings between filters and targets. |
13
13
 
14
- > Note: `ctx.filterManager` is only available in RunJS contexts that have a `BlockGridModel` (e.g. pages with a filter form); in a plain JSBlock or standalone page it is `undefined`—check before use.
14
+ > Note: `ctx.filterManager` is only available in RunJS contexts that have a `BlockGridModel` (e.g., within a page containing a filter form); it is `undefined` in regular JSBlocks or independent pages. It is recommended to use optional chaining before access.
15
15
 
16
- ## Type
16
+ ## Type Definitions
17
17
 
18
18
  ```ts
19
19
  filterManager: FilterManager;
20
20
 
21
21
  type FilterConfig = {
22
- filterId: string;
23
- targetId: string;
24
- filterPaths?: string[];
25
- operator?: string;
22
+ filterId: string; // Filter model UID
23
+ targetId: string; // Target data block model UID
24
+ filterPaths?: string[]; // Field paths of the target block
25
+ operator?: string; // Filter operator
26
26
  };
27
27
 
28
28
  type ConnectFieldsConfig = {
@@ -33,24 +33,24 @@ type ConnectFieldsConfig = {
33
33
  ## Common Methods
34
34
 
35
35
  | Method | Description |
36
- |--------|-------------|
37
- | `getFilterConfigs()` | All filter connection configs |
38
- | `getConnectFieldsConfig(filterId)` | Connection field config for a filter |
39
- | `saveConnectFieldsConfig(filterId, config)` | Save connection field config for a filter |
40
- | `addFilterConfig(config)` | Add filter config (filterId + targetId + filterPaths) |
41
- | `removeFilterConfig({ filterId?, targetId?, persist? })` | Remove config by filterId and/or targetId |
42
- | `bindToTarget(targetId)` | Bind filter to target block; its resource applies the filter |
43
- | `unbindFromTarget(targetId)` | Unbind filter from target |
44
- | `refreshTargetsByFilter(filterId or filterId[])` | Refresh target block(s) by filter |
36
+ |------|------|
37
+ | `getFilterConfigs()` | Gets all current filter connection configurations. |
38
+ | `getConnectFieldsConfig(filterId)` | Gets the connection field configuration for a specific filter. |
39
+ | `saveConnectFieldsConfig(filterId, config)` | Saves the connection field configuration for a filter. |
40
+ | `addFilterConfig(config)` | Adds a filter configuration (filterId + targetId + filterPaths). |
41
+ | `removeFilterConfig({ filterId?, targetId?, persist? })` | Removes filter configurations by filterId, targetId, or both. |
42
+ | `bindToTarget(targetId)` | Binds the filter configuration to a target block, triggering its resource to apply the filter. |
43
+ | `unbindFromTarget(targetId)` | Unbinds the filter from the target block. |
44
+ | `refreshTargetsByFilter(filterId | filterId[])` | Refreshes associated target block data based on the filter(s). |
45
45
 
46
- ## Concepts
46
+ ## Core Concepts
47
47
 
48
- - **FilterModel**: Provides filter values (e.g. FilterFormItemModel); must implement `getFilterValue()`.
49
- - **TargetModel**: Data block being filtered; its `resource` must support `addFilterGroup`, `removeFilterGroup`, `refresh`.
48
+ - **FilterModel**: A model providing filter conditions (e.g., FilterFormItemModel), which must implement `getFilterValue()` to return the current filter value.
49
+ - **TargetModel**: The data block being filtered; its `resource` must support `addFilterGroup`, `removeFilterGroup`, and `refresh`.
50
50
 
51
51
  ## Examples
52
52
 
53
- ### Add filter config
53
+ ### Add Filter Configuration
54
54
 
55
55
  ```ts
56
56
  await ctx.filterManager?.addFilterConfig({
@@ -61,19 +61,23 @@ await ctx.filterManager?.addFilterConfig({
61
61
  });
62
62
  ```
63
63
 
64
- ### Refresh target blocks
64
+ ### Refresh Target Blocks
65
65
 
66
66
  ```ts
67
+ // In doFilter / doReset of a filter form
67
68
  ctx.filterManager?.refreshTargetsByFilter(ctx.model.uid);
68
69
 
70
+ // Refresh targets associated with multiple filters
69
71
  ctx.filterManager?.refreshTargetsByFilter(['filter-1', 'filter-2']);
70
72
  ```
71
73
 
72
- ### Connection field config
74
+ ### Connection Field Configuration
73
75
 
74
76
  ```ts
77
+ // Get connection configuration
75
78
  const config = ctx.filterManager?.getConnectFieldsConfig(ctx.model.uid);
76
79
 
80
+ // Save connection configuration
77
81
  await ctx.filterManager?.saveConnectFieldsConfig(ctx.model.uid, {
78
82
  targets: [
79
83
  { targetId: 'table-uid', filterPaths: ['status'] },
@@ -82,15 +86,17 @@ await ctx.filterManager?.saveConnectFieldsConfig(ctx.model.uid, {
82
86
  });
83
87
  ```
84
88
 
85
- ### Remove config
89
+ ### Remove Configuration
86
90
 
87
91
  ```ts
92
+ // Delete all configurations for a specific filter
88
93
  await ctx.filterManager?.removeFilterConfig({ filterId: 'filter-uid' });
89
94
 
95
+ // Delete all filter configurations for a specific target
90
96
  await ctx.filterManager?.removeFilterConfig({ targetId: 'table-uid' });
91
97
  ```
92
98
 
93
99
  ## Related
94
100
 
95
- - [ctx.resource](./resource.md): target blocks resource must support filter APIs
96
- - [ctx.model](./model.md): current model uid for filterId / targetId
101
+ - [ctx.resource](./resource.md): The target block's resource must support the filter interface.
102
+ - [ctx.model](./model.md): Used to get the current model's UID for filterId / targetId.
@@ -1,109 +1,109 @@
1
1
  # ctx.form
2
2
 
3
- The Ant Design Form instance for the current block; used to read/write form fields, trigger validation, and submit. Same as `ctx.blockModel?.form`; in form blocks (Form, EditForm, sub-forms, etc.) you can use it directly.
3
+ The Ant Design Form instance within the current block, used to read/write form fields, trigger validation, and submission. It is equivalent to `ctx.blockModel?.form` and can be used directly in form-related blocks (Form, Edit Form, Sub-form, etc.).
4
4
 
5
5
  ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |----------|-------------|
9
- | **JSField** | Read/write other fields for linkage, compute or validate from other field values |
10
- | **JSItem** | Read/write same row or other fields in sub-table items |
11
- | **JSColumn** | Read row or related field values for column rendering |
12
- | **Form actions / event flow** | Pre-submit validation, batch field updates, reset form, etc. |
8
+ |------|------|
9
+ | **JSField** | Read/write other form fields to implement linkage, or perform calculations and validation based on other field values. |
10
+ | **JSItem** | Read/write same-row or other fields within sub-table items to achieve in-table linkage. |
11
+ | **JSColumn** | Read the current row or association field values in a table column for rendering. |
12
+ | **Form Actions / Workflow** | Pre-submission validation, batch updating fields, resetting forms, etc. |
13
13
 
14
- > Note: `ctx.form` is only available in RunJS contexts tied to a form block (Form, EditForm, sub-forms, etc.); in non-form contexts (e.g. standalone JSBlock, table block) it may be absent—check before use: `ctx.form?.getFieldsValue()`.
14
+ > Note: `ctx.form` is only available in RunJS contexts related to form blocks (Form, Edit Form, Sub-form, etc.). It may not exist in non-form scenarios (such as independent JSBlocks or Table blocks). It is recommended to perform a null check before use: `ctx.form?.getFieldsValue()`.
15
15
 
16
- ## Type
16
+ ## Type Definition
17
17
 
18
18
  ```ts
19
19
  form: FormInstance<any>;
20
20
  ```
21
21
 
22
- `FormInstance` is the Ant Design Form instance type.
22
+ `FormInstance` is the instance type of Ant Design Form. Common methods are as follows.
23
23
 
24
24
  ## Common Methods
25
25
 
26
- ### Read form values
26
+ ### Reading Form Values
27
27
 
28
28
  ```ts
29
- // Current registered field values (default: only rendered fields)
29
+ // Read values of currently registered fields (defaults to rendered fields only)
30
30
  const values = ctx.form.getFieldsValue();
31
31
 
32
- // All field values (including unrendered, e.g. hidden, collapsed)
32
+ // Read values of all fields (including registered but unrendered fields, e.g., hidden or inside collapsed sections)
33
33
  const allValues = ctx.form.getFieldsValue(true);
34
34
 
35
- // Single field
35
+ // Read a single field
36
36
  const email = ctx.form.getFieldValue('email');
37
37
 
38
- // Nested (e.g. sub-table)
38
+ // Read nested fields (e.g., in a sub-table)
39
39
  const amount = ctx.form.getFieldValue(['orders', 0, 'amount']);
40
40
  ```
41
41
 
42
- ### Write form values
42
+ ### Writing Form Values
43
43
 
44
44
  ```ts
45
- // Batch update (e.g. linkage)
45
+ // Batch update (commonly used for linkage)
46
46
  ctx.form.setFieldsValue({
47
47
  status: 'active',
48
48
  updatedAt: new Date(),
49
49
  });
50
50
 
51
- // Single field
52
- ctx.form.setFieldValue('remark', 'Noted');
51
+ // Update a single field
52
+ ctx.form.setFieldValue('remark', 'Updated remark');
53
53
  ```
54
54
 
55
- ### Validation and submit
55
+ ### Validation and Submission
56
56
 
57
57
  ```ts
58
- // Trigger validation
58
+ // Trigger form validation
59
59
  await ctx.form.validateFields();
60
60
 
61
- // Trigger submit
61
+ // Trigger form submission
62
62
  ctx.form.submit();
63
63
  ```
64
64
 
65
- ### Reset
65
+ ### Resetting
66
66
 
67
67
  ```ts
68
- // All fields
68
+ // Reset all fields
69
69
  ctx.form.resetFields();
70
70
 
71
- // Specific fields
71
+ // Reset only specific fields
72
72
  ctx.form.resetFields(['status', 'remark']);
73
73
  ```
74
74
 
75
- ## Relation to Other Context
75
+ ## Relationship with Related Contexts
76
76
 
77
77
  ### ctx.getValue / ctx.setValue
78
78
 
79
- | Scenario | Recommended |
80
- |----------|-------------|
81
- | **Current field** | `ctx.getValue()` / `ctx.setValue(v)` |
82
- | **Other fields** | `ctx.form.getFieldValue(name)` / `ctx.form.setFieldValue(name, v)` |
79
+ | Scenario | Recommended Usage |
80
+ |------|----------|
81
+ | **Read/Write current field** | `ctx.getValue()` / `ctx.setValue(v)` |
82
+ | **Read/Write other fields** | `ctx.form.getFieldValue(name)` / `ctx.form.setFieldValue(name, v)` |
83
83
 
84
- In the current JS field, use `getValue`/`setValue` for that field; use `ctx.form` for other fields.
84
+ Within the current JS field, prioritize using `getValue`/`setValue` to read/write the field itself; use `ctx.form` when you need to access other fields.
85
85
 
86
86
  ### ctx.blockModel
87
87
 
88
- | Need | Recommended |
89
- |------|-------------|
90
- | **Read/write form fields** | `ctx.form` (same as `ctx.blockModel?.form`) |
91
- | **Parent block** | `ctx.blockModel` (includes `collection`, `resource`, etc.) |
88
+ | Requirement | Recommended Usage |
89
+ |------|----------|
90
+ | **Read/Write form fields** | `ctx.form` (Equivalent to `ctx.blockModel?.form`, more convenient) |
91
+ | **Access parent block** | `ctx.blockModel` (Contains `collection`, `resource`, etc.) |
92
92
 
93
93
  ### ctx.getVar('ctx.formValues')
94
94
 
95
- Form values are obtained via `await ctx.getVar('ctx.formValues')`, not as `ctx.formValues`. In form contexts, prefer `ctx.form.getFieldsValue()` for up-to-date values.
95
+ Form values must be obtained via `await ctx.getVar('ctx.formValues')` and are not directly exposed as `ctx.formValues`. In a form context, it is preferred to use `ctx.form.getFieldsValue()` to read the latest values in real-time.
96
96
 
97
97
  ## Notes
98
98
 
99
- - `getFieldsValue()` by default returns only rendered fields; for unrendered (e.g. collapsed) use `getFieldsValue(true)`.
100
- - Nested paths use arrays, e.g. `['orders', 0, 'amount']`; you can use `ctx.namePath` to build paths for other columns in the same row.
101
- - `validateFields()` throws with `errorFields` etc. on failure; use `ctx.exit()` to stop further steps when validation fails.
102
- - In event flow or linkage, `ctx.form` may not be ready yet; use optional chaining or null checks.
99
+ - `getFieldsValue()` returns only rendered fields by default. To include unrendered fields (e.g., in collapsed sections or hidden by conditional rules), pass `true`: `getFieldsValue(true)`.
100
+ - Paths for nested fields like sub-tables are arrays, e.g., `['orders', 0, 'amount']`. You can use `ctx.namePath` to get the current field's path and construct paths for other columns in the same row.
101
+ - `validateFields()` throws an error object containing `errorFields` and other information. If validation fails before submission, you can use `ctx.exit()` to terminate subsequent steps.
102
+ - In asynchronous scenarios like workflows or linkage rules, `ctx.form` might not be ready yet. It is recommended to use optional chaining or null checks.
103
103
 
104
104
  ## Examples
105
105
 
106
- ### Field linkage by type
106
+ ### Field Linkage: Display different content based on type
107
107
 
108
108
  ```ts
109
109
  const type = ctx.form.getFieldValue('type');
@@ -114,7 +114,7 @@ if (type === 'vip') {
114
114
  }
115
115
  ```
116
116
 
117
- ### Compute current field from others
117
+ ### Calculate current field based on other fields
118
118
 
119
119
  ```ts
120
120
  const quantity = ctx.form.getFieldValue('quantity') ?? 0;
@@ -122,48 +122,48 @@ const price = ctx.form.getFieldValue('price') ?? 0;
122
122
  ctx.setValue(quantity * price);
123
123
  ```
124
124
 
125
- ### Same row in sub-table
125
+ ### Read/Write other columns in the same row within a sub-table
126
126
 
127
127
  ```ts
128
- // ctx.namePath is current field path, e.g. ['orders', 0, 'amount']
129
- // Same row status: ['orders', 0, 'status']
128
+ // ctx.namePath is the path of the current field in the form, e.g., ['orders', 0, 'amount']
129
+ // Read 'status' in the same row: ['orders', 0, 'status']
130
130
  const rowIndex = ctx.namePath?.[1];
131
131
  const status = ctx.form.getFieldValue(['orders', rowIndex, 'status']);
132
132
  ```
133
133
 
134
- ### Pre-submit validation
134
+ ### Pre-submission Validation
135
135
 
136
136
  ```ts
137
137
  try {
138
138
  await ctx.form.validateFields();
139
- // Continue submit logic
139
+ // Validation passed, continue with submission logic
140
140
  } catch (e) {
141
- ctx.message.error('Please fix form errors');
141
+ ctx.message.error('Please check the form fields');
142
142
  ctx.exit();
143
143
  }
144
144
  ```
145
145
 
146
- ### Confirm then submit
146
+ ### Submit after Confirmation
147
147
 
148
148
  ```ts
149
149
  const confirmed = await ctx.modal.confirm({
150
- title: 'Confirm submit',
151
- content: 'Cannot be changed after submit. Continue?',
152
- okText: 'OK',
150
+ title: 'Confirm Submission',
151
+ content: 'You will not be able to modify this after submission. Continue?',
152
+ okText: 'Confirm',
153
153
  cancelText: 'Cancel',
154
154
  });
155
155
  if (confirmed) {
156
156
  await ctx.form.validateFields();
157
157
  ctx.form.submit();
158
158
  } else {
159
- ctx.exit();
159
+ ctx.exit(); // Terminate if user cancels
160
160
  }
161
161
  ```
162
162
 
163
163
  ## Related
164
164
 
165
- - [ctx.getValue()](./get-value.md) / [ctx.setValue()](./set-value.md): read/write current field
166
- - [ctx.blockModel](./block-model.md): parent block; `ctx.form` is `ctx.blockModel?.form`
167
- - [ctx.modal](./modal.md): confirm dialog, often with `ctx.form.validateFields()` / `ctx.form.submit()`
168
- - [ctx.exit()](./exit.md): stop flow on validation failure or cancel
169
- - `ctx.namePath`: current field path in the form (array); use for nested `getFieldValue` / `setFieldValue` names
165
+ - [ctx.getValue()](./get-value.md) / [ctx.setValue()](./set-value.md): Read and write the current field value.
166
+ - [ctx.blockModel](./block-model.md): Parent block model; `ctx.form` is equivalent to `ctx.blockModel?.form`.
167
+ - [ctx.modal](./modal.md): Confirmation dialogs, often used with `ctx.form.validateFields()` and `ctx.form.submit()`.
168
+ - [ctx.exit()](./exit.md): Terminate the process upon validation failure or user cancellation.
169
+ - `ctx.namePath`: The path (array) of the current field in the form, used to construct names for `getFieldValue` / `setFieldValue` in nested fields.
@@ -1,18 +1,18 @@
1
1
  # ctx.getModel()
2
2
 
3
- Returns a model instance (e.g. BlockModel, PageModel, ActionModel) from the current engine or view stack by its `uid`. Use in RunJS to access other models across blocks, pages, or popups.
3
+ Retrieves a model instance (such as `BlockModel`, `PageModel`, `ActionModel`, etc.) from the current engine or view stack based on the model `uid`. This is used in RunJS to access other models across blocks, pages, or popups.
4
4
 
5
- If you only need the model or block for the current execution context, use `ctx.model` or `ctx.blockModel` instead of `ctx.getModel`.
5
+ If you only need the model or block where the current execution context is located, prioritize using `ctx.model` or `ctx.blockModel` instead of `ctx.getModel`.
6
6
 
7
7
  ## Use Cases
8
8
 
9
9
  | Scenario | Description |
10
- |----------|-------------|
11
- | **JSBlock / JSAction** | Get another block’s model by known `uid`; read/write its `resource`, `form`, `setProps`, etc. |
12
- | **RunJS inside popup** | Access a model on the page that opened the popup; pass `searchInPreviousEngines: true` |
13
- | **Custom actions** | Find a form or sub-model in the settings panel across the view stack by `uid` |
10
+ |------|------|
11
+ | **JSBlock / JSAction** | Get models of other blocks based on a known `uid` to read or write their `resource`, `form`, `setProps`, etc. |
12
+ | **RunJS in Popups** | When needing to access a model on the page that opened the popup, pass `searchInPreviousEngines: true`. |
13
+ | **Custom Actions** | Locate forms or sub-models in the configuration panel by `uid` across view stacks to read their configuration or state. |
14
14
 
15
- ## Type
15
+ ## Type Definition
16
16
 
17
17
  ```ts
18
18
  getModel<T extends FlowModel = FlowModel>(
@@ -24,19 +24,19 @@ getModel<T extends FlowModel = FlowModel>(
24
24
  ## Parameters
25
25
 
26
26
  | Parameter | Type | Description |
27
- |-----------|------|-------------|
28
- | `uid` | `string` | Unique id of the target model (e.g. from config or creation) |
29
- | `searchInPreviousEngines` | `boolean` | Optional, default `false`. When `true`, search up the view stack from the current engine to find models in parent views (e.g. the page that opened the popup) |
27
+ |------|------|------|
28
+ | `uid` | `string` | The unique identifier of the target model instance, specified during configuration or creation (e.g., `ctx.model.uid`). |
29
+ | `searchInPreviousEngines` | `boolean` | Optional, defaults to `false`. When `true`, searches from the current engine up to the root in the "view stack," allowing access to models in upper-level engines (e.g., the page that opened a popup). |
30
30
 
31
- ## Return value
31
+ ## Return Value
32
32
 
33
- - Returns the corresponding `FlowModel` subclass (e.g. `BlockModel`, `FormBlockModel`, `ActionModel`) if found.
33
+ - Returns the corresponding `FlowModel` subclass instance (e.g., `BlockModel`, `FormBlockModel`, `ActionModel`) if found.
34
34
  - Returns `undefined` if not found.
35
35
 
36
- ## Search scope
36
+ ## Search Scope
37
37
 
38
- - **Default (`searchInPreviousEngines: false`)**: Search only in the **current engine** by `uid`. In popups or nested views, each view has its own engine; by default only the current view is searched.
39
- - **`searchInPreviousEngines: true`**: Search from the current engine along the `previousEngine` chain; returns the first match. Use when RunJS in a popup needs to access a model on the page that opened it.
38
+ - **Default (`searchInPreviousEngines: false`)**: Searches only within the **current engine** by `uid`. In popups or multi-level views, each view has an independent engine; by default, it only searches for models within the current view.
39
+ - **`searchInPreviousEngines: true`**: Searches upwards along the `previousEngine` chain starting from the current engine, returning the first match. This is useful for accessing a model on the page that opened the current popup.
40
40
 
41
41
  ## Examples
42
42
 
@@ -49,16 +49,17 @@ if (block?.resource) {
49
49
  }
50
50
  ```
51
51
 
52
- ### Access page model from inside popup
52
+ ### Access a model on the page from a popup
53
53
 
54
54
  ```ts
55
+ // Access a block on the page that opened the current popup
55
56
  const pageBlock = ctx.getModel('page-block-uid', true);
56
57
  if (pageBlock) {
57
58
  pageBlock.rerender?.();
58
59
  }
59
60
  ```
60
61
 
61
- ### Cross-model update and rerender
62
+ ### Cross-model read/write and trigger rerender
62
63
 
63
64
  ```ts
64
65
  const target = ctx.getModel('other-block-uid');
@@ -68,17 +69,17 @@ if (target) {
68
69
  }
69
70
  ```
70
71
 
71
- ### Null check
72
+ ### Safety check
72
73
 
73
74
  ```ts
74
75
  const model = ctx.getModel(someUid);
75
76
  if (!model) {
76
- ctx.message.warning('Target model not found');
77
+ ctx.message.warning('Target model does not exist');
77
78
  return;
78
79
  }
79
80
  ```
80
81
 
81
82
  ## Related
82
83
 
83
- - [ctx.model](./model.md): model for current execution context
84
- - [ctx.blockModel](./block-model.md): parent block of current JS; often no need for `getModel`
84
+ - [ctx.model](./model.md): The model where the current execution context is located.
85
+ - [ctx.blockModel](./block-model.md): The parent block model where the current JS is located; usually accessible without needing `getModel`.