react-semaphor 0.1.546 → 0.1.548

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 (59) hide show
  1. package/dist/analytics-protocol/index.js +71 -68
  2. package/dist/assistant-context/index.js +1 -1
  3. package/dist/briefings/index.js +1 -1
  4. package/dist/chunks/applied-constraints-DU-wndZ7.js +47 -0
  5. package/dist/chunks/{assistant-chat-BPXhulAx.js → assistant-chat-DCcWsoGm.js} +106 -106
  6. package/dist/chunks/{bookmark-state-C4vetoa0.js → bookmark-state-Cu-a5ie_.js} +2 -8
  7. package/dist/chunks/{custom-visual-inputs-CkJW9pBS.js → custom-visual-inputs-BTRnwsfd.js} +1 -1
  8. package/dist/chunks/{dashboard-C3CoKbGY.js → dashboard-BZHL9a-z.js} +1 -1
  9. package/dist/chunks/{dashboard-briefing-launcher-Be4h-7My.js → dashboard-briefing-launcher-DML-cAzB.js} +528 -528
  10. package/dist/chunks/{dashboard-controls-bxPrlSyp.js → dashboard-controls-BGoBTPS7.js} +45 -45
  11. package/dist/chunks/{dashboard-json-BrjxIiRt.js → dashboard-json-iHPsdn3j.js} +1 -1
  12. package/dist/chunks/{document-dashboard-inputs-CRVHpIHp.js → document-dashboard-inputs-B2AqPfrq.js} +94 -94
  13. package/dist/chunks/{edit-dashboard-visual-DYYYDjY6.js → edit-dashboard-visual-CLEFFf2T.js} +281 -281
  14. package/dist/chunks/{column-catalog-BYnochWQ.js → filter-reach-copy-ByzGadUk.js} +978 -861
  15. package/dist/chunks/{global-date-filter-utils-9d6m9-FE.js → global-date-filter-utils-CeeFJ1CP.js} +4070 -3792
  16. package/dist/chunks/{index-DkQkMKa1.js → index-DeDHr3iz.js} +30 -30
  17. package/dist/chunks/{raw-temporal-presentation-CBzrDOjM.js → raw-temporal-presentation-CrUM2I_o.js} +1 -1
  18. package/dist/chunks/{report-preferences-dialog-4QEZWe5U.js → report-preferences-dialog-CM7kXmXp.js} +59 -59
  19. package/dist/chunks/{resolve-dashboard-input-context-UpK_LBpL.js → resolve-dashboard-input-context-BmWF9hSl.js} +1511 -1612
  20. package/dist/chunks/{saved-dashboard-context-D_I3Lxk0.js → saved-dashboard-context-qtfzl9Eb.js} +5 -5
  21. package/dist/chunks/{semaphor-ready-indicator-4zpRHE-X.js → semaphor-ready-indicator-Ol6VcaR7.js} +36548 -35855
  22. package/dist/chunks/{shelf-drop-preview-context-Cfw7TRAx.js → shelf-drop-preview-context-C2SEC3I9.js} +80 -80
  23. package/dist/chunks/{source-entity-resolution-BIGRvtbG.js → source-entity-resolution-D195CrYS.js} +221 -192
  24. package/dist/chunks/{table-settings-CunhoDUi.js → table-settings-WysCBj62.js} +133 -124
  25. package/dist/chunks/{use-create-flow-overlay-state-DZBZiiD-.js → use-create-flow-overlay-state-CbGIjaVD.js} +2 -2
  26. package/dist/dashboard/index.js +2 -2
  27. package/dist/dashboard-authoring/index.js +1419 -1340
  28. package/dist/data-app-sdk-validation/index.js +1 -1
  29. package/dist/index.js +14 -14
  30. package/dist/surfboard/index.js +2 -2
  31. package/dist/types/components/surfboard/filter/types.d.ts +7 -0
  32. package/dist/types/components/surfboard/screen-size-preview-button.d.ts +7 -4
  33. package/dist/types/components/visual/matrix-table/matrix-card-view.d.ts +3 -0
  34. package/dist/types/index.js +2 -2
  35. package/dist/types/lib/dashboard-inputs/dashboard-filter-mapping-authoring.d.ts +383 -22
  36. package/dist/types/lib/dashboard-inputs/dashboard-filter-value-identity.d.ts +65 -0
  37. package/dist/types/lib/dashboard-inputs/resolve-selection-input.d.ts +3 -3
  38. package/dist/types/lib/hooks/use-dashboard-card.d.ts +2 -0
  39. package/dist/types/lib/matrix-table/matrix-delivery-policy.d.ts +1 -1
  40. package/dist/types/lib/matrix-table/matrix-runtime-types.d.ts +9 -1
  41. package/dist/types/lib/matrix-table/matrix-runtime.d.ts +5 -1
  42. package/dist/types/lib/query-context/dashboard-filter-mapping-resolution.d.ts +83 -13
  43. package/dist/types/lib/stores/dashboard-store.d.ts +12 -0
  44. package/dist/types/shared/analytics-protocol/applied-constraints.d.ts +57 -1
  45. package/dist/types/shared/assistant-protocol/context.d.ts +8 -8
  46. package/dist/types/shared/dashboard-authoring/changes/diagnostics.d.ts +2 -0
  47. package/dist/types/shared/dashboard-authoring/changes/resolve-dashboard-changes.d.ts +7 -0
  48. package/dist/types/shared/dashboard-authoring/click-to-filter-settings.d.ts +3 -3
  49. package/dist/types/shared/dashboard-authoring/dashboard-filter-automatic-target.d.ts +4 -4
  50. package/dist/types/shared/dashboard-authoring/dashboard-filter-mapping-contract.d.ts +3 -1
  51. package/dist/types/shared/dashboard-authoring/dashboard-filter-mapping-types.d.ts +27 -1
  52. package/dist/types/shared/dashboard-authoring/dashboard-filter-value-compatibility.d.ts +12 -3
  53. package/dist/types/shared/dashboard-authoring/filter-reach-copy.d.ts +18 -0
  54. package/dist/types/shared/dashboard-authoring/filter-reach-preview.d.ts +97 -0
  55. package/dist/types/shared/dashboard-authoring/index.d.ts +5 -1
  56. package/dist/types/shared/dashboard-authoring/outline/outline-dashboard.d.ts +7 -0
  57. package/dist/types/shared/dashboard-authoring/outline/outline-filters.d.ts +26 -4
  58. package/dist/types/shared/dashboard-authoring/semantic-auto-join-card.d.ts +22 -0
  59. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { Z as Q } from "../chunks/matrix-operation-contract-D6vYkZK4.js";
3
3
  import "../chunks/analytics-base-schemas-BKs3flFS.js";
4
4
  import "zod";
5
5
  import { p as W } from "../chunks/report-runtime-context-hWiTCzFV.js";
6
- import { o as U } from "../chunks/source-entity-resolution-BIGRvtbG.js";
6
+ import { o as U } from "../chunks/source-entity-resolution-D195CrYS.js";
7
7
  import { toSemaphorMetricIntent as J, toSemaphorAnalysisIntent as V, toSemaphorRecordsIntent as G, toSemaphorSqlIntent as L, toSemaphorMatrixIntent as Z, toSemaphorInputOptionsIntent as X } from "../data-app-sdk-adapters/index.js";
8
8
  import { m as Y } from "../chunks/matrix-card-LiMEipvq.js";
9
9
  function ee({
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { D as M } from "./chunks/dashboard-C3CoKbGY.js";
2
- import { C as fa, E as ma } from "./chunks/table-settings-CunhoDUi.js";
3
- import { C as U, b as V, c as z, d as H, e as W, f as q } from "./chunks/report-preferences-dialog-4QEZWe5U.js";
4
- import { g as ga, A as Ca, h as ba, a as ya, R as va, D as Da } from "./chunks/report-preferences-dialog-4QEZWe5U.js";
1
+ import { D as M } from "./chunks/dashboard-BZHL9a-z.js";
2
+ import { C as fa, E as ma } from "./chunks/table-settings-WysCBj62.js";
3
+ import { C as U, b as V, c as z, d as H, e as W, f as q } from "./chunks/report-preferences-dialog-CM7kXmXp.js";
4
+ import { g as ga, A as Ca, h as ba, a as ya, R as va, D as Da } from "./chunks/report-preferences-dialog-CM7kXmXp.js";
5
5
  import { jsx as o, jsxs as b } from "react/jsx-runtime";
6
- import { E as P, F as $, S as G, a as K, U as Q, c as J, A as Y, C as X, u as L, d as Z, f as ee, g as ae, V as te, e as _, h as N, s as se, R as re } from "./chunks/semaphor-ready-indicator-4zpRHE-X.js";
7
- import { O as Aa, aw as Sa, ax as Ta, ay as wa, B as xa, a5 as Ba, I as Fa, G as Pa, z as _a, aG as Na, M as Ra, W as La, k as Ia, n as ja, n as ka, o as Oa, H as Ma, ar as Ua, at as Va, au as za, as as Ha, ai as Wa, al as qa, aF as $a, a9 as Ga, aq as Ka, a2 as Qa, aA as Ja, aB as Ya, ad as Xa, am as Za, y as et, x as at, v as tt, w as st, aJ as rt, a8 as ot, an as nt, ao as it, ah as lt, ak as ct, aE as ut, aD as dt, aC as pt, aI as ft, aH as mt, aj as ht, a7 as gt, a6 as Ct, T as bt, ab as yt, ap as vt, af as Dt, ac as Et, ae as At, ag as St, X as Tt, Y as wt, Z as xt, aa as Bt, P as Ft, N as Pt, t as _t, az as Nt, r as Rt, K as Lt, _ as It, a0 as jt, $ as kt, a1 as Ot, q as Mt, j as Ut, J as Vt, L as zt, l as Ht, a4 as Wt, Q as qt, a3 as $t, i as Gt, p as Kt, m as Qt, av as Jt } from "./chunks/semaphor-ready-indicator-4zpRHE-X.js";
6
+ import { E as P, F as $, S as G, a as K, U as Q, c as J, A as Y, C as X, u as L, d as Z, f as ee, g as ae, V as te, e as _, h as N, s as se, R as re } from "./chunks/semaphor-ready-indicator-Ol6VcaR7.js";
7
+ import { O as Aa, aw as Sa, ax as Ta, ay as wa, B as xa, a5 as Ba, I as Fa, G as Pa, z as _a, aG as Na, M as Ra, W as La, k as Ia, n as ja, n as ka, o as Oa, H as Ma, ar as Ua, at as Va, au as za, as as Ha, ai as Wa, al as qa, aF as $a, a9 as Ga, aq as Ka, a2 as Qa, aA as Ja, aB as Ya, ad as Xa, am as Za, y as et, x as at, v as tt, w as st, aJ as rt, a8 as ot, an as nt, ao as it, ah as lt, ak as ct, aE as ut, aD as dt, aC as pt, aI as ft, aH as mt, aj as ht, a7 as gt, a6 as Ct, T as bt, ab as yt, ap as vt, af as Dt, ac as Et, ae as At, ag as St, X as Tt, Y as wt, Z as xt, aa as Bt, P as Ft, N as Pt, t as _t, az as Nt, r as Rt, K as Lt, _ as It, a0 as jt, $ as kt, a1 as Ot, q as Mt, j as Ut, J as Vt, L as zt, l as Ht, a4 as Wt, Q as qt, a3 as $t, i as Gt, p as Kt, m as Qt, av as Jt } from "./chunks/semaphor-ready-indicator-Ol6VcaR7.js";
8
8
  import * as T from "react";
9
9
  import I, { useMemo as R, useEffect as j } from "react";
10
10
  import { C as Xt, D as Zt, L as es, P as as, e as ts, g as ss, j as rs, h as os, k as ns, d as is, b as ls, i as cs, c as us, n as ds, f as ps } from "./chunks/validators-C-aOQlTB.js";
@@ -15,26 +15,26 @@ import "./chunks/matrix-operation-contract-D6vYkZK4.js";
15
15
  import "./chunks/analytics-base-schemas-BKs3flFS.js";
16
16
  import "./value-format-preferences/index.js";
17
17
  import { D as ms } from "./chunks/token-types-BMqRmT-C.js";
18
- import { c as gs, A as Cs, b as bs, g as ys, D as vs, e as Ds, f as Es, d as As, S as Ss, U as Ts, a as ws, V as xs, W as Bs, i as Fs, u as Ps } from "./chunks/dashboard-briefing-launcher-Be4h-7My.js";
18
+ import { c as gs, A as Cs, b as bs, g as ys, D as vs, e as Ds, f as Es, d as As, S as Ss, U as Ts, a as ws, V as xs, W as Bs, i as Fs, u as Ps } from "./chunks/dashboard-briefing-launcher-DML-cAzB.js";
19
19
  import { n as Ns, s as Rs, u as Ls } from "./chunks/normalize-dashboard-for-dirty-check-XKgH3GFX.js";
20
20
  import { createRoot as ne } from "react-dom/client";
21
- import "./chunks/shelf-drop-preview-context-Cfw7TRAx.js";
21
+ import "./chunks/shelf-drop-preview-context-C2SEC3I9.js";
22
22
  import "./chunks/index-CuHybtft.js";
23
23
  import { D as js } from "./chunks/report-runtime-context-hWiTCzFV.js";
24
24
  import { c as B } from "./chunks/_commonjsHelpers-DimLPMtv.js";
25
25
  import { P as ie, a as le, B as ce, b as ue, c as de } from "./chunks/switch-CEBOR4n7.js";
26
- import "./chunks/global-date-filter-utils-9d6m9-FE.js";
26
+ import "./chunks/global-date-filter-utils-CeeFJ1CP.js";
27
27
  import { r as Os, a as Ms } from "./chunks/pivot-result-identity-C-Q1j1Wb.js";
28
- import { a as pe } from "./chunks/resolve-dashboard-input-context-UpK_LBpL.js";
29
- import { k as Vs, f as zs, n as Hs, m as Ws, s as qs, t as $s, j as Gs, h as Ks, o as Qs, g as Js, d as Ys, i as Xs, u as Zs, q as er } from "./chunks/resolve-dashboard-input-context-UpK_LBpL.js";
28
+ import { a as pe } from "./chunks/resolve-dashboard-input-context-BmWF9hSl.js";
29
+ import { k as Vs, f as zs, n as Hs, m as Ws, s as qs, t as $s, j as Gs, h as Ks, o as Qs, g as Js, d as Ys, i as Xs, u as Zs, q as er } from "./chunks/resolve-dashboard-input-context-BmWF9hSl.js";
30
30
  import "./chunks/index-CtoK1Lgu.js";
31
31
  import "react-dom";
32
- import "./chunks/index-DkQkMKa1.js";
32
+ import "./chunks/index-DeDHr3iz.js";
33
33
  import "./chunks/appearance-context-DEYtWinQ.js";
34
34
  import "./chunks/color-CJvdlFM_.js";
35
35
  import "./chunks/index-CLIro-EG.js";
36
- import "./chunks/bookmark-state-C4vetoa0.js";
37
- import { I as fe } from "./chunks/use-create-flow-overlay-state-DZBZiiD-.js";
36
+ import "./chunks/bookmark-state-Cu-a5ie_.js";
37
+ import { I as fe } from "./chunks/use-create-flow-overlay-state-CbGIjaVD.js";
38
38
  import { C as me } from "./chunks/x-4f5U2XwU.js";
39
39
  import "./chunks/appearance-runtime-provider-B-M8gwlZ.js";
40
40
  const he = { cssWidth: 960, cssHeight: 540 };
@@ -1,5 +1,5 @@
1
- import { a, R as s, D as o } from "../chunks/report-preferences-dialog-4QEZWe5U.js";
2
- import { C as f, E as D } from "../chunks/table-settings-CunhoDUi.js";
1
+ import { a, R as s, D as o } from "../chunks/report-preferences-dialog-CM7kXmXp.js";
2
+ import { C as f, E as D } from "../chunks/table-settings-WysCBj62.js";
3
3
  export {
4
4
  f as CONTROL_CARD_DEFAULT_VALUE,
5
5
  a as DisplayFormatPreferencesFields,
@@ -147,6 +147,13 @@ type BaseFilter = {
147
147
  * intersects with it (analytics kernel P2a-01).
148
148
  */
149
149
  dateOwner?: 'global_date';
150
+ /**
151
+ * Only for a mapping `relationship` target (relationship filter reach,
152
+ * RF-D10): the server resolves exactly these ids or blocks the card.
153
+ */
154
+ relationshipRoute?: {
155
+ relationshipIds: string[];
156
+ };
150
157
  };
151
158
  type FilterForString = BaseFilter & {
152
159
  operation: 'like' | 'not like';
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Preview screen sizes without editing (responsive layouts RL-D19): opens the
3
- * sheet's floating size control, look-only, at the size the grid shows now.
4
- * The host places it beside the Activity bell for people who can edit the dashboard. Reads
5
- * only the dashboard store, so semaphor-app mounts it in its own toolbar too.
2
+ * Opens and closes the sheet's screen-size bar (responsive layouts RL-D19,
3
+ * RL-D21). While editing, the bar shows Desktop, Laptop, Tablet, Phone and
4
+ * Small phone and lets Tablet and Phone be customized; while viewing, it is a
5
+ * look-only preview starting at the size the grid shows now. Closed by default.
6
+ * The host places it beside the Activity bell for people who can edit the
7
+ * dashboard. Reads only the dashboard store, so semaphor-app mounts it in its
8
+ * own toolbar too.
6
9
  */
7
10
  export declare function ScreenSizePreviewButton(): import("react").JSX.Element | null;
@@ -1,3 +1,4 @@
1
+ import { SemaphorFilterReachEntry } from '../../../shared/analytics-protocol/index.js';
1
2
  import { MatrixCardCatalog } from '../../../lib/matrix-table/matrix-card-adapter.js';
2
3
  import { TCard, TFrame } from '../../../lib/types/common-types.js';
3
4
  import { MatrixDeliveryContext } from '../../../lib/matrix-table/matrix-delivery.js';
@@ -9,6 +10,8 @@ type Props = {
9
10
  capabilities?: MatrixInteractionHost['capabilities'];
10
11
  onSizingChange?: (sizes: Record<string, number>) => void;
11
12
  onDeliveryChange?: (context: MatrixDeliveryContext | undefined) => void;
13
+ /** The latest window's per-filter report, for the card's filter info (relationship filter reach RF-D13). */
14
+ onFilterReachChange?: (filterReach: SemaphorFilterReachEntry[]) => void;
12
15
  mode: 'dashboard' | 'expanded' | 'editor';
13
16
  };
14
17
  /** One renderer adapter for dashboard, editor and expanded hosts. */
@@ -1,7 +1,7 @@
1
- import { C as s, E as r, V as l, i as o, c as i, g as n, f as d, b as m, e as u, d as E, a as c, u as p, s as C, h as T, j as D, q as A, o as I, m as _, n as F, p as S, k as b, l as L, r as f, t as N } from "../chunks/table-settings-CunhoDUi.js";
1
+ import { C as s, E as r, V as l, i as o, c as i, g as n, f as d, b as m, e as u, d as E, a as c, u as p, s as C, h as T, j as D, q as A, o as I, m as _, n as F, p as S, k as b, l as L, r as f, t as N } from "../chunks/table-settings-WysCBj62.js";
2
2
  import { C as y, D as M, L as g, P as h, e as x, g as O, j as V, h as k, k as w, d as U, b as B, i as K, c as z, n as v, f as P } from "../chunks/validators-C-aOQlTB.js";
3
3
  import { D as q } from "../chunks/token-types-BMqRmT-C.js";
4
- import { B as Q, a as j, p as W, r as J } from "../chunks/bookmark-state-C4vetoa0.js";
4
+ import { B as Q, a as j, p as W, r as J } from "../chunks/bookmark-state-Cu-a5ie_.js";
5
5
  import { r as H, a as Z } from "../chunks/pivot-result-identity-C-Q1j1Wb.js";
6
6
  import { D as ee } from "../chunks/report-runtime-context-hWiTCzFV.js";
7
7
  const e = [
@@ -1,6 +1,7 @@
1
1
  import { TFilter } from '../../components/surfboard/filter/types.js';
2
2
  import { DashboardInputScope, TCard, TDashboard } from '../types/common-types.js';
3
- import { DashboardFilterApplication, DashboardFilterCardApplication, DashboardFilterTarget, DashboardFilterTargetField } from '../../shared/dashboard-authoring/index.js';
3
+ import { DashboardFilterApplication, DashboardFilterCardApplication, DashboardFilterRelationshipTarget, DashboardFilterFieldTarget, DashboardFilterTarget, DashboardFilterTargetField, DashboardFilterOptionSource, FilterReachPreviewCard, FilterReachCardPreview, FilterReachPathOption } from '../../shared/dashboard-authoring/index.js';
4
+ import { SemaphorRelationshipRoute, SemaphorSkippedConstraintReason } from '../../shared/analytics-protocol/index.js';
4
5
  import { FilterRef, ReachedCard } from '../../shared/dashboard-authoring/filter-model/index.js';
5
6
  /**
6
7
  * Filter mapping (one filter model M3, SPEC 4.4): the Cards tab of any filter
@@ -9,19 +10,169 @@ import { FilterRef, ReachedCard } from '../../shared/dashboard-authoring/filter-
9
10
  */
10
11
  export type DashboardFilterMappingCandidateCatalog = {
11
12
  status: 'ready';
12
- targets: DashboardFilterTarget[];
13
+ targets: DashboardFilterFieldTarget[];
13
14
  } | {
14
15
  status: 'metadataUnavailable';
15
16
  message?: string;
16
17
  };
17
- export type DashboardFilterMappingDraftDecision = {
18
- kind: 'bound';
19
- target: DashboardFilterTarget;
18
+ /**
19
+ * What the author decided for a card, as the draft stands: what Accept saves
20
+ * (relationship filter reach S-D, RF-INV-14). A change staged in this
21
+ * popover, else the card's saved entry, else Auto.
22
+ */
23
+ export type DashboardFilterCardDecision =
24
+ /** No entry of its own: the card applies the filter on its own field when that is proven, else through the domain's relationships. */
25
+ {
26
+ kind: 'auto';
27
+ } | {
28
+ kind: 'field';
29
+ target: DashboardFilterFieldTarget;
30
+ }
31
+ /** A chosen relationship path (RF-D10). */
32
+ | {
33
+ kind: 'path';
34
+ target: DashboardFilterRelationshipTarget;
20
35
  } | {
21
36
  kind: 'excluded';
22
37
  };
23
- export type DashboardFilterMappingDraftStatus = 'pendingSource' | 'automatic' | 'suggested' | 'needsMapping' | 'mapped' | 'notApplicable' | 'excluded' | 'invalidMapping' | 'metadataUnavailable';
24
- export type DashboardFilterMappingDraftRow = {
38
+ /** Where a row's decision comes from: a change in this popover, the saved mapping, or neither. */
39
+ export type DashboardFilterDecisionOrigin = 'staged' | 'saved' | 'none';
40
+ /** What runs for a card's decision, as the draft stands (RF-INV-14). */
41
+ export type DashboardFilterCardOutcome =
42
+ /** On a field of the card: the one the author bound, the one Auto proves (or a click borrows), or the one a SQL card takes the value by. */
43
+ {
44
+ kind: 'appliesOnField';
45
+ target: DashboardFilterFieldTarget;
46
+ how: 'bound';
47
+ } | {
48
+ kind: 'appliesOnField';
49
+ target: DashboardFilterFieldTarget;
50
+ how: 'automatic';
51
+ } | {
52
+ kind: 'appliesOnField';
53
+ target: DashboardFilterFieldTarget;
54
+ how: 'sql';
55
+ name: string;
56
+ }
57
+ /** Through the domain's relationships, on the server's route. */
58
+ | {
59
+ kind: 'appliesThroughPath';
60
+ route: SemaphorRelationshipRoute;
61
+ }
62
+ /** The card's query already uses the value's dataset, so no path is needed (ledger R-05). */
63
+ | {
64
+ kind: 'appliesOnOwnData';
65
+ }
66
+ /** Auto, and more than one equally preferred path: the card skips the filter until one is chosen; Accept isn't refused (RF-D28). */
67
+ | {
68
+ kind: 'needsPath';
69
+ }
70
+ /**
71
+ * Auto, and the card's fields need the author: a same-named field to
72
+ * accept, a SQL card that takes the value by name until a field is
73
+ * chosen, or a choice among fields, which refuses Accept.
74
+ */
75
+ | {
76
+ kind: 'needsField';
77
+ need: 'accept';
78
+ suggestion: DashboardFilterFieldTarget;
79
+ reason?: SemaphorSkippedConstraintReason;
80
+ } | {
81
+ kind: 'needsField';
82
+ need: 'sqlByName';
83
+ name?: string;
84
+ reason?: SemaphorSkippedConstraintReason;
85
+ } | {
86
+ kind: 'needsField';
87
+ need: 'choose';
88
+ reason?: SemaphorSkippedConstraintReason;
89
+ }
90
+ /**
91
+ * The filter doesn't reach the card, with the server's reason or the
92
+ * card's guidance when there is one. `unmatched`: a field a click carries
93
+ * matches none of the card's fields, so the click drops it (no choice).
94
+ */
95
+ | {
96
+ kind: 'notApplied';
97
+ reason?: SemaphorSkippedConstraintReason;
98
+ message?: string;
99
+ unmatched?: true;
100
+ }
101
+ /**
102
+ * The decision can't run: a stale field, a path the domain no longer has,
103
+ * a path for another value field. Refuses Accept. `target`: the field that
104
+ * can't run when the decision doesn't name it (a click's borrowed binding).
105
+ */
106
+ | {
107
+ kind: 'blocked';
108
+ message: string;
109
+ reason?: SemaphorSkippedConstraintReason;
110
+ target?: DashboardFilterFieldTarget;
111
+ } | {
112
+ kind: 'excluded';
113
+ }
114
+ /** Waiting for the server's answer for this decision, or the request failed (ledger R-08). */
115
+ | {
116
+ kind: 'checking';
117
+ failed?: true;
118
+ }
119
+ /** The card's source isn't chosen yet, or its fields couldn't be loaded, which refuses Accept. */
120
+ | {
121
+ kind: 'unavailable';
122
+ cause: 'source' | 'fields';
123
+ message?: string;
124
+ reason?: SemaphorSkippedConstraintReason;
125
+ };
126
+ type OutcomeOf<K extends DashboardFilterCardOutcome['kind']> = Extract<DashboardFilterCardOutcome, {
127
+ kind: K;
128
+ }>;
129
+ /**
130
+ * A card's decision with what can run for it: exactly the pairs `cardRow`
131
+ * makes (RF-INV-14). A row changed after `cardRow` into another pair, such
132
+ * as Automatic with a bound field, doesn't compile (ledger R-27).
133
+ */
134
+ export type DashboardFilterCardState = {
135
+ decision: Extract<DashboardFilterCardDecision, {
136
+ kind: 'auto';
137
+ }>;
138
+ outcome: Extract<DashboardFilterCardOutcome, {
139
+ kind: 'appliesOnField';
140
+ how: 'automatic' | 'sql';
141
+ }> | OutcomeOf<'appliesThroughPath' | 'appliesOnOwnData' | 'needsPath' | 'needsField' | 'notApplied' | 'blocked' | 'checking' | 'unavailable'>;
142
+ } | {
143
+ decision: Extract<DashboardFilterCardDecision, {
144
+ kind: 'field';
145
+ }>;
146
+ outcome: Extract<DashboardFilterCardOutcome, {
147
+ kind: 'appliesOnField';
148
+ how: 'bound';
149
+ }> | OutcomeOf<'blocked' | 'notApplied' | 'unavailable'>;
150
+ } | {
151
+ decision: Extract<DashboardFilterCardDecision, {
152
+ kind: 'path';
153
+ }>;
154
+ outcome: OutcomeOf<'appliesThroughPath' | 'appliesOnOwnData' | 'checking' | 'blocked' | 'notApplied'>;
155
+ } | {
156
+ decision: Extract<DashboardFilterCardDecision, {
157
+ kind: 'excluded';
158
+ }>;
159
+ outcome: OutcomeOf<'excluded' | 'unavailable' | 'notApplied'>;
160
+ };
161
+ /** What a row shows, in the names the Cards tab has always used; read from `presentDashboardFilterMappingRow`. */
162
+ export type DashboardFilterMappingRowState = 'pendingSource' | 'automatic' | 'suggested' | 'needsMapping' | 'mapped' | 'notApplicable' | 'excluded' | 'invalidMapping' | 'metadataUnavailable'
163
+ /** Auto, through the domain's relationships (with a route), or on the card's own data (none). */
164
+ | 'relationship'
165
+ /** Auto, and more than one equally preferred path (P-7, RF-D10). */
166
+ | 'chooseRoute'
167
+ /** Waiting for the server's relationship answer, or it failed. */
168
+ | 'relationshipChecking';
169
+ /**
170
+ * One card in the Cards tab: the author's decision and what runs for it
171
+ * (`DashboardFilterCardState`), made only by `cardRow`. Every reader (the
172
+ * panel, the summary, Accept, the click review) reads these two, through
173
+ * `presentDashboardFilterMappingRow` for display.
174
+ */
175
+ export type DashboardFilterMappingDraftRow = DashboardFilterCardState & {
25
176
  cardId: string;
26
177
  /** The panel reads the title and meta line from it. */
27
178
  card: TCard;
@@ -31,13 +182,150 @@ export type DashboardFilterMappingDraftRow = {
31
182
  /** The section's title, for a card in a Document section. */
32
183
  sectionTitle?: string;
33
184
  executionKind: 'config' | 'sql' | 'unconfigured';
34
- status: DashboardFilterMappingDraftStatus;
35
- candidates: DashboardFilterTarget[];
36
- selectedTarget?: DashboardFilterTarget;
185
+ decisionOrigin: DashboardFilterDecisionOrigin;
186
+ /** The card's fields that can take the filter. */
187
+ fields: DashboardFilterFieldTarget[];
188
+ /** The card's equally preferred paths when it has a tie, whatever the decision (RF-D27). */
189
+ paths: FilterReachPathOption[];
190
+ /** The card's saved entry, as saved. */
37
191
  persistedApplication?: DashboardFilterCardApplication;
38
- metadataMessage?: string;
39
- guidanceMessage?: string;
40
- automaticFieldName?: string;
192
+ };
193
+ /** The row's control, as it reads when closed. */
194
+ export type DashboardFilterMappingRowTrigger = {
195
+ kind: 'notApplied';
196
+ }
197
+ /**
198
+ * A field, with "Auto ·" or "Suggested ·" before it. `muted`: the field
199
+ * doesn't apply yet (a suggestion), so all of it reads quiet.
200
+ */
201
+ | {
202
+ kind: 'field';
203
+ target: DashboardFilterFieldTarget;
204
+ prefix?: 'Auto' | 'Suggested';
205
+ muted?: true;
206
+ }
207
+ /** A SQL card's Auto: the field it takes the value by. */
208
+ | {
209
+ kind: 'sqlAuto';
210
+ target: DashboardFilterFieldTarget;
211
+ name: string;
212
+ }
213
+ /** A path in words, with "Auto ·" before it when the domain's relationships chose it. */
214
+ | {
215
+ kind: 'route';
216
+ route: SemaphorRelationshipRoute;
217
+ auto: boolean;
218
+ } | {
219
+ kind: 'checking';
220
+ } | {
221
+ kind: 'text';
222
+ text: string;
223
+ tone: 'muted' | 'strong' | 'attention';
224
+ };
225
+ /**
226
+ * What Automatic does on the card, said under its menu entry: the path or
227
+ * field it uses, that it skips the card until a path is chosen, or that it
228
+ * doesn't reach the card. Absent when not known for the row's decision.
229
+ */
230
+ export type DashboardFilterAutoDescription = {
231
+ kind: 'skipsUntilPathChosen';
232
+ } | {
233
+ kind: 'route';
234
+ route: SemaphorRelationshipRoute;
235
+ } | {
236
+ kind: 'ownData';
237
+ } | {
238
+ kind: 'field';
239
+ target: DashboardFilterFieldTarget;
240
+ } | {
241
+ kind: 'checking';
242
+ } | {
243
+ kind: 'notApplied';
244
+ reason?: SemaphorSkippedConstraintReason;
245
+ };
246
+ /** A line under the row. */
247
+ export type DashboardFilterMappingRowNote =
248
+ /** A chosen path that can't run: the server's reason, else its message. */
249
+ {
250
+ kind: 'pathBlocked';
251
+ message: string;
252
+ reason?: SemaphorSkippedConstraintReason;
253
+ } | {
254
+ kind: 'fieldBlocked';
255
+ } | {
256
+ kind: 'needsPath';
257
+ } | {
258
+ kind: 'fieldsUnavailable';
259
+ message: string;
260
+ } | {
261
+ kind: 'sqlPinnedSources';
262
+ };
263
+ /**
264
+ * What a row shows, counts as and offers: one reading of its decision and
265
+ * outcome (RF-INV-14). The panel, the popover summary and the click review
266
+ * read rows only through it.
267
+ */
268
+ export type DashboardFilterMappingRowView = {
269
+ state: DashboardFilterMappingRowState;
270
+ /** The status column of the table review. */
271
+ label: string;
272
+ /**
273
+ * Colour means something needs fixing (relationship filter reach R-31):
274
+ * `review` (amber) a field must be chosen before saving, `invalid` (red) a
275
+ * decision that no longer runs. Everything else is `quiet`, offers too.
276
+ */
277
+ tone: 'quiet' | 'review' | 'invalid';
278
+ /**
279
+ * How the row counts in the summary: applied, an open offer (a suggested
280
+ * field, a path to choose), not applied, a field to choose, or invalid;
281
+ * none while its source or the server's answer is pending.
282
+ */
283
+ count?: 'covered' | 'suggested' | 'pathChoice' | 'excluded' | 'needsChoice' | 'invalid';
284
+ /** Something breaks or blocks saving: a field to choose, or invalid. The Cards tab dot and the chip warning. */
285
+ attention: boolean;
286
+ /** A suggested field the row offers to use in one click ("Use"). */
287
+ suggestion?: DashboardFilterFieldTarget;
288
+ /** Accept is refused while the row stands: a decision that can't run, a field to choose, fields not loaded. */
289
+ blocksAccept: boolean;
290
+ /** A menu, or a control that only says why there is nothing to choose. */
291
+ control: {
292
+ kind: 'menu';
293
+ } | {
294
+ kind: 'static';
295
+ text: string;
296
+ offerFieldsRetry: boolean;
297
+ };
298
+ trigger: DashboardFilterMappingRowTrigger;
299
+ border: 'default' | 'review' | 'invalid' | 'dashed';
300
+ note?: DashboardFilterMappingRowNote;
301
+ /**
302
+ * The menu, in order: Auto, the tie's paths, the card's fields, "Don't
303
+ * apply", and "Check relationships again" while a check failed. The
304
+ * decision is the one checked entry; picking it again changes nothing.
305
+ */
306
+ menu: {
307
+ auto: {
308
+ label: string;
309
+ checked: boolean;
310
+ description?: DashboardFilterAutoDescription;
311
+ };
312
+ paths: Array<{
313
+ path: FilterReachPathOption;
314
+ checked: boolean;
315
+ }>;
316
+ /** The field a `field` decision binds, as the card lists it. */
317
+ checkedField?: DashboardFilterFieldTarget;
318
+ /**
319
+ * The field Auto proves on this card: picking it keeps Auto, so a filter
320
+ * with no mapping isn't mapped by confirming what already applies.
321
+ */
322
+ autoField?: DashboardFilterFieldTarget;
323
+ excludedChecked: boolean;
324
+ /** "Check relationships again" (ledger R-08). */
325
+ offerRetry: boolean;
326
+ };
327
+ /** The row involves the domain's relationships, so "Manage relationships" helps. */
328
+ throughRelationships: boolean;
41
329
  };
42
330
  export type DashboardFilterMappingGroup = {
43
331
  sheetId: string;
@@ -64,9 +352,15 @@ export type DashboardFilterMappingAcceptance = {
64
352
  };
65
353
  export type DashboardFilterMappingStatusSummary = {
66
354
  coveredCount: number;
67
- reviewCount: number;
355
+ /** Cards with a suggested field to use; they aren't filtered until it's used. */
356
+ suggestedCount: number;
357
+ /** Cards with equally preferred paths; they aren't filtered until one is chosen. */
358
+ pathChoiceCount: number;
68
359
  excludedCount: number;
360
+ /** Cards that need a field chosen before the mapping can be saved. */
361
+ needsChoiceCount: number;
69
362
  invalidCount: number;
363
+ /** What breaks or blocks saving (needs a field, invalid): the Cards tab dot and the chip warning. */
70
364
  attentionCount: number;
71
365
  };
72
366
  export type DashboardFilterMappingDraft = {
@@ -99,6 +393,11 @@ export type DashboardFilterMappingRequest = {
99
393
  stagedDefinition?: TFilter;
100
394
  /** The scope being edited, if changed; otherwise the saved scope, unnarrowed (OF-D8). */
101
395
  stagedScope?: DashboardInputScope;
396
+ /**
397
+ * The Option Source being edited: undefined keeps the saved one, null drops
398
+ * it. The filter's value is judged by it, as the runtime will (ledger R-04).
399
+ */
400
+ stagedOptionSource?: DashboardFilterOptionSource | null;
102
401
  candidatesByCardId: Record<string, DashboardFilterMappingCandidateCatalog | undefined>;
103
402
  /** Grounded field that supplies the current filter value. */
104
403
  selectionField?: Pick<DashboardFilterTargetField, 'name' | 'sourceField'> & Partial<Pick<DashboardFilterTargetField, 'source'>>;
@@ -111,22 +410,47 @@ export type DashboardFilterMappingRequest = {
111
410
  selectionDataType?: string;
112
411
  /** Re-check saved targets after the option value field changed. */
113
412
  revalidatePersistedTargets?: boolean;
114
- decisionsByCardId?: Record<string, DashboardFilterMappingDraftDecision | undefined>;
413
+ decisionsByCardId?: Record<string, DashboardFilterCardDecision | undefined>;
414
+ /**
415
+ * The server's relationship preview per card (`POST /api/v1/filter-reach`,
416
+ * relationship filter reach Phase 3). The draft never resolves routes.
417
+ */
418
+ relationshipPreviewsByCardId?: Record<string, FilterReachCardPreview | undefined>;
419
+ /**
420
+ * The server preview could not be read. Cards waiting on it say so instead
421
+ * of checking forever; nothing is saved for them, so Accept is not blocked
422
+ * (ledger R-08).
423
+ */
424
+ relationshipPreviewFailed?: boolean;
115
425
  /** Test seam for new binding ids; production uses opaque random UUIDs. */
116
426
  createId?: () => string;
117
427
  };
118
428
  /**
119
- * One presentation-neutral projection of authoritative Cards-tab rows.
120
- * Consumers must not independently reinterpret draft statuses when deciding
121
- * whether an author needs to act.
429
+ * The Cards tab's counts, from each row's view: the one reading every
430
+ * surface uses to decide whether the author needs to act.
122
431
  */
123
432
  export declare function summarizeDashboardFilterMappingRows(rows: DashboardFilterMappingDraftRow[]): DashboardFilterMappingStatusSummary;
433
+ /**
434
+ * What breaks or blocks saving, in words, for the chip warning, the Cards
435
+ * tab dot and the popover footer (relationship filter reach R-31). Absent
436
+ * when nothing does.
437
+ */
438
+ export declare function describeDashboardFilterMappingAttention(summary: DashboardFilterMappingStatusSummary): {
439
+ tone: 'invalid' | 'review';
440
+ text: string;
441
+ } | undefined;
442
+ /**
443
+ * Open offers, in words, for the popover footer: cards that aren't filtered
444
+ * until the author uses a suggestion or chooses a path. Information, not a
445
+ * warning (R-31). Absent when there are none.
446
+ */
447
+ export declare function describeDashboardFilterMappingOffers(summary: DashboardFilterMappingStatusSummary): string | undefined;
124
448
  /**
125
449
  * One Cards row for a source-qualified value field that is not a toolbar
126
450
  * filter, such as a field a click carries. It is the same decision chain the
127
- * toolbar filter's rows go through (`rowFromCandidates`), so automatic,
128
- * suggested, mapped, excluded and needs-mapping mean the same thing on every
129
- * authoring surface. Equality is the only operation a click applies.
451
+ * toolbar filter's rows go through (`cardRow`), so automatic, suggested,
452
+ * mapped, excluded and needs-mapping mean the same thing on every authoring
453
+ * surface. Equality is the only operation a click applies.
130
454
  */
131
455
  export declare function buildDashboardFilterMappingDraftRowForValueField(params: {
132
456
  card: TCard;
@@ -136,10 +460,47 @@ export declare function buildDashboardFilterMappingDraftRowForValueField(params:
136
460
  sectionTitle?: string;
137
461
  valueField: DashboardFilterTargetField;
138
462
  catalog: DashboardFilterMappingCandidateCatalog | undefined;
139
- decision?: DashboardFilterMappingDraftDecision;
463
+ /** The click's own decision for the card: its binding, "Don't apply", or none (Auto). */
464
+ decision?: DashboardFilterCardDecision;
140
465
  persistedApplication?: DashboardFilterCardApplication;
141
466
  /** Bindings already accepted elsewhere for this value field, offered as inherited matches. */
142
467
  acceptedTargets?: DashboardFilterTarget[];
468
+ /** A filter's binding Auto applies first (`cardRow`'s `borrowedTarget`). */
469
+ borrowedTarget?: DashboardFilterFieldTarget;
470
+ /** What a card with no matching field gets (`cardRow`'s `unmatchedField`). */
471
+ unmatchedField?: 'choose' | 'notApplied';
143
472
  }): DashboardFilterMappingDraftRow;
473
+ /** The decision that saves a target the author picked: a field, or a path. */
474
+ export declare function dashboardFilterCardDecisionForTarget(target: DashboardFilterTarget): DashboardFilterCardDecision;
475
+ /**
476
+ * A card's decision as the draft stands, and where it comes from: a change
477
+ * staged in this popover, else the saved entry, else Auto. The rows and the
478
+ * preview's card list both read it here.
479
+ */
480
+ export declare function draftCardDecision(staged: DashboardFilterCardDecision | undefined, persisted: DashboardFilterCardApplication | undefined): {
481
+ decision: DashboardFilterCardDecision;
482
+ origin: DashboardFilterDecisionOrigin;
483
+ };
484
+ /**
485
+ * What a row shows, counts as and offers, read from its decision and
486
+ * outcome only (relationship filter reach S-D, RF-INV-14).
487
+ */
488
+ export declare function presentDashboardFilterMappingRow(row: DashboardFilterMappingDraftRow): DashboardFilterMappingRowView;
144
489
  /** The one entry point of M3 (SPEC 4.4). Pure. */
145
490
  export declare function draftDashboardFilterMapping(request: DashboardFilterMappingRequest): DashboardFilterMappingDraftResult;
491
+ /**
492
+ * The cards in a staged filter's scope whose relationship reach the server
493
+ * preview should resolve, each with the route the draft runs it with (ledger
494
+ * R-02): cards with a chosen route, staged or saved, and cards the card
495
+ * target decision runs through the domain's relationships when unmapped (row
496
+ * 7r). Empty when there are none, so no preview is requested.
497
+ */
498
+ export declare function listRelationshipPreviewCards(params: {
499
+ ref: FilterRef;
500
+ dashboard: TDashboard;
501
+ stagedDefinition?: TFilter;
502
+ stagedScope?: DashboardInputScope;
503
+ stagedOptionSource?: DashboardFilterOptionSource | null;
504
+ decisionsByCardId?: Record<string, DashboardFilterCardDecision | undefined>;
505
+ }): FilterReachPreviewCard[];
506
+ export {};