@nocobase/plugin-flow-engine 2.1.0-beta.2 → 2.1.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) 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 +41 -0
  5. package/dist/ai/ai-employees/nathan/prompt.md +132 -0
  6. package/dist/ai/ai-employees/nathan/skills/frontend-developer/SKILLS.md +69 -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 +2 -2
  11. package/dist/ai/docs/runjs/context/block-model.md +35 -35
  12. package/dist/ai/docs/runjs/context/collection-field.md +53 -51
  13. package/dist/ai/docs/runjs/context/collection.md +39 -39
  14. package/dist/ai/docs/runjs/context/data-source-manager.md +40 -30
  15. package/dist/ai/docs/runjs/context/data-source.md +52 -44
  16. package/dist/ai/docs/runjs/context/element.md +44 -38
  17. package/dist/ai/docs/runjs/context/exit-all.md +37 -35
  18. package/dist/ai/docs/runjs/context/exit.md +38 -35
  19. package/dist/ai/docs/runjs/context/filter-manager.md +36 -30
  20. package/dist/ai/docs/runjs/context/form.md +57 -57
  21. package/dist/ai/docs/runjs/context/get-model.md +22 -21
  22. package/dist/ai/docs/runjs/context/get-value.md +20 -19
  23. package/dist/ai/docs/runjs/context/get-var.md +61 -55
  24. package/dist/ai/docs/runjs/context/i18n.md +17 -14
  25. package/dist/ai/docs/runjs/context/import-async.md +333 -45
  26. package/dist/ai/docs/runjs/context/init-resource.md +20 -20
  27. package/dist/ai/docs/runjs/context/libs.md +31 -31
  28. package/dist/ai/docs/runjs/context/location.md +34 -31
  29. package/dist/ai/docs/runjs/context/logger.md +41 -40
  30. package/dist/ai/docs/runjs/context/make-resource.md +27 -26
  31. package/dist/ai/docs/runjs/context/message.md +42 -41
  32. package/dist/ai/docs/runjs/context/modal.md +44 -44
  33. package/dist/ai/docs/runjs/context/model.md +36 -33
  34. package/dist/ai/docs/runjs/context/notification.md +41 -40
  35. package/dist/ai/docs/runjs/context/off.md +14 -14
  36. package/dist/ai/docs/runjs/context/on.md +30 -29
  37. package/dist/ai/docs/runjs/context/open-view.md +40 -40
  38. package/dist/ai/docs/runjs/context/render.md +37 -32
  39. package/dist/ai/docs/runjs/context/request.md +46 -45
  40. package/dist/ai/docs/runjs/context/require-async.md +28 -25
  41. package/dist/ai/docs/runjs/context/resource.md +34 -34
  42. package/dist/ai/docs/runjs/context/route.md +36 -34
  43. package/dist/ai/docs/runjs/context/router.md +43 -31
  44. package/dist/ai/docs/runjs/context/set-value.md +18 -17
  45. package/dist/ai/docs/runjs/context/sql.md +7 -15
  46. package/dist/ai/docs/runjs/context/t.md +20 -17
  47. package/dist/ai/docs/runjs/context/view.md +49 -46
  48. package/dist/ai/docs/runjs/document.md +1 -0
  49. package/dist/ai/docs/runjs/import-modules.md +32 -32
  50. package/dist/ai/docs/runjs/index.md +13 -13
  51. package/dist/ai/docs/runjs/jsx.md +19 -19
  52. package/dist/ai/docs/runjs/model/form-block-model.md +1 -3
  53. package/dist/ai/docs/runjs/render.md +15 -15
  54. package/dist/ai/docs/runjs/resource/api-resource.md +53 -53
  55. package/dist/ai/docs/runjs/resource/multi-record-resource.md +64 -64
  56. package/dist/ai/docs/runjs/resource/single-record-resource.md +55 -55
  57. package/dist/ai/docs/runjs/resource/sql-resource.md +57 -57
  58. package/dist/ai/docs/runjs/window.md +5 -5
  59. package/dist/client/index.js +1 -1
  60. package/dist/externalVersion.js +12 -11
  61. package/dist/locale/en-US.json +1 -0
  62. package/dist/locale/index.d.ts +2 -0
  63. package/dist/locale/zh-CN.json +1 -0
  64. package/dist/node_modules/ses/dist/ses.cjs +1 -1
  65. package/dist/node_modules/ses/package.json +1 -1
  66. package/dist/node_modules/zod/index.cjs +1 -1
  67. package/dist/node_modules/zod/package.json +1 -1
  68. package/dist/server/collections/flowsql.js +1 -0
  69. package/dist/server/flow-surfaces/action-scope.d.ts +39 -0
  70. package/dist/server/flow-surfaces/action-scope.js +156 -0
  71. package/dist/server/flow-surfaces/apply/compiler.d.ts +13 -0
  72. package/dist/server/flow-surfaces/apply/compiler.js +969 -0
  73. package/dist/server/flow-surfaces/apply/layout.d.ts +34 -0
  74. package/dist/server/flow-surfaces/apply/layout.js +175 -0
  75. package/dist/server/flow-surfaces/apply/matching.d.ts +16 -0
  76. package/dist/server/flow-surfaces/apply/matching.js +181 -0
  77. package/dist/server/flow-surfaces/approval/blueprint-service.d.ts +84 -0
  78. package/dist/server/flow-surfaces/approval/blueprint-service.js +589 -0
  79. package/dist/server/flow-surfaces/approval/blueprint.d.ts +21 -0
  80. package/dist/server/flow-surfaces/approval/blueprint.js +187 -0
  81. package/dist/server/flow-surfaces/approval/builder.d.ts +225 -0
  82. package/dist/server/flow-surfaces/approval/builder.js +384 -0
  83. package/dist/server/flow-surfaces/approval/catalog-specs.d.ts +33 -0
  84. package/dist/server/flow-surfaces/approval/catalog-specs.js +156 -0
  85. package/dist/server/flow-surfaces/approval/index.d.ts +14 -0
  86. package/dist/server/flow-surfaces/approval/index.js +40 -0
  87. package/dist/server/flow-surfaces/approval/runtime-config.d.ts +44 -0
  88. package/dist/server/flow-surfaces/approval/runtime-config.js +299 -0
  89. package/dist/server/flow-surfaces/approval/semantic-use.d.ts +23 -0
  90. package/dist/server/flow-surfaces/approval/semantic-use.js +155 -0
  91. package/dist/server/flow-surfaces/association-title-field.d.ts +20 -0
  92. package/dist/server/flow-surfaces/association-title-field.js +192 -0
  93. package/dist/server/flow-surfaces/blueprint/compile-blocks.d.ts +14 -0
  94. package/dist/server/flow-surfaces/blueprint/compile-blocks.js +1029 -0
  95. package/dist/server/flow-surfaces/blueprint/compile-plan.d.ts +13 -0
  96. package/dist/server/flow-surfaces/blueprint/compile-plan.js +308 -0
  97. package/dist/server/flow-surfaces/blueprint/compile-reaction.d.ts +11 -0
  98. package/dist/server/flow-surfaces/blueprint/compile-reaction.js +72 -0
  99. package/dist/server/flow-surfaces/blueprint/defaults.d.ts +26 -0
  100. package/dist/server/flow-surfaces/blueprint/defaults.js +133 -0
  101. package/dist/server/flow-surfaces/blueprint/index.d.ts +12 -0
  102. package/dist/server/flow-surfaces/blueprint/index.js +44 -0
  103. package/dist/server/flow-surfaces/blueprint/normalize-document.d.ts +10 -0
  104. package/dist/server/flow-surfaces/blueprint/normalize-document.js +416 -0
  105. package/dist/server/flow-surfaces/blueprint/private-utils.d.ts +26 -0
  106. package/dist/server/flow-surfaces/blueprint/private-utils.js +182 -0
  107. package/dist/server/flow-surfaces/blueprint/public-types.d.ts +193 -0
  108. package/dist/server/flow-surfaces/blueprint/public-types.js +24 -0
  109. package/dist/server/flow-surfaces/builder.d.ts +211 -0
  110. package/dist/server/flow-surfaces/builder.js +1097 -0
  111. package/dist/server/flow-surfaces/catalog-smart.d.ts +18 -0
  112. package/dist/server/flow-surfaces/catalog-smart.js +239 -0
  113. package/dist/server/flow-surfaces/catalog-smart.projector.d.ts +15 -0
  114. package/dist/server/flow-surfaces/catalog-smart.projector.js +157 -0
  115. package/dist/server/flow-surfaces/catalog-smart.types.d.ts +99 -0
  116. package/dist/server/flow-surfaces/catalog-smart.types.js +24 -0
  117. package/dist/server/flow-surfaces/catalog.d.ts +78 -0
  118. package/dist/server/flow-surfaces/catalog.js +3577 -0
  119. package/dist/server/flow-surfaces/chart-config.d.ts +121 -0
  120. package/dist/server/flow-surfaces/chart-config.js +1394 -0
  121. package/dist/server/flow-surfaces/compose-compiler.d.ts +108 -0
  122. package/dist/server/flow-surfaces/compose-compiler.js +167 -0
  123. package/dist/server/flow-surfaces/compose-runtime.d.ts +93 -0
  124. package/dist/server/flow-surfaces/compose-runtime.js +375 -0
  125. package/dist/server/flow-surfaces/configure-options.d.ts +23 -0
  126. package/dist/server/flow-surfaces/configure-options.js +860 -0
  127. package/dist/server/flow-surfaces/constants.d.ts +351 -0
  128. package/dist/server/flow-surfaces/constants.js +104 -0
  129. package/dist/server/flow-surfaces/context.d.ts +72 -0
  130. package/dist/server/flow-surfaces/context.js +556 -0
  131. package/dist/server/flow-surfaces/contract-guard.d.ts +19 -0
  132. package/dist/server/flow-surfaces/contract-guard.js +402 -0
  133. package/dist/server/flow-surfaces/core-field-default-bindings.d.ts +12 -0
  134. package/dist/server/flow-surfaces/core-field-default-bindings.js +157 -0
  135. package/dist/server/flow-surfaces/default-action-popup.d.ts +63 -0
  136. package/dist/server/flow-surfaces/default-action-popup.js +322 -0
  137. package/dist/server/flow-surfaces/default-block-actions.d.ts +32 -0
  138. package/dist/server/flow-surfaces/default-block-actions.js +209 -0
  139. package/dist/server/flow-surfaces/errors.d.ts +47 -0
  140. package/dist/server/flow-surfaces/errors.js +145 -0
  141. package/dist/server/flow-surfaces/executor.d.ts +23 -0
  142. package/dist/server/flow-surfaces/executor.js +132 -0
  143. package/dist/server/flow-surfaces/field-binding-registry.d.ts +23 -0
  144. package/dist/server/flow-surfaces/field-binding-registry.js +391 -0
  145. package/dist/server/flow-surfaces/field-semantics.d.ts +15 -0
  146. package/dist/server/flow-surfaces/field-semantics.js +83 -0
  147. package/dist/server/flow-surfaces/filter-group.d.ts +15 -0
  148. package/dist/server/flow-surfaces/filter-group.js +94 -0
  149. package/dist/server/flow-surfaces/index.d.ts +11 -0
  150. package/dist/server/flow-surfaces/index.js +302 -0
  151. package/dist/server/flow-surfaces/locator.d.ts +28 -0
  152. package/dist/server/flow-surfaces/locator.js +240 -0
  153. package/dist/server/flow-surfaces/node-use-sets.d.ts +15 -0
  154. package/dist/server/flow-surfaces/node-use-sets.js +134 -0
  155. package/dist/server/flow-surfaces/payload-shape.d.ts +9 -0
  156. package/dist/server/flow-surfaces/payload-shape.js +61 -0
  157. package/dist/server/flow-surfaces/placement.d.ts +33 -0
  158. package/dist/server/flow-surfaces/placement.js +198 -0
  159. package/dist/server/flow-surfaces/planning/action-specs.d.ts +179 -0
  160. package/dist/server/flow-surfaces/planning/action-specs.js +190 -0
  161. package/dist/server/flow-surfaces/planning/compiler.d.ts +37 -0
  162. package/dist/server/flow-surfaces/planning/compiler.js +376 -0
  163. package/dist/server/flow-surfaces/planning/context.d.ts +30 -0
  164. package/dist/server/flow-surfaces/planning/context.js +139 -0
  165. package/dist/server/flow-surfaces/planning/created-keys.d.ts +34 -0
  166. package/dist/server/flow-surfaces/planning/created-keys.js +375 -0
  167. package/dist/server/flow-surfaces/planning/key-kind.d.ts +11 -0
  168. package/dist/server/flow-surfaces/planning/key-kind.js +88 -0
  169. package/dist/server/flow-surfaces/planning/key-persistence.d.ts +34 -0
  170. package/dist/server/flow-surfaces/planning/key-persistence.js +148 -0
  171. package/dist/server/flow-surfaces/planning/key-registry.d.ts +40 -0
  172. package/dist/server/flow-surfaces/planning/key-registry.js +206 -0
  173. package/dist/server/flow-surfaces/planning/runtime.d.ts +37 -0
  174. package/dist/server/flow-surfaces/planning/runtime.js +259 -0
  175. package/dist/server/flow-surfaces/planning/step-link.d.ts +14 -0
  176. package/dist/server/flow-surfaces/planning/step-link.js +104 -0
  177. package/dist/server/flow-surfaces/planning/types.d.ts +55 -0
  178. package/dist/server/flow-surfaces/planning/types.js +24 -0
  179. package/dist/server/flow-surfaces/public-data-surface-default-filter.d.ts +24 -0
  180. package/dist/server/flow-surfaces/public-data-surface-default-filter.js +152 -0
  181. package/dist/server/flow-surfaces/reaction/errors.d.ts +20 -0
  182. package/dist/server/flow-surfaces/reaction/errors.js +69 -0
  183. package/dist/server/flow-surfaces/reaction/field-value.d.ts +34 -0
  184. package/dist/server/flow-surfaces/reaction/field-value.js +181 -0
  185. package/dist/server/flow-surfaces/reaction/fingerprint.d.ts +16 -0
  186. package/dist/server/flow-surfaces/reaction/fingerprint.js +71 -0
  187. package/dist/server/flow-surfaces/reaction/linkage.d.ts +136 -0
  188. package/dist/server/flow-surfaces/reaction/linkage.js +882 -0
  189. package/dist/server/flow-surfaces/reaction/meta.d.ts +11 -0
  190. package/dist/server/flow-surfaces/reaction/meta.js +451 -0
  191. package/dist/server/flow-surfaces/reaction/registry.d.ts +156 -0
  192. package/dist/server/flow-surfaces/reaction/registry.js +206 -0
  193. package/dist/server/flow-surfaces/reaction/resolver.d.ts +22 -0
  194. package/dist/server/flow-surfaces/reaction/resolver.js +202 -0
  195. package/dist/server/flow-surfaces/reaction/types.d.ts +241 -0
  196. package/dist/server/flow-surfaces/reaction/types.js +24 -0
  197. package/dist/server/flow-surfaces/reaction/utils.d.ts +17 -0
  198. package/dist/server/flow-surfaces/reaction/utils.js +67 -0
  199. package/dist/server/flow-surfaces/reaction/value-expr.d.ts +15 -0
  200. package/dist/server/flow-surfaces/reaction/value-expr.js +209 -0
  201. package/dist/server/flow-surfaces/reference-guards.d.ts +19 -0
  202. package/dist/server/flow-surfaces/reference-guards.js +103 -0
  203. package/dist/server/flow-surfaces/route-sync.d.ts +47 -0
  204. package/dist/server/flow-surfaces/route-sync.js +392 -0
  205. package/dist/server/flow-surfaces/service-helpers.d.ts +42 -0
  206. package/dist/server/flow-surfaces/service-helpers.js +310 -0
  207. package/dist/server/flow-surfaces/service-utils.d.ts +108 -0
  208. package/dist/server/flow-surfaces/service-utils.js +811 -0
  209. package/dist/server/flow-surfaces/service.d.ts +814 -0
  210. package/dist/server/flow-surfaces/service.js +14276 -0
  211. package/dist/server/flow-surfaces/support-matrix.d.ts +31 -0
  212. package/dist/server/flow-surfaces/support-matrix.js +271 -0
  213. package/dist/server/flow-surfaces/surface-context.d.ts +52 -0
  214. package/dist/server/flow-surfaces/surface-context.js +440 -0
  215. package/dist/server/flow-surfaces/template-compatibility.d.ts +42 -0
  216. package/dist/server/flow-surfaces/template-compatibility.js +189 -0
  217. package/dist/server/flow-surfaces/template-display.d.ts +20 -0
  218. package/dist/server/flow-surfaces/template-display.js +289 -0
  219. package/dist/server/flow-surfaces/template-service-utils.d.ts +62 -0
  220. package/dist/server/flow-surfaces/template-service-utils.js +281 -0
  221. package/dist/server/flow-surfaces/types.d.ts +288 -0
  222. package/dist/server/flow-surfaces/types.js +24 -0
  223. package/dist/server/index.d.ts +1 -0
  224. package/dist/server/index.js +7 -2
  225. package/dist/server/plugin.d.ts +0 -1
  226. package/dist/server/plugin.js +9 -34
  227. package/dist/server/repository.js +0 -5
  228. package/dist/server/variables/resolve.d.ts +21 -0
  229. package/dist/server/variables/resolve.js +79 -0
  230. package/dist/swagger/flow-surfaces.d.ts +5964 -0
  231. package/dist/swagger/flow-surfaces.examples.d.ts +1572 -0
  232. package/dist/swagger/flow-surfaces.examples.js +1805 -0
  233. package/dist/swagger/flow-surfaces.js +5322 -0
  234. package/dist/swagger/flow-surfaces.template-action-docs.d.ts +62 -0
  235. package/dist/swagger/flow-surfaces.template-action-docs.js +121 -0
  236. package/dist/swagger/flow-surfaces.template-schemas.d.ts +239 -0
  237. package/dist/swagger/flow-surfaces.template-schemas.js +255 -0
  238. package/dist/swagger/index.d.ts +5969 -0
  239. package/dist/swagger/index.js +50 -0
  240. package/package.json +3 -3
  241. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextApis.d.ts +0 -0
  242. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextEnvs.d.ts +0 -0
  243. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/getContextVars.d.ts +0 -0
  244. /package/dist/ai/{tools → ai-employees/nathan/skills/frontend-developer/tools}/lintAndTestJS.d.ts +0 -0
@@ -1,57 +1,60 @@
1
1
  # ctx.element
2
2
 
3
- The ElementProxy instance for the sandbox DOM container; it is the default render target of `ctx.render()`. Available in JSBlock, JSField, JSItem, JSColumn, and other contexts that have a render container.
3
+ An `ElementProxy` instance pointing to the sandbox DOM container, serving as the default rendering target for `ctx.render()`. It is available in scenarios where a rendering container exists, such as `JSBlock`, `JSField`, `JSItem`, and `JSColumn`.
4
4
 
5
- ## Use Cases
5
+ ## Applicable Scenarios
6
6
 
7
7
  | Scenario | Description |
8
- |----------|-------------|
9
- | **JSBlock** | Block’s DOM container for custom content |
10
- | **JSField / JSItem / FormJSFieldItem** | Field/item render container (often a `<span>`) |
11
- | **JSColumn** | Table cell DOM container for custom column content |
8
+ |------|------|
9
+ | **JSBlock** | The DOM container for the block, used to render custom block content. |
10
+ | **JSField / JSItem / FormJSFieldItem** | The rendering container for a field or form item (usually a `<span>`). |
11
+ | **JSColumn** | The DOM container for a table cell, used to render custom column content. |
12
12
 
13
- > Note: `ctx.element` is only available in RunJS contexts that have a render container; in contexts without UI (e.g. pure backend) it may be `undefined`—check before use.
13
+ > Note: `ctx.element` is only available in RunJS contexts that have a rendering container. In contexts without a UI (such as pure backend logic), it may be `undefined`. It is recommended to perform a null check before use.
14
14
 
15
- ## Type
15
+ ## Type Definition
16
16
 
17
17
  ```typescript
18
18
  element: ElementProxy | undefined;
19
19
 
20
+ // ElementProxy is a proxy for the raw HTMLElement, exposing a secure API
20
21
  class ElementProxy {
21
- __el: HTMLElement; // Internal native DOM (only for specific cases)
22
- innerHTML: string; // Read/write sanitized with DOMPurify
23
- outerHTML: string;
22
+ __el: HTMLElement; // The internal raw DOM element (accessible only in specific scenarios)
23
+ innerHTML: string; // Sanitized via DOMPurify during read/write
24
+ outerHTML: string; // Same as above
24
25
  appendChild(child: HTMLElement | string): void;
25
- // Other HTMLElement methods passed through (not recommended)
26
+ // Other HTMLElement methods are passed through (direct use is not recommended)
26
27
  }
27
28
  ```
28
29
 
29
- ## Security
30
+ ## Security Requirements
30
31
 
31
- **Recommended: do all rendering via `ctx.render()`.** Do not use `ctx.element`’s DOM APIs directly (e.g. `innerHTML`, `appendChild`, `querySelector`).
32
+ **Recommended: All rendering should be performed via `ctx.render()`.** Avoid using the DOM APIs of `ctx.element` directly (e.g., `innerHTML`, `appendChild`, `querySelector`, etc.).
32
33
 
33
- ### Why use ctx.render()
34
+ ### Why ctx.render() is Recommended
34
35
 
35
- | Benefit | Description |
36
- |---------|-------------|
37
- | **Security** | Centralized control, avoids XSS and unsafe DOM use |
38
- | **React** | Full JSX, components, and lifecycle |
39
- | **Context** | Inherits app ConfigProvider, theme, etc. |
40
- | **Conflicts** | Manages React root create/unmount, avoids multiple instances |
36
+ | Advantage | Description |
37
+ |------|------|
38
+ | **Security** | Centralized security control to prevent XSS and improper DOM operations. |
39
+ | **React Support** | Full support for JSX, React components, and lifecycles. |
40
+ | **Context Inheritance** | Automatically inherits the application's `ConfigProvider`, themes, etc. |
41
+ | **Conflict Handling** | Automatically manages React root creation/unmounting to avoid multi-instance conflicts. |
41
42
 
42
- ### ❌ Not recommended: direct ctx.element use
43
+ ### ❌ Not Recommended: Direct Manipulation of ctx.element
43
44
 
44
45
  ```ts
46
+ // ❌ Not recommended: Using ctx.element APIs directly
45
47
  ctx.element.innerHTML = '<div>Content</div>';
46
48
  ctx.element.appendChild(node);
47
49
  ctx.element.querySelector('.class');
48
50
  ```
49
51
 
50
- > `ctx.element.innerHTML` is deprecated; use `ctx.render()` instead.
52
+ > `ctx.element.innerHTML` is deprecated. Please use `ctx.render()` instead.
51
53
 
52
- ### ✅ Recommended: ctx.render()
54
+ ### ✅ Recommended: Using ctx.render()
53
55
 
54
56
  ```ts
57
+ // ✅ Rendering a React component
55
58
  const { Button, Card } = ctx.libs.antd;
56
59
  ctx.render(
57
60
  <Card title={ctx.t('Welcome')}>
@@ -59,40 +62,43 @@ ctx.render(
59
62
  </Card>
60
63
  );
61
64
 
65
+ // ✅ Rendering an HTML string
62
66
  ctx.render('<div style="padding:16px;">' + ctx.t('Content') + '</div>');
63
67
 
68
+ // ✅ Rendering a DOM node
64
69
  const div = document.createElement('div');
65
70
  div.textContent = ctx.t('Hello');
66
71
  ctx.render(div);
67
72
  ```
68
73
 
69
- ## Exception: popover anchor
74
+ ## Special Case: As a Popover Anchor
70
75
 
71
- When you need the current element as a popover anchor, use `ctx.element?.__el` as the native DOM `target`:
76
+ When you need to open a Popover using the current element as an anchor, you can access `ctx.element?.__el` to get the raw DOM as the `target`:
72
77
 
73
78
  ```ts
79
+ // ctx.viewer.popover requires a raw DOM as the target
74
80
  await ctx.viewer.popover({
75
81
  target: ctx.element?.__el,
76
- content: <div>Popover content</div>,
82
+ content: <div>Popup Content</div>,
77
83
  });
78
84
  ```
79
85
 
80
- > Use `__el` only for this current container as anchor” case; do not touch DOM otherwise.
86
+ > Use `__el` only in scenarios like "using the current container as an anchor"; do not manipulate the DOM directly in other cases.
81
87
 
82
- ## Relation to ctx.render
88
+ ## Relationship with ctx.render
83
89
 
84
- - `ctx.render(vnode)` without a `container` argument renders into `ctx.element`.
85
- - If there is no `ctx.element` and no `container`, an error is thrown.
86
- - You can pass a container: `ctx.render(vnode, customContainer)`.
90
+ - If `ctx.render(vnode)` is called without a `container` argument, it renders into the `ctx.element` container by default.
91
+ - If both `ctx.element` is missing and no `container` is provided, an error will be thrown.
92
+ - You can explicitly specify a container: `ctx.render(vnode, customContainer)`.
87
93
 
88
94
  ## Notes
89
95
 
90
- - Treat `ctx.element` as the internal container for `ctx.render()`; avoid reading or mutating it directly.
91
- - In contexts without a render container, `ctx.element` is `undefined`; ensure a container exists or pass `container` to `ctx.render()`.
92
- - ElementProxy’s `innerHTML`/`outerHTML` are sanitized with DOMPurify, but prefer `ctx.render()` for all rendering.
96
+ - `ctx.element` is intended for internal use by `ctx.render()`. Directly accessing or modifying its properties/methods is not recommended.
97
+ - In contexts without a rendering container, `ctx.element` will be `undefined`. Ensure the container is available or pass a `container` manually before calling `ctx.render()`.
98
+ - Although `innerHTML`/`outerHTML` in `ElementProxy` are sanitized via DOMPurify, it is still recommended to use `ctx.render()` for unified rendering management.
93
99
 
94
100
  ## Related
95
101
 
96
- - [ctx.render](./render.md): render into container
97
- - [ctx.view](./view.md): current view controller
98
- - [ctx.modal](./modal.md): modal APIs
102
+ - [ctx.render](./render.md): Rendering content into a container
103
+ - [ctx.view](./view.md): Current view controller
104
+ - [ctx.modal](./modal.md): Shortcut API for modals
@@ -1,94 +1,96 @@
1
1
  # ctx.exitAll()
2
2
 
3
- Stops the current event flow and all **subsequent** event flows that were triggered in the same event dispatch. Use when a global error or permission check requires stopping every flow for that event.
3
+ Terminates the current event flow and all subsequent event flows triggered in the same event dispatch. It is commonly used when all event flows under the current event need to be aborted immediately due to a global error or permission validation failure.
4
4
 
5
5
  ## Use Cases
6
6
 
7
- Use `ctx.exitAll()` in JS-capable contexts when you need to **stop both the current flow and any later flows for the same event**:
7
+ `ctx.exitAll()` is generally used in JS-executable contexts where it is necessary to **simultaneously abort the current event flow and subsequent event flows triggered by that event**:
8
8
 
9
9
  | Scenario | Description |
10
- |----------|-------------|
11
- | **Event flow** | Main flow fails (e.g. no permission); stop it and any subsequent flows for that event |
12
- | **Linkage rules** | When linkage validation fails and you want to stop current and subsequent linkage |
13
- | **Action events** | Pre-action check fails (e.g. delete permission); block the action and later steps |
10
+ |------|------|
11
+ | **Event Flow** | Main event flow validation fails (e.g., insufficient permissions), requiring the termination of the main flow and any subsequent flows under the same event that have not yet executed. |
12
+ | **Linkage Rules** | When linkage validation fails, the current linkage and subsequent linkages triggered by the same event must be terminated. |
13
+ | **Action Events** | Pre-action validation fails (e.g., permission check before deletion), requiring the prevention of the main action and subsequent steps. |
14
14
 
15
- > Difference from `ctx.exit()`: `ctx.exit()` only stops the current flow; `ctx.exitAll()` also stops **subsequent** flows for that event.
15
+ > Difference from `ctx.exit()`: `ctx.exit()` only terminates the current event flow; `ctx.exitAll()` terminates the current event flow and any **unexecuted** subsequent event flows in the same event dispatch.
16
16
 
17
- ## Type
17
+ ## Type Definition
18
18
 
19
19
  ```ts
20
20
  exitAll(): never;
21
21
  ```
22
22
 
23
- Calling `ctx.exitAll()` throws an internal `FlowExitAllException`, which the engine uses to stop the current flow instance and subsequent flows for the same event. The rest of the current JS does not run.
23
+ Calling `ctx.exitAll()` throws an internal `FlowExitAllException`, which is caught by the FlowEngine to stop the current event flow instance and subsequent event flows under the same event. Once called, the remaining statements in the current JS code will not be executed.
24
24
 
25
25
  ## Comparison with ctx.exit()
26
26
 
27
27
  | Method | Scope |
28
- |--------|--------|
29
- | `ctx.exit()` | Stops only the current flow; later flows still run |
30
- | `ctx.exitAll()` | Stops the current flow and **subsequent** flows for the same event |
28
+ |------|----------|
29
+ | `ctx.exit()` | Only terminates the current event flow; subsequent event flows are unaffected. |
30
+ | `ctx.exitAll()` | Terminates the current event flow and aborts subsequent event flows executed **sequentially** under the same event. |
31
31
 
32
- ## Execution mode
32
+ ## Execution Mode
33
33
 
34
- - **Sequential**: flows for the same event run one after another; after any flow calls `ctx.exitAll()`, later flows do not run.
35
- - **Parallel**: flows run in parallel; one flow calling `ctx.exitAll()` does not stop other already-running flows.
34
+ - **Sequential Execution**: Event flows under the same event are executed in order. After any event flow calls `ctx.exitAll()`, subsequent event flows will not execute.
35
+ - **Parallel Execution**: Event flows under the same event are executed in parallel. Calling `ctx.exitAll()` in one event flow will not interrupt other concurrent event flows (as they are independent).
36
36
 
37
37
  ## Examples
38
38
 
39
- ### Stop all flows on permission failure
39
+ ### Terminate all event flows when permission validation fails
40
40
 
41
41
  ```ts
42
+ // Abort the main event flow and subsequent event flows when permissions are insufficient
42
43
  if (!hasPermission(ctx)) {
43
- ctx.notification.error({ message: 'No permission' });
44
+ ctx.notification.error({ message: 'No operation permission' });
44
45
  ctx.exitAll();
45
46
  }
46
47
  ```
47
48
 
48
- ### Stop on global pre-check failure
49
+ ### Terminate when global pre-validation fails
49
50
 
50
51
  ```ts
52
+ // Example: If associated data is found to be non-deletable before deletion, prevent the main event flow and subsequent actions
51
53
  const canDelete = await checkDeletable(ctx.model?.getValue?.());
52
54
  if (!canDelete) {
53
- ctx.message.error('Cannot delete: related data exists');
55
+ ctx.message.error('Cannot delete: associated data exists');
54
56
  ctx.exitAll();
55
57
  }
56
58
  ```
57
59
 
58
- ### When to use ctx.exit() vs ctx.exitAll()
60
+ ### Choosing between ctx.exit() and ctx.exitAll()
59
61
 
60
62
  ```ts
61
- // Only this flow ctx.exit()
63
+ // Only the current event flow needs to exit -> Use ctx.exit()
62
64
  if (!params.valid) {
63
- ctx.message.error('Invalid params');
64
- ctx.exit();
65
+ ctx.message.error('Invalid parameters');
66
+ ctx.exit(); // Subsequent event flows are unaffected
65
67
  }
66
68
 
67
- // This and all subsequent flows ctx.exitAll()
69
+ // Need to terminate all subsequent event flows under the current event -> Use ctx.exitAll()
68
70
  if (!ctx.model?.context?.getPermission?.()) {
69
- ctx.notification.warning({ message: 'No permission' });
70
- ctx.exitAll();
71
+ ctx.notification.warning({ message: 'Insufficient permissions' });
72
+ ctx.exitAll(); // Both the main event flow and subsequent event flows under the same event are terminated
71
73
  }
72
74
  ```
73
75
 
74
- ### Message then exit
76
+ ### Prompt before terminating
75
77
 
76
78
  ```ts
77
79
  if (!isValidInput(ctx.form?.getValues?.())) {
78
- ctx.message.warning('Please fix form errors first');
80
+ ctx.message.warning('Please correct the errors in the form first');
79
81
  ctx.exitAll();
80
82
  }
81
83
  ```
82
84
 
83
85
  ## Notes
84
86
 
85
- - After `ctx.exitAll()`, the rest of the current JS does not run; explain to the user with `ctx.message`, `ctx.notification`, or a dialog before calling.
86
- - You usually do not need to catch `FlowExitAllException`; the engine handles it.
87
- - To stop only the current flow, use `ctx.exit()`.
88
- - In parallel mode, `ctx.exitAll()` only stops the current flow; it does not cancel other concurrent flows.
87
+ - After calling `ctx.exitAll()`, 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.
88
+ - Business code usually does not need to catch `FlowExitAllException`; let the FlowEngine handle it.
89
+ - If you only need to stop the current event flow without affecting subsequent ones, use `ctx.exit()`.
90
+ - In parallel mode, `ctx.exitAll()` only terminates the current event flow and does not interrupt other concurrent event flows.
89
91
 
90
92
  ## Related
91
93
 
92
- - [ctx.exit()](./exit.md): stop only the current flow
93
- - [ctx.message](./message.md): message API
94
- - [ctx.modal](./modal.md): confirm dialog
94
+ - [ctx.exit()](./exit.md): Terminates only the current event flow
95
+ - [ctx.message](./message.md): Message prompts
96
+ - [ctx.modal](./modal.md): Confirmation modal
@@ -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.