@fieldia/core 0.9.2 → 0.10.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/package.json +1 -1
- package/schema/page.schema.json +1128 -89
- package/src/lib/expression/evaluator.d.mts +6 -5
- package/src/lib/expression/evaluator.d.ts +6 -5
- package/src/lib/expression/evaluator.js +37 -22
- package/src/lib/expression/evaluator.js.map +1 -1
- package/src/lib/expression/evaluator.mjs +32 -18
- package/src/lib/expression/evaluator.mjs.map +1 -1
- package/src/lib/expression/expression.d.mts +21 -0
- package/src/lib/expression/expression.d.ts +21 -0
- package/src/lib/expression/expression.js +29 -0
- package/src/lib/expression/expression.js.map +1 -0
- package/src/lib/expression/expression.mjs +26 -0
- package/src/lib/expression/expression.mjs.map +1 -0
- package/src/lib/expression/extractFieldNames.js +6 -1
- package/src/lib/expression/extractFieldNames.js.map +1 -1
- package/src/lib/expression/extractFieldNames.mjs +6 -1
- package/src/lib/expression/extractFieldNames.mjs.map +1 -1
- package/src/lib/expression/functions.d.mts +35 -0
- package/src/lib/expression/functions.d.ts +35 -0
- package/src/lib/expression/functions.js +129 -0
- package/src/lib/expression/functions.js.map +1 -0
- package/src/lib/expression/functions.mjs +124 -0
- package/src/lib/expression/functions.mjs.map +1 -0
- package/src/lib/expression/modifier.d.mts +3 -1
- package/src/lib/expression/modifier.d.ts +3 -1
- package/src/lib/expression/modifier.js +4 -27
- package/src/lib/expression/modifier.js.map +1 -1
- package/src/lib/expression/modifier.mjs +3 -26
- package/src/lib/expression/modifier.mjs.map +1 -1
- package/src/lib/expression/operations.d.mts +25 -0
- package/src/lib/expression/operations.d.ts +25 -0
- package/src/lib/expression/operations.js +81 -0
- package/src/lib/expression/operations.js.map +1 -0
- package/src/lib/expression/operations.mjs +72 -0
- package/src/lib/expression/operations.mjs.map +1 -0
- package/src/lib/expression/order.d.mts +11 -0
- package/src/lib/expression/order.d.ts +11 -0
- package/src/lib/expression/order.js +36 -0
- package/src/lib/expression/order.js.map +1 -0
- package/src/lib/expression/order.mjs +33 -0
- package/src/lib/expression/order.mjs.map +1 -0
- package/src/lib/expression/parser.d.mts +34 -4
- package/src/lib/expression/parser.d.ts +34 -4
- package/src/lib/expression/parser.js +72 -6
- package/src/lib/expression/parser.js.map +1 -1
- package/src/lib/expression/parser.mjs +72 -6
- package/src/lib/expression/parser.mjs.map +1 -1
- package/src/lib/expression/reads.d.mts +8 -0
- package/src/lib/expression/reads.d.ts +8 -0
- package/src/lib/expression/reads.js +48 -0
- package/src/lib/expression/reads.js.map +1 -0
- package/src/lib/expression/reads.mjs +44 -0
- package/src/lib/expression/reads.mjs.map +1 -0
- package/src/lib/expression/tokenizer.d.mts +7 -6
- package/src/lib/expression/tokenizer.d.ts +7 -6
- package/src/lib/expression/tokenizer.js +28 -18
- package/src/lib/expression/tokenizer.js.map +1 -1
- package/src/lib/expression/tokenizer.mjs +28 -18
- package/src/lib/expression/tokenizer.mjs.map +1 -1
- package/src/lib/format/field.d.mts +686 -5
- package/src/lib/format/field.d.ts +686 -5
- package/src/lib/format/field.js +115 -13
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +114 -12
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/layout.d.mts +388 -10
- package/src/lib/format/layout.d.ts +388 -10
- package/src/lib/format/layout.js +50 -3
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +49 -2
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/names.d.mts +1 -1
- package/src/lib/format/names.d.ts +1 -1
- package/src/lib/format/names.js +1 -0
- package/src/lib/format/names.js.map +1 -1
- package/src/lib/format/names.mjs +1 -0
- package/src/lib/format/names.mjs.map +1 -1
- package/src/lib/format/page.d.mts +391 -4
- package/src/lib/format/page.d.ts +391 -4
- package/src/lib/format/page.js +13 -0
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +13 -0
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/references.d.mts +14 -1
- package/src/lib/format/references.d.ts +14 -1
- package/src/lib/format/references.js +96 -8
- package/src/lib/format/references.js.map +1 -1
- package/src/lib/format/references.mjs +96 -8
- package/src/lib/format/references.mjs.map +1 -1
- package/src/lib/format/translate.d.mts +20 -0
- package/src/lib/format/translate.d.ts +20 -0
- package/src/lib/format/translate.js +79 -21
- package/src/lib/format/translate.js.map +1 -1
- package/src/lib/format/translate.mjs +76 -21
- package/src/lib/format/translate.mjs.map +1 -1
- package/src/lib/record/check.d.mts +19 -1
- package/src/lib/record/check.d.ts +19 -1
- package/src/lib/record/check.js +84 -21
- package/src/lib/record/check.js.map +1 -1
- package/src/lib/record/check.mjs +82 -21
- package/src/lib/record/check.mjs.map +1 -1
- package/src/lib/record/compute.d.mts +24 -0
- package/src/lib/record/compute.d.ts +24 -0
- package/src/lib/record/compute.js +107 -0
- package/src/lib/record/compute.js.map +1 -0
- package/src/lib/record/compute.mjs +103 -0
- package/src/lib/record/compute.mjs.map +1 -0
- package/src/lib/record/data-source.d.mts +9 -1
- package/src/lib/record/data-source.d.ts +9 -1
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/env.d.mts +9 -0
- package/src/lib/record/env.d.ts +9 -0
- package/src/lib/record/env.js +28 -0
- package/src/lib/record/env.js.map +1 -0
- package/src/lib/record/env.mjs +25 -0
- package/src/lib/record/env.mjs.map +1 -0
- package/src/lib/record/form.d.mts +24 -0
- package/src/lib/record/form.d.ts +24 -0
- package/src/lib/record/form.js +160 -32
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +160 -32
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/inputs.d.mts +5 -0
- package/src/lib/record/inputs.d.ts +5 -0
- package/src/lib/record/inputs.js +47 -0
- package/src/lib/record/inputs.js.map +1 -0
- package/src/lib/record/inputs.mjs +44 -0
- package/src/lib/record/inputs.mjs.map +1 -0
- package/src/lib/record/limits.d.mts +13 -0
- package/src/lib/record/limits.d.ts +13 -0
- package/src/lib/record/limits.js +45 -0
- package/src/lib/record/limits.js.map +1 -0
- package/src/lib/record/limits.mjs +41 -0
- package/src/lib/record/limits.mjs.map +1 -0
- package/src/lib/record/locales/all.d.mts +7 -0
- package/src/lib/record/locales/all.d.ts +7 -0
- package/src/lib/record/locales/all.js +13 -0
- package/src/lib/record/locales/all.js.map +1 -0
- package/src/lib/record/locales/all.mjs +10 -0
- package/src/lib/record/locales/all.mjs.map +1 -0
- package/src/lib/record/locales/ar.d.mts +3 -0
- package/src/lib/record/locales/ar.d.ts +3 -0
- package/src/lib/record/locales/ar.js +55 -0
- package/src/lib/record/locales/ar.js.map +1 -0
- package/src/lib/record/locales/ar.mjs +52 -0
- package/src/lib/record/locales/ar.mjs.map +1 -0
- package/src/lib/record/locales/de.d.mts +3 -0
- package/src/lib/record/locales/de.d.ts +3 -0
- package/src/lib/record/locales/de.js +55 -0
- package/src/lib/record/locales/de.js.map +1 -0
- package/src/lib/record/locales/de.mjs +52 -0
- package/src/lib/record/locales/de.mjs.map +1 -0
- package/src/lib/record/locales/fr.d.mts +3 -0
- package/src/lib/record/locales/fr.d.ts +3 -0
- package/src/lib/record/locales/fr.js +55 -0
- package/src/lib/record/locales/fr.js.map +1 -0
- package/src/lib/record/locales/fr.mjs +52 -0
- package/src/lib/record/locales/fr.mjs.map +1 -0
- package/src/lib/record/memory-data-source.d.mts +3 -0
- package/src/lib/record/memory-data-source.d.ts +3 -0
- package/src/lib/record/memory-data-source.js +8 -0
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +8 -0
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/lib/record/messages.d.mts +46 -0
- package/src/lib/record/messages.d.ts +46 -0
- package/src/lib/record/messages.js +58 -101
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +58 -101
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/rules.d.mts +33 -0
- package/src/lib/record/rules.d.ts +33 -0
- package/src/lib/record/rules.js +83 -0
- package/src/lib/record/rules.js.map +1 -0
- package/src/lib/record/rules.mjs +79 -0
- package/src/lib/record/rules.mjs.map +1 -0
- package/src/lib/record/score.d.mts +16 -0
- package/src/lib/record/score.d.ts +16 -0
- package/src/lib/record/score.js +35 -0
- package/src/lib/record/score.js.map +1 -0
- package/src/lib/record/score.mjs +32 -0
- package/src/lib/record/score.mjs.map +1 -0
- package/src/lib/record/set-when.d.mts +24 -0
- package/src/lib/record/set-when.d.ts +24 -0
- package/src/lib/record/set-when.js +68 -0
- package/src/lib/record/set-when.js.map +1 -0
- package/src/lib/record/set-when.mjs +65 -0
- package/src/lib/record/set-when.mjs.map +1 -0
- package/src/lib/record/structures.d.mts +14 -0
- package/src/lib/record/structures.d.ts +14 -0
- package/src/lib/record/structures.js +32 -0
- package/src/lib/record/structures.js.map +1 -0
- package/src/lib/record/structures.mjs +28 -0
- package/src/lib/record/structures.mjs.map +1 -0
- package/src/lib/record/values.d.mts +10 -5
- package/src/lib/record/values.d.ts +10 -5
- package/src/lib/record/values.js +20 -6
- package/src/lib/record/values.js.map +1 -1
- package/src/lib/record/values.mjs +19 -6
- package/src/lib/record/values.mjs.map +1 -1
- package/src/runtime.d.mts +10 -7
- package/src/runtime.d.ts +10 -7
- package/src/runtime.js +12 -1
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +5 -2
- package/src/runtime.mjs.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Page } from '../format/page.mjs';
|
|
2
|
+
import type { Values } from './values.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* A quiz's points. Each option may carry a `score`; the answers earn the
|
|
5
|
+
* scores of the options chosen — the one of a single choice, every one of
|
|
6
|
+
* several, the column chosen in each row of a matrix — out of the most they
|
|
7
|
+
* could earn: the best option of a single choice, every option worth
|
|
8
|
+
* something of several, the best column of each row. An answer in one's own
|
|
9
|
+
* words, or none, earns nothing. Only questions with points count; a page
|
|
10
|
+
* with none has no score.
|
|
11
|
+
*/
|
|
12
|
+
export interface Score {
|
|
13
|
+
score: number;
|
|
14
|
+
max: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function scoreOf(page: Page, values: Values): Score | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Page } from '../format/page';
|
|
2
|
+
import type { Values } from './values';
|
|
3
|
+
/**
|
|
4
|
+
* A quiz's points. Each option may carry a `score`; the answers earn the
|
|
5
|
+
* scores of the options chosen — the one of a single choice, every one of
|
|
6
|
+
* several, the column chosen in each row of a matrix — out of the most they
|
|
7
|
+
* could earn: the best option of a single choice, every option worth
|
|
8
|
+
* something of several, the best column of each row. An answer in one's own
|
|
9
|
+
* words, or none, earns nothing. Only questions with points count; a page
|
|
10
|
+
* with none has no score.
|
|
11
|
+
*/
|
|
12
|
+
export interface Score {
|
|
13
|
+
score: number;
|
|
14
|
+
max: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function scoreOf(page: Page, values: Values): Score | null;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreOf = scoreOf;
|
|
4
|
+
/** Sums of tenths and the like without a computer's crumbs: 0.1 + 0.2 is 0.3. */
|
|
5
|
+
const tidy = (n) => Math.round(n * 1e9) / 1e9;
|
|
6
|
+
const pointsOf = (options, value) => options.find((o) => o.value === value)?.score ?? 0;
|
|
7
|
+
const best = (options) => options.reduce((most, o) => Math.max(most, o.score ?? 0), 0);
|
|
8
|
+
const allWorth = (options) => options.reduce((sum, o) => sum + Math.max(0, o.score ?? 0), 0);
|
|
9
|
+
/** The points of the options a single or a several answer chose. */
|
|
10
|
+
const earned = (options, answer, several) => several ? (Array.isArray(answer) ? answer.reduce((sum, v) => sum + pointsOf(options, v), 0) : 0) : pointsOf(options, answer);
|
|
11
|
+
function scoreOf(page, values) {
|
|
12
|
+
let score = 0;
|
|
13
|
+
let max = 0;
|
|
14
|
+
let scored = false;
|
|
15
|
+
for (const [name, field] of Object.entries(page.fields)) {
|
|
16
|
+
if (field.type === 'selection' && field.options.some((o) => o.score !== undefined)) {
|
|
17
|
+
scored = true;
|
|
18
|
+
const several = field.multiple === true;
|
|
19
|
+
score += earned(field.options, values[name], several);
|
|
20
|
+
max += several ? allWorth(field.options) : best(field.options);
|
|
21
|
+
}
|
|
22
|
+
else if (field.type === 'matrix' && field.columns.some((c) => c.score !== undefined)) {
|
|
23
|
+
scored = true;
|
|
24
|
+
const several = field.multiple === true;
|
|
25
|
+
const answers = values[name];
|
|
26
|
+
const byRow = answers && typeof answers === 'object' && !Array.isArray(answers) ? answers : {};
|
|
27
|
+
for (const row of field.rows) {
|
|
28
|
+
score += earned(field.columns, byRow[String(row.value)], several);
|
|
29
|
+
max += several ? allWorth(field.columns) : best(field.columns);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return scored ? { score: tidy(score), max: tidy(max) } : null;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Sums of tenths and the like without a computer's crumbs: 0.1 + 0.2 is 0.3. */
|
|
2
|
+
const tidy = (n) => Math.round(n * 1e9) / 1e9;
|
|
3
|
+
const pointsOf = (options, value) => options.find((o) => o.value === value)?.score ?? 0;
|
|
4
|
+
const best = (options) => options.reduce((most, o) => Math.max(most, o.score ?? 0), 0);
|
|
5
|
+
const allWorth = (options) => options.reduce((sum, o) => sum + Math.max(0, o.score ?? 0), 0);
|
|
6
|
+
/** The points of the options a single or a several answer chose. */
|
|
7
|
+
const earned = (options, answer, several) => several ? (Array.isArray(answer) ? answer.reduce((sum, v) => sum + pointsOf(options, v), 0) : 0) : pointsOf(options, answer);
|
|
8
|
+
export function scoreOf(page, values) {
|
|
9
|
+
let score = 0;
|
|
10
|
+
let max = 0;
|
|
11
|
+
let scored = false;
|
|
12
|
+
for (const [name, field] of Object.entries(page.fields)) {
|
|
13
|
+
if (field.type === 'selection' && field.options.some((o) => o.score !== undefined)) {
|
|
14
|
+
scored = true;
|
|
15
|
+
const several = field.multiple === true;
|
|
16
|
+
score += earned(field.options, values[name], several);
|
|
17
|
+
max += several ? allWorth(field.options) : best(field.options);
|
|
18
|
+
}
|
|
19
|
+
else if (field.type === 'matrix' && field.columns.some((c) => c.score !== undefined)) {
|
|
20
|
+
scored = true;
|
|
21
|
+
const several = field.multiple === true;
|
|
22
|
+
const answers = values[name];
|
|
23
|
+
const byRow = answers && typeof answers === 'object' && !Array.isArray(answers) ? answers : {};
|
|
24
|
+
for (const row of field.rows) {
|
|
25
|
+
score += earned(field.columns, byRow[String(row.value)], several);
|
|
26
|
+
max += several ? allWorth(field.columns) : best(field.columns);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return scored ? { score: tidy(score), max: tidy(max) } : null;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=score.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Page } from '../format/page.mjs';
|
|
2
|
+
import { type Values } from './values.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* Values set when a condition starts to hold: a field's `setWhen`. A rule acts
|
|
5
|
+
* only as its condition goes from not holding to holding — so people may
|
|
6
|
+
* still change the value afterwards — and rules act in the order the field
|
|
7
|
+
* lists them. Each rule is known by a key (`discount#0`, or in a line
|
|
8
|
+
* `lines.<line key>.pallet#0`), so what held before can be remembered.
|
|
9
|
+
*/
|
|
10
|
+
export interface SetWhenRules {
|
|
11
|
+
/** The keys of the conditions holding for these values: a starting point, where nothing is set. */
|
|
12
|
+
holding(values: Values): Set<string>;
|
|
13
|
+
/**
|
|
14
|
+
* The values with each field whose condition holds now, and did not in
|
|
15
|
+
* `before`, set to its value; and the conditions holding now. The values
|
|
16
|
+
* come back as they were when nothing was set.
|
|
17
|
+
*/
|
|
18
|
+
apply(values: Values, before: ReadonlySet<string>): {
|
|
19
|
+
values: Values;
|
|
20
|
+
holding: Set<string>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Read every `setWhen` of a page once. `today` is the day `today()` gives. */
|
|
24
|
+
export declare function compileSetWhen(page: Page, today: () => string): SetWhenRules;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Page } from '../format/page';
|
|
2
|
+
import { type Values } from './values';
|
|
3
|
+
/**
|
|
4
|
+
* Values set when a condition starts to hold: a field's `setWhen`. A rule acts
|
|
5
|
+
* only as its condition goes from not holding to holding — so people may
|
|
6
|
+
* still change the value afterwards — and rules act in the order the field
|
|
7
|
+
* lists them. Each rule is known by a key (`discount#0`, or in a line
|
|
8
|
+
* `lines.<line key>.pallet#0`), so what held before can be remembered.
|
|
9
|
+
*/
|
|
10
|
+
export interface SetWhenRules {
|
|
11
|
+
/** The keys of the conditions holding for these values: a starting point, where nothing is set. */
|
|
12
|
+
holding(values: Values): Set<string>;
|
|
13
|
+
/**
|
|
14
|
+
* The values with each field whose condition holds now, and did not in
|
|
15
|
+
* `before`, set to its value; and the conditions holding now. The values
|
|
16
|
+
* come back as they were when nothing was set.
|
|
17
|
+
*/
|
|
18
|
+
apply(values: Values, before: ReadonlySet<string>): {
|
|
19
|
+
values: Values;
|
|
20
|
+
holding: Set<string>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Read every `setWhen` of a page once. `today` is the day `today()` gives. */
|
|
24
|
+
export declare function compileSetWhen(page: Page, today: () => string): SetWhenRules;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileSetWhen = compileSetWhen;
|
|
4
|
+
const expression_1 = require("../expression/expression");
|
|
5
|
+
const modifier_1 = require("../expression/modifier");
|
|
6
|
+
const compute_1 = require("./compute");
|
|
7
|
+
const env_1 = require("./env");
|
|
8
|
+
const values_1 = require("./values");
|
|
9
|
+
function rules(fields) {
|
|
10
|
+
return Object.entries(fields).flatMap(([name, def]) => (def.setWhen ?? []).map((rule, i) => ({ key: `${name}#${i}`, name, def, when: (0, modifier_1.compileModifier)(rule.when), value: (0, expression_1.compileExpression)(rule.value) })));
|
|
11
|
+
}
|
|
12
|
+
/** Before anything was known: every condition counts as holding, so none starts. */
|
|
13
|
+
const EVERYTHING = { has: () => true };
|
|
14
|
+
/** Read every `setWhen` of a page once. `today` is the day `today()` gives. */
|
|
15
|
+
function compileSetWhen(page, today) {
|
|
16
|
+
const own = rules(page.fields);
|
|
17
|
+
const lineRules = new Map();
|
|
18
|
+
for (const [name, def] of Object.entries(page.fields)) {
|
|
19
|
+
if (def.type !== 'one2many')
|
|
20
|
+
continue;
|
|
21
|
+
const found = rules(def.fields);
|
|
22
|
+
if (found.length)
|
|
23
|
+
lineRules.set(name, { def, rules: found });
|
|
24
|
+
}
|
|
25
|
+
const lineEnv = { today };
|
|
26
|
+
/** One set of values (the record's, or a line's): every rule read against them as they are, before any is set. */
|
|
27
|
+
function run(values, list, fields, env, prefix, before, now) {
|
|
28
|
+
let next = values;
|
|
29
|
+
const context = (0, values_1.expressionContext)(values, fields);
|
|
30
|
+
for (const rule of list) {
|
|
31
|
+
if (!rule.when.evaluate(context, env))
|
|
32
|
+
continue;
|
|
33
|
+
const key = prefix + rule.key;
|
|
34
|
+
now.add(key);
|
|
35
|
+
if (before.has(key))
|
|
36
|
+
continue;
|
|
37
|
+
const value = (0, compute_1.fitTo)(rule.def, rule.value.evaluate(context, env));
|
|
38
|
+
if (!(0, values_1.sameValue)(value, next[rule.name]))
|
|
39
|
+
next = { ...next, [rule.name]: value };
|
|
40
|
+
}
|
|
41
|
+
return next;
|
|
42
|
+
}
|
|
43
|
+
function apply(values, before) {
|
|
44
|
+
const now = new Set();
|
|
45
|
+
let next = own.length ? run(values, own, page.fields, (0, env_1.expressionEnv)(values, page.fields, today), '', before, now) : values;
|
|
46
|
+
for (const [field, { def, rules: list }] of lineRules) {
|
|
47
|
+
const current = values[field];
|
|
48
|
+
if (!Array.isArray(current))
|
|
49
|
+
continue;
|
|
50
|
+
let changed = false;
|
|
51
|
+
const updated = current.map((line) => {
|
|
52
|
+
// A section or a note has nothing to set.
|
|
53
|
+
if ((0, values_1.lineKind)(def, line.values) !== null)
|
|
54
|
+
return line;
|
|
55
|
+
const set = run(line.values, list, def.fields, lineEnv, `${field}.${line.key}.`, before, now);
|
|
56
|
+
if (set === line.values)
|
|
57
|
+
return line;
|
|
58
|
+
changed = true;
|
|
59
|
+
return { ...line, values: set };
|
|
60
|
+
});
|
|
61
|
+
if (changed)
|
|
62
|
+
next = { ...next, [field]: updated };
|
|
63
|
+
}
|
|
64
|
+
return { values: next, holding: now };
|
|
65
|
+
}
|
|
66
|
+
return { apply, holding: (values) => apply(values, EVERYTHING).holding };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=set-when.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-when.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/set-when.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { compileExpression } from '../expression/expression.mjs';
|
|
2
|
+
import { compileModifier } from '../expression/modifier.mjs';
|
|
3
|
+
import { fitTo } from './compute.mjs';
|
|
4
|
+
import { expressionEnv } from './env.mjs';
|
|
5
|
+
import { expressionContext, lineKind, sameValue } from './values.mjs';
|
|
6
|
+
function rules(fields) {
|
|
7
|
+
return Object.entries(fields).flatMap(([name, def]) => (def.setWhen ?? []).map((rule, i) => ({ key: `${name}#${i}`, name, def, when: compileModifier(rule.when), value: compileExpression(rule.value) })));
|
|
8
|
+
}
|
|
9
|
+
/** Before anything was known: every condition counts as holding, so none starts. */
|
|
10
|
+
const EVERYTHING = { has: () => true };
|
|
11
|
+
/** Read every `setWhen` of a page once. `today` is the day `today()` gives. */
|
|
12
|
+
export function compileSetWhen(page, today) {
|
|
13
|
+
const own = rules(page.fields);
|
|
14
|
+
const lineRules = new Map();
|
|
15
|
+
for (const [name, def] of Object.entries(page.fields)) {
|
|
16
|
+
if (def.type !== 'one2many')
|
|
17
|
+
continue;
|
|
18
|
+
const found = rules(def.fields);
|
|
19
|
+
if (found.length)
|
|
20
|
+
lineRules.set(name, { def, rules: found });
|
|
21
|
+
}
|
|
22
|
+
const lineEnv = { today };
|
|
23
|
+
/** One set of values (the record's, or a line's): every rule read against them as they are, before any is set. */
|
|
24
|
+
function run(values, list, fields, env, prefix, before, now) {
|
|
25
|
+
let next = values;
|
|
26
|
+
const context = expressionContext(values, fields);
|
|
27
|
+
for (const rule of list) {
|
|
28
|
+
if (!rule.when.evaluate(context, env))
|
|
29
|
+
continue;
|
|
30
|
+
const key = prefix + rule.key;
|
|
31
|
+
now.add(key);
|
|
32
|
+
if (before.has(key))
|
|
33
|
+
continue;
|
|
34
|
+
const value = fitTo(rule.def, rule.value.evaluate(context, env));
|
|
35
|
+
if (!sameValue(value, next[rule.name]))
|
|
36
|
+
next = { ...next, [rule.name]: value };
|
|
37
|
+
}
|
|
38
|
+
return next;
|
|
39
|
+
}
|
|
40
|
+
function apply(values, before) {
|
|
41
|
+
const now = new Set();
|
|
42
|
+
let next = own.length ? run(values, own, page.fields, expressionEnv(values, page.fields, today), '', before, now) : values;
|
|
43
|
+
for (const [field, { def, rules: list }] of lineRules) {
|
|
44
|
+
const current = values[field];
|
|
45
|
+
if (!Array.isArray(current))
|
|
46
|
+
continue;
|
|
47
|
+
let changed = false;
|
|
48
|
+
const updated = current.map((line) => {
|
|
49
|
+
// A section or a note has nothing to set.
|
|
50
|
+
if (lineKind(def, line.values) !== null)
|
|
51
|
+
return line;
|
|
52
|
+
const set = run(line.values, list, def.fields, lineEnv, `${field}.${line.key}.`, before, now);
|
|
53
|
+
if (set === line.values)
|
|
54
|
+
return line;
|
|
55
|
+
changed = true;
|
|
56
|
+
return { ...line, values: set };
|
|
57
|
+
});
|
|
58
|
+
if (changed)
|
|
59
|
+
next = { ...next, [field]: updated };
|
|
60
|
+
}
|
|
61
|
+
return { values: next, holding: now };
|
|
62
|
+
}
|
|
63
|
+
return { apply, holding: (values) => apply(values, EVERYTHING).holding };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=set-when.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-when.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/set-when.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from '../format/field.mjs';
|
|
2
|
+
import type { FieldNode } from '../format/layout.mjs';
|
|
3
|
+
import { type Messages } from './messages.mjs';
|
|
4
|
+
import type { Value } from './values.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* What a structure's widget asks of its answer beyond Required: an address
|
|
7
|
+
* (`json.address`) its parts in `options.requiredParts` filled — the first
|
|
8
|
+
* missing one named — and a table of lines or a repeating group as few lines
|
|
9
|
+
* as `options.min` and as many as `options.max`, once it has any. Undefined
|
|
10
|
+
* when it keeps them, or when there is nothing to check.
|
|
11
|
+
*/
|
|
12
|
+
/** An address's parts, in the order its boxes and its messages name them. */
|
|
13
|
+
export declare const ADDRESS_PARTS: readonly ["street", "line2", "city", "region", "postcode", "country"];
|
|
14
|
+
export declare function checkStructure(field: Field, node: FieldNode, value: Value | undefined, messages: Messages): string | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from '../format/field';
|
|
2
|
+
import type { FieldNode } from '../format/layout';
|
|
3
|
+
import { type Messages } from './messages';
|
|
4
|
+
import type { Value } from './values';
|
|
5
|
+
/**
|
|
6
|
+
* What a structure's widget asks of its answer beyond Required: an address
|
|
7
|
+
* (`json.address`) its parts in `options.requiredParts` filled — the first
|
|
8
|
+
* missing one named — and a table of lines or a repeating group as few lines
|
|
9
|
+
* as `options.min` and as many as `options.max`, once it has any. Undefined
|
|
10
|
+
* when it keeps them, or when there is nothing to check.
|
|
11
|
+
*/
|
|
12
|
+
/** An address's parts, in the order its boxes and its messages name them. */
|
|
13
|
+
export declare const ADDRESS_PARTS: readonly ["street", "line2", "city", "region", "postcode", "country"];
|
|
14
|
+
export declare function checkStructure(field: Field, node: FieldNode, value: Value | undefined, messages: Messages): string | undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ADDRESS_PARTS = void 0;
|
|
4
|
+
exports.checkStructure = checkStructure;
|
|
5
|
+
const messages_1 = require("./messages");
|
|
6
|
+
/**
|
|
7
|
+
* What a structure's widget asks of its answer beyond Required: an address
|
|
8
|
+
* (`json.address`) its parts in `options.requiredParts` filled — the first
|
|
9
|
+
* missing one named — and a table of lines or a repeating group as few lines
|
|
10
|
+
* as `options.min` and as many as `options.max`, once it has any. Undefined
|
|
11
|
+
* when it keeps them, or when there is nothing to check.
|
|
12
|
+
*/
|
|
13
|
+
/** An address's parts, in the order its boxes and its messages name them. */
|
|
14
|
+
exports.ADDRESS_PARTS = ['street', 'line2', 'city', 'region', 'postcode', 'country'];
|
|
15
|
+
function checkStructure(field, node, value, messages) {
|
|
16
|
+
const options = node.options ?? {};
|
|
17
|
+
const label = node.label ?? field.label;
|
|
18
|
+
if (field.type === 'one2many' && Array.isArray(value) && value.length) {
|
|
19
|
+
if (typeof options['min'] === 'number' && value.length < options['min'])
|
|
20
|
+
return (0, messages_1.fill)(messages.minLines, { label, min: options['min'] });
|
|
21
|
+
if (typeof options['max'] === 'number' && value.length > options['max'])
|
|
22
|
+
return (0, messages_1.fill)(messages.maxLines, { label, max: options['max'] });
|
|
23
|
+
}
|
|
24
|
+
const needed = options['requiredParts'];
|
|
25
|
+
if (node.widget !== 'address' || !Array.isArray(needed) || !value || typeof value !== 'object' || Array.isArray(value))
|
|
26
|
+
return undefined;
|
|
27
|
+
const asked = Array.isArray(options['parts']) ? options['parts'] : exports.ADDRESS_PARTS;
|
|
28
|
+
const parts = value;
|
|
29
|
+
const missing = exports.ADDRESS_PARTS.findIndex((part) => needed.includes(part) && asked.includes(part) && !String(parts[part] ?? '').trim());
|
|
30
|
+
return missing < 0 ? undefined : (0, messages_1.fill)(messages.required, { label: messages.addressParts.split('|')[missing] });
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=structures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structures.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":";;;AAgBA,wCAaC;AA3BD,yCAAiD;AAGjD;;;;;;GAMG;AAEH,6EAA6E;AAChE,QAAA,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAEnG,SAAgB,cAAc,CAAC,KAAY,EAAE,IAAe,EAAE,KAAwB,EAAE,QAAkB;IACxG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtE,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxI,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAa,CAAC;IACjF,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,OAAO,GAAG,qBAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtI,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { fill } from './messages.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* What a structure's widget asks of its answer beyond Required: an address
|
|
4
|
+
* (`json.address`) its parts in `options.requiredParts` filled — the first
|
|
5
|
+
* missing one named — and a table of lines or a repeating group as few lines
|
|
6
|
+
* as `options.min` and as many as `options.max`, once it has any. Undefined
|
|
7
|
+
* when it keeps them, or when there is nothing to check.
|
|
8
|
+
*/
|
|
9
|
+
/** An address's parts, in the order its boxes and its messages name them. */
|
|
10
|
+
export const ADDRESS_PARTS = ['street', 'line2', 'city', 'region', 'postcode', 'country'];
|
|
11
|
+
export function checkStructure(field, node, value, messages) {
|
|
12
|
+
const options = node.options ?? {};
|
|
13
|
+
const label = node.label ?? field.label;
|
|
14
|
+
if (field.type === 'one2many' && Array.isArray(value) && value.length) {
|
|
15
|
+
if (typeof options['min'] === 'number' && value.length < options['min'])
|
|
16
|
+
return fill(messages.minLines, { label, min: options['min'] });
|
|
17
|
+
if (typeof options['max'] === 'number' && value.length > options['max'])
|
|
18
|
+
return fill(messages.maxLines, { label, max: options['max'] });
|
|
19
|
+
}
|
|
20
|
+
const needed = options['requiredParts'];
|
|
21
|
+
if (node.widget !== 'address' || !Array.isArray(needed) || !value || typeof value !== 'object' || Array.isArray(value))
|
|
22
|
+
return undefined;
|
|
23
|
+
const asked = Array.isArray(options['parts']) ? options['parts'] : ADDRESS_PARTS;
|
|
24
|
+
const parts = value;
|
|
25
|
+
const missing = ADDRESS_PARTS.findIndex((part) => needed.includes(part) && asked.includes(part) && !String(parts[part] ?? '').trim());
|
|
26
|
+
return missing < 0 ? undefined : fill(messages.required, { label: messages.addressParts.split('|')[missing] });
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=structures.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structures.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAiB,MAAM,YAAY,CAAC;AAGjD;;;;;;GAMG;AAEH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAEnG,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAe,EAAE,KAAwB,EAAE,QAAkB;IACxG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtE,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxI,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACjF,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtI,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -23,6 +23,8 @@ export interface FileValue {
|
|
|
23
23
|
size: number;
|
|
24
24
|
data?: string;
|
|
25
25
|
url?: string;
|
|
26
|
+
/** A signature typed rather than drawn: the name typed, kept beside its picture. */
|
|
27
|
+
text?: string;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* One line of a one2many. `key` is stable for the life of the form, so a line
|
|
@@ -34,19 +36,20 @@ export interface Line {
|
|
|
34
36
|
id?: RecordId;
|
|
35
37
|
values: Values;
|
|
36
38
|
}
|
|
37
|
-
export type Value = JsonValue | RelatedRecord | RelatedRecord[] | ReferenceValue | FileValue | Line[];
|
|
39
|
+
export type Value = JsonValue | RelatedRecord | RelatedRecord[] | ReferenceValue | FileValue | FileValue[] | Line[];
|
|
38
40
|
export type Values = Record<string, Value>;
|
|
39
41
|
type AnyField = Field | LineField;
|
|
40
42
|
/** What a field holds before anyone types in it. */
|
|
41
43
|
export declare function emptyValue(field: AnyField): Value;
|
|
42
|
-
/** A fresh record: each field's default, or its empty value. */
|
|
43
|
-
export declare function initialValues(fields: Record<string, AnyField
|
|
44
|
+
/** A fresh record: each field's default, or its empty value. A date's default may be a day counted from `today` ("today", "today+1"). */
|
|
45
|
+
export declare function initialValues(fields: Record<string, AnyField>, today?: string): Values;
|
|
44
46
|
/** Nothing worth keeping: no value, blank text, or an empty list. Numbers and booleans never are. */
|
|
45
|
-
export declare function isEmpty(
|
|
47
|
+
export declare function isEmpty(field: AnyField, value: Value | undefined): boolean;
|
|
46
48
|
/**
|
|
47
49
|
* The values as modifiers read them, matching what backends write in their
|
|
48
50
|
* expressions: a many2one is its id, a many2many its ids, a reference
|
|
49
|
-
* "model,id", a file its name
|
|
51
|
+
* "model,id", a file its name — several files their names — and lines a list
|
|
52
|
+
* (so `not child_ids` works).
|
|
50
53
|
*/
|
|
51
54
|
export declare function expressionContext(values: Values, fields: Record<string, AnyField>): Record<string, unknown>;
|
|
52
55
|
/**
|
|
@@ -56,6 +59,8 @@ export declare function expressionContext(values: Values, fields: Record<string,
|
|
|
56
59
|
export declare function lineKind(field: Extract<Field, {
|
|
57
60
|
type: 'one2many';
|
|
58
61
|
}>, values: Values): 'section' | 'note' | null;
|
|
62
|
+
/** Whether two values are the same, as they would be saved: a missing value is an empty one. */
|
|
63
|
+
export declare function sameValue(a: Value | undefined, b: Value | undefined): boolean;
|
|
59
64
|
/** A deep copy of plain JSON. */
|
|
60
65
|
export declare function structuredCopy<T>(value: T): T;
|
|
61
66
|
export {};
|
|
@@ -23,6 +23,8 @@ export interface FileValue {
|
|
|
23
23
|
size: number;
|
|
24
24
|
data?: string;
|
|
25
25
|
url?: string;
|
|
26
|
+
/** A signature typed rather than drawn: the name typed, kept beside its picture. */
|
|
27
|
+
text?: string;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* One line of a one2many. `key` is stable for the life of the form, so a line
|
|
@@ -34,19 +36,20 @@ export interface Line {
|
|
|
34
36
|
id?: RecordId;
|
|
35
37
|
values: Values;
|
|
36
38
|
}
|
|
37
|
-
export type Value = JsonValue | RelatedRecord | RelatedRecord[] | ReferenceValue | FileValue | Line[];
|
|
39
|
+
export type Value = JsonValue | RelatedRecord | RelatedRecord[] | ReferenceValue | FileValue | FileValue[] | Line[];
|
|
38
40
|
export type Values = Record<string, Value>;
|
|
39
41
|
type AnyField = Field | LineField;
|
|
40
42
|
/** What a field holds before anyone types in it. */
|
|
41
43
|
export declare function emptyValue(field: AnyField): Value;
|
|
42
|
-
/** A fresh record: each field's default, or its empty value. */
|
|
43
|
-
export declare function initialValues(fields: Record<string, AnyField
|
|
44
|
+
/** A fresh record: each field's default, or its empty value. A date's default may be a day counted from `today` ("today", "today+1"). */
|
|
45
|
+
export declare function initialValues(fields: Record<string, AnyField>, today?: string): Values;
|
|
44
46
|
/** Nothing worth keeping: no value, blank text, or an empty list. Numbers and booleans never are. */
|
|
45
|
-
export declare function isEmpty(
|
|
47
|
+
export declare function isEmpty(field: AnyField, value: Value | undefined): boolean;
|
|
46
48
|
/**
|
|
47
49
|
* The values as modifiers read them, matching what backends write in their
|
|
48
50
|
* expressions: a many2one is its id, a many2many its ids, a reference
|
|
49
|
-
* "model,id", a file its name
|
|
51
|
+
* "model,id", a file its name — several files their names — and lines a list
|
|
52
|
+
* (so `not child_ids` works).
|
|
50
53
|
*/
|
|
51
54
|
export declare function expressionContext(values: Values, fields: Record<string, AnyField>): Record<string, unknown>;
|
|
52
55
|
/**
|
|
@@ -56,6 +59,8 @@ export declare function expressionContext(values: Values, fields: Record<string,
|
|
|
56
59
|
export declare function lineKind(field: Extract<Field, {
|
|
57
60
|
type: 'one2many';
|
|
58
61
|
}>, values: Values): 'section' | 'note' | null;
|
|
62
|
+
/** Whether two values are the same, as they would be saved: a missing value is an empty one. */
|
|
63
|
+
export declare function sameValue(a: Value | undefined, b: Value | undefined): boolean;
|
|
59
64
|
/** A deep copy of plain JSON. */
|
|
60
65
|
export declare function structuredCopy<T>(value: T): T;
|
|
61
66
|
export {};
|
package/src/lib/record/values.js
CHANGED
|
@@ -5,7 +5,9 @@ exports.initialValues = initialValues;
|
|
|
5
5
|
exports.isEmpty = isEmpty;
|
|
6
6
|
exports.expressionContext = expressionContext;
|
|
7
7
|
exports.lineKind = lineKind;
|
|
8
|
+
exports.sameValue = sameValue;
|
|
8
9
|
exports.structuredCopy = structuredCopy;
|
|
10
|
+
const limits_1 = require("./limits");
|
|
9
11
|
/** What a field holds before anyone types in it. */
|
|
10
12
|
function emptyValue(field) {
|
|
11
13
|
switch (field.type) {
|
|
@@ -15,33 +17,41 @@ function emptyValue(field) {
|
|
|
15
17
|
case 'one2many':
|
|
16
18
|
return [];
|
|
17
19
|
case 'selection':
|
|
20
|
+
case 'binary':
|
|
21
|
+
case 'image':
|
|
18
22
|
return field.multiple ? [] : null;
|
|
19
23
|
default:
|
|
20
24
|
return null;
|
|
21
25
|
}
|
|
22
26
|
}
|
|
23
|
-
/** A fresh record: each field's default, or its empty value. */
|
|
24
|
-
function initialValues(fields) {
|
|
27
|
+
/** A fresh record: each field's default, or its empty value. A date's default may be a day counted from `today` ("today", "today+1"). */
|
|
28
|
+
function initialValues(fields, today) {
|
|
25
29
|
const values = {};
|
|
26
30
|
for (const [name, field] of Object.entries(fields)) {
|
|
27
|
-
|
|
31
|
+
const start = field.default;
|
|
32
|
+
values[name] = start === undefined ? emptyValue(field) : field.type === 'date' && typeof start === 'string' && start.startsWith('today') ? (0, limits_1.dayOf)(start, today) : structuredCopy(start);
|
|
28
33
|
}
|
|
29
34
|
return values;
|
|
30
35
|
}
|
|
31
36
|
/** Nothing worth keeping: no value, blank text, or an empty list. Numbers and booleans never are. */
|
|
32
|
-
function isEmpty(
|
|
37
|
+
function isEmpty(field, value) {
|
|
33
38
|
if (value === null || value === undefined)
|
|
34
39
|
return true;
|
|
35
40
|
if (typeof value === 'string')
|
|
36
41
|
return value.trim() === '';
|
|
37
42
|
if (Array.isArray(value))
|
|
38
43
|
return value.length === 0;
|
|
44
|
+
// A matrix with no row answered is not answered at all.
|
|
45
|
+
if (field.type === 'matrix' && typeof value === 'object') {
|
|
46
|
+
return Object.values(value).every((a) => a === null || a === undefined || (Array.isArray(a) && !a.length));
|
|
47
|
+
}
|
|
39
48
|
return false;
|
|
40
49
|
}
|
|
41
50
|
/**
|
|
42
51
|
* The values as modifiers read them, matching what backends write in their
|
|
43
52
|
* expressions: a many2one is its id, a many2many its ids, a reference
|
|
44
|
-
* "model,id", a file its name
|
|
53
|
+
* "model,id", a file its name — several files their names — and lines a list
|
|
54
|
+
* (so `not child_ids` works).
|
|
45
55
|
*/
|
|
46
56
|
function expressionContext(values, fields) {
|
|
47
57
|
const context = {};
|
|
@@ -67,7 +77,7 @@ function forExpressions(field, value) {
|
|
|
67
77
|
}
|
|
68
78
|
case 'binary':
|
|
69
79
|
case 'image':
|
|
70
|
-
return value.name;
|
|
80
|
+
return Array.isArray(value) ? value.map((file) => file.name) : value.name;
|
|
71
81
|
default:
|
|
72
82
|
return value;
|
|
73
83
|
}
|
|
@@ -87,6 +97,10 @@ function lineKind(field, values) {
|
|
|
87
97
|
return 'note';
|
|
88
98
|
return null;
|
|
89
99
|
}
|
|
100
|
+
/** Whether two values are the same, as they would be saved: a missing value is an empty one. */
|
|
101
|
+
function sameValue(a, b) {
|
|
102
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
103
|
+
}
|
|
90
104
|
/** A deep copy of plain JSON. */
|
|
91
105
|
function structuredCopy(value) {
|
|
92
106
|
return value === undefined ? value : JSON.parse(JSON.stringify(value));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/values.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/values.ts"],"names":[],"mappings":"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"}
|