@burdenoff/fe-libs 2026.720.4 → 2026.722.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.
- package/dist/chrome/NavCustomizeDialog.d.ts +23 -0
- package/dist/chrome/NavCustomizeDialog.d.ts.map +1 -0
- package/dist/chrome/NavCustomizeDialog.js +188 -0
- package/dist/chrome/PersonaSurfaceControls.d.ts +25 -0
- package/dist/chrome/PersonaSurfaceControls.d.ts.map +1 -0
- package/dist/chrome/PersonaSurfaceControls.js +110 -0
- package/dist/chrome/ProductSideNav.d.ts.map +1 -1
- package/dist/chrome/ProductSideNav.js +70 -37
- package/dist/chrome/index.d.ts +6 -0
- package/dist/chrome/index.d.ts.map +1 -1
- package/dist/chrome/sideNavigation/navVisibility.d.ts +56 -0
- package/dist/chrome/sideNavigation/navVisibility.d.ts.map +1 -0
- package/dist/chrome/sideNavigation/navVisibility.js +94 -0
- package/dist/chrome/sideNavigation/types.d.ts +6 -0
- package/dist/chrome/sideNavigation/types.d.ts.map +1 -1
- package/dist/chrome.js +16 -13
- package/dist/shared/components/assistantWidget/AssistantWidget.d.ts.map +1 -1
- package/dist/shared/components/assistantWidget/AssistantWidget.js +5 -5
- package/dist/shared/hooks/shell/useNavRegistry.d.ts +9 -0
- package/dist/shared/hooks/shell/useNavRegistry.d.ts.map +1 -1
- package/dist/shared/providers/shell/PermissionProvider.d.ts +13 -0
- package/dist/shared/providers/shell/PermissionProvider.d.ts.map +1 -1
- package/dist/shared/providers/shell/PermissionProvider.js +9 -5
- package/dist/shared/providers/shell/PersonaSurfaceProvider.d.ts +119 -0
- package/dist/shared/providers/shell/PersonaSurfaceProvider.d.ts.map +1 -0
- package/dist/shared/providers/shell/PersonaSurfaceProvider.js +207 -0
- package/dist/shared/providers/shell/index.d.ts +3 -1
- package/dist/shared/providers/shell/index.d.ts.map +1 -1
- package/dist/shared-providers-shell.js +19 -18
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//#region src/chrome/sideNavigation/navVisibility.ts
|
|
2
|
+
var e = "__nav_more__:";
|
|
3
|
+
function t(e, t) {
|
|
4
|
+
if (!t || !e.requiredPermission) return !0;
|
|
5
|
+
let n = Array.isArray(e.requiredPermission) ? e.requiredPermission : [e.requiredPermission];
|
|
6
|
+
return n.length === 0 ? !0 : n.some((e) => t(e));
|
|
7
|
+
}
|
|
8
|
+
function n(e, i, a = { removed: 0 }) {
|
|
9
|
+
let o = [];
|
|
10
|
+
for (let s of e) {
|
|
11
|
+
if (!t(s, i)) {
|
|
12
|
+
a.removed += 1 + r(s.children ?? []);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (!s.children || s.children.length === 0) {
|
|
16
|
+
o.push(s);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
let e = n(s.children, i, a);
|
|
20
|
+
e.length === 0 && !s.path && !s.homePath || o.push({
|
|
21
|
+
...s,
|
|
22
|
+
children: e
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return o;
|
|
26
|
+
}
|
|
27
|
+
function r(e) {
|
|
28
|
+
return e.reduce((e, t) => e + 1 + r(t.children ?? []), 0);
|
|
29
|
+
}
|
|
30
|
+
function i(e, t, n, r) {
|
|
31
|
+
return r[e.id] || (!n || t || n.has(e.id) || e.children?.some((e) => i(e, !1, n, r) === "shown") ? "shown" : "hidden");
|
|
32
|
+
}
|
|
33
|
+
function a(e, t) {
|
|
34
|
+
let n = t?.[e.id];
|
|
35
|
+
return n ? {
|
|
36
|
+
...e,
|
|
37
|
+
label: n
|
|
38
|
+
} : e;
|
|
39
|
+
}
|
|
40
|
+
function o(t, n, r, i) {
|
|
41
|
+
let a = r.length;
|
|
42
|
+
return {
|
|
43
|
+
id: `${e}${t}`,
|
|
44
|
+
label: i(a),
|
|
45
|
+
path: "",
|
|
46
|
+
group: n,
|
|
47
|
+
order: 9995,
|
|
48
|
+
children: r
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
var s = (e) => `${e} more…`;
|
|
52
|
+
function c(e, t) {
|
|
53
|
+
let n = t.surfaceVisibleItems ? new Set(t.surfaceVisibleItems) : null, r = t.overrides ?? {}, c = t.moreLabel ?? s, l = t.labelOverrides, u = 0, d = (e, t) => {
|
|
54
|
+
if (!e.children || e.children.length === 0) return a(e, l);
|
|
55
|
+
let s = [], f = [];
|
|
56
|
+
for (let a of e.children) {
|
|
57
|
+
let e = i(a, t, n, r), o = d(a, e === "shown" && (t || !n || n.has(a.id) || r[a.id] === "shown"));
|
|
58
|
+
e === "shown" ? s.push(o) : f.push(o);
|
|
59
|
+
}
|
|
60
|
+
u += f.length;
|
|
61
|
+
let p = f.length > 0 ? [...s, o(e.id, void 0, f, c)] : s;
|
|
62
|
+
return {
|
|
63
|
+
...a(e, l),
|
|
64
|
+
children: p
|
|
65
|
+
};
|
|
66
|
+
}, f = [], p = /* @__PURE__ */ new Map();
|
|
67
|
+
for (let t of e) {
|
|
68
|
+
let e = i(t, !1, n, r), a = d(t, e === "shown" && (!n || n.has(t.id) || r[t.id] === "shown"));
|
|
69
|
+
if (e === "shown") f.push(a);
|
|
70
|
+
else {
|
|
71
|
+
let e = t.group ?? "__default__", n = p.get(e);
|
|
72
|
+
n ? n.push(a) : p.set(e, [a]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
let m = [...f];
|
|
76
|
+
for (let [e, t] of p) u += t.length, m.push(o(e, e === "__default__" ? void 0 : e, t, c));
|
|
77
|
+
return {
|
|
78
|
+
items: m,
|
|
79
|
+
softHiddenCount: u
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function l(e, t) {
|
|
83
|
+
let r = { removed: 0 }, { items: i, softHiddenCount: a } = c(n(e, t.hasPermission, r), t);
|
|
84
|
+
return {
|
|
85
|
+
items: i,
|
|
86
|
+
softHiddenCount: a,
|
|
87
|
+
hardHiddenCount: r.removed
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function u(e, t, n, r) {
|
|
91
|
+
return i(e, t, n ? new Set(n) : null, r) === "shown";
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { e as NAV_MORE_ID_PREFIX, l as applyNavVisibility, n as applyPermissionFilter, c as applySurfaceVisibility, u as isItemEffectivelyShown };
|
|
@@ -29,5 +29,11 @@ export interface NavItem {
|
|
|
29
29
|
* If not specified, defaults to the first child's path (if children exist).
|
|
30
30
|
*/
|
|
31
31
|
homePath?: string;
|
|
32
|
+
/**
|
|
33
|
+
* RBAC permission(s) required to see this item ("resource:action" form).
|
|
34
|
+
* An array means ANY match shows the item. Mirrors the registry NavItem
|
|
35
|
+
* field (see shared/hooks/shell/useNavRegistry.ts).
|
|
36
|
+
*/
|
|
37
|
+
requiredPermission?: string | string[];
|
|
32
38
|
}
|
|
33
39
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chrome/sideNavigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAErB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chrome/sideNavigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAErB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC"}
|
package/dist/chrome.js
CHANGED
|
@@ -22,16 +22,19 @@ import { LanguagePickerSheet as S } from "./chrome/LanguagePickerSheet.js";
|
|
|
22
22
|
import { ProductPickerSheet as C } from "./chrome/ProductPickerSheet.js";
|
|
23
23
|
import { AccountSwitcher as w } from "./chrome/AccountSwitcher.js";
|
|
24
24
|
import { AutoBreadcrumbs as T, registerBreadcrumbName as E, unregisterBreadcrumbName as D } from "./chrome/AutoBreadcrumbs.js";
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
|
|
25
|
+
import { NAV_MORE_ID_PREFIX as O, applyNavVisibility as k, applyPermissionFilter as A, applySurfaceVisibility as j, isItemEffectivelyShown as M } from "./chrome/sideNavigation/navVisibility.js";
|
|
26
|
+
import { NavCustomizeDialog as N } from "./chrome/NavCustomizeDialog.js";
|
|
27
|
+
import { PersonaSimulationPill as P, PersonaSurfaceControls as F } from "./chrome/PersonaSurfaceControls.js";
|
|
28
|
+
import { ProductSideNav as I } from "./chrome/ProductSideNav.js";
|
|
29
|
+
import { BrandMark as L } from "./chrome/BrandMark.js";
|
|
30
|
+
import { DynamicFooter as R } from "./chrome/DynamicFooter.js";
|
|
31
|
+
import { PanelTabs as z } from "./chrome/PanelTabs.js";
|
|
32
|
+
import { PanelContainer as B } from "./chrome/PanelContainer.js";
|
|
33
|
+
import { StatusBar as V } from "./chrome/StatusBar.js";
|
|
34
|
+
import { PluginRoutes as H } from "./chrome/PluginRoutes.js";
|
|
35
|
+
import { PluginSettingsPage as U } from "./chrome/PluginSettingsPage.js";
|
|
36
|
+
import { PluginToolbar as W } from "./chrome/PluginToolbar.js";
|
|
37
|
+
import { PluginWidgetGrid as G } from "./chrome/PluginWidgetGrid.js";
|
|
38
|
+
import { PluginContextMenuTarget as K } from "./chrome/PluginContextMenuTarget.js";
|
|
39
|
+
import { ThemePreferences as q } from "./chrome/ThemePreferences.js";
|
|
40
|
+
export { w as AccountSwitcher, t as AppShellLayout, T as AutoBreadcrumbs, L as BrandMark, f as Breadcrumbs, d as CommandPalette, y as ContextSwitcher, o as DEFAULT_FOOTER_COLUMNS, s as DEFAULT_SOCIAL_LINKS, R as DynamicFooter, c as Footer, i as FooterBar, b as GeographySwitcher, u as GlobalSearch, r as HeaderBar, S as LanguagePickerSheet, v as LanguageSwitcher, O as NAV_MORE_ID_PREFIX, N as NavCustomizeDialog, p as NavLink, x as NotificationCenter, n as PageHeader, B as PanelContainer, z as PanelTabs, P as PersonaSimulationPill, F as PersonaSurfaceControls, K as PluginContextMenuTarget, a as PluginFooterStrip, H as PluginRoutes, U as PluginSettingsPage, W as PluginToolbar, G as PluginWidgetGrid, C as ProductPickerSheet, I as ProductSideNav, _ as ProductSwitcher, g as ProfileSwitcher, e as ShortcutHelpDialog, l as SideNavigation, h as Sidebar, V as StatusBar, m as Tabs, q as ThemePreferences, k as applyNavVisibility, A as applyPermissionFilter, j as applySurfaceVisibility, M as isItemEffectivelyShown, E as registerBreadcrumbName, D as unregisterBreadcrumbName };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAmBf,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AA0D1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAmBf,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AA0D1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAoyBpD,CAAC"}
|
|
@@ -332,10 +332,10 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
|
|
|
332
332
|
}) : null
|
|
333
333
|
]
|
|
334
334
|
}) : null, /* @__PURE__ */ l("div", {
|
|
335
|
-
className: "flex min-w-0 flex-1 flex-col",
|
|
335
|
+
className: "flex min-h-0 min-w-0 flex-1 flex-col",
|
|
336
336
|
children: [
|
|
337
337
|
/* @__PURE__ */ l("div", {
|
|
338
|
-
className: "flex items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
|
|
338
|
+
className: "flex shrink-0 items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
|
|
339
339
|
children: [/* @__PURE__ */ l("div", {
|
|
340
340
|
className: "flex min-w-0 items-center gap-2",
|
|
341
341
|
children: [G && K && !Ae ? /* @__PURE__ */ l("button", {
|
|
@@ -367,7 +367,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
|
|
|
367
367
|
role: "tablist",
|
|
368
368
|
"aria-label": "Assistant mode",
|
|
369
369
|
"data-testid": "assistant-mode-switcher",
|
|
370
|
-
className: "flex items-center gap-1 border-b border-border-subtle bg-bg-surface px-3 py-2",
|
|
370
|
+
className: "flex shrink-0 items-center gap-1 border-b border-border-subtle bg-bg-surface px-3 py-2",
|
|
371
371
|
children: y.map((t) => {
|
|
372
372
|
let n = t.id === b;
|
|
373
373
|
return /* @__PURE__ */ c("button", {
|
|
@@ -422,7 +422,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
|
|
|
422
422
|
}),
|
|
423
423
|
S.downloadArtifact && Me.length > 0 ? /* @__PURE__ */ c("div", {
|
|
424
424
|
"data-testid": "assistant-widget-artifacts",
|
|
425
|
-
className: "flex flex-wrap gap-1.5 border-t border-border-subtle bg-bg-sunken px-3 py-2",
|
|
425
|
+
className: "flex shrink-0 flex-wrap gap-1.5 border-t border-border-subtle bg-bg-sunken px-3 py-2",
|
|
426
426
|
children: Me.map((e) => {
|
|
427
427
|
let t = z === e.path;
|
|
428
428
|
return /* @__PURE__ */ l("button", {
|
|
@@ -440,7 +440,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
|
|
|
440
440
|
})
|
|
441
441
|
}) : null,
|
|
442
442
|
/* @__PURE__ */ l("div", {
|
|
443
|
-
className: "flex items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
|
|
443
|
+
className: "flex shrink-0 items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
|
|
444
444
|
children: [
|
|
445
445
|
q.isSupported ? /* @__PURE__ */ c("button", {
|
|
446
446
|
type: "button",
|
|
@@ -13,6 +13,15 @@ export interface NavItem {
|
|
|
13
13
|
exact?: boolean;
|
|
14
14
|
/** Plugin that registered this item. Set automatically by the plugin runtime. */
|
|
15
15
|
pluginId?: string;
|
|
16
|
+
/**
|
|
17
|
+
* RBAC permission(s) required to see this item ("resource:action" form,
|
|
18
|
+
* e.g. "healthybowl_farm:read"). An array means ANY match shows the item.
|
|
19
|
+
* When the caller's effective permissions are loaded and none match, the
|
|
20
|
+
* item is hard-hidden (no user toggle — the backend would reject the page
|
|
21
|
+
* anyway). Omit for items visible to every authenticated user.
|
|
22
|
+
* UI shaping only: the gateway `@rbac` layer stays the enforcement point.
|
|
23
|
+
*/
|
|
24
|
+
requiredPermission?: string | string[];
|
|
16
25
|
}
|
|
17
26
|
interface NavRegistryStore {
|
|
18
27
|
items: NavItem[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavRegistry.d.ts","sourceRoot":"","sources":["../../../../src/shared/hooks/shell/useNavRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useNavRegistry.d.ts","sourceRoot":"","sources":["../../../../src/shared/hooks/shell/useNavRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,+EAa7B,CAAC"}
|
|
@@ -69,6 +69,13 @@ export interface PermissionContextValue {
|
|
|
69
69
|
invalidatePermissions: () => Promise<void>;
|
|
70
70
|
/** Current scope ID */
|
|
71
71
|
scopeId: string | null;
|
|
72
|
+
/**
|
|
73
|
+
* True when the authenticated actor is a platform super admin and every
|
|
74
|
+
* check above short-circuits to `true`. Consumers that need to know the
|
|
75
|
+
* difference between "allowed by role" and "allowed by bypass" (e.g. the
|
|
76
|
+
* persona-surface role simulator) read this instead of re-deriving it.
|
|
77
|
+
*/
|
|
78
|
+
isSuperAdmin: boolean;
|
|
72
79
|
/** Raw query result for advanced usage */
|
|
73
80
|
query: UseQueryResult<EffectivePermissions, Error>;
|
|
74
81
|
}
|
|
@@ -200,6 +207,12 @@ debug, }: PermissionProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
|
200
207
|
* ```
|
|
201
208
|
*/
|
|
202
209
|
export declare function usePermissions(): PermissionContextValue;
|
|
210
|
+
/**
|
|
211
|
+
* Like `usePermissions`, but returns `null` outside a PermissionProvider
|
|
212
|
+
* instead of throwing. For chrome components (e.g. ProductSideNav) that must
|
|
213
|
+
* keep working in shells that haven't mounted RBAC yet.
|
|
214
|
+
*/
|
|
215
|
+
export declare function useSafePermissions(): PermissionContextValue | null;
|
|
203
216
|
/**
|
|
204
217
|
* Hook to check a single permission
|
|
205
218
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PermissionProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5F,OAAO,EAA4B,KAAK,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAQlG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,4CAA4C;IAC5C,WAAW,EAAE,2BAA2B,EAAE,CAAC;IAC3C,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,+BAA+B;IAC/B,WAAW,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzC,oBAAoB;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,mEAAmE;IACnE,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,iCAAiC;IACjC,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC;IACrF,wCAAwC;IACxC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,mDAAmD;IACnD,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAC7C,mDAAmD;IACnD,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAC9C,mCAAmC;IACnC,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,yCAAyC;IACzC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,uBAAuB;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0CAA0C;IAC1C,KAAK,EAAE,cAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;CACpD;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAG,aAAsB,CAAC;AACvD,eAAO,MAAM,sBAAsB,EAAG,aAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"PermissionProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PermissionProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { createContext as n, use as r, useCallback as i, useEffect as a, useMemo
|
|
|
4
4
|
import { jsx as s } from "react/jsx-runtime";
|
|
5
5
|
import { useQuery as c, useQueryClient as l } from "@tanstack/react-query";
|
|
6
6
|
//#region src/shared/providers/shell/PermissionProvider.tsx
|
|
7
|
-
var u = n(null), d = "SUPER_ADMIN", f = "super_admin", p = "\n query MyPermissions($scopeId: String!) {\n myPermissions(scopeId: $scopeId) {\n actorId\n scopeId\n permissions {\n resourceType\n level\n allowedActions\n }\n }\n }\n";
|
|
7
|
+
var u = n(null), d = "SUPER_ADMIN", f = "super_admin", p = "\n query MyPermissions($scopeId: String!) {\n myPermissions(scopeId: $scopeId) {\n actorId\n scopeId\n roles\n permissions {\n resourceType\n level\n allowedActions\n }\n }\n }\n";
|
|
8
8
|
function m(e) {
|
|
9
9
|
let t = e.permissionStrings ?? e.permissions.flatMap((e) => {
|
|
10
10
|
let t = [];
|
|
@@ -131,6 +131,7 @@ function y({ children: n, scopeId: r, gateway: d = "workspace", staleTime: f = 3
|
|
|
131
131
|
refreshPermissions: H,
|
|
132
132
|
invalidatePermissions: U,
|
|
133
133
|
scopeId: r,
|
|
134
|
+
isSuperAdmin: E,
|
|
134
135
|
query: j
|
|
135
136
|
}), [
|
|
136
137
|
I,
|
|
@@ -157,17 +158,20 @@ function b() {
|
|
|
157
158
|
if (!e) throw Error("usePermissions must be used within a PermissionProvider");
|
|
158
159
|
return e;
|
|
159
160
|
}
|
|
160
|
-
function x(
|
|
161
|
+
function x() {
|
|
162
|
+
return r(u);
|
|
163
|
+
}
|
|
164
|
+
function S(e) {
|
|
161
165
|
let { hasPermission: t, isLoading: n } = b();
|
|
162
166
|
return n ? !1 : t(e);
|
|
163
167
|
}
|
|
164
|
-
function
|
|
168
|
+
function C(e) {
|
|
165
169
|
let { hasRole: t, isLoading: n } = b();
|
|
166
170
|
return n ? !1 : t(e);
|
|
167
171
|
}
|
|
168
|
-
function
|
|
172
|
+
function w() {
|
|
169
173
|
let { isLoading: e } = b();
|
|
170
174
|
return e;
|
|
171
175
|
}
|
|
172
176
|
//#endregion
|
|
173
|
-
export { y as PermissionProvider, f as SUPER_ADMIN_ACTOR_TYPE, d as SUPER_ADMIN_ROLE, g as hasMatchingPermission, _ as isSuperAdminBypass, h as matchPermission,
|
|
177
|
+
export { y as PermissionProvider, f as SUPER_ADMIN_ACTOR_TYPE, d as SUPER_ADMIN_ROLE, g as hasMatchingPermission, _ as isSuperAdminBypass, h as matchPermission, S as usePermission, w as usePermissionLoading, b as usePermissions, C as useRole, x as useSafePermissions };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface PersonaSurfaceDefinition {
|
|
3
|
+
/** Stable surface id, e.g. "farmer". Must not be "everything" (reserved). */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Display label, e.g. "Farmer". */
|
|
6
|
+
label: string;
|
|
7
|
+
/** One-line description shown in pickers. */
|
|
8
|
+
description?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Managed role template keys this surface represents
|
|
11
|
+
* (e.g. "product.healthybowl.farmer"). Used to match simulated roles,
|
|
12
|
+
* whose templateKey is known; also serves as documentation of identity.
|
|
13
|
+
*/
|
|
14
|
+
templateKeys?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Role display names this surface matches against the caller's
|
|
17
|
+
* `myPermissions.roles` (the RBAC API exposes role NAMES to members, not
|
|
18
|
+
* template keys). List every managed role name that should get this
|
|
19
|
+
* surface, e.g. ["HealthyBowl Farmer"].
|
|
20
|
+
*/
|
|
21
|
+
roleNames: string[];
|
|
22
|
+
/** Landing path for this persona (used by shells for post-login redirect). */
|
|
23
|
+
homePath?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Nav item ids shown BY DEFAULT for this surface. Listing a parent/group id
|
|
26
|
+
* shows the parent and all of its children; a child id can be listed alone
|
|
27
|
+
* to show it under a soft-hidden parent. Every permitted item NOT covered
|
|
28
|
+
* here is soft-hidden (collapsed behind "N more…", user-toggleable) —
|
|
29
|
+
* never removed.
|
|
30
|
+
*/
|
|
31
|
+
visibleItems: string[];
|
|
32
|
+
/** Optional per-item label overrides (persona vocabulary), keyed by item id. */
|
|
33
|
+
labelOverrides?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
/** Reserved surface id meaning "no curation — show everything permitted". */
|
|
36
|
+
export declare const EVERYTHING_SURFACE_ID = "everything";
|
|
37
|
+
export type NavItemOverrideState = 'shown' | 'hidden';
|
|
38
|
+
export interface SimulatableRole {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
templateKey: string | null;
|
|
42
|
+
priority: number;
|
|
43
|
+
defaultPermissions: Array<{
|
|
44
|
+
resourceType: string;
|
|
45
|
+
level: 'ADMIN' | 'EDITOR' | 'VIEWER' | 'NONE';
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
export interface SimulationState {
|
|
49
|
+
roleId: string;
|
|
50
|
+
roleName: string;
|
|
51
|
+
templateKey: string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Permission strings synthesized from the role's default permission levels
|
|
54
|
+
* using the fleet default action matrix. A UI approximation for nav
|
|
55
|
+
* preview — per-resource action overrides are not reflected.
|
|
56
|
+
*/
|
|
57
|
+
permissionStrings: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface PersonaSurfaceContextValue {
|
|
60
|
+
/** All surfaces the product defines (excluding the built-in Everything). */
|
|
61
|
+
surfaces: PersonaSurfaceDefinition[];
|
|
62
|
+
/** The surface currently applied ("everything" when uncurated). */
|
|
63
|
+
activeSurfaceId: string;
|
|
64
|
+
/** Definition of the applied surface; null when Everything. */
|
|
65
|
+
activeSurface: PersonaSurfaceDefinition | null;
|
|
66
|
+
/** What the user's roles resolve to before any manual override. */
|
|
67
|
+
resolvedSurfaceId: string;
|
|
68
|
+
/** Surface ids the current user qualifies for (own roles), for the picker. */
|
|
69
|
+
availableSurfaceIds: string[];
|
|
70
|
+
/** Pick a surface manually; null clears the override (back to resolved). */
|
|
71
|
+
setSurfaceId: (id: string | null) => void;
|
|
72
|
+
/** Per-item user visibility overrides (sparse; wins over surface defaults). */
|
|
73
|
+
overrides: Record<string, NavItemOverrideState>;
|
|
74
|
+
setItemOverride: (itemId: string, state: NavItemOverrideState | null) => void;
|
|
75
|
+
resetOverrides: () => void;
|
|
76
|
+
/** Customize-menu dialog open state (rendered by ProductSideNav). */
|
|
77
|
+
customizeOpen: boolean;
|
|
78
|
+
setCustomizeOpen: (open: boolean) => void;
|
|
79
|
+
/** Role simulation (admins / super admins only). */
|
|
80
|
+
canSimulate: boolean;
|
|
81
|
+
simulation: SimulationState | null;
|
|
82
|
+
startSimulation: (role: SimulatableRole) => void;
|
|
83
|
+
stopSimulation: () => void;
|
|
84
|
+
simulatableRoles: SimulatableRole[];
|
|
85
|
+
simulatableRolesLoading: boolean;
|
|
86
|
+
/** Lazily fetch the workspace role catalog for the simulation picker. */
|
|
87
|
+
loadSimulatableRoles: () => void;
|
|
88
|
+
}
|
|
89
|
+
export declare function synthesizeSimulatedPermissionStrings(role: SimulatableRole): string[];
|
|
90
|
+
/**
|
|
91
|
+
* Resolve which surface the user's role names map to. Surfaces are checked in
|
|
92
|
+
* array order — list the most privileged surface first so a user holding
|
|
93
|
+
* several product roles lands on the broader one.
|
|
94
|
+
*/
|
|
95
|
+
export declare function resolveSurfaceForRoles(surfaces: PersonaSurfaceDefinition[], roleNames: string[]): string;
|
|
96
|
+
export interface PersonaSurfaceProviderProps {
|
|
97
|
+
children: ReactNode;
|
|
98
|
+
/** The product's surface definitions, most privileged first. */
|
|
99
|
+
surfaces: PersonaSurfaceDefinition[];
|
|
100
|
+
/**
|
|
101
|
+
* Stable product key used to namespace persisted preferences
|
|
102
|
+
* (e.g. "healthybowl").
|
|
103
|
+
*/
|
|
104
|
+
productKey: string;
|
|
105
|
+
/**
|
|
106
|
+
* Gateway used to fetch simulatable roles.
|
|
107
|
+
* @default 'workspace'
|
|
108
|
+
*/
|
|
109
|
+
gateway?: 'workspace' | 'global';
|
|
110
|
+
}
|
|
111
|
+
export declare function PersonaSurfaceProvider({ children, surfaces, productKey, gateway, }: PersonaSurfaceProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
112
|
+
/** Access the persona surface context; throws outside the provider. */
|
|
113
|
+
export declare function usePersonaSurface(): PersonaSurfaceContextValue;
|
|
114
|
+
/**
|
|
115
|
+
* Like `usePersonaSurface` but returns `null` outside the provider, so chrome
|
|
116
|
+
* components degrade gracefully in shells that haven't adopted surfaces yet.
|
|
117
|
+
*/
|
|
118
|
+
export declare function useSafePersonaSurface(): PersonaSurfaceContextValue | null;
|
|
119
|
+
//# sourceMappingURL=PersonaSurfaceProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonaSurfaceProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PersonaSurfaceProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { graphqlFetch as e } from "../../graphql/fetch.js";
|
|
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";
|
|
6
|
+
//#region src/shared/providers/shell/PersonaSurfaceProvider.tsx
|
|
7
|
+
var u = "everything", d = n(null), f = [
|
|
8
|
+
"read",
|
|
9
|
+
"list",
|
|
10
|
+
"download",
|
|
11
|
+
"join",
|
|
12
|
+
"leave",
|
|
13
|
+
"vote"
|
|
14
|
+
], p = [
|
|
15
|
+
...f,
|
|
16
|
+
"create",
|
|
17
|
+
"update",
|
|
18
|
+
"share",
|
|
19
|
+
"execute",
|
|
20
|
+
"export",
|
|
21
|
+
"clone",
|
|
22
|
+
"import",
|
|
23
|
+
"archive",
|
|
24
|
+
"assign",
|
|
25
|
+
"cancel",
|
|
26
|
+
"upload",
|
|
27
|
+
"sync"
|
|
28
|
+
];
|
|
29
|
+
function m(e) {
|
|
30
|
+
let t = [];
|
|
31
|
+
for (let n of e.defaultPermissions) {
|
|
32
|
+
if (n.level === "NONE") continue;
|
|
33
|
+
if (n.level === "ADMIN") {
|
|
34
|
+
t.push(`${n.resourceType}:*`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
let e = n.level === "EDITOR" ? p : f;
|
|
38
|
+
for (let r of e) t.push(`${n.resourceType}:${r}`);
|
|
39
|
+
}
|
|
40
|
+
return t;
|
|
41
|
+
}
|
|
42
|
+
function h(e, t) {
|
|
43
|
+
if (t.length === 0) return u;
|
|
44
|
+
let n = new Set(t);
|
|
45
|
+
for (let t of e) if (t.roleNames.some((e) => n.has(e))) return t.id;
|
|
46
|
+
return u;
|
|
47
|
+
}
|
|
48
|
+
function g(e, t) {
|
|
49
|
+
if (t.templateKey) {
|
|
50
|
+
for (let n of e) if (n.templateKeys?.includes(t.templateKey)) return n.id;
|
|
51
|
+
}
|
|
52
|
+
return h(e, [t.roleName]);
|
|
53
|
+
}
|
|
54
|
+
function _(e, t) {
|
|
55
|
+
return `boff-persona:${e}:${t ?? "no-scope"}`;
|
|
56
|
+
}
|
|
57
|
+
function v(e) {
|
|
58
|
+
if (typeof window > "u") return {};
|
|
59
|
+
try {
|
|
60
|
+
let t = window.localStorage.getItem(e);
|
|
61
|
+
if (!t) return {};
|
|
62
|
+
let n = JSON.parse(t);
|
|
63
|
+
return !n || typeof n != "object" ? {} : n;
|
|
64
|
+
} catch {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function y(e, t) {
|
|
69
|
+
if (!(typeof window > "u")) try {
|
|
70
|
+
!t.surfaceId && Object.keys(t.overrides ?? {}).length === 0 ? window.localStorage.removeItem(e) : window.localStorage.setItem(e, JSON.stringify(t));
|
|
71
|
+
} catch {}
|
|
72
|
+
}
|
|
73
|
+
var b = "\n query NavSimulatableRoles($scopeId: String!) {\n roles(scopeId: $scopeId) {\n id\n name\n templateKey\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n";
|
|
74
|
+
function x({ children: n, surfaces: r, productKey: f, gateway: p = "workspace" }) {
|
|
75
|
+
let x = t(), S = x?.scopeId ?? null, C = _(f, S), [w, T] = s(() => v(C));
|
|
76
|
+
a(() => {
|
|
77
|
+
T(v(C));
|
|
78
|
+
}, [C]);
|
|
79
|
+
let E = i((e) => {
|
|
80
|
+
T((t) => {
|
|
81
|
+
let n = e(t);
|
|
82
|
+
return y(C, n), n;
|
|
83
|
+
});
|
|
84
|
+
}, [C]), [D, O] = s(null), [k, A] = s(!1);
|
|
85
|
+
a(() => {
|
|
86
|
+
O(null), A(!1);
|
|
87
|
+
}, [S]);
|
|
88
|
+
let j = x?.isSuperAdmin ?? !1, M = !!x && (j || x.hasPermission("rbac:read")), N = l({
|
|
89
|
+
queryKey: [
|
|
90
|
+
"persona-simulatable-roles",
|
|
91
|
+
p,
|
|
92
|
+
S
|
|
93
|
+
],
|
|
94
|
+
queryFn: async () => {
|
|
95
|
+
let t = await e({
|
|
96
|
+
query: b,
|
|
97
|
+
variables: { scopeId: S },
|
|
98
|
+
gateway: p
|
|
99
|
+
});
|
|
100
|
+
if (t.errors?.length) throw Error(t.errors[0].message);
|
|
101
|
+
return [...t.data?.roles ?? []].sort((e, t) => t.priority - e.priority);
|
|
102
|
+
},
|
|
103
|
+
enabled: k && M && !!S,
|
|
104
|
+
staleTime: 300 * 1e3
|
|
105
|
+
}), P = i(() => {
|
|
106
|
+
A(!0);
|
|
107
|
+
}, []), F = i((e) => {
|
|
108
|
+
O({
|
|
109
|
+
roleId: e.id,
|
|
110
|
+
roleName: e.name,
|
|
111
|
+
templateKey: e.templateKey,
|
|
112
|
+
permissionStrings: m(e)
|
|
113
|
+
});
|
|
114
|
+
}, []), I = i(() => {
|
|
115
|
+
O(null);
|
|
116
|
+
}, []), L = o(() => x?.permissions?.roles ?? [], [x?.permissions?.roles]), R = o(() => D ? g(r, D) : h(r, L), [
|
|
117
|
+
r,
|
|
118
|
+
D,
|
|
119
|
+
L
|
|
120
|
+
]), z = o(() => {
|
|
121
|
+
if (D) return R;
|
|
122
|
+
let e = w.surfaceId;
|
|
123
|
+
return e && (e === "everything" || r.some((t) => t.id === e)) ? e : R;
|
|
124
|
+
}, [
|
|
125
|
+
D,
|
|
126
|
+
R,
|
|
127
|
+
w.surfaceId,
|
|
128
|
+
r
|
|
129
|
+
]), B = o(() => r.find((e) => e.id === z) ?? null, [r, z]), V = o(() => {
|
|
130
|
+
let e = new Set(L);
|
|
131
|
+
return [...r.filter((t) => j || t.roleNames.some((t) => e.has(t))).map((e) => e.id), u];
|
|
132
|
+
}, [
|
|
133
|
+
r,
|
|
134
|
+
j,
|
|
135
|
+
L
|
|
136
|
+
]), H = i((e) => {
|
|
137
|
+
E((t) => ({
|
|
138
|
+
...t,
|
|
139
|
+
surfaceId: e ?? void 0
|
|
140
|
+
}));
|
|
141
|
+
}, [E]), U = o(() => w.overrides ?? {}, [w.overrides]), W = i((e, t) => {
|
|
142
|
+
E((n) => {
|
|
143
|
+
let r = { ...n.overrides ?? {} };
|
|
144
|
+
return t === null ? delete r[e] : r[e] = t, {
|
|
145
|
+
...n,
|
|
146
|
+
overrides: r
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}, [E]), G = i(() => {
|
|
150
|
+
E((e) => ({
|
|
151
|
+
...e,
|
|
152
|
+
overrides: {}
|
|
153
|
+
}));
|
|
154
|
+
}, [E]), [K, q] = s(!1), J = o(() => ({
|
|
155
|
+
surfaces: r,
|
|
156
|
+
activeSurfaceId: z,
|
|
157
|
+
activeSurface: B,
|
|
158
|
+
resolvedSurfaceId: R,
|
|
159
|
+
availableSurfaceIds: V,
|
|
160
|
+
setSurfaceId: H,
|
|
161
|
+
overrides: U,
|
|
162
|
+
setItemOverride: W,
|
|
163
|
+
resetOverrides: G,
|
|
164
|
+
customizeOpen: K,
|
|
165
|
+
setCustomizeOpen: q,
|
|
166
|
+
canSimulate: M,
|
|
167
|
+
simulation: D,
|
|
168
|
+
startSimulation: F,
|
|
169
|
+
stopSimulation: I,
|
|
170
|
+
simulatableRoles: N.data ?? [],
|
|
171
|
+
simulatableRolesLoading: N.isLoading && k,
|
|
172
|
+
loadSimulatableRoles: P
|
|
173
|
+
}), [
|
|
174
|
+
r,
|
|
175
|
+
z,
|
|
176
|
+
B,
|
|
177
|
+
R,
|
|
178
|
+
V,
|
|
179
|
+
H,
|
|
180
|
+
U,
|
|
181
|
+
W,
|
|
182
|
+
G,
|
|
183
|
+
K,
|
|
184
|
+
M,
|
|
185
|
+
D,
|
|
186
|
+
F,
|
|
187
|
+
I,
|
|
188
|
+
N.data,
|
|
189
|
+
N.isLoading,
|
|
190
|
+
k,
|
|
191
|
+
P
|
|
192
|
+
]);
|
|
193
|
+
return /* @__PURE__ */ c(d.Provider, {
|
|
194
|
+
value: J,
|
|
195
|
+
children: n
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
function S() {
|
|
199
|
+
let e = r(d);
|
|
200
|
+
if (!e) throw Error("usePersonaSurface must be used within a PersonaSurfaceProvider");
|
|
201
|
+
return e;
|
|
202
|
+
}
|
|
203
|
+
function C() {
|
|
204
|
+
return r(d);
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
export { u as EVERYTHING_SURFACE_ID, x as PersonaSurfaceProvider, h as resolveSurfaceForRoles, m as synthesizeSimulatedPermissionStrings, S as usePersonaSurface, C as useSafePersonaSurface };
|
|
@@ -23,8 +23,10 @@ export { ContextManagerProvider, useContextManager } from './ContextManagerProvi
|
|
|
23
23
|
export type { ContextManagerValue, ContextManagerProviderProps } from './ContextManagerProvider';
|
|
24
24
|
export { GeographyProvider, useGeography } from '../../geography/GeographyProvider';
|
|
25
25
|
export type { GeographyContextValue, GeographyProviderProps, } from '../../geography/GeographyProvider';
|
|
26
|
-
export { PermissionProvider, usePermissions, usePermission, useRole, usePermissionLoading, matchPermission, hasMatchingPermission, isSuperAdminBypass, SUPER_ADMIN_ROLE, SUPER_ADMIN_ACTOR_TYPE, } from './PermissionProvider';
|
|
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
|
+
export { PersonaSurfaceProvider, usePersonaSurface, useSafePersonaSurface, resolveSurfaceForRoles, synthesizeSimulatedPermissionStrings, EVERYTHING_SURFACE_ID, } from './PersonaSurfaceProvider';
|
|
29
|
+
export type { PersonaSurfaceDefinition, PersonaSurfaceContextValue, PersonaSurfaceProviderProps, NavItemOverrideState, SimulatableRole, SimulationState, } from './PersonaSurfaceProvider';
|
|
28
30
|
export { AuthTokenProvider, useAuthToken } from './AuthTokenProvider';
|
|
29
31
|
export type { AuthTokenContextValue, AuthTokenProviderProps } from './AuthTokenProvider';
|
|
30
32
|
export { MultiGatewayProvider } from './MultiGatewayProvider';
|