@burdenoff/fe-libs 2026.723.2 → 2026.723.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"NavCustomizeDialog.d.ts","sourceRoot":"","sources":["../../src/chrome/NavCustomizeDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA6DD,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,UAAU,EACV,eAA8B,GAC/B,EAAE,uBAAuB,kDAmIzB"}
1
+ {"version":3,"file":"NavCustomizeDialog.d.ts","sourceRoot":"","sources":["../../src/chrome/NavCustomizeDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAyFD,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,UAAU,EACV,eAA8B,GAC/B,EAAE,uBAAuB,kDA6RzB"}
@@ -4,24 +4,24 @@ import { Switch as o } from "../ui/switch.js";
4
4
  import { useSafePermissions as s } from "../shared/providers/shell/PermissionProvider.js";
5
5
  import { useSafePersonaSurface as c } from "../shared/providers/shell/PersonaSurfaceProvider.js";
6
6
  import { applyPermissionFilter as l, isItemEffectivelyShown as u } from "./sideNavigation/navVisibility.js";
7
- import { useMemo as d } from "react";
8
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
7
+ import { useEffect as d, useMemo as f, useState as p } from "react";
8
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
9
9
  //#region src/chrome/NavCustomizeDialog.tsx
10
- function h({ item: e, depth: t, parentShown: n, surfaceVisibleItems: r, overrides: i, onToggle: a }) {
10
+ function _({ item: e, depth: t, parentShown: n, surfaceVisibleItems: r, overrides: i, onToggle: a }) {
11
11
  let s = u(e, n, r, i), c = s && (!r || r.includes(e.id) || i[e.id] === "shown");
12
- return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ m("div", {
12
+ return /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ g("div", {
13
13
  className: "flex items-center justify-between gap-3 py-1.5",
14
14
  style: { paddingLeft: t * 16 },
15
- children: [/* @__PURE__ */ p("span", {
15
+ children: [/* @__PURE__ */ h("span", {
16
16
  className: `truncate text-body-sm ${s ? "text-text-primary" : "text-text-muted"}`,
17
17
  children: e.label
18
- }), /* @__PURE__ */ p(o, {
18
+ }), /* @__PURE__ */ h(o, {
19
19
  checked: s,
20
20
  onCheckedChange: (t) => a(e, n, t === !0),
21
21
  "aria-label": `Show ${e.label} in the menu`,
22
22
  "data-testid": `persona-toggle-${e.id}`
23
23
  })]
24
- }), e.children?.map((e) => /* @__PURE__ */ p(h, {
24
+ }), e.children?.map((e) => /* @__PURE__ */ h(_, {
25
25
  item: e,
26
26
  depth: t + 1,
27
27
  parentShown: c,
@@ -30,94 +30,221 @@ function h({ item: e, depth: t, parentShown: n, surfaceVisibleItems: r, override
30
30
  onToggle: a
31
31
  }, e.id))] });
32
32
  }
33
- function g({ groupLabels: o, groupOrder: f, everythingLabel: g = "Everything" }) {
34
- let _ = c(), v = s(), y = a((e) => e.items), b = v?.hasPermission, x = v?.isLoading ?? !1, S = d(() => {
35
- let e = y.filter((e) => e.visible !== !1);
36
- return !b || x ? e : l(e, b);
33
+ function v(e, t, n) {
34
+ let r = [], i = (e, a) => {
35
+ for (let o of e) {
36
+ let e = u(o, a, t, n);
37
+ e && r.push(o.id);
38
+ let s = e && (!t || t.includes(o.id) || n[o.id] === "shown");
39
+ o.children && i(o.children, s);
40
+ }
41
+ };
42
+ return i(e, !1), r;
43
+ }
44
+ function y({ groupLabels: o, groupOrder: m, everythingLabel: y = "Everything" }) {
45
+ let b = c(), x = s(), S = a((e) => e.items), [C, w] = p(""), [T, E] = p(null), [D, O] = p(!1), [k, A] = p(null), j = x?.hasPermission, M = x?.isLoading ?? !1, N = f(() => {
46
+ let e = S.filter((e) => e.visible !== !1);
47
+ return !j || M ? e : l(e, j);
37
48
  }, [
38
- y,
39
- b,
40
- x
41
- ]), C = d(() => {
49
+ S,
50
+ j,
51
+ M
52
+ ]);
53
+ d(() => {
54
+ w(""), E(null), A(null);
55
+ }, [b?.customizeOpen ?? !1]);
56
+ let ee = f(() => {
42
57
  let e = /* @__PURE__ */ new Map();
43
- for (let t of S) {
58
+ for (let t of N) {
44
59
  let n = t.group ?? "__default__", r = e.get(n);
45
60
  r ? r.push(t) : e.set(n, [t]);
46
61
  }
47
- return [...f ?? [], ...Array.from(e.keys()).filter((e) => !(f ?? []).includes(e))].filter((t) => (e.get(t)?.length ?? 0) > 0).map((t) => ({
62
+ return [...m ?? [], ...Array.from(e.keys()).filter((e) => !(m ?? []).includes(e))].filter((t) => (e.get(t)?.length ?? 0) > 0).map((t) => ({
48
63
  key: t,
49
64
  label: t === "__default__" ? null : o?.[t] ?? t,
50
65
  items: e.get(t) ?? []
51
66
  }));
52
67
  }, [
53
- S,
54
- f,
68
+ N,
69
+ m,
55
70
  o
56
71
  ]);
57
- if (!_) return null;
58
- let { activeSurfaceId: w, activeSurface: T, overrides: E, setItemOverride: D, resetOverrides: O, customizeOpen: k, setCustomizeOpen: A, simulation: j } = _, M = T ? T.visibleItems : null, N = (e, t, n) => {
59
- let r = u(e, t, M, {});
60
- D(e.id, n === r ? null : n ? "shown" : "hidden");
61
- }, P = Object.keys(E).length, F = w === "everything" ? g : T?.label ?? w;
62
- return /* @__PURE__ */ p(e, {
63
- open: k,
64
- onOpenChange: A,
65
- children: /* @__PURE__ */ m(t, {
72
+ if (!b) return null;
73
+ let { activeSurfaceId: P, activeSurface: F, overrides: I, setItemOverride: L, resetOverrides: R, customizeOpen: z, setCustomizeOpen: te, simulation: B, customViews: ne, canManageViews: V, createCustomView: H, renameCustomView: U, deleteCustomView: W } = b, G = F ? F.visibleItems : null, K = (e, t, n) => {
74
+ let r = u(e, t, G, {});
75
+ L(e.id, n === r ? null : n ? "shown" : "hidden");
76
+ }, q = Object.keys(I).length, J = P === "everything" ? y : F?.label ?? P, Y = ne.find((e) => e.id === P) ?? null, X = async () => {
77
+ let e = C.trim();
78
+ if (!e || D) return;
79
+ O(!0), A(null);
80
+ let t = await H(e, v(N, G, I));
81
+ O(!1), t ? w("") : A("Could not save the view — try a different name.");
82
+ }, Z = async () => {
83
+ if (!Y || T === null || D) return;
84
+ let e = T.trim();
85
+ if (!e || e === Y.name) {
86
+ E(null);
87
+ return;
88
+ }
89
+ O(!0), A(null);
90
+ let t = await U(Y.id, e);
91
+ O(!1), t ? E(null) : A("Could not rename the view — try a different name.");
92
+ }, re = async () => {
93
+ if (!Y || D) return;
94
+ O(!0), A(null);
95
+ let e = await W(Y.id);
96
+ O(!1), e || A("Could not delete the view.");
97
+ }, Q = "w-full rounded-button border border-border-subtle bg-bg-canvas px-3 py-2 text-body-sm text-text-primary placeholder:text-text-muted", $ = "rounded-button border border-border-subtle px-3 py-2 text-body-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors disabled:opacity-50";
98
+ return /* @__PURE__ */ h(e, {
99
+ open: z,
100
+ onOpenChange: te,
101
+ children: /* @__PURE__ */ g(t, {
66
102
  className: "max-h-[85vh] overflow-y-auto sm:max-w-lg",
67
- children: [/* @__PURE__ */ m(r, { children: [/* @__PURE__ */ p(i, { children: "Customize menu" }), /* @__PURE__ */ m(n, { children: [
103
+ children: [/* @__PURE__ */ g(r, { children: [/* @__PURE__ */ h(i, { children: "Customize menu" }), /* @__PURE__ */ g(n, { children: [
68
104
  "Choose which pages appear in the",
69
105
  " ",
70
- /* @__PURE__ */ p("span", {
106
+ /* @__PURE__ */ h("span", {
71
107
  className: "font-medium text-text-primary",
72
- children: F
108
+ children: J
73
109
  }),
74
110
  " view. Hidden pages stay one click away under “more” and in search — nothing is removed."
75
- ] })] }), /* @__PURE__ */ p("div", {
111
+ ] })] }), /* @__PURE__ */ g("div", {
76
112
  className: "space-y-5",
77
- children: /* @__PURE__ */ m("section", {
78
- className: "space-y-1",
79
- "data-testid": "persona-dialog-items",
80
- children: [/* @__PURE__ */ m("div", {
81
- className: "flex items-center justify-between",
82
- children: [/* @__PURE__ */ p("h3", {
113
+ children: [
114
+ Y && !B && /* @__PURE__ */ g("section", {
115
+ className: "space-y-2",
116
+ "data-testid": "persona-dialog-manage-view",
117
+ children: [/* @__PURE__ */ h("h3", {
83
118
  className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
84
- children: "Menu items"
85
- }), P > 0 && /* @__PURE__ */ m("button", {
86
- type: "button",
87
- onClick: O,
88
- className: "text-body-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
89
- "data-testid": "persona-dialog-reset-overrides",
119
+ children: "This view"
120
+ }), T === null ? /* @__PURE__ */ g("div", {
121
+ className: "flex items-center gap-2",
90
122
  children: [
91
- "Reset ",
92
- P,
93
- " change",
94
- P === 1 ? "" : "s"
123
+ /* @__PURE__ */ h("span", {
124
+ className: "min-w-0 flex-1 truncate text-body-sm text-text-primary",
125
+ children: Y.name
126
+ }),
127
+ /* @__PURE__ */ h("button", {
128
+ type: "button",
129
+ onClick: () => E(Y.name),
130
+ className: $,
131
+ "data-testid": "persona-dialog-rename-view",
132
+ children: "Rename"
133
+ }),
134
+ /* @__PURE__ */ h("button", {
135
+ type: "button",
136
+ onClick: re,
137
+ disabled: D,
138
+ className: `${$} text-status-error-text`,
139
+ "data-testid": "persona-dialog-delete-view",
140
+ children: "Delete"
141
+ })
95
142
  ]
143
+ }) : /* @__PURE__ */ g("div", {
144
+ className: "flex items-center gap-2",
145
+ children: [/* @__PURE__ */ h("input", {
146
+ value: T,
147
+ onChange: (e) => E(e.target.value),
148
+ onKeyDown: (e) => {
149
+ e.key === "Enter" && Z();
150
+ },
151
+ maxLength: 60,
152
+ className: Q,
153
+ "data-testid": "persona-dialog-rename-input"
154
+ }), /* @__PURE__ */ h("button", {
155
+ type: "button",
156
+ onClick: () => void Z(),
157
+ disabled: D,
158
+ className: $,
159
+ "data-testid": "persona-dialog-rename-save",
160
+ children: "Save"
161
+ })]
96
162
  })]
97
- }), j ? /* @__PURE__ */ p("p", {
98
- className: "py-2 text-body-sm text-text-muted",
99
- children: "Exit role simulation to customize your own menu."
100
- }) : C.map((e) => /* @__PURE__ */ m("div", {
101
- className: "pt-2",
102
- children: [e.label && /* @__PURE__ */ p("p", {
103
- className: "pb-1 text-[11px] font-medium uppercase tracking-wider text-text-muted",
104
- children: e.label
105
- }), /* @__PURE__ */ p("div", {
106
- className: "divide-y divide-border-subtle",
107
- children: e.items.map((e) => /* @__PURE__ */ p(h, {
108
- item: e,
109
- depth: 0,
110
- parentShown: !1,
111
- surfaceVisibleItems: M,
112
- overrides: E,
113
- onToggle: N
114
- }, e.id))
115
- })]
116
- }, e.key))]
117
- })
163
+ }),
164
+ /* @__PURE__ */ g("section", {
165
+ className: "space-y-1",
166
+ "data-testid": "persona-dialog-items",
167
+ children: [/* @__PURE__ */ g("div", {
168
+ className: "flex items-center justify-between",
169
+ children: [/* @__PURE__ */ h("h3", {
170
+ className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
171
+ children: "Menu items"
172
+ }), q > 0 && /* @__PURE__ */ g("button", {
173
+ type: "button",
174
+ onClick: R,
175
+ className: "text-body-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
176
+ "data-testid": "persona-dialog-reset-overrides",
177
+ children: [
178
+ "Reset ",
179
+ q,
180
+ " change",
181
+ q === 1 ? "" : "s"
182
+ ]
183
+ })]
184
+ }), B ? /* @__PURE__ */ h("p", {
185
+ className: "py-2 text-body-sm text-text-muted",
186
+ children: "Exit role simulation to customize your own menu."
187
+ }) : ee.map((e) => /* @__PURE__ */ g("div", {
188
+ className: "pt-2",
189
+ children: [e.label && /* @__PURE__ */ h("p", {
190
+ className: "pb-1 text-[11px] font-medium uppercase tracking-wider text-text-muted",
191
+ children: e.label
192
+ }), /* @__PURE__ */ h("div", {
193
+ className: "divide-y divide-border-subtle",
194
+ children: e.items.map((e) => /* @__PURE__ */ h(_, {
195
+ item: e,
196
+ depth: 0,
197
+ parentShown: !1,
198
+ surfaceVisibleItems: G,
199
+ overrides: I,
200
+ onToggle: K
201
+ }, e.id))
202
+ })]
203
+ }, e.key))]
204
+ }),
205
+ V && !B && /* @__PURE__ */ g("section", {
206
+ className: "space-y-2",
207
+ "data-testid": "persona-dialog-save-view",
208
+ children: [
209
+ /* @__PURE__ */ h("h3", {
210
+ className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
211
+ children: "Save as new view"
212
+ }),
213
+ /* @__PURE__ */ h("p", {
214
+ className: "text-body-sm text-text-muted",
215
+ children: "Saves the menu exactly as configured above as your own view, available on all your devices."
216
+ }),
217
+ /* @__PURE__ */ g("div", {
218
+ className: "flex items-center gap-2",
219
+ children: [/* @__PURE__ */ h("input", {
220
+ value: C,
221
+ onChange: (e) => w(e.target.value),
222
+ onKeyDown: (e) => {
223
+ e.key === "Enter" && X();
224
+ },
225
+ placeholder: "View name (e.g. Harvest season)",
226
+ maxLength: 60,
227
+ className: Q,
228
+ "data-testid": "persona-dialog-new-view-name"
229
+ }), /* @__PURE__ */ h("button", {
230
+ type: "button",
231
+ onClick: () => void X(),
232
+ disabled: D || !C.trim(),
233
+ className: $,
234
+ "data-testid": "persona-dialog-new-view-save",
235
+ children: "Save"
236
+ })]
237
+ }),
238
+ k && /* @__PURE__ */ h("p", {
239
+ className: "text-body-sm text-status-error-text",
240
+ children: k
241
+ })
242
+ ]
243
+ })
244
+ ]
118
245
  })]
119
246
  })
120
247
  });
121
248
  }
122
249
  //#endregion
123
- export { g as NavCustomizeDialog };
250
+ export { y as NavCustomizeDialog };
@@ -5,12 +5,15 @@
5
5
  * mounted. One compact row: a searchable VIEW DROPDOWN (the user's surfaces —
6
6
  * their own role preselected and marked — plus Everything, and, for workspace
7
7
  * admins / super admins, a "Preview a role" section) and a Customize button
8
- * that opens the per-item visibility dialog. The dropdown panel renders
9
- * inline above the footer (no portal), so inside the mobile drawer it needs
10
- * no overlay and never covers the nav. During role preview the trigger tints
11
- * amber and an "Exit preview" row appears; a viewport-fixed pill (rendered by
12
- * ProductSideNav OUTSIDE the aside its backdrop-filter would trap fixed
13
- * positioning) mirrors the state on all breakpoints.
8
+ * that opens the per-item visibility dialog. The dropdown panel portals to
9
+ * document.body with a stable width (min 300px, clamped to the viewport) and
10
+ * tracks the trigger's rect anchored inside the sidebar it would inherit
11
+ * the sidebar's animating width and be clipped by the aside's
12
+ * overflow-x-hidden. No backdrop/overlay, so it never deadens the nav or the
13
+ * mobile drawer. During role preview the trigger tints amber and an "Exit
14
+ * preview" row appears; a viewport-fixed pill (rendered by ProductSideNav
15
+ * OUTSIDE the aside — its backdrop-filter would trap fixed positioning)
16
+ * mirrors the state on all breakpoints.
14
17
  */
15
18
  export interface PersonaSurfaceControlsProps {
16
19
  /** Label for the built-in uncurated surface. @default "Everything" */
@@ -1 +1 @@
1
- {"version":3,"file":"PersonaSurfaceControls.d.ts","sourceRoot":"","sources":["../../src/chrome/PersonaSurfaceControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkBH,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqTD,wBAAgB,sBAAsB,CAAC,EACrC,eAA8B,EAC9B,cAAiC,GAClC,EAAE,2BAA2B,kDA6C7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,mDAyBpC"}
1
+ {"version":3,"file":"PersonaSurfaceControls.d.ts","sourceRoot":"","sources":["../../src/chrome/PersonaSurfaceControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkBH,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqWD,wBAAgB,sBAAsB,CAAC,EACrC,eAA8B,EAC9B,cAAiC,GAClC,EAAE,2BAA2B,kDA6C7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,mDAyBpC"}
@@ -1,11 +1,11 @@
1
1
  import { useShellUi as e } from "../shared/providers/shell/ShellUiProvider.js";
2
2
  import { useSafePersonaSurface as t } from "../shared/providers/shell/PersonaSurfaceProvider.js";
3
3
  import { useCallback as n, useEffect as r, useRef as i, useState as a } from "react";
4
- import { Check as o, ChevronsUpDown as s, Eye as c, Search as l, SlidersHorizontal as u, X as d } from "lucide-react";
4
+ import { Check as o, ChevronsUpDown as s, Eye as c, Plus as l, Search as u, SlidersHorizontal as d, X as ee } from "lucide-react";
5
5
  import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
6
6
  import { createPortal as h } from "react-dom";
7
7
  //#region src/chrome/PersonaSurfaceControls.tsx
8
- function g(e, t) {
8
+ function te(e, t) {
9
9
  let { surfaces: n, availableSurfaceIds: r, resolvedSurfaceId: i } = e, a = (e) => e === "everything" ? t : n.find((t) => t.id === e)?.label ?? e, o = [...r];
10
10
  return o.sort((e, t) => {
11
11
  let n = (e) => e === i ? 0 : e === "everything" ? 2 : 1;
@@ -16,14 +16,14 @@ function g(e, t) {
16
16
  isResolved: e === i
17
17
  }));
18
18
  }
19
- var _ = 300;
20
- function v({ everythingLabel: e }) {
21
- let u = t(), [v, y] = a(!1), [b, x] = a(""), [S, C] = a(null), w = i(null), T = i(null), E = i(null), D = i(null), O = n(() => {
19
+ var g = 300;
20
+ function _({ everythingLabel: e, onOpenCustomize: d }) {
21
+ let _ = t(), [v, y] = a(!1), [b, x] = a(""), [S, C] = a(null), w = i(null), T = i(null), E = i(null), D = i(null), O = n(() => {
22
22
  y(!1), x("");
23
23
  }, []), k = n(() => {
24
24
  let e = T.current?.getBoundingClientRect();
25
25
  if (!e) return;
26
- let t = window.innerWidth, n = Math.min(Math.max(e.width, _), t - 16), r = Math.min(Math.max(8, e.left), t - n - 8);
26
+ let t = window.innerWidth, n = Math.min(Math.max(e.width, g), t - 16), r = Math.min(Math.max(8, e.left), t - n - 8);
27
27
  C((t) => {
28
28
  let i = window.innerHeight - e.top + 8;
29
29
  return t && t.left === r && t.bottom === i && t.width === n ? t : {
@@ -54,22 +54,22 @@ function v({ everythingLabel: e }) {
54
54
  };
55
55
  }, [v, O]), r(() => {
56
56
  v && D.current?.focus();
57
- }, [v]), !u) return null;
58
- let { activeSurfaceId: A, surfaces: j, resolvedSurfaceId: M, setSurfaceId: N, canSimulate: P, simulation: F, startSimulation: I, stopSimulation: L, simulatableRoles: R, simulatableRolesLoading: z, loadSimulatableRoles: B } = u, V = g(u, e), H = b.trim().toLowerCase(), U = H ? V.filter((e) => e.label.toLowerCase().includes(H)) : V, W = H ? R.filter((e) => e.name.toLowerCase().includes(H)) : R, G = F ? F.roleName : V.find((e) => e.id === A)?.label ?? j.find((e) => e.id === A)?.label ?? e, K = () => {
57
+ }, [v]), !_) return null;
58
+ let { activeSurfaceId: A, surfaces: j, resolvedSurfaceId: M, setSurfaceId: N, canSimulate: P, simulation: F, startSimulation: I, stopSimulation: L, simulatableRoles: R, simulatableRolesLoading: z, loadSimulatableRoles: B, customViews: V, canManageViews: H } = _, U = te(_, e), W = b.trim().toLowerCase(), G = W ? U.filter((e) => e.label.toLowerCase().includes(W)) : U, K = W ? V.filter((e) => e.name.toLowerCase().includes(W)) : V, q = W ? R.filter((e) => e.name.toLowerCase().includes(W)) : R, J = F ? F.roleName : U.find((e) => e.id === A)?.label ?? j.find((e) => e.id === A)?.label ?? V.find((e) => e.id === A)?.name ?? e, Y = () => {
59
59
  if (v) {
60
60
  O();
61
61
  return;
62
62
  }
63
63
  P && B(), y(!0);
64
- }, q = (e) => {
64
+ }, X = (e) => {
65
65
  e.key === "Escape" && v && (e.preventDefault(), e.stopPropagation(), O());
66
- }, J = (e) => {
66
+ }, Z = (e) => {
67
67
  F && L(), N(e === M ? null : e), O();
68
- }, Y = "flex w-full min-h-9 items-center gap-2 rounded-button px-2.5 py-1.5 text-left text-body-sm text-text-primary hover:bg-bg-sunken transition-colors", X = "px-2.5 pb-1 pt-2.5 text-[11px] font-medium uppercase tracking-wider text-text-muted";
68
+ }, Q = "flex w-full min-h-9 items-center gap-2 rounded-button px-2.5 py-1.5 text-left text-body-sm text-text-primary hover:bg-bg-sunken transition-colors", $ = "px-2.5 pb-1 pt-2.5 text-[11px] font-medium uppercase tracking-wider text-text-muted";
69
69
  return /* @__PURE__ */ m("div", {
70
70
  ref: w,
71
71
  className: "relative min-w-0 flex-1",
72
- onKeyDown: q,
72
+ onKeyDown: X,
73
73
  children: [v && S && typeof document < "u" && h(/* @__PURE__ */ m("div", {
74
74
  ref: E,
75
75
  style: {
@@ -80,10 +80,10 @@ function v({ everythingLabel: e }) {
80
80
  className: "fixed z-[130] flex max-h-80 flex-col overflow-hidden rounded-card border border-border-subtle bg-bg-canvas shadow-lg",
81
81
  role: "listbox",
82
82
  "data-testid": "persona-view-panel",
83
- onKeyDown: q,
83
+ onKeyDown: X,
84
84
  children: [/* @__PURE__ */ m("div", {
85
85
  className: "flex items-center gap-2 border-b border-border-subtle px-2.5 py-2",
86
- children: [/* @__PURE__ */ p(l, { className: "size-4 flex-shrink-0 text-text-muted" }), /* @__PURE__ */ p("input", {
86
+ children: [/* @__PURE__ */ p(u, { className: "size-4 flex-shrink-0 text-text-muted" }), /* @__PURE__ */ p("input", {
87
87
  ref: D,
88
88
  value: b,
89
89
  onChange: (e) => x(e.target.value),
@@ -94,16 +94,16 @@ function v({ everythingLabel: e }) {
94
94
  }), /* @__PURE__ */ m("div", {
95
95
  className: "overflow-y-auto py-1",
96
96
  children: [
97
- U.length > 0 && /* @__PURE__ */ p("p", {
98
- className: X,
97
+ G.length > 0 && /* @__PURE__ */ p("p", {
98
+ className: $,
99
99
  children: "Views"
100
100
  }),
101
- U.map((e) => {
101
+ G.map((e) => {
102
102
  let t = !F && e.id === A;
103
103
  return /* @__PURE__ */ m("button", {
104
104
  type: "button",
105
- onClick: () => J(e.id),
106
- className: Y,
105
+ onClick: () => Z(e.id),
106
+ className: Q,
107
107
  "data-testid": `persona-view-${e.id}`,
108
108
  children: [
109
109
  /* @__PURE__ */ p(o, { className: `size-4 flex-shrink-0 ${t ? "text-text-primary" : "invisible"}` }),
@@ -118,9 +118,37 @@ function v({ everythingLabel: e }) {
118
118
  ]
119
119
  }, e.id);
120
120
  }),
121
+ (K.length > 0 || H && !W) && /* @__PURE__ */ m(f, { children: [
122
+ /* @__PURE__ */ p("p", {
123
+ className: $,
124
+ children: "My views"
125
+ }),
126
+ K.map((e) => {
127
+ let t = !F && e.id === A;
128
+ return /* @__PURE__ */ m("button", {
129
+ type: "button",
130
+ onClick: () => Z(e.id),
131
+ className: Q,
132
+ "data-testid": `persona-view-${e.id}`,
133
+ children: [/* @__PURE__ */ p(o, { className: `size-4 flex-shrink-0 ${t ? "text-text-primary" : "invisible"}` }), /* @__PURE__ */ p("span", {
134
+ className: "truncate",
135
+ children: e.name
136
+ })]
137
+ }, e.id);
138
+ }),
139
+ H && !W && /* @__PURE__ */ m("button", {
140
+ type: "button",
141
+ onClick: () => {
142
+ O(), d();
143
+ },
144
+ className: `${Q} text-text-secondary`,
145
+ "data-testid": "persona-view-create",
146
+ children: [/* @__PURE__ */ p(l, { className: "size-4 flex-shrink-0" }), /* @__PURE__ */ p("span", { children: "New view from current…" })]
147
+ })
148
+ ] }),
121
149
  P && /* @__PURE__ */ m(f, { children: [
122
150
  /* @__PURE__ */ p("p", {
123
- className: X,
151
+ className: $,
124
152
  children: "Preview a role"
125
153
  }),
126
154
  F && /* @__PURE__ */ m("button", {
@@ -128,22 +156,22 @@ function v({ everythingLabel: e }) {
128
156
  onClick: () => {
129
157
  L(), O();
130
158
  },
131
- className: `${Y} text-status-warning-text`,
159
+ className: `${Q} text-status-warning-text`,
132
160
  "data-testid": "persona-view-exit-preview",
133
- children: [/* @__PURE__ */ p(d, { className: "size-4 flex-shrink-0" }), /* @__PURE__ */ p("span", { children: "Exit preview" })]
161
+ children: [/* @__PURE__ */ p(ee, { className: "size-4 flex-shrink-0" }), /* @__PURE__ */ p("span", { children: "Exit preview" })]
134
162
  }),
135
163
  z && /* @__PURE__ */ p("p", {
136
164
  className: "px-2.5 py-1.5 text-body-sm text-text-muted",
137
165
  children: "Loading roles…"
138
166
  }),
139
- W.map((e) => {
167
+ q.map((e) => {
140
168
  let t = F?.roleId === e.id;
141
169
  return /* @__PURE__ */ m("button", {
142
170
  type: "button",
143
171
  onClick: () => {
144
172
  I(e), O();
145
173
  },
146
- className: Y,
174
+ className: Q,
147
175
  "data-testid": `persona-preview-${e.id}`,
148
176
  children: [
149
177
  /* @__PURE__ */ p(c, { className: `size-4 flex-shrink-0 ${t ? "text-status-warning-text" : "text-text-muted"}` }),
@@ -155,12 +183,12 @@ function v({ everythingLabel: e }) {
155
183
  ]
156
184
  }, e.id);
157
185
  }),
158
- !z && W.length === 0 && H && /* @__PURE__ */ p("p", {
186
+ !z && q.length === 0 && W && /* @__PURE__ */ p("p", {
159
187
  className: "px-2.5 py-1.5 text-body-sm text-text-muted",
160
188
  children: "No matching roles"
161
189
  })
162
190
  ] }),
163
- U.length === 0 && (!P || W.length === 0) && H && /* @__PURE__ */ p("p", {
191
+ G.length === 0 && (!P || q.length === 0) && W && /* @__PURE__ */ p("p", {
164
192
  className: "px-2.5 py-1.5 text-body-sm text-text-muted",
165
193
  children: "No matches"
166
194
  })
@@ -169,7 +197,7 @@ function v({ everythingLabel: e }) {
169
197
  }), document.body), /* @__PURE__ */ m("button", {
170
198
  ref: T,
171
199
  type: "button",
172
- onClick: K,
200
+ onClick: Y,
173
201
  "aria-expanded": v,
174
202
  "aria-haspopup": "listbox",
175
203
  className: `flex w-full min-h-9 items-center gap-2 rounded-button border px-2.5 py-1.5 text-body-sm transition-colors ${F ? "border-status-warning-text/40 bg-status-warning-bg-subtle text-text-primary" : "border-border-subtle bg-bg-canvas text-text-primary hover:bg-bg-sunken"}`,
@@ -178,38 +206,41 @@ function v({ everythingLabel: e }) {
178
206
  F ? /* @__PURE__ */ p(c, { className: "size-4 flex-shrink-0 text-status-warning-text" }) : /* @__PURE__ */ p(o, { className: "size-4 flex-shrink-0 text-text-muted" }),
179
207
  /* @__PURE__ */ p("span", {
180
208
  className: "min-w-0 flex-1 truncate text-left",
181
- children: F ? `Preview: ${G}` : G
209
+ children: F ? `Preview: ${J}` : J
182
210
  }),
183
211
  /* @__PURE__ */ p(s, { className: "size-4 flex-shrink-0 text-text-muted" })
184
212
  ]
185
213
  })]
186
214
  });
187
215
  }
188
- function y({ everythingLabel: n = "Everything", customizeLabel: r = "Customize menu" }) {
216
+ function v({ everythingLabel: n = "Everything", customizeLabel: r = "Customize menu" }) {
189
217
  let i = t(), { sidebarCollapsed: a, toggleSidebar: o } = e();
190
218
  if (!i) return null;
191
- let { setCustomizeOpen: s } = i, c = /* @__PURE__ */ p("button", {
219
+ let { setCustomizeOpen: s } = i, c = () => {
220
+ typeof window < "u" && window.innerWidth < 768 && !a && o(), s(!0);
221
+ }, l = /* @__PURE__ */ p("button", {
192
222
  type: "button",
193
- onClick: () => {
194
- typeof window < "u" && window.innerWidth < 768 && !a && o(), s(!0);
195
- },
223
+ onClick: c,
196
224
  className: "p-2 rounded-button text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors flex-shrink-0",
197
225
  "aria-label": r,
198
226
  title: r,
199
227
  "data-testid": "persona-customize-trigger",
200
- children: /* @__PURE__ */ p(u, { className: "size-4" })
228
+ children: /* @__PURE__ */ p(d, { className: "size-4" })
201
229
  });
202
230
  return a ? /* @__PURE__ */ p("div", {
203
231
  className: "hidden md:flex justify-center",
204
232
  "data-testid": "persona-controls-collapsed",
205
- children: c
233
+ children: l
206
234
  }) : /* @__PURE__ */ m("div", {
207
235
  className: "flex items-center gap-1",
208
236
  "data-testid": "persona-controls",
209
- children: [/* @__PURE__ */ p(v, { everythingLabel: n }), c]
237
+ children: [/* @__PURE__ */ p(_, {
238
+ everythingLabel: n,
239
+ onOpenCustomize: c
240
+ }), l]
210
241
  });
211
242
  }
212
- function b() {
243
+ function y() {
213
244
  let e = t();
214
245
  return e?.simulation ? /* @__PURE__ */ m("div", {
215
246
  className: "fixed bottom-4 left-1/2 z-[120] -translate-x-1/2 flex max-w-[calc(100vw-2rem)] items-center gap-2 rounded-full border border-border-subtle bg-bg-canvas px-4 py-2 shadow-lg",
@@ -240,4 +271,4 @@ function b() {
240
271
  }) : null;
241
272
  }
242
273
  //#endregion
243
- export { b as PersonaSimulationPill, y as PersonaSurfaceControls };
274
+ export { y as PersonaSimulationPill, v as PersonaSurfaceControls };
@@ -35,6 +35,18 @@ export interface PersonaSurfaceDefinition {
35
35
  /** Reserved surface id meaning "no curation — show everything permitted". */
36
36
  export declare const EVERYTHING_SURFACE_ID = "everything";
37
37
  export type NavItemOverrideState = 'shown' | 'hidden';
38
+ /**
39
+ * A USER-CREATED view: same visibility semantics as a product-defined
40
+ * surface, but owned by one user, named by them, and (in remote-persistence
41
+ * mode) stored server-side so it follows them across devices. Custom views
42
+ * have no role mapping — they are picked explicitly.
43
+ */
44
+ export interface PersonaCustomView {
45
+ id: string;
46
+ name: string;
47
+ visibleItems: string[];
48
+ homePath: string | null;
49
+ }
38
50
  export interface SimulatableRole {
39
51
  id: string;
40
52
  name: string;
@@ -85,6 +97,17 @@ export interface PersonaSurfaceContextValue {
85
97
  simulatableRolesLoading: boolean;
86
98
  /** Lazily fetch the workspace role catalog for the simulation picker. */
87
99
  loadSimulatableRoles: () => void;
100
+ /** User-created custom views (server-persisted in remote mode). */
101
+ customViews: PersonaCustomView[];
102
+ /**
103
+ * True when custom-view management is available: remote persistence is
104
+ * enabled and the server preferences have loaded.
105
+ */
106
+ canManageViews: boolean;
107
+ /** Create a view from an explicit visible-item set; activates it. */
108
+ createCustomView: (name: string, visibleItems: string[], homePath?: string | null) => Promise<PersonaCustomView | null>;
109
+ renameCustomView: (id: string, name: string) => Promise<boolean>;
110
+ deleteCustomView: (id: string) => Promise<boolean>;
88
111
  }
89
112
  export declare function synthesizeSimulatedPermissionStrings(role: SimulatableRole): string[];
90
113
  /**
@@ -107,8 +130,18 @@ export interface PersonaSurfaceProviderProps {
107
130
  * @default 'workspace'
108
131
  */
109
132
  gateway?: 'workspace' | 'global';
133
+ /**
134
+ * Where user choices (active view, per-view item overrides, custom views)
135
+ * live. 'remote' stores them in the backend (wspace-workspace-svc
136
+ * `nav-view` module) keyed by actor+workspace+product, so they follow the
137
+ * user across devices; localStorage stays as a warm cache so the sidebar
138
+ * renders the last-known state instantly while the server responds.
139
+ * 'local' (default, for shells whose backend hasn't onboarded yet) keeps
140
+ * everything device-local.
141
+ */
142
+ persistence?: 'local' | 'remote';
110
143
  }
111
- export declare function PersonaSurfaceProvider({ children, surfaces, productKey, gateway, }: PersonaSurfaceProviderProps): import("react/jsx-runtime").JSX.Element;
144
+ export declare function PersonaSurfaceProvider({ children, surfaces, productKey, gateway, persistence, }: PersonaSurfaceProviderProps): import("react/jsx-runtime").JSX.Element;
112
145
  /** Access the persona surface context; throws outside the provider. */
113
146
  export declare function usePersonaSurface(): PersonaSurfaceContextValue;
114
147
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PersonaSurfaceProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PersonaSurfaceProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PersonaSurfaceProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PersonaSurfaceProvider.tsx"],"names":[],"mappings":"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"}
@@ -1,18 +1,19 @@
1
1
  import { graphqlFetch as e } from "../../graphql/fetch.js";
2
2
  import { useSafePermissions as t } from "./PermissionProvider.js";
3
- import { createContext as n, use as r, useCallback as i, useEffect as a, useMemo as o, useState as s } from "react";
4
- import { jsx as c } from "react/jsx-runtime";
5
- import { useQuery as l } from "@tanstack/react-query";
3
+ import { createNavView as n, deleteNavView as r, fetchNavPreferences as i, saveNavPreferences as ee, updateNavView as te } from "./personaSurfaceRemote.js";
4
+ import { createContext as a, use as o, useCallback as s, useEffect as c, useMemo as l, useRef as ne, useState as u } from "react";
5
+ import { jsx as re } from "react/jsx-runtime";
6
+ import { useQuery as d } from "@tanstack/react-query";
6
7
  //#region src/shared/providers/shell/PersonaSurfaceProvider.tsx
7
- var u = "everything", d = n(null), f = [
8
+ var f = "everything", p = a(null), m = [
8
9
  "read",
9
10
  "list",
10
11
  "download",
11
12
  "join",
12
13
  "leave",
13
14
  "vote"
14
- ], p = [
15
- ...f,
15
+ ], h = [
16
+ ...m,
16
17
  "create",
17
18
  "update",
18
19
  "share",
@@ -26,7 +27,7 @@ var u = "everything", d = n(null), f = [
26
27
  "upload",
27
28
  "sync"
28
29
  ];
29
- function m(e) {
30
+ function g(e) {
30
31
  let t = [];
31
32
  for (let n of e.defaultPermissions) {
32
33
  if (n.level === "NONE") continue;
@@ -34,24 +35,24 @@ function m(e) {
34
35
  t.push(`${n.resourceType}:*`);
35
36
  continue;
36
37
  }
37
- let e = n.level === "EDITOR" ? p : f;
38
+ let e = n.level === "EDITOR" ? h : m;
38
39
  for (let r of e) t.push(`${n.resourceType}:${r}`);
39
40
  }
40
41
  return t;
41
42
  }
42
- function h(e, t) {
43
- if (t.length === 0) return u;
43
+ function _(e, t) {
44
+ if (t.length === 0) return f;
44
45
  let n = new Set(t);
45
46
  for (let t of e) if (t.roleNames.some((e) => n.has(e))) return t.id;
46
- return u;
47
+ return f;
47
48
  }
48
- function g(e, t) {
49
+ function ie(e, t) {
49
50
  if (t.templateKey) {
50
51
  for (let n of e) if (n.templateKeys?.includes(t.templateKey)) return n.id;
51
52
  }
52
- return h(e, [t.roleName]);
53
+ return _(e, [t.roleName]);
53
54
  }
54
- function _(e, t) {
55
+ function ae(e, t) {
55
56
  return `boff-persona:${e}:${t ?? "no-scope"}`;
56
57
  }
57
58
  function v(e) {
@@ -71,146 +72,273 @@ function y(e, t) {
71
72
  !t.surfaceId && !n ? window.localStorage.removeItem(e) : window.localStorage.setItem(e, JSON.stringify(t));
72
73
  } catch {}
73
74
  }
74
- var b = "\n query NavSimulatableRoles($scopeId: String!, $filter: RoleFilterInput, $pagination: PaginationInput) {\n roles(scopeId: $scopeId, filter: $filter, pagination: $pagination) {\n id\n name\n templateKey\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n";
75
- function x({ children: n, surfaces: r, productKey: f, gateway: p = "workspace" }) {
76
- let x = t(), S = x?.scopeId ?? null, C = _(f, S), [w, T] = s(() => v(C));
77
- a(() => {
78
- T(v(C));
75
+ var oe = "\n query NavSimulatableRoles($scopeId: String!, $filter: RoleFilterInput, $pagination: PaginationInput) {\n roles(scopeId: $scopeId, filter: $filter, pagination: $pagination) {\n id\n name\n templateKey\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n";
76
+ function b({ children: a, surfaces: o, productKey: m, gateway: h = "workspace", persistence: b = "local" }) {
77
+ let x = t(), S = x?.scopeId ?? null, C = ae(m, S), w = b === "remote", [T, E] = u(() => v(C));
78
+ c(() => {
79
+ E(v(C));
79
80
  }, [C]);
80
- let E = i((e) => {
81
- T((t) => {
81
+ let [D, O] = u([]);
82
+ c(() => {
83
+ O([]);
84
+ }, [S]);
85
+ let k = d({
86
+ queryKey: [
87
+ "persona-nav-preferences",
88
+ h,
89
+ S,
90
+ m
91
+ ],
92
+ queryFn: () => i(h, S, m),
93
+ enabled: w && !!S && !!x,
94
+ staleTime: 60 * 1e3,
95
+ retry: 2
96
+ }), { data: A } = k;
97
+ c(() => {
98
+ if (!A) return;
99
+ let e = {
100
+ surfaceId: A.activeViewId ?? void 0,
101
+ overridesBySurface: A.overridesByView
102
+ };
103
+ E(e), y(C, e), O(A.customViews);
104
+ }, [A, C]);
105
+ let j = ne(null), M = s((e) => {
106
+ !w || !S || (j.current && clearTimeout(j.current), j.current = setTimeout(() => {
107
+ ee(h, {
108
+ workspaceId: S,
109
+ productSlug: m,
110
+ activeViewId: e.surfaceId ?? null,
111
+ overridesByView: e.overridesBySurface ?? {}
112
+ }).catch(() => {});
113
+ }, 700));
114
+ }, [
115
+ w,
116
+ S,
117
+ h,
118
+ m
119
+ ]);
120
+ c(() => () => {
121
+ j.current && clearTimeout(j.current);
122
+ }, []);
123
+ let N = s((e) => {
124
+ E((t) => {
82
125
  let n = e(t);
83
- return y(C, n), n;
126
+ return y(C, n), M(n), n;
84
127
  });
85
- }, [C]), [D, O] = s(null), [k, A] = s(!1);
86
- a(() => {
87
- O(null), A(!1);
128
+ }, [C, M]), [P, F] = u(null), [I, L] = u(!1);
129
+ c(() => {
130
+ F(null), L(!1);
88
131
  }, [S]);
89
- let j = x?.isSuperAdmin ?? !1, M = !!x && (j || x.hasPermission("rbac:read")), N = l({
132
+ let R = x?.isSuperAdmin ?? !1, z = !!x && (R || x.hasPermission("rbac:read")), B = d({
90
133
  queryKey: [
91
134
  "persona-simulatable-roles",
92
- p,
135
+ h,
93
136
  S,
94
- f
137
+ m
95
138
  ],
96
139
  queryFn: async () => {
97
140
  let t = await e({
98
- query: b,
141
+ query: oe,
99
142
  variables: {
100
143
  scopeId: S,
101
- filter: { product: f },
144
+ filter: { product: m },
102
145
  pagination: { limit: 100 }
103
146
  },
104
- gateway: p
147
+ gateway: h
105
148
  });
106
149
  if (t.errors?.length) throw Error(t.errors[0].message);
107
150
  return [...t.data?.roles ?? []].sort((e, t) => t.priority - e.priority);
108
151
  },
109
- enabled: k && M && !!S,
152
+ enabled: I && z && !!S,
110
153
  staleTime: 300 * 1e3
111
- }), P = i(() => {
112
- A(!0);
113
- }, []), F = i((e) => {
114
- O({
154
+ }), V = s(() => {
155
+ L(!0);
156
+ }, []), H = s((e) => {
157
+ F({
115
158
  roleId: e.id,
116
159
  roleName: e.name,
117
160
  templateKey: e.templateKey,
118
- permissionStrings: m(e)
161
+ permissionStrings: g(e)
119
162
  });
120
- }, []), I = i(() => {
121
- O(null);
122
- }, []), L = o(() => x?.permissions?.roles ?? [], [x?.permissions?.roles]), R = o(() => D ? g(r, D) : h(r, L), [
123
- r,
124
- D,
125
- L
126
- ]), z = o(() => {
127
- if (D) return R;
128
- let e = w.surfaceId;
129
- return e && (e === "everything" || r.some((t) => t.id === e)) ? e : R;
163
+ }, []), U = s(() => {
164
+ F(null);
165
+ }, []), W = l(() => x?.permissions?.roles ?? [], [x?.permissions?.roles]), G = l(() => P ? ie(o, P) : _(o, W), [
166
+ o,
167
+ P,
168
+ W
169
+ ]), K = l(() => {
170
+ if (P) return G;
171
+ let e = T.surfaceId;
172
+ return e && (e === "everything" || o.some((t) => t.id === e) || D.some((t) => t.id === e)) ? e : G;
130
173
  }, [
174
+ P,
175
+ G,
176
+ T.surfaceId,
177
+ o,
178
+ D
179
+ ]), q = l(() => {
180
+ let e = o.find((e) => e.id === K);
181
+ if (e) return e;
182
+ let t = D.find((e) => e.id === K);
183
+ return t ? {
184
+ id: t.id,
185
+ label: t.name,
186
+ roleNames: [],
187
+ visibleItems: t.visibleItems,
188
+ homePath: t.homePath ?? void 0
189
+ } : null;
190
+ }, [
191
+ o,
131
192
  D,
132
- R,
133
- w.surfaceId,
134
- r
135
- ]), B = o(() => r.find((e) => e.id === z) ?? null, [r, z]), V = o(() => {
136
- let e = new Set(L);
137
- return [...r.filter((t) => j || t.roleNames.some((t) => e.has(t))).map((e) => e.id), u];
193
+ K
194
+ ]), J = l(() => {
195
+ let e = new Set(W);
196
+ return [...o.filter((t) => R || t.roleNames.some((t) => e.has(t))).map((e) => e.id), f];
138
197
  }, [
139
- r,
140
- j,
141
- L
142
- ]), H = i((e) => {
143
- E((t) => ({
198
+ o,
199
+ R,
200
+ W
201
+ ]), Y = s((e) => {
202
+ N((t) => ({
144
203
  ...t,
145
204
  surfaceId: e ?? void 0
146
205
  }));
147
- }, [E]), U = o(() => w.overridesBySurface?.[z] ?? {}, [w.overridesBySurface, z]), W = i((e, t) => {
148
- E((n) => {
149
- let r = { ...n.overridesBySurface ?? {} }, i = { ...r[z] ?? {} };
150
- return t === null ? delete i[e] : i[e] = t, Object.keys(i).length === 0 ? delete r[z] : r[z] = i, {
206
+ }, [N]), X = l(() => T.overridesBySurface?.[K] ?? {}, [T.overridesBySurface, K]), Z = s((e, t) => {
207
+ N((n) => {
208
+ let r = { ...n.overridesBySurface ?? {} }, i = { ...r[K] ?? {} };
209
+ return t === null ? delete i[e] : i[e] = t, Object.keys(i).length === 0 ? delete r[K] : r[K] = i, {
151
210
  ...n,
152
211
  overridesBySurface: r
153
212
  };
154
213
  });
155
- }, [E, z]), G = i(() => {
156
- E((e) => {
214
+ }, [N, K]), Q = s(() => {
215
+ N((e) => {
157
216
  let t = { ...e.overridesBySurface ?? {} };
158
- return delete t[z], {
217
+ return delete t[K], {
159
218
  ...e,
160
219
  overridesBySurface: t
161
220
  };
162
221
  });
163
- }, [E, z]), [K, q] = s(!1), J = o(() => ({
164
- surfaces: r,
165
- activeSurfaceId: z,
166
- activeSurface: B,
167
- resolvedSurfaceId: R,
168
- availableSurfaceIds: V,
169
- setSurfaceId: H,
170
- overrides: U,
171
- setItemOverride: W,
172
- resetOverrides: G,
173
- customizeOpen: K,
174
- setCustomizeOpen: q,
175
- canSimulate: M,
176
- simulation: D,
177
- startSimulation: F,
178
- stopSimulation: I,
179
- simulatableRoles: N.data ?? [],
180
- simulatableRolesLoading: N.isLoading && k,
181
- loadSimulatableRoles: P
222
+ }, [N, K]), [$, se] = u(!1), ce = w && !!S && !!k.data, le = s(async (e, t, r) => {
223
+ if (!w || !S) return null;
224
+ try {
225
+ let i = await n(h, {
226
+ workspaceId: S,
227
+ productSlug: m,
228
+ name: e,
229
+ visibleItems: t,
230
+ homePath: r ?? null
231
+ });
232
+ return O((e) => [...e, i]), N((e) => ({
233
+ ...e,
234
+ surfaceId: i.id
235
+ })), i;
236
+ } catch {
237
+ return null;
238
+ }
239
+ }, [
240
+ w,
241
+ S,
242
+ h,
243
+ m,
244
+ N
245
+ ]), ue = s(async (e, t) => {
246
+ if (!w || !S) return !1;
247
+ try {
248
+ let n = await te(h, e, {
249
+ workspaceId: S,
250
+ name: t
251
+ });
252
+ return O((t) => t.map((t) => t.id === e ? {
253
+ ...t,
254
+ name: n.name
255
+ } : t)), !0;
256
+ } catch {
257
+ return !1;
258
+ }
259
+ }, [
260
+ w,
261
+ S,
262
+ h
263
+ ]), de = s(async (e) => {
264
+ if (!w || !S) return !1;
265
+ try {
266
+ return await r(h, e, S), O((t) => t.filter((t) => t.id !== e)), N((t) => {
267
+ let n = { ...t.overridesBySurface ?? {} };
268
+ return delete n[e], {
269
+ surfaceId: t.surfaceId === e ? void 0 : t.surfaceId,
270
+ overridesBySurface: n
271
+ };
272
+ }), !0;
273
+ } catch {
274
+ return !1;
275
+ }
276
+ }, [
277
+ w,
278
+ S,
279
+ h,
280
+ N
281
+ ]), fe = l(() => ({
282
+ surfaces: o,
283
+ activeSurfaceId: K,
284
+ activeSurface: q,
285
+ resolvedSurfaceId: G,
286
+ availableSurfaceIds: J,
287
+ setSurfaceId: Y,
288
+ overrides: X,
289
+ setItemOverride: Z,
290
+ resetOverrides: Q,
291
+ customizeOpen: $,
292
+ setCustomizeOpen: se,
293
+ canSimulate: z,
294
+ simulation: P,
295
+ startSimulation: H,
296
+ stopSimulation: U,
297
+ simulatableRoles: B.data ?? [],
298
+ simulatableRolesLoading: B.isLoading && I,
299
+ loadSimulatableRoles: V,
300
+ customViews: D,
301
+ canManageViews: ce,
302
+ createCustomView: le,
303
+ renameCustomView: ue,
304
+ deleteCustomView: de
182
305
  }), [
183
- r,
306
+ o,
307
+ K,
308
+ q,
309
+ G,
310
+ J,
311
+ Y,
312
+ X,
313
+ Z,
314
+ Q,
315
+ $,
184
316
  z,
185
- B,
186
- R,
187
- V,
317
+ P,
188
318
  H,
189
319
  U,
190
- W,
191
- G,
192
- K,
193
- M,
194
- D,
195
- F,
320
+ B.data,
321
+ B.isLoading,
196
322
  I,
197
- N.data,
198
- N.isLoading,
199
- k,
200
- P
323
+ V,
324
+ D,
325
+ ce,
326
+ le,
327
+ ue,
328
+ de
201
329
  ]);
202
- return /* @__PURE__ */ c(d.Provider, {
203
- value: J,
204
- children: n
330
+ return /* @__PURE__ */ re(p.Provider, {
331
+ value: fe,
332
+ children: a
205
333
  });
206
334
  }
207
- function S() {
208
- let e = r(d);
335
+ function x() {
336
+ let e = o(p);
209
337
  if (!e) throw Error("usePersonaSurface must be used within a PersonaSurfaceProvider");
210
338
  return e;
211
339
  }
212
- function C() {
213
- return r(d);
340
+ function S() {
341
+ return o(p);
214
342
  }
215
343
  //#endregion
216
- export { u as EVERYTHING_SURFACE_ID, x as PersonaSurfaceProvider, h as resolveSurfaceForRoles, m as synthesizeSimulatedPermissionStrings, S as usePersonaSurface, C as useSafePersonaSurface };
344
+ export { f as EVERYTHING_SURFACE_ID, b as PersonaSurfaceProvider, _ as resolveSurfaceForRoles, g as synthesizeSimulatedPermissionStrings, x as usePersonaSurface, S as useSafePersonaSurface };
@@ -26,7 +26,7 @@ export type { GeographyContextValue, GeographyProviderProps, } from '../../geogr
26
26
  export { PermissionProvider, usePermissions, useSafePermissions, usePermission, useRole, usePermissionLoading, matchPermission, hasMatchingPermission, isSuperAdminBypass, SUPER_ADMIN_ROLE, SUPER_ADMIN_ACTOR_TYPE, } from './PermissionProvider';
27
27
  export type { EffectivePermissions, EffectiveResourcePermission, MyRolesResult, RoleInfo, PermissionCheckOptions, PermissionContextValue, PermissionProviderProps, } from './PermissionProvider';
28
28
  export { PersonaSurfaceProvider, usePersonaSurface, useSafePersonaSurface, resolveSurfaceForRoles, synthesizeSimulatedPermissionStrings, EVERYTHING_SURFACE_ID, } from './PersonaSurfaceProvider';
29
- export type { PersonaSurfaceDefinition, PersonaSurfaceContextValue, PersonaSurfaceProviderProps, NavItemOverrideState, SimulatableRole, SimulationState, } from './PersonaSurfaceProvider';
29
+ export type { PersonaSurfaceDefinition, PersonaSurfaceContextValue, PersonaSurfaceProviderProps, PersonaCustomView, NavItemOverrideState, SimulatableRole, SimulationState, } from './PersonaSurfaceProvider';
30
30
  export { AuthTokenProvider, useAuthToken } from './AuthTokenProvider';
31
31
  export type { AuthTokenContextValue, AuthTokenProviderProps } from './AuthTokenProvider';
32
32
  export { MultiGatewayProvider } from './MultiGatewayProvider';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { NavItemOverrideState } from './PersonaSurfaceProvider';
2
+ export interface RemoteCustomView {
3
+ id: string;
4
+ productSlug: string;
5
+ name: string;
6
+ visibleItems: string[];
7
+ homePath: string | null;
8
+ }
9
+ export interface RemoteNavPreferences {
10
+ activeViewId: string | null;
11
+ overridesByView: Record<string, Record<string, NavItemOverrideState>>;
12
+ customViews: RemoteCustomView[];
13
+ }
14
+ type Gateway = 'workspace' | 'global';
15
+ export declare function fetchNavPreferences(gateway: Gateway, workspaceId: string, productSlug: string): Promise<RemoteNavPreferences>;
16
+ export declare function saveNavPreferences(gateway: Gateway, input: {
17
+ workspaceId: string;
18
+ productSlug: string;
19
+ activeViewId: string | null;
20
+ overridesByView: Record<string, Record<string, NavItemOverrideState>>;
21
+ }): Promise<void>;
22
+ export declare function createNavView(gateway: Gateway, input: {
23
+ workspaceId: string;
24
+ productSlug: string;
25
+ name: string;
26
+ visibleItems: string[];
27
+ homePath?: string | null;
28
+ }): Promise<RemoteCustomView>;
29
+ export declare function updateNavView(gateway: Gateway, id: string, input: {
30
+ workspaceId: string;
31
+ name?: string;
32
+ visibleItems?: string[];
33
+ homePath?: string | null;
34
+ }): Promise<RemoteCustomView>;
35
+ export declare function deleteNavView(gateway: Gateway, id: string, workspaceId: string): Promise<void>;
36
+ export {};
37
+ //# sourceMappingURL=personaSurfaceRemote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personaSurfaceRemote.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/personaSurfaceRemote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACtE,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,KAAK,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AA8EtC,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;IACL,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;CACvE,GACA,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;IACL,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACA,OAAO,CAAC,gBAAgB,CAAC,CAW3B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC/F,OAAO,CAAC,gBAAgB,CAAC,CAW3B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,84 @@
1
+ import { graphqlFetch as e } from "../../graphql/fetch.js";
2
+ //#region src/shared/providers/shell/personaSurfaceRemote.ts
3
+ var t = "\n query MyNavPreferences($workspaceId: String!, $productSlug: String!) {\n myNavPreferences(workspaceId: $workspaceId, productSlug: $productSlug) {\n \n activeViewId\n overridesJson\n customViews {\n id\n productSlug\n name\n visibleItems\n homePath\n }\n\n }\n }\n", n = "\n mutation SaveMyNavPreferences($input: SaveNavPreferencesInput!) {\n saveMyNavPreferences(input: $input) {\n activeViewId\n overridesJson\n }\n }\n", r = "\n mutation CreateMyNavView($input: CreateNavViewInput!) {\n createMyNavView(input: $input) {\n id\n productSlug\n name\n visibleItems\n homePath\n }\n }\n", i = "\n mutation UpdateMyNavView($id: ID!, $input: UpdateNavViewInput!) {\n updateMyNavView(id: $id, input: $input) {\n id\n productSlug\n name\n visibleItems\n homePath\n }\n }\n", a = "\n mutation DeleteMyNavView($id: ID!, $workspaceId: String!) {\n deleteMyNavView(id: $id, workspaceId: $workspaceId)\n }\n";
4
+ function o(e) {
5
+ if (!e) return {};
6
+ try {
7
+ let t = JSON.parse(e);
8
+ return !t || typeof t != "object" ? {} : t;
9
+ } catch {
10
+ return {};
11
+ }
12
+ }
13
+ function s(e) {
14
+ return e?.length ? Error(e[0].message) : null;
15
+ }
16
+ async function c(n, r, i) {
17
+ let a = await e({
18
+ query: t,
19
+ variables: {
20
+ workspaceId: r,
21
+ productSlug: i
22
+ },
23
+ gateway: n
24
+ }), c = s(a.errors);
25
+ if (c) throw c;
26
+ let l = a.data?.myNavPreferences;
27
+ if (!l) throw Error("No nav preferences returned");
28
+ return {
29
+ activeViewId: l.activeViewId,
30
+ overridesByView: o(l.overridesJson),
31
+ customViews: l.customViews ?? []
32
+ };
33
+ }
34
+ async function l(t, r) {
35
+ let i = s((await e({
36
+ query: n,
37
+ variables: { input: {
38
+ workspaceId: r.workspaceId,
39
+ productSlug: r.productSlug,
40
+ activeViewId: r.activeViewId,
41
+ overridesJson: JSON.stringify(r.overridesByView)
42
+ } },
43
+ gateway: t
44
+ })).errors);
45
+ if (i) throw i;
46
+ }
47
+ async function u(t, n) {
48
+ let i = await e({
49
+ query: r,
50
+ variables: { input: n },
51
+ gateway: t
52
+ }), a = s(i.errors);
53
+ if (a) throw a;
54
+ let o = i.data?.createMyNavView;
55
+ if (!o) throw Error("View was not created");
56
+ return o;
57
+ }
58
+ async function d(t, n, r) {
59
+ let a = await e({
60
+ query: i,
61
+ variables: {
62
+ id: n,
63
+ input: r
64
+ },
65
+ gateway: t
66
+ }), o = s(a.errors);
67
+ if (o) throw o;
68
+ let c = a.data?.updateMyNavView;
69
+ if (!c) throw Error("View was not updated");
70
+ return c;
71
+ }
72
+ async function f(t, n, r) {
73
+ let i = s((await e({
74
+ query: a,
75
+ variables: {
76
+ id: n,
77
+ workspaceId: r
78
+ },
79
+ gateway: t
80
+ })).errors);
81
+ if (i) throw i;
82
+ }
83
+ //#endregion
84
+ export { u as createNavView, f as deleteNavView, c as fetchNavPreferences, l as saveNavPreferences, d as updateNavView };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.723.2",
3
+ "version": "2026.723.4",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "imports": {