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.
Files changed (48) hide show
  1. package/README.md +52 -13
  2. package/dist/field.d.ts +1 -1
  3. package/dist/field.d.ts.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/kinds.d.ts +11 -7
  9. package/dist/kinds.d.ts.map +1 -1
  10. package/dist/kinds.js +35 -20
  11. package/dist/kinds.js.map +1 -1
  12. package/dist/numeric.d.ts +7 -0
  13. package/dist/numeric.d.ts.map +1 -1
  14. package/dist/numeric.js +12 -0
  15. package/dist/numeric.js.map +1 -1
  16. package/dist/parseApiError.d.ts +6 -0
  17. package/dist/parseApiError.d.ts.map +1 -1
  18. package/dist/parseApiError.js +7 -1
  19. package/dist/parseApiError.js.map +1 -1
  20. package/dist/tree.d.ts +21 -9
  21. package/dist/tree.d.ts.map +1 -1
  22. package/dist/tree.js +64 -21
  23. package/dist/tree.js.map +1 -1
  24. package/dist/types.d.ts +2 -0
  25. package/dist/types.d.ts.map +1 -1
  26. package/dist/{useTreeField.d.ts → useManyOfTreeField.d.ts} +10 -9
  27. package/dist/useManyOfTreeField.d.ts.map +1 -0
  28. package/dist/{useTreeField.js → useManyOfTreeField.js} +9 -8
  29. package/dist/useManyOfTreeField.js.map +1 -0
  30. package/dist/useNumericField.d.ts.map +1 -1
  31. package/dist/useNumericField.js +2 -5
  32. package/dist/useNumericField.js.map +1 -1
  33. package/dist/useRangeField.d.ts.map +1 -1
  34. package/dist/useRangeField.js +2 -5
  35. package/dist/useRangeField.js.map +1 -1
  36. package/package.json +3 -2
  37. package/src/field.ts +1 -1
  38. package/src/index.ts +8 -4
  39. package/src/kinds.ts +35 -24
  40. package/src/numeric.ts +12 -0
  41. package/src/parseApiError.ts +7 -1
  42. package/src/tree.ts +71 -20
  43. package/src/types.ts +2 -2
  44. package/src/{useTreeField.ts → useManyOfTreeField.ts} +14 -13
  45. package/src/useNumericField.ts +2 -5
  46. package/src/useRangeField.ts +2 -5
  47. package/dist/useTreeField.d.ts.map +0 -1
  48. 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
- /** The nodes a value covers in the cascading selections: the value's nodes, their descendants, and every node all of whose children are covered. */
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 self = inherited || listed.has(node.value);
32
- const children = (node.children ?? []).map((child) => walk(child, self));
33
- const isCovered = self || (children.length > 0 && children.every(Boolean));
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
- /** The covered nodes the value names under `selection` (see TreeSelection), in pre-order. */
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 covered); with
75
- * `'independent'` the value's nodes themselves. Values that name no node follow, as in
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. In the cascading selections a covered node
83
- * is removed with its descendants and its ancestors (they no longer have all their
84
- * children), and an uncovered one is added with its descendants; with `'independent'` the
85
- * node alone is added or removed. A `node` that is not one of the nodes changes nothing.
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
- for (const v of subtree)
99
- covered.delete(v);
100
- for (let up = parent.get(node); up !== undefined; up = parent.get(up))
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
- for (const v of subtree)
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":"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"}
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;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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;AAED,sOAAsO;AACtO,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAcrC,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEnE,MAAM,WAAW,YAAY,CAAC,KAAK,GAAG,IAAI;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,iFAAiF;IACjF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,MAAM,IACpD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAEjD,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,MAAM,IAAI;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C,CAAC"}
@@ -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 TreeOwnOptions<T extends string = string, Ctx = any> = {
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 TreeFieldOptions<T extends string = string, RouteId extends string = string, Ctx = any> = FieldOptions<T[], T[], RouteId, Ctx> & TreeOwnOptions<T, Ctx>;
14
- export interface TreeFieldControls<T extends string = string> extends FieldControls<T[], T[]> {
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 treeInitialValue<T extends string>(opts: {
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
- * and `selection` says which nodes the value lists (see TreeSelection). The value is shown
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 useTreeField<T extends string = string, RouteId extends string = string, Ctx = any>(opts: TreeFieldOptions<T, RouteId, Ctx>, registry?: ErrorRoutesRegistry<RouteId>): TreeFieldControls<T>;
39
- //# sourceMappingURL=useTreeField.d.ts.map
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 treeInitialValue(opts, ctx, id) {
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
- * and `selection` says which nodes the value lists (see TreeSelection). The value is shown
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 useTreeField(opts, registry) {
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 = () => treeInitialValue(opts, ctx, opts.id);
28
- const field = useFieldCore('tree', inside ? { ...opts, initialValue } : opts, registry);
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=useTreeField.js.map
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,EAAyB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,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,CA6BtB"}
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"}
@@ -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;AAa/F;;;;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;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,CAAC,CAAC;IACF,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
+ {"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,EAAyB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,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,CAmCpB"}
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"}
@@ -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 { 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":"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"}
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.0",
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' | 'tree' | 'text';
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
- export * from './types.js';
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
- useTreeField, treeInitialValue,
46
- type TreeFieldControls, type TreeFieldOptions, type TreeOwnOptions,
47
- } from './useTreeField.js';
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 { treeInitialValue, type TreeOwnOptions, type useTreeField } from './useTreeField.js';
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<'tree', string[], TreeOwnOptions<string, Ctx>, Ctx>
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<'tree'>, HookOptions<typeof useTreeField>>,
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 useTreeField resolves them. */
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 'tree':
107
- return normalizeTreeValue(nodesOf(definition, ctx), treeInitialValue(definition, ctx, id), definition.selection ?? 'topmost');
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 'tree': return stringSetType;
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. Each such change warns, naming
139
- * the field: the value came from outside, so it is not an error. Reordering is silent: lists
140
- * come back in choice order or normalized under the tree's selection (a store keeps them
141
- * sorted, so a warning would come on every read), and a range's ends in order. The warnings go
142
- * to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
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 'tree': {
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
- if (clamped !== stored) warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${clamped}`);
182
- return clamped;
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 from = clamp(stored[0], min, max);
188
- const to = clamp(stored[1], min, max);
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
- warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
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