@rytass/bpm-core-shared 0.22.0 โ†’ 0.24.0

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,69 @@
1
+ ## 0.24.0 (2026-11-14)
2
+
3
+ ### ๐Ÿš€ Features
4
+
5
+ - **bpm-core:** page the stuck approval instance list ([6cd50975](https://github.com/Rytass/BPMCore/commit/6cd50975))
6
+ - **bpm-core-react:** mount the stuck approval instances page like the other admin pages ([fc19c298](https://github.com/Rytass/BPMCore/commit/fc19c298))
7
+ - let reassignMemberTasks take an optional list of task ids ([4b3c22a1](https://github.com/Rytass/BPMCore/commit/4b3c22a1))
8
+ - **shared:** let a manager chain continue an earlier chain or skip when its start already qualifies ([fbcd813c](https://github.com/Rytass/BPMCore/commit/fbcd813c))
9
+
10
+ ### ๐Ÿฉน Fixes
11
+
12
+ - **bpm-core:** tell the initiator of an administrator cancel only after it commits ([2fca97e7](https://github.com/Rytass/BPMCore/commit/2fca97e7))
13
+ - **bpm-core:** export the administrator cancel input like the other workflow inputs ([988981ae](https://github.com/Rytass/BPMCore/commit/988981ae))
14
+
15
+ ### ๐Ÿ”ฅ Performance
16
+
17
+ - **workflow-engine:** index the ADVANCE_FAILED rows the stuck list reads ([2cf16d8d](https://github.com/Rytass/BPMCore/commit/2cf16d8d))
18
+
19
+ ### โค๏ธ Thank You
20
+
21
+ - Chia Yu Pai @fantasywind
22
+ - Kai-Chieh Yang
23
+
24
+ ## 0.23.0 (2026-11-14)
25
+
26
+ ### ๐Ÿš€ Features
27
+
28
+ - **form-data-source:** locate approver-fill VALUE_NOT_RESOLVED on its field or cell ([1a17907a](https://github.com/Rytass/BPMCore/commit/1a17907a))
29
+ - **shared:** add column mode to field access matrix ([d0658f54](https://github.com/Rytass/BPMCore/commit/d0658f54))
30
+ - **bpm-core-client:** expose host error code on BPMGraphQLRequestError ([3a388721](https://github.com/Rytass/BPMCore/commit/3a388721))
31
+ - **workflow-command:** keep column grants in field access matrix ([ce50a7b0](https://github.com/Rytass/BPMCore/commit/ce50a7b0))
32
+ - **bpm-core-react:** pass column-mode table access to approver fill ([c4fcb87d](https://github.com/Rytass/BPMCore/commit/c4fcb87d))
33
+ - **bpm-core-react:** add per-table access to form renderer ([98cd5208](https://github.com/Rytass/BPMCore/commit/98cd5208))
34
+ - **field-access:** reject publish when a table dependent column is not opened ([a4f64372](https://github.com/Rytass/BPMCore/commit/a4f64372))
35
+ - **field-access:** export dependency break helper for column fills ([d25212c6](https://github.com/Rytass/BPMCore/commit/d25212c6))
36
+ - **field-access:** allow approver-filled data-source columns in column mode ([3b8cb06a](https://github.com/Rytass/BPMCore/commit/3b8cb06a))
37
+ - **field-access:** lint per-column fill conflicts and approver data sources ([2d081bb2](https://github.com/Rytass/BPMCore/commit/2d081bb2))
38
+ - **field-access:** read per-column fill units for table fields ([996bffcc](https://github.com/Rytass/BPMCore/commit/996bffcc))
39
+ - **workflow-engine:** expose recordTaskAutoDecisionFailed on the engine token ([40d69180](https://github.com/Rytass/BPMCore/commit/40d69180))
40
+ - **instance-event:** expose admin list and retry resolvers ([4cbb84ac](https://github.com/Rytass/BPMCore/commit/4cbb84ac))
41
+ - **instance-event:** purge delivered rows past retention ([69d19f9a](https://github.com/Rytass/BPMCore/commit/69d19f9a))
42
+ - **instance-event:** schedule periodic delivery scans ([ac9b7dc3](https://github.com/Rytass/BPMCore/commit/ac9b7dc3))
43
+ - **instance-event:** deliver on commit via subscriber ([53641feb](https://github.com/Rytass/BPMCore/commit/53641feb))
44
+ - **instance-event:** add outbox delivery service ([b7ddcd3f](https://github.com/Rytass/BPMCore/commit/b7ddcd3f))
45
+ - **instance-event:** add outbox event writer ([fd891be4](https://github.com/Rytass/BPMCore/commit/fd891be4))
46
+ - **instance-event:** add lifecycle event outbox and observer wiring ([74dcdffd](https://github.com/Rytass/BPMCore/commit/74dcdffd))
47
+ - **workflow-engine:** add pre-decision host guard for submit, resubmit and decide ([8d450dd3](https://github.com/Rytass/BPMCore/commit/8d450dd3))
48
+ - **form:** add HOST_RULE issue reason with optional host code ([3d58779d](https://github.com/Rytass/BPMCore/commit/3d58779d))
49
+ - **shared:** allow REQUIRED on approver-filled boolean fields ([2b669b75](https://github.com/Rytass/BPMCore/commit/2b669b75))
50
+ - **instances:** filter approval instances by template key ([18d496c7](https://github.com/Rytass/BPMCore/commit/18d496c7))
51
+ - **conditions:** optionally read unfilled form fields as null ([958d3be6](https://github.com/Rytass/BPMCore/commit/958d3be6))
52
+ - **template:** add a HOST_ONLY launch mode to template versions ([d83db05e](https://github.com/Rytass/BPMCore/commit/d83db05e))
53
+ - **initiator:** let a host add customFields to the built snapshot ([609bc5ab](https://github.com/Rytass/BPMCore/commit/609bc5ab))
54
+ - **inbox:** filter inbox and approval history by template ([6870883a](https://github.com/Rytass/BPMCore/commit/6870883a))
55
+ - **migrations:** add the host integration round schema ([34eef9b2](https://github.com/Rytass/BPMCore/commit/34eef9b2))
56
+
57
+ ### ๐Ÿฉน Fixes
58
+
59
+ - **workflow-engine:** report only changed keys to the resubmit guard ([53d7bdb2](https://github.com/Rytass/BPMCore/commit/53d7bdb2))
60
+ - **field-access:** lint column-mode fills of data-source columns ([314ba31d](https://github.com/Rytass/BPMCore/commit/314ba31d))
61
+ - **field-access:** keep column-mode fills out of whole-field write paths ([dca765de](https://github.com/Rytass/BPMCore/commit/dca765de))
62
+
63
+ ### โค๏ธ Thank You
64
+
65
+ - Chia Yu Pai @fantasywind
66
+
1
67
  ## 0.22.0 (2026-11-13)
2
68
 
3
69
  ### ๐Ÿš€ Features
package/README.md CHANGED
@@ -70,10 +70,20 @@ without a `mode` normalize to `single`; `radio` is always single and
70
70
  `POSITION`). The `POSITION` fallback type is not released yet (it landed after
71
71
  `v0.16.2`); older engines reject it at run time.
72
72
  `ORG_MANAGER_CHAIN` also takes `startFrom` (`OrgManagerChainStart`: the
73
- initiator, the person picked in a form field, or the person who approved an
74
- earlier stage) and `startPositionLevel` (managers below it are walked past);
75
- both are optional, and an older engine ignores them and climbs from the
76
- initiator.
73
+ initiator, the person picked in a form field, the person who approved an
74
+ earlier stage, or `CHAIN_CONTINUATION` to continue an earlier manager-chain
75
+ stage by `nodeId`), `startPositionLevel` (managers below it are walked past)
76
+ and `skipWhenStartReached` (skip the whole stage when the start person's own
77
+ position level already reaches `minPositionLevel`); all are optional. A
78
+ continuation only signs managers above the level the earlier stage actually
79
+ reached, and skips the stage when that level already reaches its own
80
+ `minPositionLevel`. `CHAIN_CONTINUATION` and `skipWhenStartReached: true`
81
+ exclude each other, and a notify node may use neither
82
+ (`readOrgManagerChainIssue`); `readChainContinuationSourceIssues` checks the
83
+ earlier stage. An engine that knows `startFrom` but not `CHAIN_CONTINUATION`
84
+ refuses it by name; an engine from before `startFrom` ignores `startFrom` and
85
+ `startPositionLevel` and climbs from the initiator, and one from before
86
+ `skipWhenStartReached` ignores that key and runs the stage as before.
77
87
  - Service task actions (`ServiceAction`) have three types. The workflow engine
78
88
  executes all three at run time:
79
89
  - `NOTIFY`: `channels`, `recipients` (an `ApproverResolver`), optional
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/bpm-core-shared",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "Shared TypeScript contracts for the Rytass BPM approval workflow stack (workflow, form, condition, identity, organization, status types).",
5
5
  "keywords": [
6
6
  "bpm",
@@ -1,4 +1,5 @@
1
1
  import { FormDefinitionSchema, FormFieldDefinition } from './form';
2
+ import { FieldAccessFillUnit } from './field-access';
2
3
  import type { FieldAccessDisplay, FieldAccessEntry, FieldAccessFill, UserTaskNode, WorkflowDefinition } from './workflow';
3
4
  import { isOnOwnParallelBranch, readReachableWorkflowNodeIds, readWorkflowParallelBranchSets } from './workflow-reachability';
4
5
  export { isOnOwnParallelBranch, readReachableWorkflowNodeIds, readWorkflowParallelBranchSets, };
@@ -10,7 +11,7 @@ export { isOnOwnParallelBranch, readReachableWorkflowNodeIds, readWorkflowParall
10
11
  * filled it in) stays in the backend: it needs the expression sources of
11
12
  * every node, which the matrix does not show.
12
13
  */
13
- export type FieldAccessIssueCode = 'applicantRuleReadsApproverFilled' | 'approverFilledFieldDataSource' | 'approverFilledFieldFileUpload' | 'approverFilledFieldFormRule' | 'approverFilledMultipleFillNodesOnPath' | 'approverFilledRequiredBoolean' | 'approverFilledTableDataSourceColumn' | 'fieldAccessAutoApprove' | 'fieldAccessDuplicate' | 'fieldAccessFillHidden' | 'fieldAccessGroupPolicy' | 'fieldAccessInvalid' | 'fieldAccessSkipNode' | 'fieldAccessUnknownField' | 'legacyFieldPermissions' | 'setFormFieldApproverFilled';
14
+ export type FieldAccessIssueCode = 'applicantRuleReadsApproverFilled' | 'approverFilledFieldDataSource' | 'approverFilledFieldFileUpload' | 'approverFilledFieldFormRule' | 'approverFilledMultipleFillNodesOnPath' | 'approverFilledTableDataSourceColumn' | 'fieldAccessAutoApprove' | 'fieldAccessDuplicate' | 'fieldAccessFillHidden' | 'fieldAccessGroupPolicy' | 'fieldAccessInvalid' | 'fieldAccessManagerChainReached' | 'fieldAccessSkipNode' | 'fieldAccessUnknownField' | 'legacyFieldPermissions' | 'setFormFieldApproverFilled';
14
15
  export interface FieldAccessIssue {
15
16
  readonly code: FieldAccessIssueCode;
16
17
  /** The top-level fields the issue is about, the offending one first. */
@@ -24,9 +25,11 @@ export interface FieldAccessIssue {
24
25
  * Why a user task node cannot let its approver fill fields in: a decision
25
26
  * shared by several approvers (`PARALLEL_ALL` / `QUORUM`) has no single
26
27
  * filler, and a node that can approve or skip itself would pass without
27
- * anybody filling anything in.
28
+ * anybody filling anything in. A manager chain that skips itself when its
29
+ * start person already reaches its level (`skipWhenStartReached`, or a
30
+ * continuation of an earlier chain) can pass the same way.
28
31
  */
29
- export type UserTaskFillConflict = 'autoApprove' | 'groupPolicy' | 'skipNode';
32
+ export type UserTaskFillConflict = 'autoApprove' | 'groupPolicy' | 'managerChainReached' | 'skipNode';
30
33
  export declare function readUserTaskFillConflicts(node: UserTaskNode): readonly UserTaskFillConflict[];
31
34
  export declare const FIELD_ACCESS_DISPLAYS: readonly FieldAccessDisplay[];
32
35
  export declare const FIELD_ACCESS_FILLS: readonly FieldAccessFill[];
@@ -83,9 +86,10 @@ export declare function readDefinitionFieldAccessIssues(definition: WorkflowDefi
83
86
  * Why a form field cannot be one an approver fills in, as the issues the
84
87
  * publish lint reports once it is: a form-level rule (`required` / `hidden`
85
88
  * set to `true`, the others set at all โ€” `required: false` and
86
- * `hidden: false`, what the form editor writes for "off", are not rules), a
87
- * data source, a file upload, or a table with a data-source column. Empty
88
- * when the field can be filled in.
89
+ * `hidden: false`, what the form editor writes for "off", are not rules) or a
90
+ * file upload. A data source, or a table with a data-source column, can be
91
+ * filled in by the approver (ADR 27 ยง4(b)). Empty when the field can be filled
92
+ * in.
89
93
  */
90
94
  export declare function readFormFieldFillIssues(field: FormFieldDefinition): readonly FieldAccessIssue[];
91
95
  /**
@@ -101,13 +105,31 @@ export declare function readFormFieldFillIssues(field: FormFieldDefinition): rea
101
105
  * stricter.
102
106
  */
103
107
  export declare function referencesFormField(expression: string, fieldKey: string): boolean;
108
+ /**
109
+ * A data-source column of a column-mode table that reads another column of the
110
+ * same table (ADR 27 ยง4.3) while the approver may fill in the read column but
111
+ * not this one. Once the read column changes, this column still holds the
112
+ * value its old source gave.
113
+ */
114
+ export interface FieldAccessDependencyBreak {
115
+ readonly fieldKey: string;
116
+ readonly sourceColumnKey: string;
117
+ readonly dependentColumnKey: string;
118
+ }
119
+ /**
120
+ * Every column the approver may fill in that a data-source column of the same
121
+ * table reads, while that data-source column is not open to the same node.
122
+ * A table granted whole is skipped: every column of it is then open. An
123
+ * EXPRESSION source counts only through a `row` reference, the way the cell
124
+ * reads its own row. Empty when `schema` is null.
125
+ */
126
+ export declare function readFieldAccessDependencyBreaks(schema: FormDefinitionSchema | null, units: readonly FieldAccessFillUnit[]): readonly FieldAccessDependencyBreak[];
104
127
  /**
105
128
  * The issues read against the form the definition is bound to, in
106
129
  * publish-lint order: a `fieldKey` that is not a top-level field of the form,
107
130
  * an approver-filled field the form will not let anybody fill in
108
131
  * (`readFormFieldFillIssues`, once per field however many nodes fill it in),
109
- * `fill: 'REQUIRED'` on a boolean (`false` is an answer, so required can never
110
- * fail), and an applicant's rule that reads an approver-filled field โ€” the
132
+ * and an applicant's rule that reads an approver-filled field โ€” the
111
133
  * rule is evaluated against the submitted form, where that field is still
112
134
  * empty, and the evaluation silently compares against nothing.
113
135
  */
@@ -8,6 +8,7 @@ exports.createWorkflowCoRunReader = createWorkflowCoRunReader;
8
8
  exports.readDefinitionFieldAccessIssues = readDefinitionFieldAccessIssues;
9
9
  exports.readFormFieldFillIssues = readFormFieldFillIssues;
10
10
  exports.referencesFormField = referencesFormField;
11
+ exports.readFieldAccessDependencyBreaks = readFieldAccessDependencyBreaks;
11
12
  exports.readFormFieldAccessIssues = readFormFieldAccessIssues;
12
13
  const form_1 = require("./form");
13
14
  const field_access_1 = require("./field-access");
@@ -29,6 +30,9 @@ function readUserTaskFillConflicts(node) {
29
30
  ...(((_d = node.data.excludeInitiator) === null || _d === void 0 ? void 0 : _d.whenEmpty) === 'SKIP_NODE'
30
31
  ? ['skipNode']
31
32
  : []),
33
+ ...((0, workflow_graph_1.canUserTaskBeSkippedByManagerChain)(node)
34
+ ? ['managerChainReached']
35
+ : []),
32
36
  ];
33
37
  }
34
38
  const FILL_CONFLICT_ISSUES = {
@@ -40,6 +44,10 @@ const FILL_CONFLICT_ISSUES = {
40
44
  code: 'fieldAccessGroupPolicy',
41
45
  message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.fieldAccessGroupPolicy,
42
46
  },
47
+ managerChainReached: {
48
+ code: 'fieldAccessManagerChainReached',
49
+ message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.fieldAccessManagerChainReached,
50
+ },
43
51
  skipNode: {
44
52
  code: 'fieldAccessSkipNode',
45
53
  message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.fieldAccessSkipNode,
@@ -57,6 +65,33 @@ exports.FIELD_ACCESS_FILLS = [
57
65
  'OPTIONAL',
58
66
  'REQUIRED',
59
67
  ];
68
+ /**
69
+ * Whether a stored `columns` list is one the publish lint accepts: a non-empty
70
+ * array of column entries with a non-blank, unique `columnKey` and a `fill` of
71
+ * `OPTIONAL` or `REQUIRED`. Absent means whole-field mode and is valid.
72
+ */
73
+ const isFieldAccessColumnsValid = (columns) => {
74
+ if (columns === undefined) {
75
+ return true;
76
+ }
77
+ if (!Array.isArray(columns) || columns.length === 0) {
78
+ return false;
79
+ }
80
+ const columnKeys = columns.map((column) => isPlainRecord(column) && typeof column['columnKey'] === 'string'
81
+ ? column['columnKey']
82
+ : undefined);
83
+ return (columns.every((column) => isPlainRecord(column) &&
84
+ typeof column['columnKey'] === 'string' &&
85
+ column['columnKey'].trim() !== '' &&
86
+ (column['fill'] === 'OPTIONAL' || column['fill'] === 'REQUIRED')) && new Set(columnKeys).size === columnKeys.length);
87
+ };
88
+ /**
89
+ * Whether two fill-unit column sets share a unit: a whole-field unit (`null`)
90
+ * overlaps every column, and two columns overlap only when they are the same.
91
+ */
92
+ const doFillUnitsOverlap = (left, right) => left.some((leftColumn) => right.some((rightColumn) => leftColumn === null ||
93
+ rightColumn === null ||
94
+ leftColumn === rightColumn));
60
95
  /**
61
96
  * Whether a stored entry is one the publish lint accepts. Stricter than
62
97
  * `readNodeFieldAccess`, which the engine reads with: a blank `fieldKey`
@@ -67,7 +102,8 @@ function isFieldAccessEntryValid(entry) {
67
102
  typeof entry['fieldKey'] === 'string' &&
68
103
  entry['fieldKey'].trim() !== '' &&
69
104
  exports.FIELD_ACCESS_DISPLAYS.some((display) => display === entry['display']) &&
70
- exports.FIELD_ACCESS_FILLS.some((fill) => fill === entry['fill']));
105
+ exports.FIELD_ACCESS_FILLS.some((fill) => fill === entry['fill']) &&
106
+ isFieldAccessColumnsValid(entry['columns']));
71
107
  }
72
108
  /**
73
109
  * One user task node's issues, in publish-lint order: the deprecated
@@ -118,7 +154,7 @@ function readNodeFieldAccessIssues(node) {
118
154
  ];
119
155
  }
120
156
  const fieldKeys = entries.map((entry) => entry.fieldKey);
121
- const hasFillableField = (0, field_access_1.readNodeFillableFieldKeys)(node).size > 0;
157
+ const fillableFieldKeys = (0, field_access_1.readNodeFillGrantFieldKeys)(node);
122
158
  return [
123
159
  ...legacyIssues,
124
160
  ...fieldKeys
@@ -131,14 +167,14 @@ function readNodeFieldAccessIssues(node) {
131
167
  nodeIds: [nodeId],
132
168
  })),
133
169
  ...(0, field_access_1.readNodeFieldAccess)(node)
134
- .filter((entry) => entry.fill !== 'NONE' && entry.display === 'HIDE')
170
+ .filter((entry) => entry.display === 'HIDE' && fillableFieldKeys.has(entry.fieldKey))
135
171
  .map((entry) => ({
136
172
  code: 'fieldAccessFillHidden',
137
173
  fieldKeys: [entry.fieldKey],
138
174
  message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.fieldAccessFillHidden(nodeId, entry.fieldKey),
139
175
  nodeIds: [nodeId],
140
176
  })),
141
- ...(hasFillableField ? readUserTaskFillConflicts(node) : []).map((conflict) => ({
177
+ ...(fillableFieldKeys.size > 0 ? readUserTaskFillConflicts(node) : []).map((conflict) => ({
142
178
  code: FILL_CONFLICT_ISSUES[conflict].code,
143
179
  fieldKeys: [],
144
180
  message: FILL_CONFLICT_ISSUES[conflict].message(nodeId),
@@ -211,19 +247,26 @@ function readDefinitionFieldAccessIssues(definition) {
211
247
  const userTasks = definition.nodes.filter((node) => node.type === 'userTask');
212
248
  const canBothRun = createWorkflowCoRunReader(definition);
213
249
  const pathIssues = [...approverFilled].flatMap((fieldKey) => {
214
- const fillNodeIds = [
215
- ...new Set(userTasks
216
- .filter((node) => (0, field_access_1.readNodeFillableFieldKeys)(node).has(fieldKey))
217
- .map((node) => node.id)),
218
- ];
219
- return fillNodeIds.flatMap((nodeId, index) => fillNodeIds
250
+ // One filler per (fieldKey, columnKey): two nodes filling different
251
+ // columns of one table never overwrite each other (ADR 27 ยง4(a)).
252
+ const fillers = userTasks
253
+ .map((node) => ({
254
+ nodeId: node.id,
255
+ columnKeys: (0, field_access_1.readNodeFillUnits)(node)
256
+ .filter((unit) => unit.fieldKey === fieldKey)
257
+ .map((unit) => unit.columnKey),
258
+ }))
259
+ .filter((filler) => filler.columnKeys.length > 0);
260
+ return fillers.flatMap((filler, index) => fillers
220
261
  .slice(index + 1)
221
- .filter((otherNodeId) => canBothRun(nodeId, otherNodeId))
222
- .map((otherNodeId) => ({
262
+ .filter((other) => other.nodeId !== filler.nodeId &&
263
+ doFillUnitsOverlap(filler.columnKeys, other.columnKeys) &&
264
+ canBothRun(filler.nodeId, other.nodeId))
265
+ .map((other) => ({
223
266
  code: 'approverFilledMultipleFillNodesOnPath',
224
267
  fieldKeys: [fieldKey],
225
- message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledMultipleFillNodesOnPath(fieldKey, nodeId, otherNodeId),
226
- nodeIds: [nodeId, otherNodeId],
268
+ message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledMultipleFillNodesOnPath(fieldKey, filler.nodeId, other.nodeId),
269
+ nodeIds: [filler.nodeId, other.nodeId],
227
270
  })));
228
271
  });
229
272
  return [...writeIssues, ...pathIssues];
@@ -232,9 +275,10 @@ function readDefinitionFieldAccessIssues(definition) {
232
275
  * Why a form field cannot be one an approver fills in, as the issues the
233
276
  * publish lint reports once it is: a form-level rule (`required` / `hidden`
234
277
  * set to `true`, the others set at all โ€” `required: false` and
235
- * `hidden: false`, what the form editor writes for "off", are not rules), a
236
- * data source, a file upload, or a table with a data-source column. Empty
237
- * when the field can be filled in.
278
+ * `hidden: false`, what the form editor writes for "off", are not rules) or a
279
+ * file upload. A data source, or a table with a data-source column, can be
280
+ * filled in by the approver (ADR 27 ยง4(b)). Empty when the field can be filled
281
+ * in.
238
282
  */
239
283
  function readFormFieldFillIssues(field) {
240
284
  const { fieldKey } = field;
@@ -248,22 +292,11 @@ function readFormFieldFillIssues(field) {
248
292
  ...workflow_graph_1.APPROVER_FILLED_FORM_RULES.filter((rule) => rule === 'required' || rule === 'hidden'
249
293
  ? field[rule] === true
250
294
  : field[rule] !== undefined).map((rule) => issue('approverFilledFieldFormRule', workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledFieldFormRule(fieldKey, rule))),
251
- ...((0, form_1.isFormDataSourceFieldDefinition)(field)
252
- ? [
253
- issue('approverFilledFieldDataSource', workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledFieldDataSource(fieldKey)),
254
- ]
255
- : []),
256
295
  ...(field.type === 'file_upload'
257
296
  ? [
258
297
  issue('approverFilledFieldFileUpload', workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledFieldFileUpload(fieldKey)),
259
298
  ]
260
299
  : []),
261
- ...((0, form_1.isTableFieldDefinition)(field) &&
262
- field.columns.some(form_1.isFormDataSourceFieldDefinition)
263
- ? [
264
- issue('approverFilledTableDataSourceColumn', workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledTableDataSourceColumn(fieldKey)),
265
- ]
266
- : []),
267
300
  ];
268
301
  }
269
302
  /**
@@ -279,22 +312,64 @@ function readFormFieldFillIssues(field) {
279
312
  * stricter.
280
313
  */
281
314
  function referencesFormField(expression, fieldKey) {
282
- const escapedKey = fieldKey.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
283
- // Not preceded by an identifier character or a dot, so `myform` and
284
- // `a.form` do not pass for the root.
285
- const root = '(?<![\\p{L}\\p{N}_.])(?:formData|form)\\s*';
315
+ return referencesRootedKey(expression, '(?:formData|form)', fieldKey);
316
+ }
317
+ /**
318
+ * The same match as `referencesFormField`, for an arbitrary root: `root` is a
319
+ * regex alternation (`(?:formData|form)`, `row`) placed before `.key` or
320
+ * `["key"]`. The root may not be preceded by an identifier character or a dot.
321
+ */
322
+ function referencesRootedKey(expression, root, key) {
323
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
324
+ const rootPattern = `(?<![\\p{L}\\p{N}_.])${root}\\s*`;
286
325
  return [
287
- new RegExp(`${root}\\.\\s*${escapedKey}(?![\\p{L}\\p{N}_])`, 'u'),
288
- new RegExp(`${root}\\[\\s*["']${escapedKey}["']\\s*\\]`, 'u'),
326
+ new RegExp(`${rootPattern}\\.\\s*${escapedKey}(?![\\p{L}\\p{N}_])`, 'u'),
327
+ new RegExp(`${rootPattern}\\[\\s*["']${escapedKey}["']\\s*\\]`, 'u'),
289
328
  ].some((pattern) => pattern.test(expression));
290
329
  }
330
+ const readDependentColumnKeys = (table, sourceColumnKey) => table.columns
331
+ .filter((column) => (0, form_1.isFormDataSourceFieldDefinition)(column) &&
332
+ column.dataSource.bindings.some(({ from }) => from.kind === 'ROW_FIELD'
333
+ ? from.columnKey === sourceColumnKey
334
+ : from.kind === 'EXPRESSION' &&
335
+ referencesRootedKey(from.expression, 'row', sourceColumnKey)))
336
+ .map((column) => column.fieldKey);
337
+ /**
338
+ * Every column the approver may fill in that a data-source column of the same
339
+ * table reads, while that data-source column is not open to the same node.
340
+ * A table granted whole is skipped: every column of it is then open. An
341
+ * EXPRESSION source counts only through a `row` reference, the way the cell
342
+ * reads its own row. Empty when `schema` is null.
343
+ */
344
+ function readFieldAccessDependencyBreaks(schema, units) {
345
+ if (schema === null) {
346
+ return [];
347
+ }
348
+ const wholeFieldKeys = new Set(units
349
+ .filter(({ columnKey }) => columnKey === null)
350
+ .map(({ fieldKey }) => fieldKey));
351
+ return schema.fields.flatMap((field) => {
352
+ if (!(0, form_1.isTableFieldDefinition)(field) ||
353
+ wholeFieldKeys.has(field.fieldKey)) {
354
+ return [];
355
+ }
356
+ const openColumnKeys = new Set(units.flatMap(({ fieldKey, columnKey }) => fieldKey === field.fieldKey && columnKey !== null ? [columnKey] : []));
357
+ return [...openColumnKeys].flatMap((sourceColumnKey) => readDependentColumnKeys(field, sourceColumnKey)
358
+ .filter((dependentColumnKey) => dependentColumnKey !== sourceColumnKey &&
359
+ !openColumnKeys.has(dependentColumnKey))
360
+ .map((dependentColumnKey) => ({
361
+ dependentColumnKey,
362
+ fieldKey: field.fieldKey,
363
+ sourceColumnKey,
364
+ })));
365
+ });
366
+ }
291
367
  /**
292
368
  * The issues read against the form the definition is bound to, in
293
369
  * publish-lint order: a `fieldKey` that is not a top-level field of the form,
294
370
  * an approver-filled field the form will not let anybody fill in
295
371
  * (`readFormFieldFillIssues`, once per field however many nodes fill it in),
296
- * `fill: 'REQUIRED'` on a boolean (`false` is an answer, so required can never
297
- * fail), and an applicant's rule that reads an approver-filled field โ€” the
372
+ * and an applicant's rule that reads an approver-filled field โ€” the
298
373
  * rule is evaluated against the submitted form, where that field is still
299
374
  * empty, and the evaluation silently compares against nothing.
300
375
  */
@@ -313,18 +388,6 @@ function readFormFieldAccessIssues(definition, schema) {
313
388
  message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.fieldAccessUnknownField(node.id, fieldKey),
314
389
  nodeIds: [node.id],
315
390
  })));
316
- const requiredBooleanIssues = userTasks.flatMap((node) => (0, field_access_1.readNodeFieldAccess)(node)
317
- .filter(({ fieldKey, fill }) => {
318
- var _a;
319
- return fill === 'REQUIRED' &&
320
- ((_a = fieldsByKey.get(fieldKey)) === null || _a === void 0 ? void 0 : _a.type) === 'boolean';
321
- })
322
- .map(({ fieldKey }) => ({
323
- code: 'approverFilledRequiredBoolean',
324
- fieldKeys: [fieldKey],
325
- message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledRequiredBoolean(node.id, fieldKey),
326
- nodeIds: [node.id],
327
- })));
328
391
  const approverFilled = (0, field_access_1.readApproverFilledFieldKeys)(definition);
329
392
  const applicantRuleIssues = ((_b = schema === null || schema === void 0 ? void 0 : schema.fields) !== null && _b !== void 0 ? _b : [])
330
393
  .filter((field) => !approverFilled.has(field.fieldKey))
@@ -345,10 +408,19 @@ function readFormFieldAccessIssues(definition, schema) {
345
408
  const field = fieldsByKey.get(fieldKey);
346
409
  return field === undefined ? [] : readFormFieldFillIssues(field);
347
410
  });
411
+ // A column the approver fills in whose data-source dependent the same node
412
+ // leaves open would keep its upstream value after the approver changes its
413
+ // source, so the publish refuses it (ADR 27 ยง4.3).
414
+ const dependencyIssues = userTasks.flatMap((node) => readFieldAccessDependencyBreaks(schema, (0, field_access_1.readNodeFillUnits)(node)).map(({ fieldKey, sourceColumnKey, dependentColumnKey }) => ({
415
+ code: 'approverFilledTableDataSourceColumn',
416
+ fieldKeys: [fieldKey],
417
+ message: workflow_graph_1.WORKFLOW_LINT_MESSAGES.approverFilledTableDataSourceColumn(node.id, fieldKey, sourceColumnKey, dependentColumnKey),
418
+ nodeIds: [node.id],
419
+ })));
348
420
  return [
349
421
  ...unknownFieldIssues,
350
422
  ...fieldIssues,
351
- ...requiredBooleanIssues,
423
+ ...dependencyIssues,
352
424
  ...applicantRuleIssues,
353
425
  ];
354
426
  }
@@ -1 +1 @@
1
- {"version":3,"file":"field-access-lint.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/field-access-lint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field-access-lint.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/field-access-lint.ts"],"names":[],"mappings":";;;AAyFA,8DAkBC;AAmGD,0DAWC;AAmBD,8DA6EC;AAUD,8DA4BC;AAiBD,0EAqEC;AAWD,0DAkCC;AAcD,kDAKC;AAyDD,0EA6CC;AAWD,8DA2FC;AAjsBD,iCAMgB;AAChB,iDAOwB;AAQxB,qDAK0B;AAC1B,mEAIiC;AAK/B,sGARA,6CAAqB,OAQA;AACrB,6GARA,oDAA4B,OAQA;AAC5B,+GARA,sDAA8B,OAQA;AAkDhC,SAAgB,yBAAyB,CACvC,IAAkB;;IAElB,OAAO;QACL,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,cAAc,0CAAE,IAAI,MAAK,cAAc;YACrD,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,cAAc,0CAAE,IAAI,MAAK,QAAQ;YACzC,CAAC,CAAE,CAAC,aAAa,CAAW;YAC5B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,SAAS,MAAK,cAAc;YAC7C,CAAC,CAAE,CAAC,aAAa,CAAW;YAC5B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,0CAAE,SAAS,MAAK,WAAW;YACvD,CAAC,CAAE,CAAC,UAAU,CAAW;YACzB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAA,mDAAkC,EAAC,IAAI,CAAC;YAC1C,CAAC,CAAE,CAAC,qBAAqB,CAAW;YACpC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB,GAQtB;IACF,WAAW,EAAE;QACX,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,uCAAsB,CAAC,sBAAsB;KACvD;IACD,WAAW,EAAE;QACX,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,uCAAsB,CAAC,sBAAsB;KACvD;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,uCAAsB,CAAC,8BAA8B;KAC/D;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,uCAAsB,CAAC,mBAAmB;KACpD;CACF,CAAC;AAEF,SAAS,aAAa,CACpB,KAAc;IAEd,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAEY,QAAA,qBAAqB,GAAkC;IAClE,MAAM;IACN,MAAM;CACP,CAAC;AAEW,QAAA,kBAAkB,GAA+B;IAC5D,MAAM;IACN,UAAU;IACV,UAAU;CACX,CAAC;AAEF;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAe,EAAE,EAAE,CACjD,aAAa,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ;QAC9D,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;QACrB,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,OAAO,CACL,OAAO,CAAC,KAAK,CACX,CAAC,MAAe,EAAE,EAAE,CAClB,aAAa,CAAC,MAAM,CAAC;QACrB,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QACjC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CACnE,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CACpD,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CACzB,IAAgC,EAChC,KAAiC,EACxB,EAAE,CACX,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACvB,KAAK,CAAC,IAAI,CACR,CAAC,WAAW,EAAE,EAAE,CACd,UAAU,KAAK,IAAI;IACnB,WAAW,KAAK,IAAI;IACpB,UAAU,KAAK,WAAW,CAC7B,CACF,CAAC;AAEJ;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,KAAc;IAEd,OAAO,CACL,aAAa,CAAC,KAAK,CAAC;QACpB,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ;QACrC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAC/B,6BAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;QACrE,0BAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QACzD,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,yBAAyB,CACvC,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACvB,MAAM,MAAM,GAAY,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnD,MAAM,YAAY,GAChB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,uCAAsB,CAAC,sBAAsB,CAAC,MAAM,CAAC;gBAC9D,OAAO,EAAE,CAAC,MAAM,CAAC;aAClB;SACF,CAAC;IACR,MAAM,GAAG,GAAY,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAE3C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAmC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAChE,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACrE,OAAO;YACL,GAAG,YAAY;YACf;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,uCAAsB,CAAC,kBAAkB,CAAC,MAAM,CAAC;gBAC1D,OAAO,EAAE,CAAC,MAAM,CAAC;aAClB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,IAAA,yCAA0B,EAAC,IAAI,CAAC,CAAC;IAE3D,OAAO;QACL,GAAG,YAAY;QACf,GAAG,SAAS;aACT,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC;aAClE,MAAM,CACL,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,CACpE;aACA,GAAG,CAAC,CAAC,QAAQ,EAAoB,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,CAAC,QAAQ,CAAC;YACrB,OAAO,EAAE,uCAAsB,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtE,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAC,CAAC;QACL,GAAG,IAAA,kCAAmB,EAAC,IAAI,CAAC;aACzB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CACpE;aACA,GAAG,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,uBAAuB;YAC7B,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3B,OAAO,EAAE,uCAAsB,CAAC,qBAAqB,CACnD,MAAM,EACN,KAAK,CAAC,QAAQ,CACf;YACD,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAC,CAAC;QACL,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,QAAQ,EAAoB,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,IAAI;YACzC,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YACvD,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAC,CACH;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACvC,UAA8B;IAE9B,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC9D,MAAM,aAAa,GAAG,CAAC,MAAc,EAAuB,EAAE;QAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,oDAA4B,EAAC,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3E,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEtC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAA,sDAA8B,EACrD,UAAU,EACV,aAAa,CACd,CAAC;IAEF,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAC7B,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;QACtC,aAAa,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACjC,IAAA,6CAAqB,EAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CACrD,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,+BAA+B,CAC7C,UAA8B;IAE9B,MAAM,cAAc,GAAG,IAAA,0CAA2B,EAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK;SACjC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;SAC7C,OAAO,CAAC,CAAC,IAAI,EAA+B,EAAE;QAC7C,MAAM,MAAM,GAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM,QAAQ,GACZ,aAAa,CAAC,MAAM,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,KAAK,gBAAgB;YACnC,OAAO,SAAS,KAAK,QAAQ;YAC3B,CAAC,CAAC,IAAA,2CAA4B,EAAC,SAAS,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO,QAAQ,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC3D,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,CAAC,QAAQ,CAAC;oBACrB,OAAO,EAAE,uCAAsB,CAAC,0BAA0B,CACxD,IAAI,CAAC,EAAE,EACP,QAAQ,CACT;oBACD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;iBACnB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IACL,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CACvC,CAAC,IAAI,EAAwB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;IACF,MAAM,UAAU,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1D,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,OAAO,GAAG,SAAS;aACtB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,IAAA,gCAAiB,EAAC,IAAI,CAAC;iBAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;iBAC5C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;SACjC,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvC,OAAO;aACJ,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aAChB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAC9B,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;YACvD,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAC1C;aACA,GAAG,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,uCAAuC;YAC7C,SAAS,EAAE,CAAC,QAAQ,CAAC;YACrB,OAAO,EAAE,uCAAsB,CAAC,qCAAqC,CACnE,QAAQ,EACR,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,MAAM,CACb;YACD,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;SACvC,CAAC,CAAC,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,uBAAuB,CACrC,KAA0B;IAE1B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,CACZ,IAA0B,EAC1B,OAAe,EACG,EAAE,CAAC,CAAC;QACtB,IAAI;QACJ,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,OAAO;QACP,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,2CAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAW,EAAE,CACrD,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ;YACtC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI;YACtB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAC9B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACb,KAAK,CACH,6BAA6B,EAC7B,uCAAsB,CAAC,2BAA2B,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnE,CACF;QACD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa;YAC9B,CAAC,CAAC;gBACE,KAAK,CACH,+BAA+B,EAC/B,uCAAsB,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAC/D;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,mBAAmB,CACjC,UAAkB,EAClB,QAAgB;IAEhB,OAAO,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,IAAY,EACZ,GAAW;IAEX,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,wBAAwB,IAAI,MAAM,CAAC;IAEvD,OAAO;QACL,IAAI,MAAM,CAAC,GAAG,WAAW,UAAU,UAAU,qBAAqB,EAAE,GAAG,CAAC;QACxE,IAAI,MAAM,CAAC,GAAG,WAAW,cAAc,UAAU,aAAa,EAAE,GAAG,CAAC;KACrE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAChD,CAAC;AAcD,MAAM,uBAAuB,GAAG,CAC9B,KAA2B,EAC3B,eAAuB,EACJ,EAAE,CACrB,KAAK,CAAC,OAAO;KACV,MAAM,CACL,CAAC,MAAM,EAAW,EAAE,CAClB,IAAA,sCAA+B,EAAC,MAAM,CAAC;IACvC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAW,EAAE,CACpD,IAAI,CAAC,IAAI,KAAK,WAAW;QACvB,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,eAAe;QACpC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY;YAC1B,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,CACjE,CACJ;KACA,GAAG,CAAC,CAAC,MAAM,EAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE9C;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,MAAmC,EACnC,KAAqC;IAErC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,KAAK;SACF,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAW,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC;SACtD,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAU,EAAE,CAAC,QAAQ,CAAC,CAC3C,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAC1B,CAAC,KAAK,EAAyC,EAAE;QAC/C,IACE,CAAC,IAAA,6BAAsB,EAAC,KAAK,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAClC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAqB,EAAE,CAC3D,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,CAChC,CAAC,eAAe,EAAyC,EAAE,CACzD,uBAAuB,CAAC,KAAK,EAAE,eAAe,CAAC;aAC5C,MAAM,CACL,CAAC,kBAAkB,EAAW,EAAE,CAC9B,kBAAkB,KAAK,eAAe;YACtC,CAAC,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAC1C;aACA,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC5B,kBAAkB;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,eAAe;SAChB,CAAC,CAAC,CACR,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,yBAAyB,CACvC,UAA8B,EAC9B,MAAmC;;IAEnC,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,CAAC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,mCAAI,EAAE,CAAC,CAAC,GAAG,CACxB,CAAC,KAAK,EAA0C,EAAE,CAAC;QACjD,KAAK,CAAC,QAAQ;QACd,KAAK;KACN,CACF,CACF,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CACvC,CAAC,IAAI,EAAwB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;IACF,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAC1C,CAAC,IAAI,EAA+B,EAAE,CACpC,IAAA,kCAAmB,EAAC,IAAI,CAAC;SACtB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,EAAE,yBAAyB;QAC/B,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,uCAAsB,CAAC,uBAAuB,CACrD,IAAI,CAAC,EAAE,EACP,QAAQ,CACT;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;KACnB,CAAC,CAAC,CACR,CAAC;IACF,MAAM,cAAc,GAAG,IAAA,0CAA2B,EAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,mBAAmB,GAAG,CAAC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,mCAAI,EAAE,CAAC;SAC/C,MAAM,CAAC,CAAC,KAAK,EAAW,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC/D,OAAO,CAAC,CAAC,KAAK,EAA+B,EAAE,CAC9C,gDAA+B,CAAC,OAAO,CACrC,CAAC,IAAI,EAA+B,EAAE;QACpC,MAAM,UAAU,GAAY,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,OAAO,OAAO,UAAU,KAAK,QAAQ;YACnC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;iBAChB,MAAM,CAAC,CAAC,QAAQ,EAAW,EAAE,CAC5B,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAC1C;iBACA,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE,kCAAkC;gBACxC,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBACrC,OAAO,EACL,uCAAsB,CAAC,gCAAgC,CACrD,KAAK,CAAC,QAAQ,EACd,IAAI,EACJ,QAAQ,CACT;gBACH,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACP,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CACF,CACF,CAAC;IACJ,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,CAC7C,CAAC,QAAQ,EAA+B,EAAE;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;IAEF,2EAA2E;IAC3E,2EAA2E;IAC3E,mDAAmD;IACnD,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CACxC,CAAC,IAAI,EAA+B,EAAE,CACpC,+BAA+B,CAAC,MAAM,EAAE,IAAA,gCAAiB,EAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAClE,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,EAAE,qCAAqC;QAC3C,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,uCAAsB,CAAC,mCAAmC,CACjE,IAAI,CAAC,EAAE,EACP,QAAQ,EACR,eAAe,EACf,kBAAkB,CACnB;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;KACnB,CAAC,CACH,CACJ,CAAC;IAEF,OAAO;QACL,GAAG,kBAAkB;QACrB,GAAG,WAAW;QACd,GAAG,gBAAgB;QACnB,GAAG,mBAAmB;KACvB,CAAC;AACJ,CAAC"}
@@ -1,21 +1,30 @@
1
1
  import { FieldAccessIssue, UserTaskFillConflict } from './field-access-lint';
2
- import type { FormDefinitionSchema, FormFieldDefinition } from './form';
3
- import type { FieldAccessEntry, WorkflowDefinition } from './workflow';
2
+ import { type FormDefinitionSchema, type FormFieldDefinition } from './form';
3
+ import type { FieldAccessColumnEntry, FieldAccessEntry, FieldAccessFill, WorkflowDefinition } from './workflow';
4
4
  /**
5
5
  * What a cell of the field access matrix offers. `DEFAULT` writes nothing for
6
- * the node, so the field falls back to the derived value; the other four each
7
- * stand for one `FieldAccessEntry` (`fill` other than `NONE` is always shown,
8
- * since a hidden fill cannot be published).
6
+ * the node, so the field falls back to the derived value. `SHOW`, `HIDE`,
7
+ * `FILL_OPTIONAL` and `FILL_REQUIRED` each stand for one whole-field
8
+ * `FieldAccessEntry` (`fill` other than `NONE` is always shown, since a hidden
9
+ * fill cannot be published). `COLUMNS` stands for a column-mode entry (ADR 27
10
+ * ยง4(a)) on a table field, whose fillable columns are set per column through
11
+ * `updateFieldAccessColumnFill`; it may hold zero columns while being edited.
9
12
  */
10
- export type FieldAccessChoice = 'DEFAULT' | 'FILL_OPTIONAL' | 'FILL_REQUIRED' | 'HIDE' | 'SHOW';
13
+ export type FieldAccessChoice = 'DEFAULT' | 'FILL_OPTIONAL' | 'FILL_REQUIRED' | 'HIDE' | 'SHOW' | 'COLUMNS';
11
14
  export declare const FIELD_ACCESS_CHOICES: readonly FieldAccessChoice[];
12
15
  /**
13
16
  * What a viewer at one place in the flow gets for a field. `FILL` is the
14
17
  * applicant's own field; `NOT_SHOWN` is an approver-filled field nobody has
15
18
  * filled in yet, which BPM leaves off the screen; `HIDDEN` is a node that
16
- * chose to hide the field (display only, never a permission).
19
+ * chose to hide the field (display only, never a permission); `FILL_COLUMNS`
20
+ * is a node that lets its approver fill some columns of a table.
17
21
  */
18
- export type FieldAccessEffective = 'FILL' | 'FILL_OPTIONAL' | 'FILL_REQUIRED' | 'HIDDEN' | 'NOT_SHOWN' | 'READ_ONLY';
22
+ export type FieldAccessEffective = 'FILL' | 'FILL_COLUMNS' | 'FILL_OPTIONAL' | 'FILL_REQUIRED' | 'HIDDEN' | 'NOT_SHOWN' | 'READ_ONLY';
23
+ /** One column of a table field, as the matrix lists it under the table row. */
24
+ export interface FieldAccessMatrixTableColumn {
25
+ readonly columnKey: string;
26
+ readonly label: string;
27
+ }
19
28
  /**
20
29
  * Why a cell reads the way it does: the node lists the field (`EXPLICIT`), an
21
30
  * ordinary field every node sees read-only (`APPLICANT_FIELD`), an
@@ -49,6 +58,8 @@ export interface FieldAccessMatrixCell {
49
58
  /** The fill choices this cell cannot take, for the node or the field. */
50
59
  readonly disabledChoices: readonly FieldAccessChoice[];
51
60
  readonly effective: FieldAccessEffective;
61
+ /** The fillable columns of a column-mode entry; empty for any other cell. */
62
+ readonly columnFills: readonly FieldAccessColumnEntry[];
52
63
  readonly explicit: FieldAccessEntry | null;
53
64
  readonly nodeId: string;
54
65
  readonly reason: FieldAccessCellReason;
@@ -68,6 +79,8 @@ export interface FieldAccessMatrixRow {
68
79
  /** Publish-blocking issues that name this field. */
69
80
  readonly issues: readonly FieldAccessIssue[];
70
81
  readonly notices: readonly FieldAccessNotice[];
82
+ /** The columns a table field offers per-column access for; empty otherwise. */
83
+ readonly tableColumns: readonly FieldAccessMatrixTableColumn[];
71
84
  }
72
85
  export interface FieldAccessMatrix {
73
86
  readonly columns: readonly FieldAccessMatrixColumn[];
@@ -79,8 +92,20 @@ export interface FieldAccessMatrix {
79
92
  readonly rows: readonly FieldAccessMatrixRow[];
80
93
  }
81
94
  export declare function readFieldAccessChoice(entry: FieldAccessEntry | null): FieldAccessChoice;
82
- /** The entry a choice writes for the field, or `null` for `DEFAULT`. */
95
+ /**
96
+ * The entry a choice writes for the field, or `null` for `DEFAULT`. `COLUMNS`
97
+ * writes an empty column list, which the publish lint rejects until a column
98
+ * is checked, so the drawer must not apply it on its own.
99
+ */
83
100
  export declare function readFieldAccessEntryForChoice(fieldKey: string, choice: FieldAccessChoice): FieldAccessEntry | null;
101
+ /**
102
+ * The entry after one column of a table field is set to `fill`, or cleared
103
+ * when `fill` is `NONE`. The other columns keep their fill and order; a
104
+ * whole-field entry (no `columns`) starts from an empty column list.
105
+ */
106
+ export declare function updateFieldAccessColumnFill(entry: FieldAccessEntry | null, fieldKey: string, columnKey: string, fill: FieldAccessFill): FieldAccessEntry;
107
+ /** The table columns a field offers per-column access for; none for other fields. */
108
+ export declare function readTableColumns(field: FormFieldDefinition): readonly FieldAccessMatrixTableColumn[];
84
109
  /**
85
110
  * The designer's field access matrix: one row per top-level form field, one
86
111
  * column per user task in flow order, and in each cell the node's explicit