vultus-core 0.1.1 → 0.2.1

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 +35 -1
  2. package/dist/MessageSink.d.ts +8 -5
  3. package/dist/MessageSink.d.ts.map +1 -1
  4. package/dist/MessageSink.js.map +1 -1
  5. package/dist/action-core.d.ts +3 -3
  6. package/dist/action-core.d.ts.map +1 -1
  7. package/dist/action-core.js +24 -6
  8. package/dist/action-core.js.map +1 -1
  9. package/dist/decision.d.ts +2 -0
  10. package/dist/decision.d.ts.map +1 -1
  11. package/dist/decision.js +2 -0
  12. package/dist/decision.js.map +1 -1
  13. package/dist/field.d.ts +97 -0
  14. package/dist/field.d.ts.map +1 -0
  15. package/dist/field.js +95 -0
  16. package/dist/field.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/types.d.ts +34 -1
  22. package/dist/types.d.ts.map +1 -1
  23. package/dist/useAction.d.ts.map +1 -1
  24. package/dist/useAction.js +4 -4
  25. package/dist/useAction.js.map +1 -1
  26. package/dist/useActionList.d.ts +2 -2
  27. package/dist/useActionList.d.ts.map +1 -1
  28. package/dist/useActionList.js +6 -6
  29. package/dist/useActionList.js.map +1 -1
  30. package/dist/useBoolField.d.ts +17 -0
  31. package/dist/useBoolField.d.ts.map +1 -0
  32. package/dist/useBoolField.js +12 -0
  33. package/dist/useBoolField.js.map +1 -0
  34. package/dist/useMixedBoolField.d.ts +24 -0
  35. package/dist/useMixedBoolField.d.ts.map +1 -0
  36. package/dist/useMixedBoolField.js +25 -0
  37. package/dist/useMixedBoolField.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/MessageSink.tsx +8 -5
  40. package/src/action-core.ts +27 -7
  41. package/src/decision.ts +4 -0
  42. package/src/field.ts +197 -0
  43. package/src/index.ts +8 -0
  44. package/src/types.ts +43 -2
  45. package/src/useAction.ts +5 -5
  46. package/src/useActionList.ts +7 -7
  47. package/src/useBoolField.ts +30 -0
  48. package/src/useMixedBoolField.ts +43 -0
package/README.md CHANGED
@@ -20,13 +20,47 @@ npm install vultus-core
20
20
 
21
21
  - `.` — the action model, exporting: the core `types`, `decision`, `resolve`,
22
22
  `parseApiError`, `routeApiError`, `ActionErrorContext` / `useActionErrorCtx`,
23
- `useAction`, `useActionList`, `InternalLinkContext` / `useInternalLink` /
23
+ `useAction`, `useActionList`, the fields (`useBoolField`, `useFieldCore` and
24
+ their types), `InternalLinkContext` / `useInternalLink` /
24
25
  `InternalLinkComponent`, and `MessageSinkContext` / `useMessageSink` /
25
26
  `MessageSink`.
26
27
  - `./link` — `InternalLinkContext`, `useInternalLink`, and the
27
28
  `InternalLinkComponent` type on their own, for consumers that only need the
28
29
  link-injection seam.
29
30
 
31
+ ## Actions report messages
32
+
33
+ An action's `fire(args, ctx)` receives an `ExecutionContext` next to its arguments:
34
+ `ctx.info(text)`, `ctx.warn(text)` and `ctx.error(text)` report messages while it runs.
35
+ They land on the action's status as `messages` (with their `severity`) and go to the
36
+ `MessageSink` (`(text, severity?)`). A thrown error still fails the action and ends the
37
+ run's messages; `errors` lists the error texts among them.
38
+
39
+ ## Fields
40
+
41
+ `useBoolField(options)` is the first field hook: the value half of vultus, next to
42
+ actions. Fields are built by composition on a shared core (`useFieldCore`): label,
43
+ description, `visible`/`hidden`, `enabled`/`disabled` (a `Decision`, so with a reason),
44
+ and where the value lives:
45
+
46
+ - inside the field: `initialValue` (default `false`), changed locally;
47
+ - outside, changed locally: `value` + `onChange` (the caller owns the value, e.g. a form);
48
+ - outside, committed immediately: `value` + `commit: { fire(next, ctx), confirmation?, errorRoute? }`.
49
+ The commit runs as an action, so the field is `pending` while it runs and carries its
50
+ `messages`; afterwards it shows whatever `value` the caller passes. `confirmation` may
51
+ depend on the requested value.
52
+
53
+ The returned controls (`value`, `setValue`, `toggle`, `pending`, `enabled`, `whyDisabled`,
54
+ `description`, `valueDescription`, `messages`, `confirmationFor(next)`, ...) are what widgets
55
+ render: vultus-antd's `BoolSwitch` and `BoolCheckbox` take the same field.
56
+ `valueDescriptions` (texts keyed by value: `true`, `false`, `mixed`) say what the current value
57
+ means, next to `description` (what the field is).
58
+
59
+ `useMixedBoolField` is the same field over an aggregate: it shows `true`, `false` or `'mixed'`
60
+ and can be asked for `true` or `false` only (the field core separates the shown type from the
61
+ requestable one); a toggle from mixed requests `true`. `aggregateBool(values)` derives the
62
+ value; with no items at all, disable the field with a reason instead.
63
+
30
64
  ## Distribution
31
65
 
32
66
  This package ships compiled ESM (`dist/`) with TypeScript declarations to
@@ -1,10 +1,13 @@
1
+ import type { Severity } from './types.js';
1
2
  /**
2
- * How the action framework surfaces an otherwise-unhandled error (no form field,
3
- * no inline error target). Default is a no-op so vultus-core stays antd-free and
4
- * framework-neutral; vultus-antd's VultusProvider wires this to antd's
5
- * message.error. Hosts may inject any toast/notification mechanism.
3
+ * How the action framework surfaces messages: an otherwise-unhandled error (no
4
+ * form field, no inline error target), and the messages an action reports
5
+ * through its ExecutionContext. `severity` defaults to 'error'. Default is a
6
+ * no-op so vultus-core stays antd-free and framework-neutral; vultus-antd's
7
+ * VultusProvider wires this to antd's message API. Hosts may inject any
8
+ * toast/notification mechanism.
6
9
  */
7
- export type MessageSink = (text: string) => void;
10
+ export type MessageSink = (text: string, severity?: Severity) => void;
8
11
  export declare const MessageSinkContext: import("react").Context<MessageSink>;
9
12
  export declare function useMessageSink(): MessageSink;
10
13
  //# sourceMappingURL=MessageSink.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageSink.d.ts","sourceRoot":"","sources":["../src/MessageSink.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjD,eAAO,MAAM,kBAAkB,sCAAuC,CAAC;AAEvE,wBAAgB,cAAc,IAAI,WAAW,CAE5C"}
1
+ {"version":3,"file":"MessageSink.d.ts","sourceRoot":"","sources":["../src/MessageSink.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEtE,eAAO,MAAM,kBAAkB,sCAAuC,CAAC;AAEvE,wBAAgB,cAAc,IAAI,WAAW,CAE5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageSink.js","sourceRoot":"","sources":["../src/MessageSink.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAUlD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAc,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"MessageSink.js","sourceRoot":"","sources":["../src/MessageSink.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAalD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAc,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACxC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import type { MutableRefObject } from 'react';
3
3
  import type { MessageSink } from './MessageSink.js';
4
- import type { ActionErrorCtx, ActionOptions, ActionStatus, ConfirmationSpec, ErrorRoutesRegistry } from './types.js';
4
+ import type { ActionErrorCtx, ActionOptions, ActionStatus, ConfirmationSpec, ErrorRoutesRegistry, Message } from './types.js';
5
5
  /**
6
6
  * Hookless core of the action framework, shared by useAction (single) and
7
7
  * useActionList (dynamic list) so the firing machinery + ActionStatus shape
@@ -23,7 +23,7 @@ export interface FirePromiseDeps<RouteId extends string> {
23
23
  reason: string | undefined;
24
24
  getPending: () => boolean;
25
25
  setPending: (value: boolean) => void;
26
- setErrors: (errors: string[]) => void;
26
+ setMessages: (messages: Message[]) => void;
27
27
  errCtxRef: MutableRefObject<ActionErrorCtx | null>;
28
28
  t: (key: string, opts?: Record<string, unknown>) => string;
29
29
  registry?: ErrorRoutesRegistry<RouteId>;
@@ -32,5 +32,5 @@ export interface FirePromiseDeps<RouteId extends string> {
32
32
  /** Build the async fire (pending guard + error routing) for one action. */
33
33
  export declare function makeFirePromise<TArgs, TResult, RouteId extends string>(opts: ActionOptions<TArgs, TResult, RouteId>, deps: FirePromiseDeps<RouteId>): (args: TArgs) => Promise<void>;
34
34
  /** Assemble the public ActionStatus from resolved fields + state + fire. */
35
- export declare function assembleStatus<TArgs>(opts: ActionOptions<TArgs, any, any>, fields: ResolvedFields, pending: boolean, errors: string[], firePromise: (args: TArgs) => Promise<void>): ActionStatus<TArgs>;
35
+ export declare function assembleStatus<TArgs>(opts: ActionOptions<TArgs, any, any>, fields: ResolvedFields, pending: boolean, messages: Message[], firePromise: (args: TArgs) => Promise<void>): ActionStatus<TArgs>;
36
36
  //# sourceMappingURL=action-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action-core.d.ts","sourceRoot":"","sources":["../src/action-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAK9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAEhB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,cAAc,CAWtF;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC3D,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAAS,MAAM,EACpE,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAC5C,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,GAC7B,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAmChC;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAClC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EACpC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1C,YAAY,CAAC,KAAK,CAAC,CAkBrB"}
1
+ {"version":3,"file":"action-core.d.ts","sourceRoot":"","sources":["../src/action-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAK9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAEhB,mBAAmB,EAEnB,OAAO,EAER,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,cAAc,CAWtF;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC3D,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAAS,MAAM,EACpE,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAC5C,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,GAC7B,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAmDhC;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAClC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EACpC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1C,YAAY,CAAC,KAAK,CAAC,CAmBrB"}
@@ -26,14 +26,27 @@ export function makeFirePromise(opts, deps) {
26
26
  console.warn(`Action '${opts.id}': already pending — ignoring fire`);
27
27
  return;
28
28
  }
29
- deps.setErrors([]);
29
+ // Messages of this run: reported through the context while it runs, then
30
+ // the thrown error if it fails. Each report updates the status at once.
31
+ const messages = [];
32
+ const report = (severity) => (text) => {
33
+ messages.push({ text, severity });
34
+ deps.setMessages([...messages]);
35
+ deps.messageSink?.(text, severity);
36
+ };
37
+ const ctx = { info: report('info'), warn: report('warning'), error: report('error') };
38
+ deps.setMessages([]);
30
39
  deps.setPending(true);
31
40
  try {
32
- const result = await opts.fire(args);
41
+ const result = await opts.fire(args, ctx);
33
42
  opts.onSuccess?.(result);
34
43
  }
35
44
  catch (err) {
45
+ const parsed = parseApiError(err);
46
+ const text = parsed.message ?? 'Action failed';
36
47
  if (opts.errorRoute && deps.registry) {
48
+ // A routed action: routeApiError decides where the error shows (a form
49
+ // field, the inline error, or the sink).
37
50
  routeApiError(err, {
38
51
  route: opts.errorRoute,
39
52
  form: deps.errCtxRef.current?.form,
@@ -42,8 +55,12 @@ export function makeFirePromise(opts, deps) {
42
55
  showError: deps.messageSink,
43
56
  }, deps.registry);
44
57
  }
45
- const parsed = parseApiError(err);
46
- deps.setErrors([parsed.message ?? 'Action failed']);
58
+ else {
59
+ // No route: the sink shows it, like the messages reported through ctx.
60
+ deps.messageSink?.(text, 'error');
61
+ }
62
+ messages.push({ text, severity: 'error' });
63
+ deps.setMessages([...messages]);
47
64
  }
48
65
  finally {
49
66
  deps.setPending(false);
@@ -51,7 +68,7 @@ export function makeFirePromise(opts, deps) {
51
68
  };
52
69
  }
53
70
  /** Assemble the public ActionStatus from resolved fields + state + fire. */
54
- export function assembleStatus(opts, fields, pending, errors, firePromise) {
71
+ export function assembleStatus(opts, fields, pending, messages, firePromise) {
55
72
  const fire = (args) => {
56
73
  void firePromise(args);
57
74
  };
@@ -65,7 +82,8 @@ export function assembleStatus(opts, fields, pending, errors, firePromise) {
65
82
  reason: fields.reason,
66
83
  invisible: fields.invisible,
67
84
  confirmation: fields.confirmation,
68
- errors,
85
+ messages,
86
+ errors: messages.filter((m) => m.severity === 'error').map((m) => m.text),
69
87
  fire: fire,
70
88
  firePromise: firePromise,
71
89
  };
@@ -1 +1 @@
1
- {"version":3,"file":"action-core.js","sourceRoot":"","sources":["../src/action-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action-core.js","sourceRoot":"","sources":["../src/action-core.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,6 @@ export declare const denyWithReason: (reason: string) => Decision;
5
5
  export declare const getVerdict: (d: Decision | undefined, fallback: boolean) => boolean;
6
6
  export declare const getReason: (d: Decision | undefined) => string | undefined;
7
7
  export declare const andDecisions: (a: Decision, b: Decision) => Decision;
8
+ /** The opposite verdict, keeping the reason (a reason to disable is a reason not to enable). */
9
+ export declare const invertDecision: (d: Decision) => Decision;
8
10
  //# sourceMappingURL=decision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,KAAG,QAAuC,CAAC;AAChF,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,KAAG,QAAwC,CAAC;AAChF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,QAAwC,CAAC;AAEzF,eAAO,MAAM,UAAU,GAAI,GAAG,QAAQ,GAAG,SAAS,EAAE,UAAU,OAAO,KAAG,OACH,CAAC;AAEtE,eAAO,MAAM,SAAS,GAAI,GAAG,QAAQ,GAAG,SAAS,KAAG,MAAM,GAAG,SACgB,CAAC;AAE9E,eAAO,MAAM,YAAY,GAAI,GAAG,QAAQ,EAAE,GAAG,QAAQ,KAAG,QAQvD,CAAC"}
1
+ {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,KAAG,QAAuC,CAAC;AAChF,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,KAAG,QAAwC,CAAC;AAChF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,QAAwC,CAAC;AAEzF,eAAO,MAAM,UAAU,GAAI,GAAG,QAAQ,GAAG,SAAS,EAAE,UAAU,OAAO,KAAG,OACH,CAAC;AAEtE,eAAO,MAAM,SAAS,GAAI,GAAG,QAAQ,GAAG,SAAS,KAAG,MAAM,GAAG,SACgB,CAAC;AAE9E,eAAO,MAAM,YAAY,GAAI,GAAG,QAAQ,EAAE,GAAG,QAAQ,KAAG,QAQvD,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,cAAc,GAAI,GAAG,QAAQ,KAAG,QAC4B,CAAC"}
package/dist/decision.js CHANGED
@@ -12,4 +12,6 @@ export const andDecisions = (a, b) => {
12
12
  }
13
13
  return av ? b : a;
14
14
  };
15
+ /** The opposite verdict, keeping the reason (a reason to disable is a reason not to enable). */
16
+ export const invertDecision = (d) => typeof d === 'boolean' ? !d : { verdict: !d.verdict, reason: d.reason };
15
17
  //# sourceMappingURL=decision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decision.js","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAe,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAuB,EAAE,QAAiB,EAAW,EAAE,CAChF,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAuB,EAAsB,EAAE,CACvE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,CAAW,EAAY,EAAE;IACjE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC"}
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAe,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAuB,EAAE,QAAiB,EAAW,EAAE,CAChF,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAuB,EAAsB,EAAE,CACvE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,CAAW,EAAY,EAAE;IACjE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAW,EAAY,EAAE,CACtD,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -0,0 +1,97 @@
1
+ import type { ConfirmationSpec, Decision, ErrorRoutesRegistry, ExecutionContext, Message, ValueOrFn } from './types.js';
2
+ /**
3
+ * Fields: the value half of vultus, on the pattern of the sidedao InputFields.
4
+ * A field hook (useBoolField, later others) is built on useFieldCore by
5
+ * composition, never by inheritance. A field's value lives either inside the
6
+ * field (its own state) or outside it (the caller passes it every render);
7
+ * from outside it is changed either locally (`onChange`, e.g. a form) or by an
8
+ * immediate commit (`commit`), whose setter runs as an action.
9
+ * Design notes: unitas docs/2026-10-05-vultus-field-model-design.md.
10
+ */
11
+ /** How an immediately committing field stores a change: an action that receives the requested value. */
12
+ export interface FieldCommit<TRequest, RouteId extends string = string> {
13
+ fire: (next: TRequest, ctx: ExecutionContext) => Promise<void> | void;
14
+ /** Confirmation before committing; may depend on the requested value (e.g. only when switching off). */
15
+ confirmation?: ConfirmationSpec | ((next: TRequest) => ConfirmationSpec | undefined);
16
+ errorRoute?: RouteId;
17
+ }
18
+ /** The key of a value in `valueDescriptions`: 'true' / 'false' for booleans, the value itself for strings. */
19
+ export type ValueKey<T> = T extends boolean ? `${T}` : T extends string | number ? `${T}` : never;
20
+ interface FieldBaseOptions<TValue> {
21
+ id: string;
22
+ label?: ValueOrFn<string>;
23
+ description?: ValueOrFn<string | undefined>;
24
+ /** Shown? Default true. Use `visible` or `hidden`, not contradicting each other. */
25
+ visible?: ValueOrFn<boolean>;
26
+ hidden?: ValueOrFn<boolean>;
27
+ /** Changeable? Default true, optionally with a reason. Use `enabled` or `disabled`, not contradicting each other. */
28
+ enabled?: ValueOrFn<Decision>;
29
+ disabled?: ValueOrFn<Decision>;
30
+ /**
31
+ * What each value means right now, keyed by value (for booleans `true` / `false`, and `mixed`
32
+ * where the field can show it). Shown with the current value, next to `description`, which
33
+ * says what the field is in general.
34
+ */
35
+ valueDescriptions?: Partial<Record<ValueKey<TValue>, string>>;
36
+ }
37
+ /**
38
+ * Where the value lives, and what setting it does. Exactly one of the three. The field shows a
39
+ * `TValue` and can be asked for a `TRequest`; usually the same type, but an aggregate can show
40
+ * a state that cannot be requested (a boolean field showing 'mixed').
41
+ */
42
+ export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = string> =
43
+ /** Inside the field: its own state, starting at `initialValue`. */
44
+ {
45
+ initialValue?: TValue;
46
+ value?: never;
47
+ onChange?: never;
48
+ commit?: never;
49
+ }
50
+ /** Outside, changed locally: the caller owns the value and applies `onChange`. */
51
+ | {
52
+ value: TValue;
53
+ onChange: (value: TRequest) => void;
54
+ initialValue?: never;
55
+ commit?: never;
56
+ }
57
+ /** Outside, committed immediately: `commit.fire` stores the change (pending, messages, confirmation). */
58
+ | {
59
+ value: TValue;
60
+ commit: FieldCommit<TRequest, RouteId>;
61
+ initialValue?: never;
62
+ onChange?: never;
63
+ };
64
+ export type FieldOptions<TValue, TRequest = TValue, RouteId extends string = string> = FieldBaseOptions<TValue> & FieldStorage<TValue, TRequest, RouteId>;
65
+ /** What a field widget receives: everything it shows, and the one way to change the value. */
66
+ export interface FieldControls<TValue, TRequest = TValue> {
67
+ type: string;
68
+ id: string;
69
+ label: string;
70
+ description: string | undefined;
71
+ /** What the current value means (from `valueDescriptions`). */
72
+ valueDescription: string | undefined;
73
+ visible: boolean;
74
+ enabled: boolean;
75
+ whyDisabled: string | undefined;
76
+ value: TValue;
77
+ /** Request a new value. Ignored (with a warning) when disabled or while a commit is pending. */
78
+ setValue(next: TRequest): void;
79
+ /** A commit is running. */
80
+ pending: boolean;
81
+ /** Messages of the last commit. */
82
+ messages: Message[];
83
+ /** The confirmation a widget must obtain before requesting `next`, if any. */
84
+ confirmationFor(next: TRequest): ConfirmationSpec | undefined;
85
+ }
86
+ export type FieldStorageMode = 'inside' | 'local' | 'commit';
87
+ export declare function fieldStorageMode(id: string, opts: FieldStorage<unknown, unknown, string>): FieldStorageMode;
88
+ export declare function calculateVisible(id: string, visible: boolean | undefined, hidden: boolean | undefined): boolean;
89
+ export declare function calculateEnabled(id: string, enabled: Decision | undefined, disabled: Decision | undefined): Decision;
90
+ /**
91
+ * The shared core of every field hook: label and description, visibility and
92
+ * enabled state (with reason), the storage mode, and in commit mode the setter
93
+ * as an action (its pending state and messages become the field's).
94
+ */
95
+ export declare function useFieldCore<TValue, TRequest extends TValue = TValue, RouteId extends string = string>(type: string, opts: FieldOptions<TValue, TRequest, RouteId>, registry?: ErrorRoutesRegistry<RouteId>): FieldControls<TValue, TRequest>;
96
+ export {};
97
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
package/dist/field.js ADDED
@@ -0,0 +1,95 @@
1
+ import { useState } from 'react';
2
+ import { getReason, getVerdict, invertDecision } from './decision.js';
3
+ import { resolve } from './resolve.js';
4
+ import { useAction } from './useAction.js';
5
+ export function fieldStorageMode(id, opts) {
6
+ const { initialValue, value, onChange, commit } = opts;
7
+ if (commit && onChange)
8
+ throw new Error(`Field '${id}': "commit" and "onChange" are mutually exclusive`);
9
+ if ((commit || onChange) && initialValue !== undefined) {
10
+ throw new Error(`Field '${id}': "initialValue" is for a value inside the field; with "${commit ? 'commit' : 'onChange'}" the caller passes "value"`);
11
+ }
12
+ if (commit)
13
+ return 'commit';
14
+ if (onChange)
15
+ return 'local';
16
+ if (value !== undefined)
17
+ throw new Error(`Field '${id}': "value" needs "onChange" or "commit"`);
18
+ return 'inside';
19
+ }
20
+ export function calculateVisible(id, visible, hidden) {
21
+ if (visible === undefined)
22
+ return hidden === undefined ? true : !hidden;
23
+ if (hidden === undefined || visible !== hidden)
24
+ return visible;
25
+ throw new Error(`Field '${id}': "visible" and "hidden" contradict each other`);
26
+ }
27
+ export function calculateEnabled(id, enabled, disabled) {
28
+ if (enabled === undefined)
29
+ return disabled === undefined ? true : invertDecision(disabled);
30
+ if (disabled === undefined)
31
+ return enabled;
32
+ if (getVerdict(enabled, false) !== getVerdict(disabled, false)) {
33
+ return { verdict: getVerdict(enabled, false), reason: getReason(disabled) ?? getReason(enabled) };
34
+ }
35
+ throw new Error(`Field '${id}': "enabled" and "disabled" contradict each other`);
36
+ }
37
+ /**
38
+ * The shared core of every field hook: label and description, visibility and
39
+ * enabled state (with reason), the storage mode, and in commit mode the setter
40
+ * as an action (its pending state and messages become the field's).
41
+ */
42
+ export function useFieldCore(type, opts, registry) {
43
+ const mode = fieldStorageMode(opts.id, opts);
44
+ const [inner, setInner] = useState(opts.initialValue);
45
+ const label = resolve(opts.label, '');
46
+ const description = resolve(opts.description, undefined);
47
+ const visible = calculateVisible(opts.id, resolve(opts.visible, undefined), resolve(opts.hidden, undefined));
48
+ const enabledDecision = calculateEnabled(opts.id, resolve(opts.enabled, undefined), resolve(opts.disabled, undefined));
49
+ const enabled = getVerdict(enabledDecision, true);
50
+ const whyDisabled = enabled ? undefined : getReason(enabledDecision);
51
+ // Hooks run unconditionally; the setter action is only fired in commit mode.
52
+ const setter = useAction({
53
+ id: `${opts.id}.set`,
54
+ label,
55
+ enabled: enabledDecision,
56
+ invisible: !visible,
57
+ errorRoute: opts.commit?.errorRoute,
58
+ fire: (next, ctx) => opts.commit?.fire(next, ctx),
59
+ }, registry);
60
+ const value = mode === 'inside' ? inner : opts.value;
61
+ const pending = mode === 'commit' && setter.pending;
62
+ const valueDescription = opts.valueDescriptions?.[String(value)];
63
+ const setValue = (next) => {
64
+ if (!enabled) {
65
+ console.warn(`Field '${opts.id}': disabled — ${whyDisabled ?? '(no reason)'}`);
66
+ return;
67
+ }
68
+ if (mode === 'inside')
69
+ setInner(next);
70
+ else if (mode === 'local')
71
+ opts.onChange(next);
72
+ else
73
+ setter.fire(next);
74
+ };
75
+ const confirmationFor = (next) => {
76
+ const spec = opts.commit?.confirmation;
77
+ return typeof spec === 'function' ? spec(next) : spec;
78
+ };
79
+ return {
80
+ type,
81
+ id: opts.id,
82
+ label,
83
+ description,
84
+ valueDescription,
85
+ visible,
86
+ enabled,
87
+ whyDisabled,
88
+ value,
89
+ setValue,
90
+ pending,
91
+ messages: mode === 'commit' ? (setter.messages ?? []) : [],
92
+ confirmationFor,
93
+ };
94
+ }
95
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAyF3C,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,IAA4C;IACvF,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAEjD,CAAC;IACF,IAAI,MAAM,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,4DAA4D,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,6BAA6B,CAAC,CAAC;IACvJ,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,yCAAyC,CAAC,CAAC;IAChG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,OAA4B,EAAE,MAA2B;IACpG,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IAC/D,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,iDAAiD,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,OAA6B,EAAE,QAA8B;IACxG,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3F,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,IAA6C,EAC7C,QAAuC;IAEvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAA8C,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,IAAI,CAAC,YAAsB,CAAC,CAAC;IAExE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAqB,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,gBAAgB,CAC9B,IAAI,CAAC,EAAE,EACP,OAAO,CAAsB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACrD,OAAO,CAAsB,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CACrD,CAAC;IACF,MAAM,eAAe,GAAG,gBAAgB,CACtC,IAAI,CAAC,EAAE,EACP,OAAO,CAAuB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACtD,OAAO,CAAuB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CACxD,CAAC;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAErE,6EAA6E;IAC7E,MAAM,MAAM,GAAG,SAAS,CACtB;QACE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM;QACpB,KAAK;QACL,OAAO,EAAE,eAAe;QACxB,SAAS,EAAE,CAAC,OAAO;QACnB,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;QACnC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;KAClD,EACD,QAAQ,CACT,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,KAAgB,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;IACpD,MAAM,gBAAgB,GAAI,IAAI,CAAC,iBAAoE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAErH,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,iBAAiB,WAAW,IAAI,aAAa,EAAE,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;aACjC,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC;;YAC1C,MAAM,CAAC,IAAiC,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,IAAc,EAAgC,EAAE;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;QACvC,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK;QACL,WAAW;QACX,gBAAgB;QAChB,OAAO;QACP,OAAO;QACP,WAAW;QACX,KAAK;QACL,QAAQ;QACR,OAAO;QACP,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1D,eAAe;KAChB,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,9 @@ export * from './routeApiError.js';
6
6
  export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
7
7
  export { useAction } from './useAction.js';
8
8
  export { useActionList } from './useActionList.js';
9
+ export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, type FieldCommit, type FieldControls, type FieldOptions, type FieldStorage, type FieldStorageMode, type ValueKey, } from './field.js';
10
+ export { useBoolField, type BoolFieldControls, type BoolFieldOptions } from './useBoolField.js';
11
+ export { useMixedBoolField, aggregateBool, type MixedBool, type MixedBoolFieldControls, type MixedBoolFieldOptions, } from './useMixedBoolField.js';
9
12
  export { InternalLinkContext, useInternalLink, type InternalLinkComponent } from './LinkContext.js';
10
13
  export { MessageSinkContext, useMessageSink, type MessageSink } from './MessageSink.js';
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAClE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,QAAQ,GACjH,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,GAC1G,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,9 @@ export * from './routeApiError.js';
6
6
  export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
7
7
  export { useAction } from './useAction.js';
8
8
  export { useActionList } from './useActionList.js';
9
+ export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, } from './field.js';
10
+ export { useBoolField } from './useBoolField.js';
11
+ export { useMixedBoolField, aggregateBool, } from './useMixedBoolField.js';
9
12
  export { InternalLinkContext, useInternalLink } from './LinkContext.js';
10
13
  export { MessageSinkContext, useMessageSink } from './MessageSink.js';
11
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,GAEnE,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAiD,MAAM,mBAAmB,CAAC;AAChG,OAAO,EACL,iBAAiB,EAAE,aAAa,GACjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -15,6 +15,23 @@ export type Decision = boolean | {
15
15
  reason?: string;
16
16
  };
17
17
  export type ValueOrFn<T> = T | (() => T);
18
+ export type Severity = 'info' | 'warning' | 'error';
19
+ /** Something an action (or, later, a field's validation) has to say, with its severity. */
20
+ export interface Message {
21
+ text: string;
22
+ severity: Severity;
23
+ }
24
+ /**
25
+ * What an action's `fire` receives next to its arguments: a way to report
26
+ * messages while it runs (absorbed from the sidedao InputFields). Messages land
27
+ * on the action's status (`messages`) and go to the MessageSink. A thrown
28
+ * error still fails the action; `error()` reports an error without throwing.
29
+ */
30
+ export interface ExecutionContext {
31
+ info(text: string): void;
32
+ warn(text: string): void;
33
+ error(text: string): void;
34
+ }
18
35
  export type ConfirmationSpec = {
19
36
  kind: 'popconfirm';
20
37
  question: string;
@@ -25,8 +42,17 @@ export type ConfirmationSpec = {
25
42
  } | {
26
43
  kind: 'typing';
27
44
  title: string;
45
+ /** The phrase to type. Confirming (the OK button, labelled with the action's label, or Enter) needs it typed exactly. */
28
46
  entityName: string;
29
47
  description: React.ReactNode;
48
+ /**
49
+ * The instruction line above the input, e.g. a translated
50
+ * `'Zum Bestätigen {phrase} eingeben:'`. Each `{phrase}` shows the phrase
51
+ * (`entityName`) highlighted, so a translation can place it anywhere; a
52
+ * prompt without `{phrase}` gets the phrase after it. Absent: the
53
+ * English `Type {phrase} to confirm:`.
54
+ */
55
+ prompt?: string;
30
56
  };
31
57
  export interface ActionOptions<TArgs = void, TResult = void, RouteId extends string = string> {
32
58
  id: string;
@@ -37,7 +63,7 @@ export interface ActionOptions<TArgs = void, TResult = void, RouteId extends str
37
63
  invisible?: ValueOrFn<boolean>;
38
64
  confirmation?: ValueOrFn<ConfirmationSpec | undefined>;
39
65
  errorRoute?: RouteId;
40
- fire: (args: TArgs) => Promise<TResult> | TResult;
66
+ fire: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
41
67
  onSuccess?: (result: TResult) => void;
42
68
  }
43
69
  type FireArgs<TArgs> = [TArgs] extends [void] ? [] : [args: TArgs];
@@ -51,6 +77,13 @@ export interface ActionStatus<TArgs = void> {
51
77
  reason?: string;
52
78
  invisible: boolean;
53
79
  confirmation?: ConfirmationSpec;
80
+ /**
81
+ * Messages of the last run: reported through the ExecutionContext, or the thrown error.
82
+ * Optional so hand-built statuses (adapters, test fixtures) stay valid; read it as `[]` when
83
+ * absent. Statuses from useAction and useActionList always carry it.
84
+ */
85
+ messages?: Message[];
86
+ /** The error texts among `messages` (kept for callers that only show errors). */
54
87
  errors: string[];
55
88
  fire(...args: FireArgs<TArgs>): void;
56
89
  firePromise(...args: FireArgs<TArgs>): Promise<void>;
@@ -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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../src/useAction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnF,wBAAgB,SAAS,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EACrF,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAC5C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,YAAY,CAAC,KAAK,CAAC,CAkDrB"}
1
+ {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../src/useAction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAW,MAAM,YAAY,CAAC;AAE5F,wBAAgB,SAAS,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EACrF,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAC5C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,YAAY,CAAC,KAAK,CAAC,CAkDrB"}
package/dist/useAction.js CHANGED
@@ -10,7 +10,7 @@ export function useAction(opts, registry) {
10
10
  const { t } = useTranslation();
11
11
  const messageSink = useMessageSink();
12
12
  const [pending, setPending] = useState(false);
13
- const [errors, setErrors] = useState([]);
13
+ const [messages, setMessages] = useState([]);
14
14
  const pendingRef = useRef(pending);
15
15
  pendingRef.current = pending;
16
16
  const fields = resolveActionFields(opts);
@@ -19,7 +19,7 @@ export function useAction(opts, registry) {
19
19
  reason: fields.reason,
20
20
  getPending: () => pendingRef.current,
21
21
  setPending,
22
- setErrors,
22
+ setMessages,
23
23
  errCtxRef,
24
24
  t,
25
25
  registry,
@@ -28,7 +28,7 @@ export function useAction(opts, registry) {
28
28
  // Granular deps by design: memo invalidates on the specific opts/fields
29
29
  // primitives below, not on the whole `opts`/`fields` objects (which are
30
30
  // fresh each render and would defeat the memo).
31
- return useMemo(() => assembleStatus(opts, fields, pending, errors, firePromise),
31
+ return useMemo(() => assembleStatus(opts, fields, pending, messages, firePromise),
32
32
  // eslint-disable-next-line react-hooks/exhaustive-deps
33
33
  [
34
34
  opts.id,
@@ -40,7 +40,7 @@ export function useAction(opts, registry) {
40
40
  fields.reason,
41
41
  fields.invisible,
42
42
  fields.confirmation,
43
- errors,
43
+ messages,
44
44
  firePromise,
45
45
  ]);
46
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useAction.js","sourceRoot":"","sources":["../src/useAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxF,MAAM,UAAU,SAAS,CACvB,IAA4C,EAC5C,QAAuC;IAEvC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CACH,eAAe,CAAC,IAAI,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO;QACpC,UAAU;QACV,SAAS;QACT,SAAS;QACT,CAAC;QACD,QAAQ;QACR,WAAW;KACZ,CAAC,EACJ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,CAAC,CACjE,CAAC;IAEF,wEAAwE;IACxE,wEAAwE;IACxE,gDAAgD;IAChD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;IAChE,uDAAuD;IACvD;QACE,IAAI,CAAC,EAAE;QACP,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,OAAO;QACd,OAAO;QACP,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,YAAY;QACnB,MAAM;QACN,WAAW;KACZ,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useAction.js","sourceRoot":"","sources":["../src/useAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxF,MAAM,UAAU,SAAS,CACvB,IAA4C,EAC5C,QAAuC;IAEvC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CACH,eAAe,CAAC,IAAI,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO;QACpC,UAAU;QACV,WAAW;QACX,SAAS;QACT,CAAC;QACD,QAAQ;QACR,WAAW;KACZ,CAAC,EACJ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,CAAC,CACjE,CAAC;IAEF,wEAAwE;IACxE,wEAAwE;IACxE,gDAAgD;IAChD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;IAClE,uDAAuD;IACvD;QACE,IAAI,CAAC,EAAE;QACP,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,OAAO;QACd,OAAO;QACP,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,YAAY;QACnB,QAAQ;QACR,WAAW;KACZ,CACF,CAAC;AACJ,CAAC"}