@plumile/backoffice-react 0.2.11 → 0.2.12
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/README.md +3 -0
- package/lib/esm/auth/authRefreshNotice.css.js +1 -1
- package/lib/esm/auth/login/OidcButtons.js +16 -15
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/loginPage.css.js +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js +7 -9
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +7 -9
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -1
- package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
- package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +13 -13
- package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
- package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
- package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
- package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
- package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +2 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
- package/lib/esm/hooks/useBackofficeSidebarPins.js +1 -1
- package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
- package/lib/esm/hooks/useSidebarGroupCollapse.js +1 -1
- package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +2 -2
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
- package/lib/esm/storybook/backofficeDashboardPageStory.css.js +1 -1
- package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
- package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
- package/package.json +11 -11
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/filters/entityIdFilterField.css.ts
|
|
3
|
-
var e = "
|
|
3
|
+
var e = "txvbqb5m2 txvbqb2ny txvbqbl6w txvbqbd7o txvbqbe1y", t = "oa1uye0 txvbqb5mc txvbqb2ny txvbqb1cw txvbqbe1y txvbqbne txvbqblp txvbqbn8 txvbqbj9 txvbqbak txvbqbeh txvbqbire txvbqbk4u txvbqb7x txvbqb7j txvbqb89", n = "oa1uye1 txvbqb6 txvbqb5mc txvbqb8om txvbqbe1y txvbqbla8 txvbqb2m4 txvbqbv txvbqbkk txvbqb8y txvbqbeh txvbqbf5e", r = "txvbqb5m2 txvbqb6mq txvbqb8om txvbqb7fw txvbqbe1y txvbqbla8 txvbqbd7o", i = "txvbqb1cw txvbqbe1y txvbqb5m2 txvbqb2ny txvbqbf4k", a = "txvbqb5li txvbqbej txvbqb6nu txvbqb1df txvbqbe1y txvbqbf4k txvbqb2m7 txvbqb2mq", o = "txvbqb5li txvbqbe1y txvbqbf4k txvbqb2m7 txvbqb2mq txvbqb6o4 txvbqb1dg", s = "txvbqb5li txvbqbe1y txvbqbf4k txvbqb2m7 txvbqb2mq txvbqbej txvbqb6o4", c = "oa1uye3 oa1uye2 txvbqb6 txvbqb5mw txvbqb2ny txvbqbgs txvbqb8om txvbqbkzo txvbqb7uc txvbqbf5e txvbqbnc txvbqbkk txvbqb8y txvbqbej txvbqbv txvbqb7y txvbqb7h txvbqb89", l = "txvbqbkyu txvbqb7ti";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { l as actionIcon, c as clearButton, e as container, r as content, a as labelText, n as pickerButton, t as pickerControl, s as placeholder, i as valueBox, o as valueText };
|
|
6
6
|
|
|
@@ -22,7 +22,7 @@ var _ = /* @__PURE__ */ d(g, {
|
|
|
22
22
|
children: [/* @__PURE__ */ f("div", {
|
|
23
23
|
className: r,
|
|
24
24
|
children: [e.icon != null && /* @__PURE__ */ d("span", {
|
|
25
|
-
className: "
|
|
25
|
+
className: "txvbqb5mw txvbqb2ny txvbqb8om txvbqbkzy txvbqb7um txvbqbnc txvbqbam txvbqblp txvbqbn8 txvbqbja txvbqbei txvbqb1d2 txvbqbb7q",
|
|
26
26
|
"aria-hidden": "true",
|
|
27
27
|
children: e.icon
|
|
28
28
|
}), /* @__PURE__ */ f("span", {
|
|
@@ -31,7 +31,7 @@ var _ = /* @__PURE__ */ d(g, {
|
|
|
31
31
|
className: a,
|
|
32
32
|
children: e.title
|
|
33
33
|
}), e.description != null && /* @__PURE__ */ d("span", {
|
|
34
|
-
className: "
|
|
34
|
+
className: "txvbqbej txvbqb6o4",
|
|
35
35
|
children: e.description
|
|
36
36
|
})]
|
|
37
37
|
})]
|
|
@@ -55,11 +55,11 @@ var _ = /* @__PURE__ */ d(g, {
|
|
|
55
55
|
children: e.label
|
|
56
56
|
}),
|
|
57
57
|
n && /* @__PURE__ */ d("span", {
|
|
58
|
-
className: "
|
|
58
|
+
className: "txvbqbej txvbqb6o4 txvbqb1ry txvbqb20h",
|
|
59
59
|
children: e.description
|
|
60
60
|
}),
|
|
61
61
|
r && /* @__PURE__ */ d("span", {
|
|
62
|
-
className: "
|
|
62
|
+
className: "txvbqbej txvbqb6nu txvbqb1df txvbqb6k txvbqb1oc",
|
|
63
63
|
children: e.metaLabel
|
|
64
64
|
})
|
|
65
65
|
]
|
|
@@ -71,7 +71,7 @@ var _ = /* @__PURE__ */ d(g, {
|
|
|
71
71
|
}), /* @__PURE__ */ f("div", {
|
|
72
72
|
className: e,
|
|
73
73
|
children: [v != null && /* @__PURE__ */ d("div", {
|
|
74
|
-
className: "
|
|
74
|
+
className: "txvbqbd2y",
|
|
75
75
|
children: /* @__PURE__ */ d(h, {
|
|
76
76
|
value: v.value,
|
|
77
77
|
onChange: v.onChange,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/hub/backofficeHubTemplate.css.ts
|
|
3
|
-
var e = "
|
|
3
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6t4", t = "txvbqbd2y", n = "txvbqb5m2 txvbqb6mq txvbqb6te", r = "txvbqb5m2 txvbqb6mq txvbqb6sk", i = "txvbqb5m2 txvbqb2no txvbqb6sk", a = "txvbqb5mw txvbqb2ny txvbqb8om txvbqbkzy txvbqb7um txvbqbnc txvbqbam txvbqblp txvbqbn8 txvbqbja txvbqbei txvbqb1d2 txvbqbb7q", o = "txvbqb5m2 txvbqb6mq txvbqb6s0 txvbqbe1y", s = "txvbqb6oo txvbqb1dg txvbqbeh txvbqb1s4", c = "txvbqbej txvbqb6o4", l = "txvbqb5mc txvbqb7rk txvbqb6sk", u = "u4nszr0 txvbqb5m2 txvbqb2no txvbqb6sk txvbqbf68 txvbqbnc txvbqblp txvbqbn8 txvbqbja txvbqbak txvbqbeh txvbqb3p txvbqbe1y txvbqb7x txvbqb7j txvbqb89 qbwcue2", d = "txvbqb5mw txvbqb2ny txvbqb8om txvbqbl08 txvbqb7uw txvbqbnc txvbqbam txvbqbei txvbqb1d2", f = "txvbqb5m2 txvbqb6mq txvbqb6s0 txvbqbe1y", p = "txvbqb1dg txvbqbeh txvbqb20h", m = "txvbqbej txvbqb6o4 txvbqb1ry txvbqb20h", h = "txvbqbej txvbqb6nu txvbqb1df txvbqb6k txvbqb1oc";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { e as content, l as grid, r as group, c as groupDescription, i as groupHeader, o as groupHeading, a as groupIcon, s as groupTitle, n as groups, u as item, f as itemContent, m as itemDescription, d as itemIcon, h as itemMeta, p as itemTitle, t as search };
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/layout/backofficeSidebarActions.css.ts
|
|
3
|
-
var e = "_1xws1b00
|
|
3
|
+
var e = "_1xws1b00 txvbqb5mw txvbqb2ny txvbqb8om txvbqbkze txvbqb7u2 txvbqbkk txvbqbn6 txvbqbnc txvbqb8y txvbqbv txvbqbf5e txvbqb7y txvbqb7j txvbqb89";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { e as actionButton };
|
|
6
6
|
|
|
@@ -31,13 +31,13 @@ var g = (e) => {
|
|
|
31
31
|
children: [/* @__PURE__ */ p("li", {
|
|
32
32
|
className: o,
|
|
33
33
|
children: [x && /* @__PURE__ */ f("span", {
|
|
34
|
-
className: "_80s44h2 _80s44h1 qbwcueu qbwcues
|
|
34
|
+
className: "_80s44h2 _80s44h1 qbwcueu qbwcues txvbqb5mw txvbqb2ny txvbqb8om txvbqbkk txvbqbn6 txvbqbnc txvbqb8y txvbqbei txvbqbv txvbqbf5e txvbqb7y txvbqb7j txvbqb89 qbwcuet txvbqbmdb txvbqbo8n qbwcuec txvbqborp txvbqboy5 qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 qbwcue18 qbwcue12 txvbqb1d2 txvbqb1rv qbwcue1c qbwcue16 txvbqbkzy txvbqb7um txvbqbe46 txvbqbdco txvbqb3p txvbqbam txvbqbeh",
|
|
35
35
|
"aria-current": "page",
|
|
36
36
|
title: b,
|
|
37
37
|
children: w
|
|
38
38
|
}), !x && /* @__PURE__ */ f(m, {
|
|
39
39
|
to: y,
|
|
40
|
-
className: "_80s44h1 qbwcueu qbwcues
|
|
40
|
+
className: "_80s44h1 qbwcueu qbwcues txvbqb5mw txvbqb2ny txvbqb8om txvbqbkk txvbqbn6 txvbqbnc txvbqb8y txvbqbei txvbqbv txvbqbf5e txvbqb7y txvbqb7j txvbqb89 qbwcuet txvbqbmdb txvbqbo8n qbwcuec txvbqborp txvbqboy5 qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 qbwcue18 qbwcue12 txvbqb1d2 txvbqb1rv qbwcue1c qbwcue16 txvbqbkzy txvbqb7um txvbqbe46 txvbqbdco txvbqb3p",
|
|
41
41
|
"aria-label": b,
|
|
42
42
|
title: b,
|
|
43
43
|
preloadOnHover: "code-and-data",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.ts
|
|
3
|
-
var e = "
|
|
3
|
+
var e = "txvbqb5m2 txvbqb2ny txvbqbla8 txvbqbe1y txvbqbd7o", t = "_80s44h0 txvbqb5m2 txvbqb2ny txvbqb6sa txvbqb1s4 txvbqbf5e txvbqb1s1 txvbqb1d5 txvbqbe1y txvbqbd7o", n = "txvbqb5mw txvbqb2ny txvbqb6sa txvbqbe1y", r = "txvbqbei txvbqb1ry", i = "_80s44h1 qbwcueu qbwcues txvbqb5mw txvbqb2ny txvbqb8om txvbqbkk txvbqbn6 txvbqbnc txvbqb8y txvbqbei txvbqbv txvbqbf5e txvbqb7y txvbqb7j txvbqb89 qbwcuet txvbqbmdb txvbqbo8n qbwcuec txvbqborp txvbqboy5 qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 qbwcue18 qbwcue12 txvbqb1d2 txvbqb1rv qbwcue1c qbwcue16 txvbqbkzy txvbqb7um txvbqbe46 txvbqbdco txvbqb3p", a = "_80s44h2 _80s44h1 qbwcueu qbwcues txvbqb5mw txvbqb2ny txvbqb8om txvbqbkk txvbqbn6 txvbqbnc txvbqb8y txvbqbei txvbqbv txvbqbf5e txvbqb7y txvbqb7j txvbqb89 qbwcuet txvbqbmdb txvbqbo8n qbwcuec txvbqborp txvbqboy5 qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 qbwcue18 qbwcue12 txvbqb1d2 txvbqb1rv qbwcue1c qbwcue16 txvbqbkzy txvbqb7um txvbqbe46 txvbqbdco txvbqb3p txvbqbam txvbqbeh", o = "_4k5f061 _4k5f060 txvbqbkk txvbqbn6 txvbqb1t txvbqb856 txvbqb1tc txvbqbf4k txvbqbf5e txvbqbk68 txvbqbk7m txvbqb1j1 txvbqblai", s = "_80s44h3 qbwcue10 qbwcuey txvbqb5mw txvbqb2ny txvbqb6s0 txvbqbeh txvbqb3p txvbqb7y txvbqb7h txvbqb89 qbwcuez txvbqbpwu qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 txvbqbei txvbqb1ry txvbqbe1y txvbqbd7o txvbqb20h", c = "txvbqbeh txvbqb1ry txvbqb1dg txvbqbe1y txvbqbd7o txvbqb20h";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { c as current, a as homeCurrent, o as homeLabel, i as homeLink, n as item, s as link, t as list, e as nav, r as separator };
|
|
6
6
|
|
|
@@ -5,7 +5,7 @@ var i = ({ icon: i, label: a, showIcon: o = !0, endAdornment: s }) => /* @__PURE
|
|
|
5
5
|
className: e,
|
|
6
6
|
children: [
|
|
7
7
|
o && i != null && /* @__PURE__ */ n("span", {
|
|
8
|
-
className: "
|
|
8
|
+
className: "txvbqb5mw txvbqb2ny txvbqb8om txvbqbcm txvbqb1cz txvbqblnk txvbqb8i8",
|
|
9
9
|
"aria-hidden": "true",
|
|
10
10
|
children: /* @__PURE__ */ n(i, {
|
|
11
11
|
width: 14,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/links/backofficeLink.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5mw txvbqb2ny txvbqb6s0", t = "txvbqb5mw txvbqb2ny txvbqb8om txvbqbcm txvbqb1cz txvbqblnk txvbqb8i8", n = "txvbqbe1y";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as content, t as icon, n as label };
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/list/RowFlagsCell.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb8om txvbqbiqu txvbqbjge", t = "txvbqb5mw txvbqb2ny txvbqb8om txvbqb7g6 txvbqbla8", n = "qbwcue18 qbwcue12 txvbqb5mw txvbqb2ny txvbqb8om txvbqb1d2 txvbqb1rv qbwcue1c qbwcue16 txvbqbkzy txvbqb7um txvbqbe46 txvbqbdco";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as container, n as flag, e as rowFlagsColumnCell };
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/overview/backofficeOverviewLayout.css.ts
|
|
3
|
-
var e = "
|
|
3
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6te txvbqbla8 txvbqbe1y", t = "txvbqb5m2 txvbqb6mq txvbqb6su", n = "_1f81p5z0 txvbqb5mc txvbqb7hk txvbqb6te txvbqb2no", r = "txvbqb5m2 txvbqb6mq txvbqb6te", i = "txvbqb5m2 txvbqb6mq txvbqb6te";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { i as aside, e as container, n as content, r as primary, t as summary };
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/pickers/entityIdPickerDialog.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqbei txvbqb6o4 txvbqb2m5 txvbqbjh8 txvbqbiqk", t = "txvbqb5m2 txvbqb2ny txvbqb8om txvbqb6sa txvbqbjhi txvbqbire txvbqbei", n = "txvbqb6o4 txvbqbei";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { n as loadingLabel, t as loadingState, e as searchRequiredMessage };
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/refs/backofficeRelatedCountLink.css.ts
|
|
3
|
-
var e = "qbwcuex qbwcuev
|
|
3
|
+
var e = "qbwcuex qbwcuev txvbqb5mw txvbqb2ny txvbqb8om txvbqb6s0 txvbqbe4g txvbqbir4 txvbqbjgo txvbqbeh txvbqbal txvbqbja txvbqbn8 txvbqbls txvbqbnj txvbqb1dg txvbqb1rv txvbqb3p txvbqb7x txvbqb7h txvbqb89 qbwcuew txvbqbodq txvbqbmcu txvbqbndi txvbqbnmm qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3", t = "txvbqbe2i txvbqb2m5 txvbqb1d7", n = "txvbqb5mw txvbqb2ny txvbqb8om txvbqbkyu txvbqb7ti txvbqbej", r = "kk18lv0 txvbqb1d2 txvbqbei txvbqb6o4 txvbqb1rv txvbqb7y txvbqb7h txvbqb89";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { t as count, n as countLoading, r as icon, e as link };
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/routing/backofficeContentFallback.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6su txvbqbla8 txvbqbdmo", t = "txvbqbd8i", n = "txvbqb5mc txvbqb6su txvbqb7ra", r = "txvbqb5m2 txvbqb6mq txvbqb6sk txvbqbf6i txvbqbdhy txvbqbne txvbqblp txvbqbn8 txvbqbja txvbqbam";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { r as card, e as container, n as grid, t as title };
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb1d5 txvbqb2ny txvbqb6sa", t = "txvbqbla8 txvbqbl6y txvbqbd7o", n = "txvbqb5m2 txvbqb6mq txvbqb6sa txvbqbla8", r = "txvbqb5m2 txvbqb1d5 txvbqb2ny txvbqb6s0 txvbqbe1y", i = "txvbqb5m2 txvbqb6mq txvbqb6sk", a = "txvbqb5m2 txvbqb6mq txvbqb84w txvbqbdag", o = "txvbqb5m2 txvbqb2ny txvbqb6sa txvbqbgr txvbqbir4 txvbqbjgo txvbqb8qu txvbqbls txvbqbn8 txvbqbja txvbqbnc txvbqbak txvbqbei txvbqb6o4 txvbqb1rw", s = "txvbqb6oe txvbqb1dg txvbqbeh";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as controlsRow, i as embeddedContainer, s as embeddedHeader, n as entityIdListFilter, r as entityIdListTags, t as filterInput, o as refreshingIndicator, a as tableHost };
|
|
5
5
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
import { c as e } from "../../../node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js";
|
|
3
3
|
//#region src/components/backoffice/shared/backofficeFilterableCell.css.ts
|
|
4
|
-
var t = "_1q232kj0
|
|
5
|
-
defaultClassName: "_1q232kj1
|
|
4
|
+
var t = "_1q232kj0 txvbqb2ny txvbqb1a6 txvbqbd7o txvbqbe1y txvbqb8f", n = "txvbqb5mw txvbqb2ny txvbqb8om", r = "txvbqb5mw txvbqb2ny txvbqb6s0 txvbqbe1y txvbqbd7o", i = e({
|
|
5
|
+
defaultClassName: "_1q232kj1 txvbqbe1y txvbqbd7o",
|
|
6
6
|
variantClassNames: { wrap: {
|
|
7
|
-
false: "_1q232kj2
|
|
8
|
-
true: "_1q232kj3
|
|
7
|
+
false: "_1q232kj2 txvbqbf4k txvbqb2m7 txvbqb2mq",
|
|
8
|
+
true: "_1q232kj3 txvbqb2mr txvbqb2mc"
|
|
9
9
|
} },
|
|
10
10
|
defaultVariants: { wrap: !1 },
|
|
11
11
|
compoundVariants: []
|
|
12
|
-
}), a = "_1q232kj4 qbwcue10 qbwcuey
|
|
12
|
+
}), a = "_1q232kj4 qbwcue10 qbwcuey txvbqb5mw txvbqb2ny txvbqb6s0 txvbqbeh txvbqb3p txvbqb7y txvbqb7h txvbqb89 qbwcuez txvbqbpwu qbwcue5 qbwcue4 txvbqbozt txvbqbpu1 qbwcue3 txvbqbe1y txvbqbd7o txvbqbf4 txvbqb1dg txvbqbo8m", o = "txvbqb1d2 txvbqbei txvbqblnk txvbqb8i8";
|
|
13
13
|
//#endregion
|
|
14
14
|
export { n as actionSlot, t as container, r as contentSlot, o as detailIcon, a as detailLink, i as text };
|
|
15
15
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/shared/backofficeInlineFilterRow.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5mw txvbqb2ny txvbqb6s0 txvbqb1d4 txvbqbd7o txvbqbe1y txvbqbf4k", t = "txvbqb5mw txvbqb2ny txvbqb8om txvbqb1d2", n = "txvbqbe1y txvbqbd7o txvbqbf4k txvbqb2m7 txvbqb2mq";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as actionSlot, e as container, n as valueSlot };
|
|
5
5
|
|
|
@@ -27,7 +27,7 @@ var f = ({ title: f, content: p, language: m, badgeLabel: h, defaultOpen: g = !1
|
|
|
27
27
|
className: c(n, { [r]: v })
|
|
28
28
|
})]
|
|
29
29
|
}), v && /* @__PURE__ */ l("div", {
|
|
30
|
-
className: "
|
|
30
|
+
className: "txvbqb57c txvbqbn8 txvbqbq3 txvbqbal txvbqbe1y txvbqb20n txvbqbf68",
|
|
31
31
|
id: b,
|
|
32
32
|
children: /* @__PURE__ */ l(s, {
|
|
33
33
|
code: _,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Stack as e } from "@plumile/ui";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
3
|
import { useTranslation as r } from "react-i18next";
|
|
3
4
|
import { Button as i } from "@plumile/ui/button";
|
|
4
5
|
import { BackofficeDetailSection as a } from "@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/button';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n
|
|
1
|
+
{"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/button';\nimport { Stack } from '@plumile/ui';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <Stack>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={onRetry}\n tone=\"neutral\"\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </Stack>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;;AAaA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;EAEA,UAAA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;GACT,MAAK;GAEJ,UAAA,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;EACtD,UAAA,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAEtB,EAAA,CAAA;AAEX"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
//#region src/components/backoffice/tools/backofficeToolsDocPanel.css.ts
|
|
3
|
-
var e = "
|
|
3
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6sk", t = "txvbqblp txvbqbn8 txvbqbj9 txvbqbnd txvbqbak txvbqbe1y txvbqbf4k", n = "_8o9eh80 txvbqbla8 txvbqb5m2 txvbqb2ny txvbqb8pg txvbqb6sa txvbqbjh8 txvbqbiro txvbqb8y txvbqbkk txvbqbn6 txvbqbeh txvbqbv txvbqb2m4", r = "txvbqb6oe txvbqb1dg", i = "txvbqbei txvbqb85 txvbqb7h txvbqb89", a = "txvbqb3a", o = "txvbqb57c txvbqbn8 txvbqbq3 txvbqbal txvbqbe1y txvbqb20n txvbqbf68";
|
|
4
4
|
//#endregion
|
|
5
5
|
export { o as content, t as panel, e as panelGroup, n as trigger, i as triggerIcon, a as triggerIconOpen, r as triggerTitle };
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/tools/backofficeToolsForm.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6sk", t = "txvbqb5m2 txvbqb8pq txvbqb8ox", n = "txvbqb5m2 txvbqb2ny txvbqb8pg txvbqb1d5 txvbqb6sa", r = "txvbqb5m2 txvbqb6mq txvbqb6sk", i = "txvbqb5mc txvbqb6su txvbqb7r0", a = "txvbqb5m2 txvbqb8om txvbqbjhs";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as actions, e as form, n as inputHeader, i as keyValueGrid, a as loadingState, r as outputStack };
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/tools/backofficeToolsJsonForm.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6su", t = "txvbqb5m2 txvbqb8pq txvbqb8ox", n = "txvbqb5m2 txvbqb2ny txvbqb8pg txvbqb1d5 txvbqb6sa";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as actions, e as form, n as inputHeader };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBackofficeSidebarPins.js","names":[],"sources":["../../../src/hooks/useBackofficeSidebarPins.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'backoffice.sidebar.pins.v1';\n\ntype PinsPayload = unknown;\n\nconst readPinsFromStorage = (storageKey: string): string[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as PinsPayload;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n } catch {\n return [];\n }\n};\n\nconst normalizePins = (\n pins: readonly string[],\n validIds: Set<string>,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n pins.forEach((entry) => {\n if (!validIds.has(entry)) {\n return;\n }\n if (seen.has(entry)) {\n return;\n }\n seen.add(entry);\n output.push(entry);\n });\n return output;\n};\n\nconst reorderPins = (\n pins: readonly string[],\n fromId: string,\n toId: string,\n): readonly string[] => {\n if (fromId === toId) {\n return pins;\n }\n const fromIndex = pins.indexOf(fromId);\n const toIndex = pins.indexOf(toId);\n if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) {\n return pins;\n }\n const next = [...pins];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, fromId);\n return next;\n};\n\nexport type SidebarPinsState = {\n pins: readonly string[];\n isPinned: (id: string) => boolean;\n pin: (id: string) => void;\n unpin: (id: string) => void;\n toggle: (id: string) => void;\n reorder: (fromId: string, toId: string) => void;\n};\n\nexport type UseBackofficeSidebarPinsInput = {\n enabled?: boolean;\n storageKey?: string;\n visibleEntityIds: readonly string[];\n};\n\nexport const useBackofficeSidebarPins = (\n input: UseBackofficeSidebarPinsInput,\n): SidebarPinsState => {\n const {\n enabled = true,\n storageKey = DEFAULT_STORAGE_KEY,\n visibleEntityIds,\n } = input;\n const validIds = useMemo(() => {\n return new Set(visibleEntityIds);\n }, [visibleEntityIds]);\n\n const [pins, setPins] = useState<string[]>(() => {\n if (!enabled) {\n return [];\n }\n const stored = readPinsFromStorage(storageKey);\n return normalizePins(stored, validIds);\n });\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n setPins((prev) => {\n const normalized = normalizePins(prev, validIds);\n if (normalized.length === prev.length) {\n let unchanged = true;\n for (let index = 0; index < normalized.length; index += 1) {\n if (normalized[index] !== prev[index]) {\n unchanged = false;\n break;\n }\n }\n if (unchanged) {\n return prev;\n }\n }\n return normalized;\n });\n }, [enabled, validIds]);\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n const stored = readPinsFromStorage(storageKey);\n setPins(normalizePins(stored, validIds));\n }, [enabled, storageKey, validIds]);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(pins));\n } catch {\n // Ignore storage errors in non-browser or restricted environments.\n }\n }, [enabled, pins, storageKey]);\n\n const pinsSet = useMemo(() => {\n return new Set(pins);\n }, [pins]);\n\n const pin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n if (!validIds.has(id)) {\n return;\n }\n setPins((prev) => {\n if (prev.includes(id)) {\n return prev;\n }\n return [...prev, id];\n });\n },\n [enabled, validIds],\n );\n\n const unpin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return prev.filter((entry) => {\n return entry !== id;\n });\n });\n },\n [enabled],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (pinsSet.has(id)) {\n unpin(id);\n } else {\n pin(id);\n }\n },\n [pin, pinsSet, unpin],\n );\n\n const reorder = useCallback(\n (fromId: string, toId: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return reorderPins(prev, fromId, toId) as string[];\n });\n },\n [enabled],\n );\n\n const isPinned = useCallback(\n (id: string) => {\n return pinsSet.has(id);\n },\n [pinsSet],\n );\n\n return {\n pins,\n isPinned,\n pin,\n unpin,\n toggle,\n reorder,\n };\n};\n\nexport const __test = {\n normalizePins,\n readPinsFromStorage,\n reorderPins,\n};\n\nexport default useBackofficeSidebarPins;\n"],"mappings":";;AAEA,IAAM,IAAsB,8BAItB,KAAuB,MAAiC;CAC5D,IAAI,OAAO,SAAW,KACpB,OAAO,CAAC;CAEV,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO,CAAC;EAEV,IAAM,IAAS,KAAK,MAAM,CAAG;EAI7B,OAHK,MAAM,QAAQ,CAAM,IAGlB,EAAO,QAAQ,MACb,OAAO,KAAU,QACzB,IAJQ,CAAC;CAKZ,QAAQ;EACN,OAAO,CAAC;CACV;AACF,GAEM,KACJ,GACA,MACa;CACb,IAAM,IAAmB,CAAC,GACpB,oBAAO,IAAI,IAAY;CAW7B,OAVA,EAAK,SAAS,MAAU;EACjB,EAAS,IAAI,CAAK,MAGnB,EAAK,IAAI,CAAK,MAGlB,EAAK,IAAI,CAAK,GACd,EAAO,KAAK,CAAK;CACnB,CAAC,GACM;AACT,GAEM,KACJ,GACA,GACA,MACsB;CACtB,IAAI,MAAW,GACb,OAAO;CAET,IAAM,IAAY,EAAK,QAAQ,CAAM,GAC/B,IAAU,EAAK,QAAQ,CAAI;CACjC,IAAI,MAAc,MAAM,MAAY,MAAM,MAAc,GACtD,OAAO;CAET,IAAM,IAAO,CAAC,GAAG,CAAI;CAGrB,OAFA,EAAK,OAAO,GAAW,CAAC,GACxB,EAAK,OAAO,GAAS,GAAG,CAAM,GACvB;AACT,GAiBa,KACX,MACqB;CACrB,IAAM,EACJ,aAAU,IACV,gBAAa,GACb,wBACE,GACE,IAAW,QACR,IAAI,IAAI,CAAgB,GAC9B,CAAC,CAAgB,CAAC,GAEf,CAAC,GAAM,KAAW,QACjB,IAIE,EADQ,EAAoB,CACd,GAAQ,CAAQ,IAH5B,CAAC,CAIX;CAkCD,AAhCA,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,CAAC,CAAC;GACV;EACF;EACA,GAAS,MAAS;GAChB,IAAM,IAAa,EAAc,GAAM,CAAQ;GAC/C,IAAI,EAAW,WAAW,EAAK,QAAQ;IACrC,IAAI,IAAY;IAChB,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAW,QAAQ,KAAS,GACtD,IAAI,EAAW,OAAW,EAAK,IAAQ;KACrC,IAAY;KACZ;IACF;IAEF,IAAI,GACF,OAAO;GAEX;GACA,OAAO;EACT,CAAC;CACH,GAAG,CAAC,GAAS,CAAQ,CAAC,GAEtB,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,CAAC,CAAC;GACV;EACF;EACA,IAAM,IAAS,EAAoB,CAAU;EAC7C,EAAQ,EAAc,GAAQ,CAAQ,CAAC;CACzC,GAAG;EAAC;EAAS;EAAY;CAAQ,CAAC,GAElC,QAAgB;EACV,
|
|
1
|
+
{"version":3,"file":"useBackofficeSidebarPins.js","names":[],"sources":["../../../src/hooks/useBackofficeSidebarPins.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'backoffice.sidebar.pins.v1';\n\ntype PinsPayload = unknown;\n\nconst readPinsFromStorage = (storageKey: string): string[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as PinsPayload;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n } catch {\n return [];\n }\n};\n\nconst normalizePins = (\n pins: readonly string[],\n validIds: Set<string>,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n pins.forEach((entry) => {\n if (!validIds.has(entry)) {\n return;\n }\n if (seen.has(entry)) {\n return;\n }\n seen.add(entry);\n output.push(entry);\n });\n return output;\n};\n\nconst reorderPins = (\n pins: readonly string[],\n fromId: string,\n toId: string,\n): readonly string[] => {\n if (fromId === toId) {\n return pins;\n }\n const fromIndex = pins.indexOf(fromId);\n const toIndex = pins.indexOf(toId);\n if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) {\n return pins;\n }\n const next = [...pins];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, fromId);\n return next;\n};\n\nexport type SidebarPinsState = {\n pins: readonly string[];\n isPinned: (id: string) => boolean;\n pin: (id: string) => void;\n unpin: (id: string) => void;\n toggle: (id: string) => void;\n reorder: (fromId: string, toId: string) => void;\n};\n\nexport type UseBackofficeSidebarPinsInput = {\n enabled?: boolean;\n storageKey?: string;\n visibleEntityIds: readonly string[];\n};\n\nexport const useBackofficeSidebarPins = (\n input: UseBackofficeSidebarPinsInput,\n): SidebarPinsState => {\n const {\n enabled = true,\n storageKey = DEFAULT_STORAGE_KEY,\n visibleEntityIds,\n } = input;\n const validIds = useMemo(() => {\n return new Set(visibleEntityIds);\n }, [visibleEntityIds]);\n\n const [pins, setPins] = useState<string[]>(() => {\n if (!enabled) {\n return [];\n }\n const stored = readPinsFromStorage(storageKey);\n return normalizePins(stored, validIds);\n });\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n setPins((prev) => {\n const normalized = normalizePins(prev, validIds);\n if (normalized.length === prev.length) {\n let unchanged = true;\n for (let index = 0; index < normalized.length; index += 1) {\n if (normalized[index] !== prev[index]) {\n unchanged = false;\n break;\n }\n }\n if (unchanged) {\n return prev;\n }\n }\n return normalized;\n });\n }, [enabled, validIds]);\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n const stored = readPinsFromStorage(storageKey);\n setPins(normalizePins(stored, validIds));\n }, [enabled, storageKey, validIds]);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(pins));\n } catch {\n // Ignore storage errors in non-browser or restricted environments.\n }\n }, [enabled, pins, storageKey]);\n\n const pinsSet = useMemo(() => {\n return new Set(pins);\n }, [pins]);\n\n const pin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n if (!validIds.has(id)) {\n return;\n }\n setPins((prev) => {\n if (prev.includes(id)) {\n return prev;\n }\n return [...prev, id];\n });\n },\n [enabled, validIds],\n );\n\n const unpin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return prev.filter((entry) => {\n return entry !== id;\n });\n });\n },\n [enabled],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (pinsSet.has(id)) {\n unpin(id);\n } else {\n pin(id);\n }\n },\n [pin, pinsSet, unpin],\n );\n\n const reorder = useCallback(\n (fromId: string, toId: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return reorderPins(prev, fromId, toId) as string[];\n });\n },\n [enabled],\n );\n\n const isPinned = useCallback(\n (id: string) => {\n return pinsSet.has(id);\n },\n [pinsSet],\n );\n\n return {\n pins,\n isPinned,\n pin,\n unpin,\n toggle,\n reorder,\n };\n};\n\nexport const __test = {\n normalizePins,\n readPinsFromStorage,\n reorderPins,\n};\n\nexport default useBackofficeSidebarPins;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSidebarGroupCollapse.js","names":[],"sources":["../../../src/hooks/useSidebarGroupCollapse.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type SidebarGroupCollapseState = Record<string, boolean | undefined>;\n\nexport type UseSidebarGroupCollapseInput = {\n groupIds: readonly string[];\n activeGroupId?: string | null;\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>;\n storageKey?: string;\n persist?: boolean;\n};\n\nconst readStoredState = (\n storageKey: string | undefined,\n): SidebarGroupCollapseState | null => {\n if (storageKey == null || typeof window === 'undefined') {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n const output: SidebarGroupCollapseState = {};\n Object.entries(parsed as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (typeof value === 'boolean') {\n output[key] = value;\n }\n },\n );\n return output;\n } catch {\n return null;\n }\n};\n\nconst buildInitialState = (\n groupIds: readonly string[],\n activeGroupId?: string | null,\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>,\n): SidebarGroupCollapseState => {\n const state: SidebarGroupCollapseState = {};\n groupIds.forEach((groupId) => {\n state[groupId] = defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n if (activeGroupId != null && groupIds.includes(activeGroupId)) {\n state[activeGroupId] = false;\n }\n return state;\n};\n\nexport const useSidebarGroupCollapse = (\n input: UseSidebarGroupCollapseInput,\n): {\n collapsedByGroupId: SidebarGroupCollapseState;\n setCollapsed: (groupId: string, collapsed: boolean) => void;\n} => {\n const {\n activeGroupId,\n defaultCollapsedByGroupId,\n groupIds,\n persist = false,\n storageKey,\n } = input;\n\n const groupIdList = useMemo(() => {\n return [...groupIds];\n }, [groupIds]);\n\n const [collapsedByGroupId, setCollapsedByGroupId] =\n useState<SidebarGroupCollapseState>(() => {\n if (persist) {\n const stored = readStoredState(storageKey);\n if (stored != null) {\n return {\n ...buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n ),\n ...stored,\n };\n }\n }\n return buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n );\n });\n\n useEffect(() => {\n setCollapsedByGroupId((prev) => {\n const next: SidebarGroupCollapseState = {};\n\n groupIdList.forEach((groupId) => {\n const existing = prev[groupId];\n next[groupId] =\n existing ?? defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n\n if (activeGroupId != null && groupIdList.includes(activeGroupId)) {\n next[activeGroupId] = false;\n }\n\n return next;\n });\n }, [activeGroupId, defaultCollapsedByGroupId, groupIdList]);\n\n useEffect(() => {\n if (!persist || storageKey == null || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify(collapsedByGroupId),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [collapsedByGroupId, persist, storageKey]);\n\n useEffect(() => {\n if (activeGroupId == null) {\n return;\n }\n setCollapsedByGroupId((prev) => {\n if (prev[activeGroupId] === false) {\n return prev;\n }\n return {\n ...prev,\n [activeGroupId]: false,\n };\n });\n }, [activeGroupId]);\n\n const setCollapsed = useCallback((groupId: string, collapsed: boolean) => {\n setCollapsedByGroupId((prev) => {\n if (prev[groupId] === collapsed) {\n return prev;\n }\n return {\n ...prev,\n [groupId]: collapsed,\n };\n });\n }, []);\n\n return {\n collapsedByGroupId,\n setCollapsed,\n };\n};\n\nexport default useSidebarGroupCollapse;\n"],"mappings":";;AAYA,IAAM,KACJ,MACqC;CACrC,IAAI,KAAc,QAAQ,OAAO,SAAW,KAC1C,OAAO;CAET,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO;EAET,IAAM,IAAS,KAAK,MAAM,CAAG;EAC7B,IAAsB,OAAO,KAAW,aAApC,GACF,OAAO;EAET,IAAM,IAAoC,CAAC;EAQ3C,OAPA,OAAO,QAAQ,CAAiC,CAAC,CAAC,SAC/C,CAAC,GAAK,OAAW;GAChB,AAAI,OAAO,KAAU,cACnB,EAAO,KAAO;EAElB,CACF,GACO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAEM,KACJ,GACA,GACA,MAC8B;CAC9B,IAAM,IAAmC,CAAC;CAO1C,OANA,EAAS,SAAS,MAAY;EAC5B,EAAM,KAAW,IAA4B,MAAY;CAC3D,CAAC,GACG,KAAiB,QAAQ,EAAS,SAAS,CAAa,MAC1D,EAAM,KAAiB,KAElB;AACT,GAEa,KACX,MAIG;CACH,IAAM,EACJ,kBACA,8BACA,aACA,aAAU,IACV,kBACE,GAEE,IAAc,QACX,CAAC,GAAG,CAAQ,GAClB,CAAC,CAAQ,CAAC,GAEP,CAAC,GAAoB,KACzB,QAA0C;EACxC,IAAI,GAAS;GACX,IAAM,IAAS,EAAgB,CAAU;GACzC,IAAI,KAAU,MACZ,OAAO;IACL,GAAG,EACD,GACA,GACA,CACF;IACA,GAAG;GACL;EAEJ;EACA,OAAO,EACL,GACA,GACA,CACF;CACF,CAAC;CA6DH,OA3DA,QAAgB;EACd,GAAuB,MAAS;GAC9B,IAAM,IAAkC,CAAC;GAYzC,OAVA,EAAY,SAAS,MAAY;IAC/B,IAAM,IAAW,EAAK;IACtB,EAAK,KACH,KAAY,IAA4B,MAAY;GACxD,CAAC,GAEG,KAAiB,QAAQ,EAAY,SAAS,CAAa,MAC7D,EAAK,KAAiB,KAGjB;EACT,CAAC;CACH,GAAG;EAAC;EAAe;EAA2B;CAAW,CAAC,GAE1D,QAAgB;EACV,
|
|
1
|
+
{"version":3,"file":"useSidebarGroupCollapse.js","names":[],"sources":["../../../src/hooks/useSidebarGroupCollapse.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type SidebarGroupCollapseState = Record<string, boolean | undefined>;\n\nexport type UseSidebarGroupCollapseInput = {\n groupIds: readonly string[];\n activeGroupId?: string | null;\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>;\n storageKey?: string;\n persist?: boolean;\n};\n\nconst readStoredState = (\n storageKey: string | undefined,\n): SidebarGroupCollapseState | null => {\n if (storageKey == null || typeof window === 'undefined') {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n const output: SidebarGroupCollapseState = {};\n Object.entries(parsed as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (typeof value === 'boolean') {\n output[key] = value;\n }\n },\n );\n return output;\n } catch {\n return null;\n }\n};\n\nconst buildInitialState = (\n groupIds: readonly string[],\n activeGroupId?: string | null,\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>,\n): SidebarGroupCollapseState => {\n const state: SidebarGroupCollapseState = {};\n groupIds.forEach((groupId) => {\n state[groupId] = defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n if (activeGroupId != null && groupIds.includes(activeGroupId)) {\n state[activeGroupId] = false;\n }\n return state;\n};\n\nexport const useSidebarGroupCollapse = (\n input: UseSidebarGroupCollapseInput,\n): {\n collapsedByGroupId: SidebarGroupCollapseState;\n setCollapsed: (groupId: string, collapsed: boolean) => void;\n} => {\n const {\n activeGroupId,\n defaultCollapsedByGroupId,\n groupIds,\n persist = false,\n storageKey,\n } = input;\n\n const groupIdList = useMemo(() => {\n return [...groupIds];\n }, [groupIds]);\n\n const [collapsedByGroupId, setCollapsedByGroupId] =\n useState<SidebarGroupCollapseState>(() => {\n if (persist) {\n const stored = readStoredState(storageKey);\n if (stored != null) {\n return {\n ...buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n ),\n ...stored,\n };\n }\n }\n return buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n );\n });\n\n useEffect(() => {\n setCollapsedByGroupId((prev) => {\n const next: SidebarGroupCollapseState = {};\n\n groupIdList.forEach((groupId) => {\n const existing = prev[groupId];\n next[groupId] =\n existing ?? defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n\n if (activeGroupId != null && groupIdList.includes(activeGroupId)) {\n next[activeGroupId] = false;\n }\n\n return next;\n });\n }, [activeGroupId, defaultCollapsedByGroupId, groupIdList]);\n\n useEffect(() => {\n if (!persist || storageKey == null || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify(collapsedByGroupId),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [collapsedByGroupId, persist, storageKey]);\n\n useEffect(() => {\n if (activeGroupId == null) {\n return;\n }\n setCollapsedByGroupId((prev) => {\n if (prev[activeGroupId] === false) {\n return prev;\n }\n return {\n ...prev,\n [activeGroupId]: false,\n };\n });\n }, [activeGroupId]);\n\n const setCollapsed = useCallback((groupId: string, collapsed: boolean) => {\n setCollapsedByGroupId((prev) => {\n if (prev[groupId] === collapsed) {\n return prev;\n }\n return {\n ...prev,\n [groupId]: collapsed,\n };\n });\n }, []);\n\n return {\n collapsedByGroupId,\n setCollapsed,\n };\n};\n\nexport default useSidebarGroupCollapse;\n"],"mappings":";;AAYA,IAAM,KACJ,MACqC;CACrC,IAAI,KAAc,QAAQ,OAAO,SAAW,KAC1C,OAAO;CAET,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO;EAET,IAAM,IAAS,KAAK,MAAM,CAAG;EAC7B,IAAsB,OAAO,KAAW,aAApC,GACF,OAAO;EAET,IAAM,IAAoC,CAAC;EAQ3C,OAPA,OAAO,QAAQ,CAAiC,CAAC,CAAC,SAC/C,CAAC,GAAK,OAAW;GAChB,AAAI,OAAO,KAAU,cACnB,EAAO,KAAO;EAElB,CACF,GACO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAEM,KACJ,GACA,GACA,MAC8B;CAC9B,IAAM,IAAmC,CAAC;CAO1C,OANA,EAAS,SAAS,MAAY;EAC5B,EAAM,KAAW,IAA4B,MAAY;CAC3D,CAAC,GACG,KAAiB,QAAQ,EAAS,SAAS,CAAa,MAC1D,EAAM,KAAiB,KAElB;AACT,GAEa,KACX,MAIG;CACH,IAAM,EACJ,kBACA,8BACA,aACA,aAAU,IACV,kBACE,GAEE,IAAc,QACX,CAAC,GAAG,CAAQ,GAClB,CAAC,CAAQ,CAAC,GAEP,CAAC,GAAoB,KACzB,QAA0C;EACxC,IAAI,GAAS;GACX,IAAM,IAAS,EAAgB,CAAU;GACzC,IAAI,KAAU,MACZ,OAAO;IACL,GAAG,EACD,GACA,GACA,CACF;IACA,GAAG;GACL;EAEJ;EACA,OAAO,EACL,GACA,GACA,CACF;CACF,CAAC;CA6DH,OA3DA,QAAgB;EACd,GAAuB,MAAS;GAC9B,IAAM,IAAkC,CAAC;GAYzC,OAVA,EAAY,SAAS,MAAY;IAC/B,IAAM,IAAW,EAAK;IACtB,EAAK,KACH,KAAY,IAA4B,MAAY;GACxD,CAAC,GAEG,KAAiB,QAAQ,EAAY,SAAS,CAAa,MAC7D,EAAK,KAAiB,KAGjB;EACT,CAAC;CACH,GAAG;EAAC;EAAe;EAA2B;CAAW,CAAC,GAE1D,QAAgB;EACV,IAAC,KAAW,KAAc,QAAQ,OAAO,SAAW,KAGxD,IAAI;GACF,OAAO,aAAa,QAClB,GACA,KAAK,UAAU,CAAkB,CACnC;EACF,QAAQ,CAER;CACF,GAAG;EAAC;EAAoB;EAAS;CAAU,CAAC,GAE5C,QAAgB;EACV,KAAiB,QAGrB,GAAuB,MACjB,EAAK,OAAmB,KACnB,IAEF;GACL,GAAG;IACF,IAAgB;EACnB,CACD;CACH,GAAG,CAAC,CAAa,CAAC,GAcX;EACL;EACA,cAdmB,GAAa,GAAiB,MAAuB;GACxE,GAAuB,MACjB,EAAK,OAAa,IACb,IAEF;IACL,GAAG;KACF,IAAU;GACb,CACD;EACH,GAAG,CAAC,CAIF;CACF;AACF"}
|
|
@@ -112,7 +112,7 @@ var { usePreloadedQuery: N } = E, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
112
112
|
(q.subtitleItems != null || q.status != null || q.badges != null) && (X = /* @__PURE__ */ w("div", {
|
|
113
113
|
className: u,
|
|
114
114
|
children: [q.subtitleItems, (q.status != null || q.badges != null) && /* @__PURE__ */ w("div", {
|
|
115
|
-
className: "
|
|
115
|
+
className: "txvbqb5m2 txvbqb2ny txvbqb6sa txvbqb1d5",
|
|
116
116
|
children: [q.status, q.badges]
|
|
117
117
|
})]
|
|
118
118
|
}));
|
|
@@ -35,7 +35,7 @@ var _e = "plumile:backoffice:recent-items", ve = "plumile:backoffice:sidebar", y
|
|
|
35
35
|
return [];
|
|
36
36
|
}
|
|
37
37
|
}, p = (e, t) => {
|
|
38
|
-
if (
|
|
38
|
+
if (typeof window < "u") try {
|
|
39
39
|
window.localStorage.setItem(e, JSON.stringify(t));
|
|
40
40
|
} catch {}
|
|
41
41
|
}, m = ({ children: f, permissions: m, authStatus: h, activeGroupId: g }) => {
|
|
@@ -48,7 +48,7 @@ var _e = "plumile:backoffice:recent-items", ve = "plumile:backoffice:sidebar", y
|
|
|
48
48
|
}
|
|
49
49
|
}), [j, M] = l(!1), [N, P] = l(null), F = E?.recentItems, I = F?.enabled === !0, L = F?.storageKey ?? _e, R = F?.maxItems ?? 8, [z, Se] = l(() => I ? ye(L) : []);
|
|
50
50
|
s(() => {
|
|
51
|
-
if (
|
|
51
|
+
if (k && typeof window < "u") try {
|
|
52
52
|
window.localStorage.setItem(`${O}:collapsed`, String(A));
|
|
53
53
|
} catch {}
|
|
54
54
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeLayoutPage.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n type JSX,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n usePreloadedQuery,\n type PreloadedQuery,\n} from 'react-relay';\nimport type {\n GraphQLTaggedNode,\n MutationParameters,\n OperationType,\n} from 'relay-runtime';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\nimport { resetRelayStore } from '@plumile/relay/environment.js';\n\nimport {\n AdminShellLayout,\n ToastProvider,\n SidebarProfileMenu,\n} from '@plumile/ui';\n\nimport { GlobalSearchInput } from '@plumile/ui/backoffice/molecules/global_search_input/GlobalSearchInput.js';\n\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { LogoutResponse, LogoutVariables } from '../hooks/useAuth.js';\nimport { useBackofficeSidebarPins } from '../hooks/useBackofficeSidebarPins.js';\nimport { useSidebarGroupCollapse } from '../hooks/useSidebarGroupCollapse.js';\nimport { buildSidebarSections } from '../components/backoffice/layout/buildSidebarSections.js';\nimport { BackofficeContentBoundary } from '../components/backoffice/routing/BackofficeContentBoundary.js';\nimport {\n resolveActiveEntityId,\n resolveSidebarGroups,\n resolveVisibleEntityIds,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport { BackofficeTopbarPortalContextProvider } from '../components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js';\nimport { BackofficePermissionsProvider } from '../components/backoffice/layout/BackofficePermissionsContext.js';\nimport {\n mapViewerToSidebarProfileView,\n type BackofficeViewerIdentity,\n} from '../components/backoffice/layout/mapViewerToSidebarProfileView.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\nimport type { BackofficeSidebarRecentItem } from '../provider/types.js';\n\nexport type BackofficeLayoutPageProps = {\n children: ReactNode;\n permissionsQuery?: GraphQLTaggedNode;\n prepared?: PreloadedQuery<OperationType> | null;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\ntype LayoutShellProps = {\n children: ReactNode;\n permissions: unknown;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst DEFAULT_RECENT_ITEMS_STORAGE_KEY = 'plumile:backoffice:recent-items';\nconst DEFAULT_SIDEBAR_PREFS_STORAGE_KEY = 'plumile:backoffice:sidebar';\n\nconst readRecentItems = (\n storageKey: string,\n): readonly BackofficeSidebarRecentItem[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((item): item is BackofficeSidebarRecentItem => {\n if (item == null || typeof item !== 'object') {\n return false;\n }\n const candidate = item as Partial<BackofficeSidebarRecentItem>;\n return (\n (candidate.kind === 'entity' || candidate.kind === 'tool') &&\n typeof candidate.id === 'string' &&\n typeof candidate.label === 'string' &&\n typeof candidate.href === 'string' &&\n typeof candidate.visitedAt === 'number'\n );\n });\n } catch {\n return [];\n }\n};\n\nconst writeRecentItems = (\n storageKey: string,\n items: readonly BackofficeSidebarRecentItem[],\n): void => {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n};\n\nconst BackofficeLayoutShell = ({\n children,\n permissions,\n authStatus,\n activeGroupId,\n}: LayoutShellProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const relayEnvironment = useRelayEnvironment();\n const {\n auth: authConfig,\n basePath,\n dashboards,\n entities,\n sidebar,\n } = useBackofficeConfig();\n const [sidebarQuery, setSidebarQuery] = useState('');\n const sidebarPreferencesStorageKey =\n sidebar?.preferences?.storageKey ?? DEFAULT_SIDEBAR_PREFS_STORAGE_KEY;\n const persistSidebarCollapsed =\n sidebar?.preferences?.persistCollapsed === true;\n const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return false;\n }\n try {\n return (\n window.localStorage.getItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n ) === 'true'\n );\n } catch {\n return false;\n }\n });\n const [isSigningOut, setIsSigningOut] = useState(false);\n const [topbarTarget, setTopbarTarget] = useState<HTMLDivElement | null>(null);\n const recentItemsConfig = sidebar?.recentItems;\n const recentItemsEnabled = recentItemsConfig?.enabled === true;\n const recentItemsStorageKey =\n recentItemsConfig?.storageKey ?? DEFAULT_RECENT_ITEMS_STORAGE_KEY;\n const recentItemsMaxItems = recentItemsConfig?.maxItems ?? 8;\n const [recentItems, setRecentItems] = useState<\n readonly BackofficeSidebarRecentItem[]\n >(() => {\n if (!recentItemsEnabled) {\n return [];\n }\n return readRecentItems(recentItemsStorageKey);\n });\n\n useEffect(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n String(isSidebarCollapsed),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [\n isSidebarCollapsed,\n persistSidebarCollapsed,\n sidebarPreferencesStorageKey,\n ]);\n\n const groups = useMemo(() => {\n return resolveSidebarGroups(entities, sidebar);\n }, [entities, sidebar]);\n\n const groupIds = useMemo(() => {\n return Object.keys(groups);\n }, [groups]);\n\n const defaultCollapsedByGroupId = useMemo(() => {\n return Object.fromEntries(\n Object.entries(groups).map(([groupId, group]) => {\n return [groupId, group.behavior?.defaultCollapsed ?? true];\n }),\n );\n }, [groups]);\n\n const visibleEntityIds = useMemo(() => {\n return resolveVisibleEntityIds(groups, entities, sidebar, permissions);\n }, [entities, groups, permissions, sidebar]);\n\n const activeEntityId = useMemo(() => {\n return resolveActiveEntityId(pathname, entities);\n }, [entities, pathname]);\n\n useEffect(() => {\n if (!recentItemsEnabled || activeEntityId == null) {\n return;\n }\n const config = entities[activeEntityId];\n if (config == null) {\n return;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return;\n }\n const href = config.routes.list;\n let kind: BackofficeSidebarRecentItem['kind'] = 'entity';\n if (config.kind === 'tool') {\n kind = 'tool';\n }\n const item: BackofficeSidebarRecentItem = {\n kind,\n id: activeEntityId,\n label: config.label(tApp),\n href,\n visitedAt: Date.now(),\n };\n setRecentItems((prev) => {\n const next = [\n item,\n ...prev.filter((entry) => {\n return entry.id !== item.id || entry.kind !== item.kind;\n }),\n ].slice(0, recentItemsMaxItems);\n writeRecentItems(recentItemsStorageKey, next);\n return next;\n });\n }, [\n activeEntityId,\n entities,\n recentItemsEnabled,\n recentItemsMaxItems,\n recentItemsStorageKey,\n tApp,\n ]);\n\n const pinningEnabled = sidebar?.pinnedItems?.enabled === true;\n\n const {\n pins,\n toggle: togglePin,\n reorder: reorderPin,\n } = useBackofficeSidebarPins({\n enabled: pinningEnabled,\n storageKey: sidebar?.pinnedItems?.storageKey,\n visibleEntityIds,\n });\n\n let sidebarPinnedEntityIds: readonly string[] | undefined;\n let sidebarTogglePin: ((entityId: string) => void) | undefined;\n let sidebarReorderPin: ((fromId: string, toId: string) => void) | undefined;\n if (pinningEnabled) {\n sidebarPinnedEntityIds = pins;\n sidebarTogglePin = togglePin;\n sidebarReorderPin = reorderPin;\n }\n\n let groupCollapseStorageKey: string | undefined;\n if (sidebar?.preferences?.storageKey != null) {\n groupCollapseStorageKey = `${sidebar.preferences.storageKey}:groups`;\n }\n\n const { collapsedByGroupId, setCollapsed } = useSidebarGroupCollapse({\n groupIds,\n activeGroupId,\n defaultCollapsedByGroupId,\n persist: sidebar?.preferences?.persistGroups === true,\n storageKey: groupCollapseStorageKey,\n });\n\n const sections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n dashboards,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: sidebarPinnedEntityIds,\n recentItems,\n onTogglePin: sidebarTogglePin,\n onReorderPin: sidebarReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n dashboards,\n pathname,\n permissions,\n recentItems,\n setCollapsed,\n sidebar,\n sidebarPinnedEntityIds,\n sidebarQuery,\n sidebarReorderPin,\n sidebarTogglePin,\n t,\n tApp,\n ]);\n\n const mobileSections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n dashboards,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: sidebarPinnedEntityIds,\n recentItems,\n onTogglePin: sidebarTogglePin,\n onReorderPin: sidebarReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n dashboards,\n pathname,\n permissions,\n recentItems,\n setCollapsed,\n sidebar,\n sidebarPinnedEntityIds,\n sidebarQuery,\n sidebarReorderPin,\n sidebarTogglePin,\n t,\n tApp,\n ]);\n\n const handleSignOut = useCallback(() => {\n if (isSigningOut) {\n return;\n }\n\n type LogoutMutation = MutationParameters & {\n response: LogoutResponse;\n variables: LogoutVariables;\n };\n\n setIsSigningOut(true);\n\n const runSignOut = async (): Promise<void> => {\n try {\n const config = await authConfig.logout.load();\n await new Promise<void>((resolve, reject) => {\n commitMutation<LogoutMutation>(relayEnvironment, {\n mutation: config.logoutMutation,\n variables: {},\n onCompleted: () => {\n resolve();\n },\n onError: (error) => {\n reject(error);\n },\n });\n });\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n resetRelayStore();\n routing?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n } finally {\n setIsSigningOut(false);\n }\n };\n\n runSignOut().catch(() => {\n /* noop */\n });\n }, [authConfig.logout, basePath, isSigningOut, relayEnvironment, routing]);\n\n const viewer = authStatus?.me ?? null;\n const sidebarProfile = useMemo(() => {\n return mapViewerToSidebarProfileView({\n viewer,\n unknownUserLabel: t('sidebar.profile.unknownUser'),\n });\n }, [t, viewer]);\n\n const sidebarFooter = (\n <SidebarProfileMenu\n viewer={sidebarProfile}\n sectionTitle={t('sidebar.profile.title')}\n labels={{\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n triggerAriaLabel: `${t('sidebar.profile.menuAriaLabel')}: ${sidebarProfile.displayName}`,\n }}\n items={[\n {\n kind: 'action',\n id: 'sign-out',\n label: t('sidebar.profile.actions.signOut'),\n onSelect: handleSignOut,\n disabled: isSigningOut,\n tone: 'danger',\n },\n ]}\n />\n );\n\n const mobileSidebarFooter = (\n <SidebarProfileMenu\n viewer={sidebarProfile}\n sectionTitle={t('sidebar.profile.title')}\n labels={{\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n triggerAriaLabel: `${t('sidebar.profile.menuAriaLabel')}: ${sidebarProfile.displayName}`,\n }}\n items={[\n {\n kind: 'action',\n id: 'sign-out',\n label: t('sidebar.profile.actions.signOut'),\n onSelect: handleSignOut,\n disabled: isSigningOut,\n tone: 'danger',\n },\n ]}\n />\n );\n\n let contentNode: JSX.Element | null = null;\n if (topbarTarget != null) {\n contentNode = (\n <BackofficeContentBoundary>{children}</BackofficeContentBoundary>\n );\n }\n\n const sidebarSearchNode = (\n <GlobalSearchInput\n value={sidebarQuery}\n onChange={setSidebarQuery}\n placeholder={t('sidebar.search.placeholder')}\n ariaLabel={t('sidebar.search.placeholder')}\n />\n );\n\n return (\n <ToastProvider>\n <AdminShellLayout\n sidebar={{\n sections,\n search: sidebarSearchNode,\n footer: sidebarFooter,\n collapsed: isSidebarCollapsed,\n onCollapsedChange: setIsSidebarCollapsed,\n collapseLabel: t('sidebar.actions.collapseSidebar'),\n expandLabel: t('sidebar.actions.expandSidebar'),\n navigationLabel: t('sidebar.navigationAriaLabel'),\n }}\n mobileSidebar={{\n sections: mobileSections,\n search: sidebarSearchNode,\n footer: mobileSidebarFooter,\n hideCollapseToggle: true,\n navigationLabel: t('sidebar.navigationAriaLabel'),\n }}\n topbar={{\n breadcrumb: <div ref={setTopbarTarget} />,\n }}\n containedScrollLabel={t('sidebar.contentAriaLabel')}\n contentScrollMode=\"contained\"\n >\n <BackofficePermissionsProvider permissions={permissions}>\n <BackofficeTopbarPortalContextProvider\n value={{\n target: topbarTarget,\n dashboardHref: basePath,\n dashboardLabel: t('sidebar.items.dashboard'),\n }}\n >\n {contentNode}\n </BackofficeTopbarPortalContextProvider>\n </BackofficePermissionsProvider>\n </AdminShellLayout>\n </ToastProvider>\n );\n};\n\ntype LayoutWithPermissionsProps = {\n children: ReactNode;\n permissionsQuery: GraphQLTaggedNode;\n prepared: PreloadedQuery<OperationType>;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst LayoutWithPermissions = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: LayoutWithPermissionsProps): JSX.Element => {\n const permissions = usePreloadedQuery(permissionsQuery, prepared);\n\n return (\n <BackofficeLayoutShell\n permissions={permissions}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport const BackofficeLayoutPage = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: BackofficeLayoutPageProps): JSX.Element => {\n if (permissionsQuery != null && prepared != null) {\n return (\n <LayoutWithPermissions\n permissionsQuery={permissionsQuery}\n prepared={prepared}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </LayoutWithPermissions>\n );\n }\n\n return (\n <BackofficeLayoutShell\n permissions={null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport default BackofficeLayoutPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeLayoutPage.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n type JSX,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n usePreloadedQuery,\n type PreloadedQuery,\n} from 'react-relay';\nimport type {\n GraphQLTaggedNode,\n MutationParameters,\n OperationType,\n} from 'relay-runtime';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\nimport { resetRelayStore } from '@plumile/relay/environment.js';\n\nimport {\n AdminShellLayout,\n ToastProvider,\n SidebarProfileMenu,\n} from '@plumile/ui';\n\nimport { GlobalSearchInput } from '@plumile/ui/backoffice/molecules/global_search_input/GlobalSearchInput.js';\n\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { LogoutResponse, LogoutVariables } from '../hooks/useAuth.js';\nimport { useBackofficeSidebarPins } from '../hooks/useBackofficeSidebarPins.js';\nimport { useSidebarGroupCollapse } from '../hooks/useSidebarGroupCollapse.js';\nimport { buildSidebarSections } from '../components/backoffice/layout/buildSidebarSections.js';\nimport { BackofficeContentBoundary } from '../components/backoffice/routing/BackofficeContentBoundary.js';\nimport {\n resolveActiveEntityId,\n resolveSidebarGroups,\n resolveVisibleEntityIds,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport { BackofficeTopbarPortalContextProvider } from '../components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js';\nimport { BackofficePermissionsProvider } from '../components/backoffice/layout/BackofficePermissionsContext.js';\nimport {\n mapViewerToSidebarProfileView,\n type BackofficeViewerIdentity,\n} from '../components/backoffice/layout/mapViewerToSidebarProfileView.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\nimport type { BackofficeSidebarRecentItem } from '../provider/types.js';\n\nexport type BackofficeLayoutPageProps = {\n children: ReactNode;\n permissionsQuery?: GraphQLTaggedNode;\n prepared?: PreloadedQuery<OperationType> | null;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\ntype LayoutShellProps = {\n children: ReactNode;\n permissions: unknown;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst DEFAULT_RECENT_ITEMS_STORAGE_KEY = 'plumile:backoffice:recent-items';\nconst DEFAULT_SIDEBAR_PREFS_STORAGE_KEY = 'plumile:backoffice:sidebar';\n\nconst readRecentItems = (\n storageKey: string,\n): readonly BackofficeSidebarRecentItem[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((item): item is BackofficeSidebarRecentItem => {\n if (item == null || typeof item !== 'object') {\n return false;\n }\n const candidate = item as Partial<BackofficeSidebarRecentItem>;\n return (\n (candidate.kind === 'entity' || candidate.kind === 'tool') &&\n typeof candidate.id === 'string' &&\n typeof candidate.label === 'string' &&\n typeof candidate.href === 'string' &&\n typeof candidate.visitedAt === 'number'\n );\n });\n } catch {\n return [];\n }\n};\n\nconst writeRecentItems = (\n storageKey: string,\n items: readonly BackofficeSidebarRecentItem[],\n): void => {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n};\n\nconst BackofficeLayoutShell = ({\n children,\n permissions,\n authStatus,\n activeGroupId,\n}: LayoutShellProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const relayEnvironment = useRelayEnvironment();\n const {\n auth: authConfig,\n basePath,\n dashboards,\n entities,\n sidebar,\n } = useBackofficeConfig();\n const [sidebarQuery, setSidebarQuery] = useState('');\n const sidebarPreferencesStorageKey =\n sidebar?.preferences?.storageKey ?? DEFAULT_SIDEBAR_PREFS_STORAGE_KEY;\n const persistSidebarCollapsed =\n sidebar?.preferences?.persistCollapsed === true;\n const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return false;\n }\n try {\n return (\n window.localStorage.getItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n ) === 'true'\n );\n } catch {\n return false;\n }\n });\n const [isSigningOut, setIsSigningOut] = useState(false);\n const [topbarTarget, setTopbarTarget] = useState<HTMLDivElement | null>(null);\n const recentItemsConfig = sidebar?.recentItems;\n const recentItemsEnabled = recentItemsConfig?.enabled === true;\n const recentItemsStorageKey =\n recentItemsConfig?.storageKey ?? DEFAULT_RECENT_ITEMS_STORAGE_KEY;\n const recentItemsMaxItems = recentItemsConfig?.maxItems ?? 8;\n const [recentItems, setRecentItems] = useState<\n readonly BackofficeSidebarRecentItem[]\n >(() => {\n if (!recentItemsEnabled) {\n return [];\n }\n return readRecentItems(recentItemsStorageKey);\n });\n\n useEffect(() => {\n if (!persistSidebarCollapsed || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n `${sidebarPreferencesStorageKey}:collapsed`,\n String(isSidebarCollapsed),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [\n isSidebarCollapsed,\n persistSidebarCollapsed,\n sidebarPreferencesStorageKey,\n ]);\n\n const groups = useMemo(() => {\n return resolveSidebarGroups(entities, sidebar);\n }, [entities, sidebar]);\n\n const groupIds = useMemo(() => {\n return Object.keys(groups);\n }, [groups]);\n\n const defaultCollapsedByGroupId = useMemo(() => {\n return Object.fromEntries(\n Object.entries(groups).map(([groupId, group]) => {\n return [groupId, group.behavior?.defaultCollapsed ?? true];\n }),\n );\n }, [groups]);\n\n const visibleEntityIds = useMemo(() => {\n return resolveVisibleEntityIds(groups, entities, sidebar, permissions);\n }, [entities, groups, permissions, sidebar]);\n\n const activeEntityId = useMemo(() => {\n return resolveActiveEntityId(pathname, entities);\n }, [entities, pathname]);\n\n useEffect(() => {\n if (!recentItemsEnabled || activeEntityId == null) {\n return;\n }\n const config = entities[activeEntityId];\n if (config == null) {\n return;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return;\n }\n const href = config.routes.list;\n let kind: BackofficeSidebarRecentItem['kind'] = 'entity';\n if (config.kind === 'tool') {\n kind = 'tool';\n }\n const item: BackofficeSidebarRecentItem = {\n kind,\n id: activeEntityId,\n label: config.label(tApp),\n href,\n visitedAt: Date.now(),\n };\n setRecentItems((prev) => {\n const next = [\n item,\n ...prev.filter((entry) => {\n return entry.id !== item.id || entry.kind !== item.kind;\n }),\n ].slice(0, recentItemsMaxItems);\n writeRecentItems(recentItemsStorageKey, next);\n return next;\n });\n }, [\n activeEntityId,\n entities,\n recentItemsEnabled,\n recentItemsMaxItems,\n recentItemsStorageKey,\n tApp,\n ]);\n\n const pinningEnabled = sidebar?.pinnedItems?.enabled === true;\n\n const {\n pins,\n toggle: togglePin,\n reorder: reorderPin,\n } = useBackofficeSidebarPins({\n enabled: pinningEnabled,\n storageKey: sidebar?.pinnedItems?.storageKey,\n visibleEntityIds,\n });\n\n let sidebarPinnedEntityIds: readonly string[] | undefined;\n let sidebarTogglePin: ((entityId: string) => void) | undefined;\n let sidebarReorderPin: ((fromId: string, toId: string) => void) | undefined;\n if (pinningEnabled) {\n sidebarPinnedEntityIds = pins;\n sidebarTogglePin = togglePin;\n sidebarReorderPin = reorderPin;\n }\n\n let groupCollapseStorageKey: string | undefined;\n if (sidebar?.preferences?.storageKey != null) {\n groupCollapseStorageKey = `${sidebar.preferences.storageKey}:groups`;\n }\n\n const { collapsedByGroupId, setCollapsed } = useSidebarGroupCollapse({\n groupIds,\n activeGroupId,\n defaultCollapsedByGroupId,\n persist: sidebar?.preferences?.persistGroups === true,\n storageKey: groupCollapseStorageKey,\n });\n\n const sections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n dashboards,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: sidebarPinnedEntityIds,\n recentItems,\n onTogglePin: sidebarTogglePin,\n onReorderPin: sidebarReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n dashboards,\n pathname,\n permissions,\n recentItems,\n setCollapsed,\n sidebar,\n sidebarPinnedEntityIds,\n sidebarQuery,\n sidebarReorderPin,\n sidebarTogglePin,\n t,\n tApp,\n ]);\n\n const mobileSections = useMemo(() => {\n return buildSidebarSections({\n basePath,\n pathname,\n entities,\n dashboards,\n sidebar,\n permissions,\n searchQuery: sidebarQuery,\n tApp,\n t,\n pinnedEntityIds: sidebarPinnedEntityIds,\n recentItems,\n onTogglePin: sidebarTogglePin,\n onReorderPin: sidebarReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange: setCollapsed,\n sidebarCollapsed: false,\n });\n }, [\n basePath,\n collapsedByGroupId,\n entities,\n dashboards,\n pathname,\n permissions,\n recentItems,\n setCollapsed,\n sidebar,\n sidebarPinnedEntityIds,\n sidebarQuery,\n sidebarReorderPin,\n sidebarTogglePin,\n t,\n tApp,\n ]);\n\n const handleSignOut = useCallback(() => {\n if (isSigningOut) {\n return;\n }\n\n type LogoutMutation = MutationParameters & {\n response: LogoutResponse;\n variables: LogoutVariables;\n };\n\n setIsSigningOut(true);\n\n const runSignOut = async (): Promise<void> => {\n try {\n const config = await authConfig.logout.load();\n await new Promise<void>((resolve, reject) => {\n commitMutation<LogoutMutation>(relayEnvironment, {\n mutation: config.logoutMutation,\n variables: {},\n onCompleted: () => {\n resolve();\n },\n onError: (error) => {\n reject(error);\n },\n });\n });\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n resetRelayStore();\n routing?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n } finally {\n setIsSigningOut(false);\n }\n };\n\n runSignOut().catch(() => {\n /* noop */\n });\n }, [authConfig.logout, basePath, isSigningOut, relayEnvironment, routing]);\n\n const viewer = authStatus?.me ?? null;\n const sidebarProfile = useMemo(() => {\n return mapViewerToSidebarProfileView({\n viewer,\n unknownUserLabel: t('sidebar.profile.unknownUser'),\n });\n }, [t, viewer]);\n\n const sidebarFooter = (\n <SidebarProfileMenu\n viewer={sidebarProfile}\n sectionTitle={t('sidebar.profile.title')}\n labels={{\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n triggerAriaLabel: `${t('sidebar.profile.menuAriaLabel')}: ${sidebarProfile.displayName}`,\n }}\n items={[\n {\n kind: 'action',\n id: 'sign-out',\n label: t('sidebar.profile.actions.signOut'),\n onSelect: handleSignOut,\n disabled: isSigningOut,\n tone: 'danger',\n },\n ]}\n />\n );\n\n const mobileSidebarFooter = (\n <SidebarProfileMenu\n viewer={sidebarProfile}\n sectionTitle={t('sidebar.profile.title')}\n labels={{\n menuAriaLabel: t('sidebar.profile.menuAriaLabel'),\n triggerAriaLabel: `${t('sidebar.profile.menuAriaLabel')}: ${sidebarProfile.displayName}`,\n }}\n items={[\n {\n kind: 'action',\n id: 'sign-out',\n label: t('sidebar.profile.actions.signOut'),\n onSelect: handleSignOut,\n disabled: isSigningOut,\n tone: 'danger',\n },\n ]}\n />\n );\n\n let contentNode: JSX.Element | null = null;\n if (topbarTarget != null) {\n contentNode = (\n <BackofficeContentBoundary>{children}</BackofficeContentBoundary>\n );\n }\n\n const sidebarSearchNode = (\n <GlobalSearchInput\n value={sidebarQuery}\n onChange={setSidebarQuery}\n placeholder={t('sidebar.search.placeholder')}\n ariaLabel={t('sidebar.search.placeholder')}\n />\n );\n\n return (\n <ToastProvider>\n <AdminShellLayout\n sidebar={{\n sections,\n search: sidebarSearchNode,\n footer: sidebarFooter,\n collapsed: isSidebarCollapsed,\n onCollapsedChange: setIsSidebarCollapsed,\n collapseLabel: t('sidebar.actions.collapseSidebar'),\n expandLabel: t('sidebar.actions.expandSidebar'),\n navigationLabel: t('sidebar.navigationAriaLabel'),\n }}\n mobileSidebar={{\n sections: mobileSections,\n search: sidebarSearchNode,\n footer: mobileSidebarFooter,\n hideCollapseToggle: true,\n navigationLabel: t('sidebar.navigationAriaLabel'),\n }}\n topbar={{\n breadcrumb: <div ref={setTopbarTarget} />,\n }}\n containedScrollLabel={t('sidebar.contentAriaLabel')}\n contentScrollMode=\"contained\"\n >\n <BackofficePermissionsProvider permissions={permissions}>\n <BackofficeTopbarPortalContextProvider\n value={{\n target: topbarTarget,\n dashboardHref: basePath,\n dashboardLabel: t('sidebar.items.dashboard'),\n }}\n >\n {contentNode}\n </BackofficeTopbarPortalContextProvider>\n </BackofficePermissionsProvider>\n </AdminShellLayout>\n </ToastProvider>\n );\n};\n\ntype LayoutWithPermissionsProps = {\n children: ReactNode;\n permissionsQuery: GraphQLTaggedNode;\n prepared: PreloadedQuery<OperationType>;\n authStatus?: {\n isLoggedIn?: boolean | null;\n me?: BackofficeViewerIdentity | null;\n } | null;\n activeGroupId?: string | null;\n};\n\nconst LayoutWithPermissions = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: LayoutWithPermissionsProps): JSX.Element => {\n const permissions = usePreloadedQuery(permissionsQuery, prepared);\n\n return (\n <BackofficeLayoutShell\n permissions={permissions}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport const BackofficeLayoutPage = ({\n children,\n permissionsQuery,\n prepared,\n authStatus,\n activeGroupId,\n}: BackofficeLayoutPageProps): JSX.Element => {\n if (permissionsQuery != null && prepared != null) {\n return (\n <LayoutWithPermissions\n permissionsQuery={permissionsQuery}\n prepared={prepared}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </LayoutWithPermissions>\n );\n }\n\n return (\n <BackofficeLayoutShell\n permissions={null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutShell>\n );\n};\n\nexport default BackofficeLayoutPage;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/pages/backofficeDashboardPage.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb6mq txvbqb6sa", t = "txvbqb5m2 txvbqb2ny txvbqb6sa txvbqbej txvbqb6o4", n = "txvbqb6pi txvbqb1dh txvbqb1op";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as loadingBody, e as tileBody, n as tileCount };
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/pages/backofficeEntityDetailPage.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5m2 txvbqb2ny txvbqb8ow txvbqb6sa txvbqb1d5 txvbqbe1y", t = "txvbqb5m2 txvbqb2ny txvbqb8ow txvbqb6sa txvbqb1d5", n = "txvbqb5m2 txvbqb2ny txvbqbglo txvbqb3ew txvbqb3r6 txvbqbn8 txvbqbxh", r = "txvbqb5m2 txvbqb6mq txvbqb6sk", i = "txvbqb5m2 txvbqb2ny txvbqb6sa txvbqb1d5", a = "txvbqb5m2 txvbqb6mq txvbqb6sa", o = "txvbqb5mw txvbqb2ny txvbqb8om txvbqbkyu txvbqb7ti txvbqbej";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as headerActionGroup, e as headerActions, r as headerBlock, i as headerMeta, a as headerMetaList, n as headerRelationGroup, o as relationCountLoading };
|
|
5
5
|
|