vultus-core 0.5.0 → 0.5.2
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/README.md +52 -13
- package/dist/field.d.ts +1 -1
- package/dist/field.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/kinds.d.ts +11 -7
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +35 -20
- package/dist/kinds.js.map +1 -1
- package/dist/numeric.d.ts +7 -0
- package/dist/numeric.d.ts.map +1 -1
- package/dist/numeric.js +12 -0
- package/dist/numeric.js.map +1 -1
- package/dist/parseApiError.d.ts +6 -0
- package/dist/parseApiError.d.ts.map +1 -1
- package/dist/parseApiError.js +7 -1
- package/dist/parseApiError.js.map +1 -1
- package/dist/tree.d.ts +21 -9
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +64 -21
- package/dist/tree.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/{useTreeField.d.ts → useManyOfTreeField.d.ts} +10 -9
- package/dist/useManyOfTreeField.d.ts.map +1 -0
- package/dist/{useTreeField.js → useManyOfTreeField.js} +9 -8
- package/dist/useManyOfTreeField.js.map +1 -0
- package/dist/useNumericField.d.ts.map +1 -1
- package/dist/useNumericField.js +2 -5
- package/dist/useNumericField.js.map +1 -1
- package/dist/useRangeField.d.ts.map +1 -1
- package/dist/useRangeField.js +2 -5
- package/dist/useRangeField.js.map +1 -1
- package/package.json +3 -2
- package/src/field.ts +1 -1
- package/src/index.ts +8 -4
- package/src/kinds.ts +35 -24
- package/src/numeric.ts +12 -0
- package/src/parseApiError.ts +7 -1
- package/src/tree.ts +71 -20
- package/src/types.ts +2 -2
- package/src/{useTreeField.ts → useManyOfTreeField.ts} +14 -13
- package/src/useNumericField.ts +2 -5
- package/src/useRangeField.ts +2 -5
- package/dist/useTreeField.d.ts.map +0 -1
- package/dist/useTreeField.js.map +0 -1
package/dist/tree.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getVerdict } from './decision.js';
|
|
1
2
|
import { normalizeText } from './normalizeText.js';
|
|
2
3
|
function hasChildren(node) {
|
|
3
4
|
return (node.children?.length ?? 0) > 0;
|
|
@@ -23,14 +24,33 @@ function unknownValues(order, value) {
|
|
|
23
24
|
const known = new Set(order.map((n) => n.value));
|
|
24
25
|
return [...new Set(value.filter((v) => !known.has(v)))];
|
|
25
26
|
}
|
|
26
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Whether a node can be checked: its `enabled` / `disabled` resolved as resolveChoice does (a
|
|
29
|
+
* Decision takes no context, so this needs none). Works on a definition's nodes (TreeNode,
|
|
30
|
+
* Decisions) and on the widgets' node controls (TreeNodeControls, `enabled: boolean`) alike.
|
|
31
|
+
*/
|
|
32
|
+
function nodeEnabled(node) {
|
|
33
|
+
if (node.enabled !== undefined)
|
|
34
|
+
return getVerdict(node.enabled, true);
|
|
35
|
+
return !getVerdict(node.disabled, false);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The nodes a value covers in the cascading selections, by antd's check conduction (rc-tree's
|
|
39
|
+
* conductCheck), so the hook and the widgets agree: the value's nodes; the enabled children of
|
|
40
|
+
* a covered enabled node, and so on down (a disabled node is never covered through a checked
|
|
41
|
+
* ancestor, nor is its subtree through it); and an enabled node all of whose enabled children
|
|
42
|
+
* are covered, if it has any (a parent whose children are all disabled, or a disabled parent,
|
|
43
|
+
* is never covered through its children). A disabled node in the value covers itself only.
|
|
44
|
+
*/
|
|
27
45
|
function cascade(nodes, value) {
|
|
28
46
|
const listed = new Set(value);
|
|
29
47
|
const covered = new Set();
|
|
30
48
|
const walk = (node, inherited) => {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
49
|
+
const enabled = nodeEnabled(node);
|
|
50
|
+
const self = listed.has(node.value) || (inherited && enabled);
|
|
51
|
+
const children = (node.children ?? []).map((child) => ({ enabled: nodeEnabled(child), covered: walk(child, self && enabled) }));
|
|
52
|
+
const counted = children.filter((child) => child.enabled);
|
|
53
|
+
const isCovered = self || (enabled && counted.length > 0 && counted.every((child) => child.covered));
|
|
34
54
|
if (isCovered)
|
|
35
55
|
covered.add(node.value);
|
|
36
56
|
return isCovered;
|
|
@@ -39,16 +59,31 @@ function cascade(nodes, value) {
|
|
|
39
59
|
walk(node, false);
|
|
40
60
|
return covered;
|
|
41
61
|
}
|
|
42
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* The covered nodes the value names under `selection` (see TreeSelection), in pre-order, by
|
|
64
|
+
* rc-tree-select's formatStrategyValues (for `'leaves'`, a stricter form of it), so that the
|
|
65
|
+
* named nodes cover exactly what `covered` does (`cascade` of them gives it back) also where
|
|
66
|
+
* disabled nodes break the cascade:
|
|
67
|
+
* - `'topmost'`: a covered node unless its parent is covered and neither of the two is
|
|
68
|
+
* disabled (only then does the parent cover it);
|
|
69
|
+
* - `'leaves'`: the covered leaves, and a covered node with children that is disabled, has
|
|
70
|
+
* no enabled child, or has an enabled child not covered (its children would not cover it);
|
|
71
|
+
* - `'all'`: every covered node.
|
|
72
|
+
*/
|
|
43
73
|
function namedNodes(order, parent, covered, selection) {
|
|
74
|
+
const enabled = new Map(order.map((node) => [node.value, nodeEnabled(node)]));
|
|
44
75
|
const named = order.filter((node) => {
|
|
45
76
|
if (!covered.has(node.value))
|
|
46
77
|
return false;
|
|
47
|
-
if (selection === 'leaves')
|
|
48
|
-
return !hasChildren(node);
|
|
49
78
|
if (selection === 'topmost') {
|
|
50
79
|
const up = parent.get(node.value);
|
|
51
|
-
return up === undefined || !covered.has(up);
|
|
80
|
+
return up === undefined || !covered.has(up) || !enabled.get(node.value) || !enabled.get(up);
|
|
81
|
+
}
|
|
82
|
+
if (selection === 'leaves') {
|
|
83
|
+
if (!hasChildren(node) || !enabled.get(node.value))
|
|
84
|
+
return true;
|
|
85
|
+
const counted = node.children.filter((child) => enabled.get(child.value));
|
|
86
|
+
return counted.length === 0 || !counted.every((child) => covered.has(child.value));
|
|
52
87
|
}
|
|
53
88
|
return true;
|
|
54
89
|
});
|
|
@@ -71,18 +106,22 @@ export function normalizeTreeValue(nodes, value, selection) {
|
|
|
71
106
|
/**
|
|
72
107
|
* Every node a tree field's value stands for, in pre-order (what an item filed under some
|
|
73
108
|
* node matches against): in the cascading selections the covered nodes (the value's nodes,
|
|
74
|
-
* their descendants, and every node all of whose children are
|
|
75
|
-
* `'independent'` the value's nodes themselves. Values that
|
|
76
|
-
* normalizeTreeValue.
|
|
109
|
+
* their enabled descendants, and every enabled node all of whose enabled children are
|
|
110
|
+
* covered; see `cascade`); with `'independent'` the value's nodes themselves. Values that
|
|
111
|
+
* name no node follow, as in normalizeTreeValue. A node disabled when the value was stored
|
|
112
|
+
* and enabled now is covered from then on (with `'topmost'`, a stored parent covers it).
|
|
77
113
|
*/
|
|
78
114
|
export function coveredNodes(nodes, value, selection = 'topmost') {
|
|
79
115
|
return normalizeTreeValue(nodes, value, selection === 'independent' ? 'independent' : 'all');
|
|
80
116
|
}
|
|
81
117
|
/**
|
|
82
|
-
* The value after flipping `node`, normalized
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
118
|
+
* The value after flipping `node`, normalized, as antd's Tree flips a checkbox. In the
|
|
119
|
+
* cascading selections a covered node is removed with the descendants it covers through
|
|
120
|
+
* enabled nodes and with its enabled ancestors up to the first disabled one (they no longer
|
|
121
|
+
* have all their enabled children); an uncovered one is added, covering its subtree as
|
|
122
|
+
* `cascade` says. With `'independent'` the node alone is added or removed. A `node` that is
|
|
123
|
+
* not one of the nodes changes nothing. Whether `node` itself may be flipped is the caller's
|
|
124
|
+
* to decide (useManyOfTreeField refuses a disabled one).
|
|
86
125
|
*/
|
|
87
126
|
export function toggleTreeValue(nodes, value, node, selection) {
|
|
88
127
|
const { order, parent } = indexTree(nodes);
|
|
@@ -93,16 +132,20 @@ export function toggleTreeValue(nodes, value, node, selection) {
|
|
|
93
132
|
return normalizeTreeValue(nodes, value.includes(node) ? value.filter((v) => v !== node) : [...value, node], selection);
|
|
94
133
|
}
|
|
95
134
|
const covered = cascade(nodes, value);
|
|
96
|
-
const subtree = indexTree([target]).order.map((n) => n.value);
|
|
97
135
|
if (covered.has(node)) {
|
|
98
|
-
|
|
99
|
-
covered.delete(
|
|
100
|
-
|
|
136
|
+
const uncover = (n) => {
|
|
137
|
+
covered.delete(n.value);
|
|
138
|
+
for (const child of n.children ?? [])
|
|
139
|
+
if (nodeEnabled(child))
|
|
140
|
+
uncover(child);
|
|
141
|
+
};
|
|
142
|
+
uncover(target);
|
|
143
|
+
const byValue = new Map(order.map((n) => [n.value, n]));
|
|
144
|
+
for (let up = parent.get(node); up !== undefined && nodeEnabled(byValue.get(up)); up = parent.get(up))
|
|
101
145
|
covered.delete(up);
|
|
102
146
|
}
|
|
103
147
|
else {
|
|
104
|
-
|
|
105
|
-
covered.add(v);
|
|
148
|
+
covered.add(node);
|
|
106
149
|
}
|
|
107
150
|
return normalizeTreeValue(nodes, [...covered, ...unknownValues(order, value)], selection);
|
|
108
151
|
}
|
package/dist/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -74,6 +74,8 @@ export interface ActionOptions<TArgs = void, TResult = void, RouteId extends str
|
|
|
74
74
|
fire: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
|
|
75
75
|
onSuccess?: (result: TResult) => void;
|
|
76
76
|
}
|
|
77
|
+
/** Compiles only when `A` is assignable to `B`. Not part of the package's public API: kept here as the one definition, imported directly by the files that use it (kinds.ts), and left out of index.ts's re-export of this module. */
|
|
78
|
+
export type Fits<A extends B, B> = A;
|
|
77
79
|
type FireArgs<TArgs> = [TArgs] extends [void] ? [] : [args: TArgs];
|
|
78
80
|
export interface ActionStatus<TArgs = void> {
|
|
79
81
|
id: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;CAC9F;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvE;;;;;GAKG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AAE5D,sIAAsI;AACtI,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAErC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,2FAA2F;AAC3F,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,GAClE;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,yHAAyH;IACzH,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM;IAC1F,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { type FieldControls, type FieldOptions } from './field.js';
|
|
|
2
2
|
import { type FieldCtx } from './FieldContext.js';
|
|
3
3
|
import { type TreeExpand, type TreeNode, type TreeNodeControls, type TreeSelection } from './tree.js';
|
|
4
4
|
import type { ErrorRoutesRegistry, ValueOrFn } from './types.js';
|
|
5
|
-
export type
|
|
5
|
+
export type ManyOfTreeOwnOptions<T extends string = string, Ctx = any> = {
|
|
6
6
|
/** The roots, each with its children; static or derived (a function, of the field context if it declares a parameter). */
|
|
7
7
|
nodes: ValueOrFn<TreeNode<T>[], Ctx>;
|
|
8
8
|
/** What the value lists; default `'topmost'` (see TreeSelection). */
|
|
@@ -10,8 +10,8 @@ export type TreeOwnOptions<T extends string = string, Ctx = any> = {
|
|
|
10
10
|
/** Which nodes a widget opens at first; default `'top'` (see TreeExpand). */
|
|
11
11
|
expand?: TreeExpand;
|
|
12
12
|
};
|
|
13
|
-
export type
|
|
14
|
-
export interface
|
|
13
|
+
export type ManyOfTreeFieldOptions<T extends string = string, RouteId extends string = string, Ctx = any> = FieldOptions<T[], T[], RouteId, Ctx> & ManyOfTreeOwnOptions<T, Ctx>;
|
|
14
|
+
export interface ManyOfTreeFieldControls<T extends string = string> extends FieldControls<T[], T[]> {
|
|
15
15
|
/** The roots as the widgets get them, each with its children. */
|
|
16
16
|
nodes: TreeNodeControls<T>[];
|
|
17
17
|
selection: TreeSelection;
|
|
@@ -22,18 +22,19 @@ export interface TreeFieldControls<T extends string = string> extends FieldContr
|
|
|
22
22
|
/** Checks or unchecks a node (with its subtree, in the cascading selections); ignored (with a warning) for an unknown or disabled node. */
|
|
23
23
|
toggle(value: T): void;
|
|
24
24
|
}
|
|
25
|
-
/** The implicit initial value for a tree field: `initialValue` resolved, else the empty list. */
|
|
26
|
-
export declare function
|
|
25
|
+
/** The implicit initial value for a many-of tree field: `initialValue` resolved, else the empty list. */
|
|
26
|
+
export declare function manyOfTreeInitialValue<T extends string>(opts: {
|
|
27
27
|
initialValue?: ValueOrFn<T[]>;
|
|
28
28
|
}, ctx: FieldCtx, id: string): T[];
|
|
29
29
|
/**
|
|
30
30
|
* A field whose value is a set of tree nodes (Praeceptor's category filter), with antd
|
|
31
|
-
* TreeSelect's semantics: in the cascading selections a checked node stands for its subtree
|
|
32
|
-
*
|
|
31
|
+
* TreeSelect's semantics: in the cascading selections a checked node stands for its subtree
|
|
32
|
+
* (its enabled part: disabled nodes follow antd's check conduction, so the widgets show what
|
|
33
|
+
* the value covers), and `selection` says which nodes the value lists (see TreeSelection). The value is shown
|
|
33
34
|
* and requested normalized (normalizeTreeValue): in tree pre-order, values that name no
|
|
34
35
|
* node (a stored value naming a removed node) kept at the end. `setValue` does not police
|
|
35
36
|
* disabled nodes (the widgets disable them); `toggle` refuses a disabled or unknown node with
|
|
36
37
|
* a warning, as useManyOfField does.
|
|
37
38
|
*/
|
|
38
|
-
export declare function
|
|
39
|
-
//# sourceMappingURL=
|
|
39
|
+
export declare function useManyOfTreeField<T extends string = string, RouteId extends string = string, Ctx = any>(opts: ManyOfTreeFieldOptions<T, RouteId, Ctx>, registry?: ErrorRoutesRegistry<RouteId>): ManyOfTreeFieldControls<T>;
|
|
40
|
+
//# sourceMappingURL=useManyOfTreeField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useManyOfTreeField.d.ts","sourceRoot":"","sources":["../src/useManyOfTreeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAEL,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAC1E,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI;IACvE,0HAA0H;IAC1H,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrC,qEAAqE;IACrE,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACtG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAEtE,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACjG,iEAAiE;IACjE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,yDAAyD;IACzD,YAAY,EAAE,CAAC,EAAE,CAAC;IAClB,gCAAgC;IAChC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,2IAA2I;IAC3I,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACxB;AAED,yGAAyG;AACzG,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,IAAI,EAAE;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAA;CAAE,EACvC,GAAG,EAAE,QAAQ,EACb,EAAE,EAAE,MAAM,GACT,CAAC,EAAE,CAEL;AAMD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACtG,IAAI,EAAE,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAC7C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,uBAAuB,CAAC,CAAC,CAAC,CAgD5B"}
|
|
@@ -3,8 +3,8 @@ import { resolveChoice } from './choices.js';
|
|
|
3
3
|
import { useFieldContext } from './FieldContext.js';
|
|
4
4
|
import { resolveIn } from './resolve.js';
|
|
5
5
|
import { coveredNodes, expandedTreeKeys, normalizeTreeValue, toggleTreeValue, } from './tree.js';
|
|
6
|
-
/** The implicit initial value for a tree field: `initialValue` resolved, else the empty list. */
|
|
7
|
-
export function
|
|
6
|
+
/** The implicit initial value for a many-of tree field: `initialValue` resolved, else the empty list. */
|
|
7
|
+
export function manyOfTreeInitialValue(opts, ctx, id) {
|
|
8
8
|
return resolveIn(opts.initialValue, [], ctx, `Field '${id}': option 'initialValue'`);
|
|
9
9
|
}
|
|
10
10
|
function sameList(a, b) {
|
|
@@ -12,20 +12,21 @@ function sameList(a, b) {
|
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* A field whose value is a set of tree nodes (Praeceptor's category filter), with antd
|
|
15
|
-
* TreeSelect's semantics: in the cascading selections a checked node stands for its subtree
|
|
16
|
-
*
|
|
15
|
+
* TreeSelect's semantics: in the cascading selections a checked node stands for its subtree
|
|
16
|
+
* (its enabled part: disabled nodes follow antd's check conduction, so the widgets show what
|
|
17
|
+
* the value covers), and `selection` says which nodes the value lists (see TreeSelection). The value is shown
|
|
17
18
|
* and requested normalized (normalizeTreeValue): in tree pre-order, values that name no
|
|
18
19
|
* node (a stored value naming a removed node) kept at the end. `setValue` does not police
|
|
19
20
|
* disabled nodes (the widgets disable them); `toggle` refuses a disabled or unknown node with
|
|
20
21
|
* a warning, as useManyOfField does.
|
|
21
22
|
*/
|
|
22
|
-
export function
|
|
23
|
+
export function useManyOfTreeField(opts, registry) {
|
|
23
24
|
const ctx = useFieldContext();
|
|
24
25
|
const nodes = resolveIn(opts.nodes, [], ctx, `Field '${opts.id}': option 'nodes'`);
|
|
25
26
|
const selection = opts.selection ?? 'topmost';
|
|
26
27
|
const inside = !opts.onChange && !opts.commit;
|
|
27
|
-
const initialValue = () =>
|
|
28
|
-
const field = useFieldCore('
|
|
28
|
+
const initialValue = () => manyOfTreeInitialValue(opts, ctx, opts.id);
|
|
29
|
+
const field = useFieldCore('manyOfTree', inside ? { ...opts, initialValue } : opts, registry);
|
|
29
30
|
// The same list object while it is already normalized, so the value is stable across renders.
|
|
30
31
|
const normalized = normalizeTreeValue(nodes, field.value, selection);
|
|
31
32
|
const value = sameList(normalized, field.value) ? field.value : normalized;
|
|
@@ -63,4 +64,4 @@ export function useTreeField(opts, registry) {
|
|
|
63
64
|
toggle,
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
|
-
//# sourceMappingURL=
|
|
67
|
+
//# sourceMappingURL=useManyOfTreeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useManyOfTreeField.js","sourceRoot":"","sources":["../src/useManyOfTreeField.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNumericField.d.ts","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,
|
|
1
|
+
{"version":3,"file":"useNumericField.d.ts","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAA2C,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACjH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,iBAAiB,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AAE9D,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACxE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAEtE,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe;IAC1F,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACxE,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,EACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,oBAAoB,CA0BtB"}
|
package/dist/useNumericField.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useFieldCore } from './field.js';
|
|
2
2
|
import { useFieldContext } from './FieldContext.js';
|
|
3
3
|
import { resolveIn } from './resolve.js';
|
|
4
|
-
import { clamp, resolveNumeric } from './numeric.js';
|
|
4
|
+
import { clamp, fit as fitNumber, resolveNumeric } from './numeric.js';
|
|
5
5
|
/**
|
|
6
6
|
* The implicit initial value for a numeric field: `initialValue` resolved, else `min` (or 0),
|
|
7
7
|
* clamped into the bounds. Only those options are resolved, not `format`, so a `format` of the
|
|
@@ -29,10 +29,7 @@ export function useNumericField(opts, registry) {
|
|
|
29
29
|
const initialValue = () => numericInitialValue(opts, ctx, opts.id);
|
|
30
30
|
const field = useFieldCore('numeric', inside ? { ...opts, initialValue } : opts, registry);
|
|
31
31
|
/** A number clamped into the bounds, then rounded when `integer`. */
|
|
32
|
-
const fit = (n) =>
|
|
33
|
-
const clamped = clamp(n, resolved.min, resolved.max);
|
|
34
|
-
return resolved.integer ? Math.round(clamped) : clamped;
|
|
35
|
-
};
|
|
32
|
+
const fit = (n) => fitNumber(n, resolved.min, resolved.max, resolved.integer);
|
|
36
33
|
const value = fit(field.value);
|
|
37
34
|
const setValue = (next) => {
|
|
38
35
|
if (!Number.isFinite(next)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNumericField.js","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useNumericField.js","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAajH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAyB,EAAE,GAAa,EAAE,EAAU;IACtF,MAAM,QAAQ,GAAG,SAAS,CAAqB,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;IAC1H,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuC,EACvC,QAAuC;IAEvC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,YAAY,CAA+B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzH,qEAAqE;IACrE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,GAAG,QAAQ;QACX,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRangeField.d.ts","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,
|
|
1
|
+
{"version":3,"file":"useRangeField.d.ts","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAoC,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjE,sGAAsG;AACtG,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG;IAAE,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAE3H,MAAM,MAAM,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACtE,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AAE9E,MAAM,WAAW,kBAAmB,SAAQ,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,eAAe;IAClG,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CAMjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACtE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,EACrC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,kBAAkB,CAgCpB"}
|
package/dist/useRangeField.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useFieldCore } from './field.js';
|
|
2
2
|
import { useFieldContext } from './FieldContext.js';
|
|
3
3
|
import { resolveIn } from './resolve.js';
|
|
4
|
-
import {
|
|
4
|
+
import { fit as fitNumber, resolveNumeric } from './numeric.js';
|
|
5
5
|
function order([from, to]) {
|
|
6
6
|
return from <= to ? [from, to] : [to, from];
|
|
7
7
|
}
|
|
@@ -37,10 +37,7 @@ export function useRangeField(opts, registry) {
|
|
|
37
37
|
const initialValue = () => rangeInitialValue(opts, ctx, opts.id);
|
|
38
38
|
const field = useFieldCore('range', inside ? { ...opts, initialValue } : opts, registry);
|
|
39
39
|
/** An end clamped into the bounds, then rounded when `integer`. */
|
|
40
|
-
const fit = (n) =>
|
|
41
|
-
const clamped = clamp(n, min, max);
|
|
42
|
-
return resolved.integer ? Math.round(clamped) : clamped;
|
|
43
|
-
};
|
|
40
|
+
const fit = (n) => fitNumber(n, min, max, resolved.integer);
|
|
44
41
|
const value = order([fit(field.value[0]), fit(field.value[1])]);
|
|
45
42
|
const setValue = (next) => {
|
|
46
43
|
if (!Number.isFinite(next[0]) || !Number.isFinite(next[1])) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRangeField.js","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useRangeField.js","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vultus-core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Framework-neutral action model + hooks for vultus (antd-free by design)",
|
|
6
6
|
"repository": {
|
|
@@ -53,7 +53,8 @@
|
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
56
|
-
"test": "vitest run"
|
|
56
|
+
"test": "vitest run",
|
|
57
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
57
58
|
},
|
|
58
59
|
"main": "./dist/index.js",
|
|
59
60
|
"types": "./dist/index.d.ts"
|
package/src/field.ts
CHANGED
|
@@ -23,7 +23,7 @@ import type {
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
/** The field kinds (FieldControls.type and a FieldDefinition's `kind`). */
|
|
26
|
-
export type FieldKind = 'boolean' | 'mixed-boolean' | 'oneOf' | 'manyOf' | 'numeric' | 'range' | '
|
|
26
|
+
export type FieldKind = 'boolean' | 'mixed-boolean' | 'oneOf' | 'manyOf' | 'numeric' | 'range' | 'manyOfTree' | 'text';
|
|
27
27
|
|
|
28
28
|
/** The widget to render a field with: a name, or a name with display options overriding its defaults. */
|
|
29
29
|
export type WidgetHint = string | { name: string; [option: string]: unknown };
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
// Fits is deliberately left out here: it is an internal compile-time check (see types.ts), not public API.
|
|
2
|
+
export type {
|
|
3
|
+
FormLike, Decision, ValueOrFn, Thunk, Severity, Message, ExecutionContext, ConfirmationSpec,
|
|
4
|
+
ActionOptions, ActionStatus, ParsedApiError, RegistryEntry, ErrorRoutesRegistry, ApiErrorContext, ActionErrorCtx,
|
|
5
|
+
} from './types.js';
|
|
2
6
|
export * from './decision.js';
|
|
3
7
|
export * from './resolve.js';
|
|
4
8
|
export * from './parseApiError.js';
|
|
@@ -42,9 +46,9 @@ export {
|
|
|
42
46
|
type TreeNode, type TreeNodeControls, type TreeSelection, type TreeExpand,
|
|
43
47
|
} from './tree.js';
|
|
44
48
|
export {
|
|
45
|
-
|
|
46
|
-
type
|
|
47
|
-
} from './
|
|
49
|
+
useManyOfTreeField, manyOfTreeInitialValue,
|
|
50
|
+
type ManyOfTreeFieldControls, type ManyOfTreeFieldOptions, type ManyOfTreeOwnOptions,
|
|
51
|
+
} from './useManyOfTreeField.js';
|
|
48
52
|
export {
|
|
49
53
|
useTextField, textInitialValue,
|
|
50
54
|
type TextFieldControls, type TextFieldOptions, type TextOwnOptions,
|
package/src/kinds.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { resolveChoice, type OneOfChoice, type OneOfChoiceControls } from './choices.js';
|
|
2
2
|
import type { FieldBaseOptions, FieldKind } from './field.js';
|
|
3
3
|
import type { FieldCtx } from './FieldContext.js';
|
|
4
|
-
import { clamp, resolveNumeric } from './numeric.js';
|
|
4
|
+
import { clamp, fit, resolveNumeric } from './numeric.js';
|
|
5
5
|
import { resolveIn } from './resolve.js';
|
|
6
6
|
import { normalizeTreeValue, type TreeNode } from './tree.js';
|
|
7
|
-
import type { ValueOrFn } from './types.js';
|
|
7
|
+
import type { Fits, ValueOrFn } from './types.js';
|
|
8
8
|
import { boolInitialValue, type useBoolField } from './useBoolField.js';
|
|
9
9
|
import { manyOfInitialValue, type ManyOfOwnOptions, type useManyOfField } from './useManyOfField.js';
|
|
10
10
|
import { mixedBoolInitialValue, type MixedBool, type useMixedBoolField } from './useMixedBoolField.js';
|
|
@@ -12,7 +12,7 @@ import { numericInitialValue, type NumericOwnOptions, type useNumericField } fro
|
|
|
12
12
|
import { oneOfInitialValue, type OneOfOwnOptions, type useOneOfField } from './useOneOfField.js';
|
|
13
13
|
import { rangeInitialValue, type NumberRange, type RangeOwnOptions, type useRangeField } from './useRangeField.js';
|
|
14
14
|
import { textInitialValue, type TextOwnOptions, type useTextField } from './useTextField.js';
|
|
15
|
-
import {
|
|
15
|
+
import { manyOfTreeInitialValue, type ManyOfTreeOwnOptions, type useManyOfTreeField } from './useManyOfTreeField.js';
|
|
16
16
|
import { booleanType, numberType, rangeType, stringSetType, stringType, type ValueType } from './valueTypes.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -35,11 +35,9 @@ export type FieldDefinition<Ctx = any> =
|
|
|
35
35
|
| Definition<'manyOf', string[], ManyOfOwnOptions<string, Ctx>, Ctx>
|
|
36
36
|
| Definition<'numeric', number, NumericOwnOptions<Ctx>, Ctx>
|
|
37
37
|
| Definition<'range', NumberRange, RangeOwnOptions<Ctx>, Ctx>
|
|
38
|
-
| Definition<'
|
|
38
|
+
| Definition<'manyOfTree', string[], ManyOfTreeOwnOptions<string, Ctx>, Ctx>
|
|
39
39
|
| Definition<'text', string, TextOwnOptions, Ctx>;
|
|
40
40
|
|
|
41
|
-
/** Compiles only when `A` is assignable to `B`. */
|
|
42
|
-
type Fits<A extends B, B> = A;
|
|
43
41
|
type DefinitionOf<K extends FieldKind> = Extract<FieldDefinition, { kind: K }>;
|
|
44
42
|
type HookOptions<H extends (...args: any[]) => unknown> = Parameters<H>[0];
|
|
45
43
|
|
|
@@ -54,7 +52,7 @@ type DefinitionsFitTheirHooks = [
|
|
|
54
52
|
Fits<DefinitionOf<'manyOf'>, HookOptions<typeof useManyOfField>>,
|
|
55
53
|
Fits<DefinitionOf<'numeric'>, HookOptions<typeof useNumericField>>,
|
|
56
54
|
Fits<DefinitionOf<'range'>, HookOptions<typeof useRangeField>>,
|
|
57
|
-
Fits<DefinitionOf<'
|
|
55
|
+
Fits<DefinitionOf<'manyOfTree'>, HookOptions<typeof useManyOfTreeField>>,
|
|
58
56
|
Fits<DefinitionOf<'text'>, HookOptions<typeof useTextField>>,
|
|
59
57
|
];
|
|
60
58
|
|
|
@@ -81,7 +79,7 @@ function nodeValues(nodes: TreeNode[], into = new Set<string>()): Set<string> {
|
|
|
81
79
|
return into;
|
|
82
80
|
}
|
|
83
81
|
|
|
84
|
-
/** A tree definition's nodes, resolved as
|
|
82
|
+
/** A tree definition's nodes, resolved as useManyOfTreeField resolves them. */
|
|
85
83
|
function nodesOf(definition: { id: string; nodes: ValueOrFn<TreeNode[]> }, ctx: FieldCtx): TreeNode[] {
|
|
86
84
|
return resolveIn<TreeNode[]>(definition.nodes, [], ctx, `Field '${definition.id}': option 'nodes'`);
|
|
87
85
|
}
|
|
@@ -103,8 +101,8 @@ export function initialValueOf(definition: FieldDefinition, ctx: FieldCtx): unkn
|
|
|
103
101
|
case 'manyOf': return manyOfInitialValue(definition, ctx, id);
|
|
104
102
|
case 'numeric': return numericInitialValue(definition, ctx, id);
|
|
105
103
|
case 'range': return rangeInitialValue(definition, ctx, id);
|
|
106
|
-
case '
|
|
107
|
-
return normalizeTreeValue(nodesOf(definition, ctx),
|
|
104
|
+
case 'manyOfTree':
|
|
105
|
+
return normalizeTreeValue(nodesOf(definition, ctx), manyOfTreeInitialValue(definition, ctx, id), definition.selection ?? 'topmost');
|
|
108
106
|
case 'text': return textInitialValue(definition, ctx, id);
|
|
109
107
|
default: return unknownKind(definition);
|
|
110
108
|
}
|
|
@@ -117,7 +115,7 @@ export function valueTypeOf(kind: FieldKind): ValueType<any> {
|
|
|
117
115
|
case 'oneOf':
|
|
118
116
|
case 'text': return stringType;
|
|
119
117
|
case 'manyOf':
|
|
120
|
-
case '
|
|
118
|
+
case 'manyOfTree': return stringSetType;
|
|
121
119
|
case 'numeric': return numberType;
|
|
122
120
|
case 'range': return rangeType;
|
|
123
121
|
case 'mixed-boolean': throw new Error(NOT_STORABLE);
|
|
@@ -135,11 +133,15 @@ function warnDropped(id: string, among: 'choices' | 'nodes', dropped: string[],
|
|
|
135
133
|
* A stored value (already parsed by the kind's value type) made fit for the definition as it is
|
|
136
134
|
* now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
|
|
137
135
|
* not a choice becomes the initial value; many-of and tree values that are not choices or nodes
|
|
138
|
-
* are dropped; numbers and ranges are clamped into the bounds
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
136
|
+
* are dropped; numbers and ranges are clamped into the bounds, then rounded when the field is
|
|
137
|
+
* `integer` (so a stored `2.5` reads `3`; a whole number inside the bounds, see `fit`), with one
|
|
138
|
+
* warning for whichever of the two actually changed the value: "outside its bounds" when
|
|
139
|
+
* clamping did (whether or not rounding also did), "not a whole number" ("has ends that are not
|
|
140
|
+
* whole numbers" for a range) when only rounding did. Each such change warns, naming the
|
|
141
|
+
* field: the value came from outside, so it is not an error. Reordering is silent: lists come
|
|
142
|
+
* back in choice order or normalized under the tree's selection (a store keeps them sorted, so a
|
|
143
|
+
* warning would come on every read), and a range's ends in order. The warnings go to `warn`,
|
|
144
|
+
* console.warn unless a caller that only summarizes (useStoredFields) silences them.
|
|
143
145
|
*/
|
|
144
146
|
export function sanitizeStored(
|
|
145
147
|
definition: FieldDefinition,
|
|
@@ -167,7 +169,7 @@ export function sanitizeStored(
|
|
|
167
169
|
warnDropped(id, 'choices', stored.filter((v) => !known.includes(v)), warn);
|
|
168
170
|
return known.filter((v) => stored.includes(v));
|
|
169
171
|
}
|
|
170
|
-
case '
|
|
172
|
+
case 'manyOfTree': {
|
|
171
173
|
const stored = value as string[];
|
|
172
174
|
const nodes = nodesOf(definition, ctx);
|
|
173
175
|
const known = nodeValues(nodes);
|
|
@@ -176,19 +178,28 @@ export function sanitizeStored(
|
|
|
176
178
|
}
|
|
177
179
|
case 'numeric': {
|
|
178
180
|
const stored = value as number;
|
|
179
|
-
const { min, max } = resolveNumeric(id, definition, ctx);
|
|
181
|
+
const { min, max, integer } = resolveNumeric(id, definition, ctx);
|
|
180
182
|
const clamped = clamp(stored, min, max);
|
|
181
|
-
|
|
182
|
-
|
|
183
|
+
const fitted = fit(stored, min, max, integer);
|
|
184
|
+
if (fitted !== stored) {
|
|
185
|
+
if (clamped !== stored) warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${fitted}`);
|
|
186
|
+
else warn(`Field '${id}': stored value ${stored} is not a whole number, using ${fitted}`);
|
|
187
|
+
}
|
|
188
|
+
return fitted;
|
|
183
189
|
}
|
|
184
190
|
case 'range': {
|
|
185
191
|
const stored = value as NumberRange;
|
|
186
|
-
const { min, max } = resolveNumeric(id, definition, ctx);
|
|
187
|
-
const
|
|
188
|
-
const
|
|
192
|
+
const { min, max, integer } = resolveNumeric(id, definition, ctx);
|
|
193
|
+
const clampedChanged = clamp(stored[0], min, max) !== stored[0] || clamp(stored[1], min, max) !== stored[1];
|
|
194
|
+
const from = fit(stored[0], min, max, integer);
|
|
195
|
+
const to = fit(stored[1], min, max, integer);
|
|
189
196
|
const sanitized: NumberRange = [Math.min(from, to), Math.max(from, to)];
|
|
190
197
|
if (from !== stored[0] || to !== stored[1]) {
|
|
191
|
-
|
|
198
|
+
if (clampedChanged) {
|
|
199
|
+
warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
|
|
200
|
+
} else {
|
|
201
|
+
warn(`Field '${id}': stored range ${rangeType.format(stored)} has ends that are not whole numbers, using ${rangeType.format(sanitized)}`);
|
|
202
|
+
}
|
|
192
203
|
}
|
|
193
204
|
return sanitized;
|
|
194
205
|
}
|
package/src/numeric.ts
CHANGED
|
@@ -36,6 +36,18 @@ export function clamp(n: number, min?: number, max?: number): number {
|
|
|
36
36
|
return result;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* `n` clamped into [min, max], then, when `integer` is true, rounded and kept to the whole numbers
|
|
41
|
+
* inside the bounds ([ceil(min), floor(max)]: with `max: 9.5`, 9.7 is 9, not 10): the rule a
|
|
42
|
+
* numeric or range field's shown value and requests are fit by (useNumericField, useRangeField),
|
|
43
|
+
* and the one `sanitizeStored` fits a stored value by.
|
|
44
|
+
*/
|
|
45
|
+
export function fit(n: number, min: number | undefined, max: number | undefined, integer: boolean): number {
|
|
46
|
+
const clamped = clamp(n, min, max);
|
|
47
|
+
if (!integer) return clamped;
|
|
48
|
+
return clamp(Math.round(clamped), min === undefined ? undefined : Math.ceil(min), max === undefined ? undefined : Math.floor(max));
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
/**
|
|
40
52
|
* Resolves a numeric field's bounds and formatter with the field context. `format` goes by its
|
|
41
53
|
* own rule, not resolveIn's, as it always receives the number first; otherwise it is treated
|