@nocobase/plugin-flow-engine 2.1.0-alpha.9 → 2.1.0-beta.10

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 (51) hide show
  1. package/dist/ai/docs/runjs/context/block-model.md +35 -35
  2. package/dist/ai/docs/runjs/context/collection-field.md +51 -53
  3. package/dist/ai/docs/runjs/context/collection.md +39 -39
  4. package/dist/ai/docs/runjs/context/data-source-manager.md +30 -40
  5. package/dist/ai/docs/runjs/context/data-source.md +44 -52
  6. package/dist/ai/docs/runjs/context/element.md +38 -44
  7. package/dist/ai/docs/runjs/context/exit-all.md +35 -37
  8. package/dist/ai/docs/runjs/context/exit.md +35 -38
  9. package/dist/ai/docs/runjs/context/filter-manager.md +30 -36
  10. package/dist/ai/docs/runjs/context/form.md +57 -57
  11. package/dist/ai/docs/runjs/context/get-model.md +21 -22
  12. package/dist/ai/docs/runjs/context/get-value.md +19 -20
  13. package/dist/ai/docs/runjs/context/get-var.md +55 -61
  14. package/dist/ai/docs/runjs/context/i18n.md +14 -17
  15. package/dist/ai/docs/runjs/context/import-async.md +45 -333
  16. package/dist/ai/docs/runjs/context/init-resource.md +20 -20
  17. package/dist/ai/docs/runjs/context/libs.md +31 -31
  18. package/dist/ai/docs/runjs/context/location.md +31 -34
  19. package/dist/ai/docs/runjs/context/logger.md +40 -41
  20. package/dist/ai/docs/runjs/context/make-resource.md +26 -27
  21. package/dist/ai/docs/runjs/context/message.md +41 -42
  22. package/dist/ai/docs/runjs/context/modal.md +44 -44
  23. package/dist/ai/docs/runjs/context/model.md +33 -36
  24. package/dist/ai/docs/runjs/context/notification.md +40 -41
  25. package/dist/ai/docs/runjs/context/off.md +14 -14
  26. package/dist/ai/docs/runjs/context/on.md +29 -30
  27. package/dist/ai/docs/runjs/context/open-view.md +40 -40
  28. package/dist/ai/docs/runjs/context/render.md +32 -37
  29. package/dist/ai/docs/runjs/context/request.md +45 -46
  30. package/dist/ai/docs/runjs/context/require-async.md +25 -28
  31. package/dist/ai/docs/runjs/context/resource.md +34 -34
  32. package/dist/ai/docs/runjs/context/route.md +34 -36
  33. package/dist/ai/docs/runjs/context/router.md +31 -43
  34. package/dist/ai/docs/runjs/context/set-value.md +17 -18
  35. package/dist/ai/docs/runjs/context/t.md +17 -20
  36. package/dist/ai/docs/runjs/context/view.md +46 -49
  37. package/dist/ai/docs/runjs/document.md +0 -1
  38. package/dist/ai/docs/runjs/import-modules.md +32 -32
  39. package/dist/ai/docs/runjs/index.md +13 -13
  40. package/dist/ai/docs/runjs/jsx.md +19 -19
  41. package/dist/ai/docs/runjs/model/form-block-model.md +3 -1
  42. package/dist/ai/docs/runjs/render.md +15 -15
  43. package/dist/ai/docs/runjs/resource/api-resource.md +53 -53
  44. package/dist/ai/docs/runjs/resource/multi-record-resource.md +64 -64
  45. package/dist/ai/docs/runjs/resource/single-record-resource.md +55 -55
  46. package/dist/ai/docs/runjs/resource/sql-resource.md +57 -57
  47. package/dist/ai/docs/runjs/window.md +5 -5
  48. package/dist/externalVersion.js +10 -10
  49. package/dist/node_modules/ses/package.json +1 -1
  50. package/dist/node_modules/zod/package.json +1 -1
  51. package/package.json +2 -2
@@ -1,49 +1,49 @@
1
1
  # ctx.blockModel
2
2
 
3
- The parent block model (BlockModel instance) where the current JS Field / JS Block is located. In scenarios such as JSField, JSItem, and JSColumn, `ctx.blockModel` points to the form block or table block carrying the current JS logic. In a standalone JSBlock, it may be `null` or the same as `ctx.model`.
3
+ The parent block model (BlockModel instance) that hosts the current JS field / JS block. In JSField, JSItem, JSColumn, etc., `ctx.blockModel` refers to the form block or table block that hosts the current JS logic; in a standalone JSBlock it may be `null` or the same as `ctx.model`.
4
4
 
5
- ## Scenarios
5
+ ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |------|------|
9
- | **JSField** | Access the `form`, `collection`, and `resource` of the parent form block within a form field to implement linkage or validation. |
10
- | **JSItem** | Access the resource and collection information of the parent table/form block within a sub-table item. |
11
- | **JSColumn** | Access the `resource` (e.g., `getSelectedRows`) and `collection` of the parent table block within a table column. |
12
- | **Form Actions / FlowEngine** | Access `form` for pre-submission validation, `resource` for refreshing, etc. |
8
+ |----------|-------------|
9
+ | **JSField** | Access parent form block's `form`, `collection`, `resource` for linkage or validation |
10
+ | **JSItem** | Access parent table/form block's resource and collection in sub-table items |
11
+ | **JSColumn** | Access parent table block's `resource` (e.g. `getSelectedRows`), `collection` |
12
+ | **Form actions / event flow** | Use `form` for pre-submit validation, `resource` for refresh, etc. |
13
13
 
14
- > Note: `ctx.blockModel` is only available in RunJS contexts where a parent block exists. In standalone JSBlocks (without a parent form/table), it may be `null`. It is recommended to perform a null check before use.
14
+ > Note: `ctx.blockModel` is only available in RunJS contexts that have a parent block; in a standalone JSBlock (no parent form/table) it may be `null`—check before use.
15
15
 
16
- ## Type Definition
16
+ ## Type
17
17
 
18
18
  ```ts
19
19
  blockModel: BlockModel | FormBlockModel | TableBlockModel | CollectionBlockModel | DataBlockModel | null;
20
20
  ```
21
21
 
22
- The specific type depends on the parent block type: form blocks are mostly `FormBlockModel` or `EditFormModel`, while table blocks are mostly `TableBlockModel`.
22
+ The exact type depends on the parent block: form blocks are usually `FormBlockModel` / `EditFormModel`, table blocks are usually `TableBlockModel`.
23
23
 
24
24
  ## Common Properties
25
25
 
26
26
  | Property | Type | Description |
27
- |------|------|------|
28
- | `uid` | `string` | Unique identifier of the block model. |
29
- | `collection` | `Collection` | The collection bound to the current block. |
30
- | `resource` | `Resource` | The resource instance used by the block (`SingleRecordResource` / `MultiRecordResource`, etc.). |
31
- | `form` | `FormInstance` | Form Block: Ant Design Form instance, supporting `getFieldsValue`, `validateFields`, `setFieldsValue`, etc. |
32
- | `emitter` | `EventEmitter` | Event emitter, used to listen for `formValuesChange`, `onFieldReset`, etc. |
27
+ |----------|------|-------------|
28
+ | `uid` | `string` | Block model unique id |
29
+ | `collection` | `Collection` | Collection bound to the block |
30
+ | `resource` | `Resource` | Resource instance (`SingleRecordResource` / `MultiRecordResource`, etc.) |
31
+ | `form` | `FormInstance` | Form block: Ant Design Form instance (`getFieldsValue`, `validateFields`, `setFieldsValue`, etc.) |
32
+ | `emitter` | `EventEmitter` | Event emitter; can listen to `formValuesChange`, `onFieldReset`, etc. |
33
33
 
34
- ## Relationship with ctx.model and ctx.form
34
+ ## Relation to ctx.model, ctx.form
35
35
 
36
- | Requirement | Recommended Usage |
37
- |------|----------|
38
- | **Parent block of the current JS** | `ctx.blockModel` |
39
- | **Read/Write form fields** | `ctx.form` (equivalent to `ctx.blockModel?.form`, more convenient in form blocks) |
40
- | **Model of the current execution context** | `ctx.model` (Field model in JSField, Block model in JSBlock) |
36
+ | Need | Recommended |
37
+ |------|-------------|
38
+ | **Parent block of current JS** | `ctx.blockModel` |
39
+ | **Read/write form fields** | `ctx.form` (same as `ctx.blockModel?.form`; more convenient in form blocks) |
40
+ | **Model for current execution context** | `ctx.model` (field model in JSField, block model in JSBlock) |
41
41
 
42
- In a JSField, `ctx.model` is the field model, and `ctx.blockModel` is the form or table block carrying that field; `ctx.form` is typically `ctx.blockModel.form`.
42
+ In JSField, `ctx.model` is the field model and `ctx.blockModel` is the form/table block that hosts it; `ctx.form` is usually `ctx.blockModel.form`.
43
43
 
44
44
  ## Examples
45
45
 
46
- ### Table: Get selected rows and process
46
+ ### Table: get selected rows and process
47
47
 
48
48
  ```ts
49
49
  const rows = ctx.blockModel?.resource?.getSelectedRows?.() || [];
@@ -53,7 +53,7 @@ if (rows.length === 0) {
53
53
  }
54
54
  ```
55
55
 
56
- ### Form Scenario: Validate and Refresh
56
+ ### Form: validate and refresh
57
57
 
58
58
  ```ts
59
59
  if (ctx.blockModel?.form) {
@@ -62,15 +62,15 @@ if (ctx.blockModel?.form) {
62
62
  }
63
63
  ```
64
64
 
65
- ### Listen for Form Changes
65
+ ### Listen to form changes
66
66
 
67
67
  ```ts
68
68
  ctx.blockModel?.emitter?.on?.('formValuesChange', (payload) => {
69
- // Implement linkage or re-rendering based on the latest form values
69
+ // React to latest form values or re-render
70
70
  });
71
71
  ```
72
72
 
73
- ### Trigger Block Re-render
73
+ ### Trigger block re-render
74
74
 
75
75
  ```ts
76
76
  ctx.blockModel?.rerender?.();
@@ -78,13 +78,13 @@ ctx.blockModel?.rerender?.();
78
78
 
79
79
  ## Notes
80
80
 
81
- - In a **standalone JSBlock** (without a parent form or table block), `ctx.blockModel` may be `null`. It is recommended to use optional chaining when accessing its properties: `ctx.blockModel?.resource?.refresh?.()`.
82
- - In **JSField / JSItem / JSColumn**, `ctx.blockModel` refers to the form or table block carrying the current field. In a **JSBlock**, it may be itself or an upper-level block, depending on the actual hierarchy.
83
- - `resource` only exists in data blocks; `form` only exists in form blocks. Table blocks typically do not have a `form`.
81
+ - In a **standalone JSBlock** (no parent form/table), `ctx.blockModel` may be `null`; use optional chaining: `ctx.blockModel?.resource?.refresh?.()`.
82
+ - In **JSField / JSItem / JSColumn**, `ctx.blockModel` is the form or table block that hosts the field; in **JSBlock**, it may be the block itself or an ancestor, depending on hierarchy.
83
+ - `resource` exists only on data blocks; `form` exists only on form blocks; table blocks usually have no `form`.
84
84
 
85
85
  ## Related
86
86
 
87
- - [ctx.model](./model.md): The model of the current execution context.
88
- - [ctx.form](./form.md): Form instance, commonly used in form blocks.
89
- - [ctx.resource](./resource.md): Resource instance (equivalent to `ctx.blockModel?.resource`, use directly if available).
90
- - [ctx.getModel()](./get-model.md): Get other block models by UID.
87
+ - [ctx.model](./model.md): model for current execution context
88
+ - [ctx.form](./form.md): form instance, common in form blocks
89
+ - [ctx.resource](./resource.md): resource instance (same as `ctx.blockModel?.resource` when present)
90
+ - [ctx.getModel()](./get-model.md): get another block model by uid
@@ -1,18 +1,18 @@
1
1
  # ctx.collectionField
2
2
 
3
- The `CollectionField` instance associated with the current RunJS execution context, used to access field metadata, types, validation rules, and association information. It only exists when the field is bound to a collection definition; custom/virtual fields may be `null`.
3
+ The collection field (CollectionField) instance for the current RunJS context; used to access field metadata, type, validation rules, and association info. Only present when the field is bound to a collection definition; custom/virtual fields may have `null`.
4
4
 
5
5
  ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |------|------|
9
- | **JSField** | Perform linkage or validation in form fields based on `interface`, `enum`, `targetCollection`, etc. |
10
- | **JSItem** | Access metadata of the field corresponding to the current column in sub-table items. |
11
- | **JSColumn** | Select rendering methods based on `collectionField.interface` or access `targetCollection` in table columns. |
8
+ |----------|-------------|
9
+ | **JSField** | Use `interface`, `enum`, `targetCollection`, etc. for linkage or validation |
10
+ | **JSItem** | Access metadata of the column’s field in sub-table items |
11
+ | **JSColumn** | Choose render by `collectionField.interface`, or use `targetCollection` |
12
12
 
13
- > Note: `ctx.collectionField` is only available when the field is bound to a Collection definition; it is usually `undefined` in scenarios like JSBlock independent blocks or action events without field binding. It is recommended to check for null values before use.
13
+ > Note: `ctx.collectionField` is only available when the field is bound to a collection; in standalone JSBlock or actions with no field binding it is usually `undefined`—check before use.
14
14
 
15
- ## Type Definition
15
+ ## Type
16
16
 
17
17
  ```ts
18
18
  collectionField: CollectionField | null | undefined;
@@ -21,47 +21,46 @@ collectionField: CollectionField | null | undefined;
21
21
  ## Common Properties
22
22
 
23
23
  | Property | Type | Description |
24
- |------|------|------|
25
- | `name` | `string` | Field name (e.g., `status`, `userId`) |
26
- | `title` | `string` | Field title (including internationalization) |
27
- | `type` | `string` | Field data type (`string`, `integer`, `belongsTo`, etc.) |
28
- | `interface` | `string` | Field interface type (`input`, `select`, `m2o`, `o2m`, `m2m`, etc.) |
29
- | `collection` | `Collection` | The collection the field belongs to |
30
- | `targetCollection` | `Collection` | The target collection of the association field (only for association types) |
31
- | `target` | `string` | Target collection name (for association fields) |
32
- | `enum` | `array` | Enumeration options (select, radio, etc.) |
24
+ |----------|------|-------------|
25
+ | `name` | `string` | Field name (e.g. `status`, `userId`) |
26
+ | `title` | `string` | Field title (i18n) |
27
+ | `type` | `string` | Data type (`string`, `integer`, `belongsTo`, etc.) |
28
+ | `interface` | `string` | UI type (`input`, `select`, `m2o`, `o2m`, `m2m`, etc.) |
29
+ | `collection` | `Collection` | Field’s collection |
30
+ | `targetCollection` | `Collection` | Target collection for association fields only |
31
+ | `target` | `string` | Target collection name (association) |
32
+ | `enum` | `array` | Enum options (select, radio, etc.) |
33
33
  | `defaultValue` | `any` | Default value |
34
- | `collectionName` | `string` | Name of the collection it belongs to |
35
- | `foreignKey` | `string` | Foreign key field name (belongsTo, etc.) |
36
- | `sourceKey` | `string` | Association source key (hasMany, etc.) |
37
- | `targetKey` | `string` | Association target key |
38
- | `fullpath` | `string` | Full path (e.g., `main.users.status`), used for API or variable references |
39
- | `resourceName` | `string` | Resource name (e.g., `users.status`) |
40
- | `readonly` | `boolean` | Whether it is read-only |
41
- | `titleable` | `boolean` | Whether it can be displayed as a title |
42
- | `validation` | `object` | Validation rule configuration |
43
- | `uiSchema` | `object` | UI configuration |
44
- | `targetCollectionTitleField` | `CollectionField` | The title field of the target collection (for association fields) |
34
+ | `collectionName` | `string` | Collection name |
35
+ | `foreignKey` | `string` | Foreign key (e.g. belongsTo) |
36
+ | `sourceKey` | `string` | Source key (e.g. hasMany) |
37
+ | `targetKey` | `string` | Target key |
38
+ | `fullpath` | `string` | Full path (e.g. `main.users.status`) for API/variables |
39
+ | `resourceName` | `string` | Resource name (e.g. `users.status`) |
40
+ | `readonly` | `boolean` | Read-only |
41
+ | `titleable` | `boolean` | Can be used as title |
42
+ | `validation` | `object` | Validation config |
43
+ | `uiSchema` | `object` | UI config |
44
+ | `targetCollectionTitleField` | `CollectionField` | Title field of target collection (association) |
45
45
 
46
46
  ## Common Methods
47
47
 
48
48
  | Method | Description |
49
- |------|------|
50
- | `isAssociationField(): boolean` | Whether it is an association field (belongsTo, hasMany, hasOne, belongsToMany, etc.) |
51
- | `isRelationshipField(): boolean` | Whether it is a relationship field (including o2o, m2o, o2m, m2m, etc.) |
52
- | `getComponentProps(): object` | Get the default props of the field component |
53
- | `getFields(): CollectionField[]` | Get the field list of the target collection (association fields only) |
54
- | `getFilterOperators(): object[]` | Get the filter operators supported by this field (e.g., `$eq`, `$ne`, etc.) |
49
+ |--------|-------------|
50
+ | `isAssociationField(): boolean` | Whether it is an association (belongsTo, hasMany, hasOne, belongsToMany, etc.) |
51
+ | `isRelationshipField(): boolean` | Whether it is a relationship (o2o, m2o, o2m, m2m, etc.) |
52
+ | `getComponentProps(): object` | Default props for the field component |
53
+ | `getFields(): CollectionField[]` | Fields of target collection (association only) |
54
+ | `getFilterOperators(): object[]` | Filter operators (e.g. `$eq`, `$ne`) |
55
55
 
56
56
  ## Examples
57
57
 
58
- ### Branch rendering based on field type
58
+ ### Branch by field type
59
59
 
60
60
  ```ts
61
61
  if (!ctx.collectionField) return null;
62
62
  const { interface: iface } = ctx.collectionField;
63
63
  if (['m2o', 'o2m', 'm2m'].includes(iface)) {
64
- // Association field: display associated records
65
64
  const target = ctx.collectionField.targetCollection;
66
65
  // ...
67
66
  } else if (iface === 'select' || iface === 'radioGroup') {
@@ -70,24 +69,24 @@ if (['m2o', 'o2m', 'm2m'].includes(iface)) {
70
69
  }
71
70
  ```
72
71
 
73
- ### Determine if it is an association field and access the target collection
72
+ ### Check association and use target collection
74
73
 
75
74
  ```ts
76
75
  if (ctx.collectionField?.isAssociationField()) {
77
76
  const targetCol = ctx.collectionField.targetCollection;
78
77
  const titleField = targetCol?.titleCollectionField?.name;
79
- // Process according to the target collection structure
78
+ // ...
80
79
  }
81
80
  ```
82
81
 
83
- ### Get enumeration options
82
+ ### Get enum options
84
83
 
85
84
  ```ts
86
85
  const options = ctx.collectionField?.enum ?? [];
87
86
  const labels = options.map((o) => (typeof o === 'object' ? o.label : o));
88
87
  ```
89
88
 
90
- ### Conditional rendering based on read-only/view mode
89
+ ### Conditional render by readonly
91
90
 
92
91
  ```ts
93
92
  const { Input } = ctx.libs.antd;
@@ -98,35 +97,34 @@ if (ctx.collectionField?.readonly) {
98
97
  }
99
98
  ```
100
99
 
101
- ### Get the title field of the target collection
100
+ ### Title field of target collection
102
101
 
103
102
  ```ts
104
- // When displaying an association field, use targetCollectionTitleField to get the title field name
105
103
  const titleField = ctx.collectionField?.targetCollectionTitleField;
106
104
  const titleKey = titleField?.name ?? 'title';
107
105
  const assocValue = ctx.getValue?.() ?? ctx.record?.[ctx.collectionField?.name];
108
106
  const label = assocValue?.[titleKey];
109
107
  ```
110
108
 
111
- ## Relationship with ctx.collection
109
+ ## Relation to ctx.collection
112
110
 
113
- | Requirement | Recommended Usage |
114
- |------|----------|
115
- | **Current field's collection** | `ctx.collectionField?.collection` or `ctx.collection` |
111
+ | Need | Recommended |
112
+ |------|-------------|
113
+ | **Collection of current field** | `ctx.collectionField?.collection` or `ctx.collection` |
116
114
  | **Field metadata (name, type, interface, enum, etc.)** | `ctx.collectionField` |
117
115
  | **Target collection** | `ctx.collectionField?.targetCollection` |
118
116
 
119
- `ctx.collection` usually represents the collection bound to the current block; `ctx.collectionField` represents the definition of the current field in the collection. In scenarios like sub-tables or association fields, the two may differ.
117
+ `ctx.collection` is usually the block’s collection; `ctx.collectionField` is the field definition; they can differ in sub-tables and associations.
120
118
 
121
119
  ## Notes
122
120
 
123
- - In scenarios such as **JSBlock** or **JSAction (without field binding)**, `ctx.collectionField` is usually `undefined`. It is recommended to use optional chaining before access.
124
- - If a custom JS field is not bound to a collection field, `ctx.collectionField` may be `null`.
125
- - `targetCollection` only exists for association type fields (e.g., m2o, o2m, m2m); `enum` only exists for fields with options like select or radioGroup.
121
+ - In **JSBlock**, **JSAction (no field binding)**, `ctx.collectionField` is usually `undefined`; use optional chaining.
122
+ - Custom JS fields not bound to a collection field may have `ctx.collectionField` as `null`.
123
+ - `targetCollection` exists only for association fields (m2o, o2m, m2m); `enum` only for select, radioGroup, etc.
126
124
 
127
125
  ## Related
128
126
 
129
- - [ctx.collection](./collection.md): Collection associated with the current context
130
- - [ctx.model](./model.md): Model where the current execution context is located
131
- - [ctx.blockModel](./block-model.md): Parent block carrying the current JS
132
- - [ctx.getValue()](./get-value.md), [ctx.setValue()](./set-value.md): Read and write the current field value
127
+ - [ctx.collection](./collection.md): collection for current context
128
+ - [ctx.model](./model.md): model for current execution context
129
+ - [ctx.blockModel](./block-model.md): parent block
130
+ - [ctx.getValue()](./get-value.md), [ctx.setValue()](./set-value.md): read/write current field value
@@ -1,18 +1,18 @@
1
1
  # ctx.collection
2
2
 
3
- The Collection instance associated with the current RunJS execution context, used to access collection metadata, field definitions, primary keys, and other configurations. It usually originates from `ctx.blockModel.collection` or `ctx.collectionField?.collection`.
3
+ The collection (data table) instance associated with the current RunJS execution context; used to access collection metadata, field definitions, primary key, etc. Usually from `ctx.blockModel.collection` or `ctx.collectionField?.collection`.
4
4
 
5
5
  ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |------|------|
9
- | **JSBlock** | The collection bound to the block; can access `name`, `getFields`, `filterTargetKey`, etc. |
10
- | **JSField / JSItem / JSColumn** | The collection the current field belongs to (or the parent block's collection), used to retrieve field lists, primary keys, etc. |
11
- | **Table Column / Detail Block** | Used for rendering based on collection structure or passing `filterByTk` when opening popups. |
8
+ |----------|-------------|
9
+ | **JSBlock** | Block-bound collection; access `name`, `getFields`, `filterTargetKey`, etc. |
10
+ | **JSField / JSItem / JSColumn** | Collection of current field or parent block; get field list, primary key, etc. |
11
+ | **Table column / detail block** | Render by collection structure, pass `filterByTk` when opening popup, etc. |
12
12
 
13
- > Note: `ctx.collection` is available in scenarios where a data block, form block, or table block is bound to a collection. In an independent JSBlock that is not bound to a collection, it may be `null`. It is recommended to perform a null check before use.
13
+ > Note: `ctx.collection` is available when the context is bound to a data block, form block, or table block; a standalone JSBlock with no bound collection may have `null`—check before use.
14
14
 
15
- ## Type Definition
15
+ ## Type
16
16
 
17
17
  ```ts
18
18
  collection: Collection | null | undefined;
@@ -21,39 +21,39 @@ collection: Collection | null | undefined;
21
21
  ## Common Properties
22
22
 
23
23
  | Property | Type | Description |
24
- |------|------|------|
25
- | `name` | `string` | Collection name (e.g., `users`, `orders`) |
26
- | `title` | `string` | Collection title (includes internationalization) |
27
- | `filterTargetKey` | `string \| string[]` | Primary key field name, used for `filterByTk` and `getFilterByTK` |
28
- | `dataSourceKey` | `string` | Data source key (e.g., `main`) |
29
- | `dataSource` | `DataSource` | The data source instance it belongs to |
30
- | `template` | `string` | Collection template (e.g., `general`, `file`, `tree`) |
31
- | `titleableFields` | `CollectionField[]` | List of fields that can be displayed as titles |
32
- | `titleCollectionField` | `CollectionField` | The title field instance |
24
+ |----------|------|-------------|
25
+ | `name` | `string` | Collection name (e.g. `users`, `orders`) |
26
+ | `title` | `string` | Collection title (i18n) |
27
+ | `filterTargetKey` | `string \| string[]` | Primary key field name(s); used for `filterByTk`, `getFilterByTK` |
28
+ | `dataSourceKey` | `string` | Data source key (e.g. `main`) |
29
+ | `dataSource` | `DataSource` | Data source instance |
30
+ | `template` | `string` | Collection template (e.g. `general`, `file`, `tree`) |
31
+ | `titleableFields` | `CollectionField[]` | Fields that can be used as title |
32
+ | `titleCollectionField` | `CollectionField` | Title field instance |
33
33
 
34
34
  ## Common Methods
35
35
 
36
36
  | Method | Description |
37
- |------|------|
38
- | `getFields(): CollectionField[]` | Get all fields (including inherited ones) |
39
- | `getField(name: string): CollectionField \| undefined` | Get a single field by field name |
40
- | `getFieldByPath(path: string): CollectionField \| undefined` | Get a field by path (supports associations, e.g., `user.name`) |
41
- | `getAssociationFields(types?): CollectionField[]` | Get association fields; `types` can be `['one']`, `['many']`, etc. |
42
- | `getFilterByTK(record): any` | Extract the primary key value from a record, used for the API's `filterByTk` |
37
+ |--------|-------------|
38
+ | `getFields(): CollectionField[]` | All fields (including inherited) |
39
+ | `getField(name: string): CollectionField \| undefined` | Single field by name |
40
+ | `getFieldByPath(path: string): CollectionField \| undefined` | Field by path (supports association, e.g. `user.name`) |
41
+ | `getAssociationFields(types?): CollectionField[]` | Association fields; `types` e.g. `['one']`, `['many']` |
42
+ | `getFilterByTK(record): any` | Primary key value from record for API `filterByTk` |
43
43
 
44
- ## Relationship with ctx.collectionField and ctx.blockModel
44
+ ## Relation to ctx.collectionField, ctx.blockModel
45
45
 
46
- | Requirement | Recommended Usage |
47
- |------|----------|
48
- | **Collection associated with current context** | `ctx.collection` (equivalent to `ctx.blockModel?.collection` or `ctx.collectionField?.collection`) |
49
- | **Collection definition of the current field** | `ctx.collectionField?.collection` (the collection the field belongs to) |
50
- | **Association target collection** | `ctx.collectionField?.targetCollection` (the target collection of an association field) |
46
+ | Need | Recommended |
47
+ |------|-------------|
48
+ | **Collection for current context** | `ctx.collection` (same as `ctx.blockModel?.collection` or `ctx.collectionField?.collection`) |
49
+ | **Collection of current field** | `ctx.collectionField?.collection` |
50
+ | **Target collection of association** | `ctx.collectionField?.targetCollection` |
51
51
 
52
- In scenarios like sub-tables, `ctx.collection` might be the association target collection; in standard forms/tables, it is usually the collection bound to the block.
52
+ In sub-tables etc., `ctx.collection` may be the association target; in normal form/table it is usually the block’s collection.
53
53
 
54
54
  ## Examples
55
55
 
56
- ### Get Primary Key and Open Popup
56
+ ### Get primary key and open popup
57
57
 
58
58
  ```ts
59
59
  const primaryKey = ctx.collection?.filterTargetKey ?? 'id';
@@ -66,7 +66,7 @@ await ctx.openView(popupUid, {
66
66
  });
67
67
  ```
68
68
 
69
- ### Iterate Through Fields for Validation or Linkage
69
+ ### Iterate fields for validation or linkage
70
70
 
71
71
  ```ts
72
72
  const fields = ctx.collection?.getFields() ?? [];
@@ -80,21 +80,21 @@ for (const f of requiredFields) {
80
80
  }
81
81
  ```
82
82
 
83
- ### Get Association Fields
83
+ ### Get association fields
84
84
 
85
85
  ```ts
86
86
  const oneToMany = ctx.collection?.getAssociationFields(['many']) ?? [];
87
- // Used for building sub-tables, associated resources, etc.
87
+ // For sub-tables, association resources, etc.
88
88
  ```
89
89
 
90
90
  ## Notes
91
91
 
92
- - `filterTargetKey` is the primary key field name of the collection. Some collections may use a `string[]` for composite primary keys. If not configured, `'id'` is commonly used as a fallback.
93
- - In scenarios like **sub-tables or association fields**, `ctx.collection` may point to the association target collection, which differs from `ctx.blockModel.collection`.
94
- - `getFields()` merges fields from inherited collections; local fields override inherited fields with the same name.
92
+ - `filterTargetKey` is the collection’s primary key field name; some collections use `string[]` composite keys; fallback is often `'id'`.
93
+ - In **sub-tables, association fields**, `ctx.collection` may point to the association target, different from `ctx.blockModel.collection`.
94
+ - `getFields()` merges inherited collection fields; local fields override inherited ones with the same name.
95
95
 
96
96
  ## Related
97
97
 
98
- - [ctx.collectionField](./collection-field.md): The collection field definition of the current field
99
- - [ctx.blockModel](./block-model.md): The parent block hosting the current JS, containing `collection`
100
- - [ctx.model](./model.md): The current model, which may contain `collection`
98
+ - [ctx.collectionField](./collection-field.md): current field’s collection field definition
99
+ - [ctx.blockModel](./block-model.md): parent block that hosts current JS; has `collection`
100
+ - [ctx.model](./model.md): current model; may have `collection`
@@ -1,18 +1,18 @@
1
1
  # ctx.dataSourceManager
2
2
 
3
- The Data Source Manager (`DataSourceManager` instance) is used to manage and access multiple data sources (e.g., the main database `main`, logging database `logging`, etc.). It is used when multiple data sources exist or when cross-data source metadata access is required.
3
+ The data source manager (`DataSourceManager` instance) for managing and accessing multiple data sources (e.g. main `main`, logging `logging`). Use when you have multiple data sources or need cross–data-source metadata access.
4
4
 
5
5
  ## Use Cases
6
6
 
7
7
  | Scenario | Description |
8
- |------|------|
9
- | **Multi-data source** | Enumerate all data sources, or get a specific data source by key. |
10
- | **Cross-data source access** | Access metadata using the "data source key + collection name" format when the data source of the current context is unknown. |
11
- | **Get fields by full path** | Use the `dataSourceKey.collectionName.fieldPath` format to retrieve field definitions across different data sources. |
8
+ |----------|-------------|
9
+ | **Multiple data sources** | Enumerate all data sources, get one by key |
10
+ | **Cross–data-source access** | When context doesn’t know the data source, access by data source key + collection name” |
11
+ | **Field by full path** | Get field definition with path format `dataSourceKey.collectionName.fieldPath` |
12
12
 
13
- > Note: If you are only operating on the current data source, prioritize using `ctx.dataSource`. Use `ctx.dataSourceManager` only when you need to enumerate or switch between data sources.
13
+ > Note: If you only work with the current data source, use `ctx.dataSource`; use `ctx.dataSourceManager` when you need to enumerate or switch data sources.
14
14
 
15
- ## Type Definition
15
+ ## Type
16
16
 
17
17
  ```ts
18
18
  dataSourceManager: DataSourceManager;
@@ -20,74 +20,64 @@ dataSourceManager: DataSourceManager;
20
20
  class DataSourceManager {
21
21
  constructor();
22
22
 
23
- // Data source management
24
23
  addDataSource(ds: DataSource | DataSourceOptions): void;
25
24
  upsertDataSource(ds: DataSource | DataSourceOptions): void;
26
25
  removeDataSource(key: string): void;
27
26
  clearDataSources(): void;
28
27
 
29
- // Read data sources
30
- getDataSources(): DataSource[]; // Get all data sources
31
- getDataSource(key: string): DataSource | undefined; // Get data source by key
28
+ getDataSources(): DataSource[];
29
+ getDataSource(key: string): DataSource | undefined;
32
30
 
33
- // Access metadata directly by data source + collection
34
31
  getCollection(dataSourceKey: string, collectionName: string): Collection | undefined;
35
32
  getCollectionField(fieldPathWithDataSource: string): CollectionField | undefined;
36
33
  }
37
34
  ```
38
35
 
39
- ## Relationship with ctx.dataSource
36
+ ## Relation to ctx.dataSource
40
37
 
41
- | Requirement | Recommended Usage |
42
- |------|----------|
43
- | **Single data source bound to the current context** | `ctx.dataSource` (e.g., the data source of the current page/block) |
44
- | **Entry point for all data sources** | `ctx.dataSourceManager` |
38
+ | Need | Recommended |
39
+ |------|-------------|
40
+ | **Single data source for context** | `ctx.dataSource` |
41
+ | **Entry to all data sources** | `ctx.dataSourceManager` |
45
42
  | **List or switch data sources** | `ctx.dataSourceManager.getDataSources()` / `getDataSource(key)` |
46
- | **Get collection within the current data source** | `ctx.dataSource.getCollection(name)` |
47
- | **Get collection across data sources** | `ctx.dataSourceManager.getCollection(dataSourceKey, collectionName)` |
48
- | **Get field within the current data source** | `ctx.dataSource.getCollectionField('users.profile.avatar')` |
49
- | **Get field across data sources** | `ctx.dataSourceManager.getCollectionField('main.users.profile.avatar')` |
43
+ | **Collection in current data source** | `ctx.dataSource.getCollection(name)` |
44
+ | **Collection in another data source** | `ctx.dataSourceManager.getCollection(dataSourceKey, collectionName)` |
45
+ | **Field in current data source** | `ctx.dataSource.getCollectionField('users.profile.avatar')` |
46
+ | **Field across data sources** | `ctx.dataSourceManager.getCollectionField('main.users.profile.avatar')` |
50
47
 
51
48
  ## Examples
52
49
 
53
- ### Get a Specific Data Source
50
+ ### Get a data source
54
51
 
55
52
  ```ts
56
- // Get the data source named 'main'
57
53
  const mainDS = ctx.dataSourceManager.getDataSource('main');
58
-
59
- // Get all collections under this data source
60
54
  const collections = mainDS?.getCollections();
61
55
  ```
62
56
 
63
- ### Access Collection Metadata Across Data Sources
57
+ ### Cross–data-source collection metadata
64
58
 
65
59
  ```ts
66
- // Get collection by dataSourceKey + collectionName
67
60
  const users = ctx.dataSourceManager.getCollection('main', 'users');
68
61
  const orders = ctx.dataSourceManager.getCollection('main', 'orders');
69
62
 
70
- // Get the primary key of the collection
71
63
  const primaryKey = users?.filterTargetKey ?? 'id';
72
64
  ```
73
65
 
74
- ### Get Field Definition by Full Path
66
+ ### Field by full path
75
67
 
76
68
  ```ts
77
69
  // Format: dataSourceKey.collectionName.fieldPath
78
- // Get field definition by "data source key.collection name.field path"
79
70
  const field = ctx.dataSourceManager.getCollectionField('main.users.profile.avatar');
80
71
 
81
- // Supports association field paths
82
72
  const userNameField = ctx.dataSourceManager.getCollectionField('main.orders.createdBy.name');
83
73
  ```
84
74
 
85
- ### Iterate Through All Data Sources
75
+ ### Iterate all data sources
86
76
 
87
77
  ```ts
88
78
  const dataSources = ctx.dataSourceManager.getDataSources();
89
79
  for (const ds of dataSources) {
90
- ctx.logger.info(`Data Source: ${ds.key}, Display Name: ${ds.displayName}`);
80
+ ctx.logger.info(`Data source: ${ds.key}, display: ${ds.displayName}`);
91
81
  const collections = ds.getCollections();
92
82
  for (const col of collections) {
93
83
  ctx.logger.info(` - Collection: ${col.name}`);
@@ -95,7 +85,7 @@ for (const ds of dataSources) {
95
85
  }
96
86
  ```
97
87
 
98
- ### Dynamically Select Data Source Based on Variables
88
+ ### Dynamic data source from variable
99
89
 
100
90
  ```ts
101
91
  const dsKey = ctx.getVar('dataSourceKey') ?? 'main';
@@ -109,12 +99,12 @@ if (col) {
109
99
 
110
100
  ## Notes
111
101
 
112
- - The path format for `getCollectionField` is `dataSourceKey.collectionName.fieldPath`, where the first segment is the data source key, followed by the collection name and the field path.
113
- - `getDataSource(key)` returns `undefined` if the data source does not exist; it is recommended to perform a null check before use.
114
- - `addDataSource` will throw an exception if the key already exists; `upsertDataSource` will either overwrite the existing one or add a new one.
102
+ - `getCollectionField` path format is `dataSourceKey.collectionName.fieldPath`; first segment is data source key, then collection name and field path.
103
+ - `getDataSource(key)` returns `undefined` if the data source doesn’t existcheck before use.
104
+ - `addDataSource` throws if key already exists; `upsertDataSource` overwrites or adds.
115
105
 
116
106
  ## Related
117
107
 
118
- - [ctx.dataSource](./data-source.md): Current data source instance
119
- - [ctx.collection](./collection.md): Collection associated with the current context
120
- - [ctx.collectionField](./collection-field.md): Collection field definition for the current field
108
+ - [ctx.dataSource](./data-source.md): current data source instance
109
+ - [ctx.collection](./collection.md): collection for current context
110
+ - [ctx.collectionField](./collection-field.md): current field’s collection field definition