@plumile/backoffice-react 0.1.206 → 0.2.3
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 +5 -2
- package/lib/esm/auth/authRefreshNotice.css.js +1 -1
- package/lib/esm/auth/authStoryFixtures.js +29 -0
- package/lib/esm/auth/authStoryFixtures.js.map +1 -0
- package/lib/esm/auth/login/loginPage.css.js +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/BackofficeUsageCostBreakdown.js.map +1 -1
- 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/errors/BackofficeErrorBoundary.js +2 -16
- package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +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/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/BackofficeEntityDetailScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +311 -351
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +6 -11
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +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/technical/TechnicalIdentifierValue.js +2 -26
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +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/i18n/locales/en/backofficeReact.js +1 -5
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -6
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +158 -158
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +60 -62
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +87 -91
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListRouteContext.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/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
- package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +79 -80
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/relay/typedRelayHooks.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/authStoryFixtures.d.ts +3 -0
- package/lib/types/auth/authStoryFixtures.d.ts.map +1 -0
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts +3 -17
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts +2 -6
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +0 -2
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +2 -2
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
- package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts +1 -11
- package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +0 -13
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +0 -2
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
- package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts +2 -2
- package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts.map +1 -1
- package/lib/types/pages/detail/buildTabsItems.d.ts +2 -2
- package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/relay/typedRelayHooks.d.ts +3 -5
- package/lib/types/relay/typedRelayHooks.d.ts.map +1 -1
- package/package.json +17 -17
- package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js.map +0 -1
- package/lib/esm/provider/BackofficeListUiStateContext.js +0 -88
- package/lib/esm/provider/BackofficeListUiStateContext.js.map +0 -1
- package/lib/types/provider/BackofficeListUiStateContext.d.ts +0 -21
- package/lib/types/provider/BackofficeListUiStateContext.d.ts.map +0 -1
|
@@ -7,20 +7,19 @@ import { rowFlagsColumnCell as a } from "../components/backoffice/list/RowFlagsC
|
|
|
7
7
|
import { RowFlagsCell as o } from "../components/backoffice/list/RowFlagsCell.js";
|
|
8
8
|
import { BackofficeEntityListScaffold as s } from "../components/backoffice/scaffolds/BackofficeEntityListScaffold.js";
|
|
9
9
|
import { useBackofficeListUrlState as c } from "../hooks/useBackofficeListUrlState.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import
|
|
18
|
-
import j from "@plumile/
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { EyeSvg as P } from "@plumile/ui/icons/EyeSvg.js";
|
|
10
|
+
import { BackofficeEntityListRouteProvider as l } from "./BackofficeEntityListRouteContext.js";
|
|
11
|
+
import { buildActionsColumn as u, computeActionsColumnWidthPx as d, computeRowFlagsColumnWidthPx as f, isFormMutationAction as p, isRouteAction as m, resolveActionVariant as h, resolveLabel as g, resolveTrackBySize as _ } from "./BackofficeEntityListPage.helpers.js";
|
|
12
|
+
import { actionTrigger as v, actionsColumnCell as y, headerActions as b } from "./backofficeEntityListPage.css.js";
|
|
13
|
+
import { Suspense as x, useCallback as S, useMemo as C, useRef as w, useState as T } from "react";
|
|
14
|
+
import { jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
15
|
+
import { useTranslation as O } from "react-i18next";
|
|
16
|
+
import { Button as k } from "@plumile/ui/atomic/atoms/button/Button.js";
|
|
17
|
+
import A from "@plumile/router/routing/Link.js";
|
|
18
|
+
import { LinkButton as j } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
|
|
19
|
+
import { TableCell as M } from "@plumile/ui/components/data-table/TableCell.js";
|
|
20
|
+
import { EyeSvg as N } from "@plumile/ui/icons/EyeSvg.js";
|
|
22
21
|
//#region src/pages/BackofficeEntityListPage.tsx
|
|
23
|
-
var
|
|
22
|
+
var P = (e, t, n, r) => {
|
|
24
23
|
let i = t != null && t.length > 0, s = e;
|
|
25
24
|
if (i) {
|
|
26
25
|
let n = [{
|
|
@@ -28,7 +27,7 @@ var F = (e, t, n, r) => {
|
|
|
28
27
|
header: "",
|
|
29
28
|
className: a,
|
|
30
29
|
mobileRole: "badge",
|
|
31
|
-
cell: (e) => /* @__PURE__ */
|
|
30
|
+
cell: (e) => /* @__PURE__ */ E(o, {
|
|
32
31
|
row: e,
|
|
33
32
|
flags: t,
|
|
34
33
|
tApp: r
|
|
@@ -41,56 +40,56 @@ var F = (e, t, n, r) => {
|
|
|
41
40
|
}
|
|
42
41
|
let c = 0;
|
|
43
42
|
i && (c = t.length);
|
|
44
|
-
let l =
|
|
45
|
-
i && (
|
|
46
|
-
let
|
|
43
|
+
let l = f(c), u = d(n), p = 0;
|
|
44
|
+
i && (p = 1);
|
|
45
|
+
let m = s.length - p - 1, h = s.slice(p, p + Math.max(0, m)).map((e) => _(e, "1fr")).join(" "), g = "";
|
|
47
46
|
return g = i ? `${l}px ${h} ${u}px` : `${h} ${u}px`, {
|
|
48
47
|
columns: s,
|
|
49
48
|
gridTemplateColumns: g
|
|
50
49
|
};
|
|
51
|
-
},
|
|
52
|
-
let
|
|
53
|
-
|
|
54
|
-
}, []), { columns:
|
|
55
|
-
let e = n(
|
|
56
|
-
tApp:
|
|
57
|
-
t:
|
|
58
|
-
}), t =
|
|
59
|
-
ariaLabel:
|
|
60
|
-
fallback:
|
|
61
|
-
className:
|
|
50
|
+
}, F = ({ children: i, config: a, breadcrumb: o }) => {
|
|
51
|
+
let d = a.list, { t: f } = O(), { t: _ } = e(), [F, I] = T(null), [L, R] = T(0), z = w(null), B = S((e) => {
|
|
52
|
+
z.current = e;
|
|
53
|
+
}, []), { columns: V, gridTemplateColumns: H } = C(() => {
|
|
54
|
+
let e = n(d.columns, {
|
|
55
|
+
tApp: f,
|
|
56
|
+
t: _
|
|
57
|
+
}), t = u({
|
|
58
|
+
ariaLabel: _("actions.view"),
|
|
59
|
+
fallback: _("common.notAvailable"),
|
|
60
|
+
className: y,
|
|
62
61
|
resolveDetailHref: (e) => a.routes.detail(e),
|
|
63
|
-
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */
|
|
62
|
+
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ E(M.Actions, { children: /* @__PURE__ */ E(A, {
|
|
64
63
|
to: e,
|
|
65
|
-
className:
|
|
64
|
+
className: v,
|
|
66
65
|
"aria-label": t,
|
|
67
66
|
title: t,
|
|
68
67
|
preloadOnHover: "code",
|
|
69
|
-
children: /* @__PURE__ */
|
|
68
|
+
children: /* @__PURE__ */ E(N, {
|
|
70
69
|
width: 16,
|
|
71
70
|
height: 16
|
|
72
71
|
})
|
|
73
72
|
}) })
|
|
74
73
|
});
|
|
75
|
-
return
|
|
74
|
+
return P([...e, t], d.rowFlags, 1, f);
|
|
76
75
|
}, [
|
|
77
76
|
a.routes,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
]),
|
|
83
|
-
|
|
84
|
-
}, []),
|
|
85
|
-
if (
|
|
86
|
-
className:
|
|
87
|
-
children:
|
|
88
|
-
let { variant: n } = e, r =
|
|
89
|
-
e.ariaLabel != null && (i =
|
|
90
|
-
let a =
|
|
91
|
-
if (
|
|
77
|
+
d.columns,
|
|
78
|
+
d.rowFlags,
|
|
79
|
+
_,
|
|
80
|
+
f
|
|
81
|
+
]), U = S((e) => d.getRowId(e), [d]), { state: W, pushState: G } = c(a), K = S(() => {
|
|
82
|
+
R((e) => e + 1), z.current?.();
|
|
83
|
+
}, []), q = C(() => a.listActions ?? [], [a.listActions]), J = C(() => q.filter((e) => e.isVisible == null || e.isVisible(null)), [q]), Y = C(() => {
|
|
84
|
+
if (J.length !== 0) return /* @__PURE__ */ E("div", {
|
|
85
|
+
className: b,
|
|
86
|
+
children: J.map((e, t) => {
|
|
87
|
+
let { variant: n } = e, r = g(e.label, f), i = r;
|
|
88
|
+
e.ariaLabel != null && (i = g(e.ariaLabel, f));
|
|
89
|
+
let a = h(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
|
|
90
|
+
if (m(e)) {
|
|
92
91
|
let t = e.to(null);
|
|
93
|
-
return /* @__PURE__ */
|
|
92
|
+
return /* @__PURE__ */ E(j, {
|
|
94
93
|
to: t,
|
|
95
94
|
variant: a,
|
|
96
95
|
size: o,
|
|
@@ -100,85 +99,82 @@ var F = (e, t, n, r) => {
|
|
|
100
99
|
children: r
|
|
101
100
|
}, e.id);
|
|
102
101
|
}
|
|
103
|
-
return
|
|
102
|
+
return p(e) ? /* @__PURE__ */ E(k, {
|
|
104
103
|
type: "button",
|
|
105
104
|
variant: a,
|
|
106
105
|
size: o,
|
|
107
106
|
disabled: s,
|
|
108
107
|
onClick: () => {
|
|
109
|
-
|
|
108
|
+
I(e.id);
|
|
110
109
|
},
|
|
111
110
|
"aria-label": i,
|
|
112
111
|
children: r
|
|
113
112
|
}, e.id) : null;
|
|
114
113
|
})
|
|
115
114
|
});
|
|
116
|
-
}, [
|
|
115
|
+
}, [f, J]), X = q.find((e) => e.id === F), Z = () => /* @__PURE__ */ E(s, {
|
|
117
116
|
config: a,
|
|
118
|
-
state:
|
|
119
|
-
pushState:
|
|
120
|
-
headerActions:
|
|
117
|
+
state: W,
|
|
118
|
+
pushState: G,
|
|
119
|
+
headerActions: Y,
|
|
121
120
|
rows: [],
|
|
122
|
-
columns:
|
|
123
|
-
gridTemplateColumns:
|
|
124
|
-
getRowId:
|
|
121
|
+
columns: V,
|
|
122
|
+
gridTemplateColumns: H,
|
|
123
|
+
getRowId: U,
|
|
125
124
|
hasNextPage: !1,
|
|
126
125
|
isLoadingMore: !1,
|
|
127
126
|
incrementalError: null,
|
|
128
127
|
isRefreshing: !1,
|
|
129
128
|
onLoadMore: () => {},
|
|
130
129
|
onRetryLoadMore: () => {},
|
|
131
|
-
onRefresh:
|
|
130
|
+
onRefresh: K,
|
|
132
131
|
totalCount: null,
|
|
133
|
-
isLoadingInitial: !0
|
|
134
|
-
|
|
135
|
-
}), ne = T(() => ({
|
|
132
|
+
isLoadingInitial: !0
|
|
133
|
+
}), Q = C(() => ({
|
|
136
134
|
config: a,
|
|
137
|
-
state:
|
|
138
|
-
pushState:
|
|
139
|
-
headerActions:
|
|
140
|
-
columns:
|
|
141
|
-
gridTemplateColumns:
|
|
142
|
-
getRowId:
|
|
143
|
-
countFetchKey:
|
|
144
|
-
filterDrawerState: J,
|
|
135
|
+
state: W,
|
|
136
|
+
pushState: G,
|
|
137
|
+
headerActions: Y,
|
|
138
|
+
columns: V,
|
|
139
|
+
gridTemplateColumns: H,
|
|
140
|
+
getRowId: U,
|
|
141
|
+
countFetchKey: L,
|
|
145
142
|
bumpCountFetchKey: () => {
|
|
146
|
-
|
|
143
|
+
R((e) => e + 1);
|
|
147
144
|
},
|
|
148
|
-
registerRefresh:
|
|
145
|
+
registerRefresh: B
|
|
149
146
|
}), [
|
|
150
|
-
|
|
147
|
+
V,
|
|
151
148
|
a,
|
|
152
|
-
|
|
153
|
-
J,
|
|
154
|
-
W,
|
|
149
|
+
L,
|
|
155
150
|
U,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
151
|
+
H,
|
|
152
|
+
Y,
|
|
153
|
+
G,
|
|
154
|
+
B,
|
|
155
|
+
W
|
|
160
156
|
]);
|
|
161
|
-
return /* @__PURE__ */
|
|
157
|
+
return /* @__PURE__ */ D(r, {
|
|
162
158
|
breadcrumb: o,
|
|
163
|
-
children: [/* @__PURE__ */
|
|
164
|
-
value:
|
|
165
|
-
children: /* @__PURE__ */
|
|
166
|
-
fallback:
|
|
159
|
+
children: [/* @__PURE__ */ E(l, {
|
|
160
|
+
value: Q,
|
|
161
|
+
children: /* @__PURE__ */ E(x, {
|
|
162
|
+
fallback: Z(),
|
|
167
163
|
children: i
|
|
168
164
|
})
|
|
169
|
-
}),
|
|
165
|
+
}), X != null && p(X) && /* @__PURE__ */ E(t, {
|
|
170
166
|
isOpen: !0,
|
|
171
|
-
action:
|
|
167
|
+
action: X,
|
|
172
168
|
node: null,
|
|
173
169
|
onClose: () => {
|
|
174
|
-
|
|
170
|
+
I(null);
|
|
175
171
|
},
|
|
176
|
-
onSuccess:
|
|
172
|
+
onSuccess: K
|
|
177
173
|
})]
|
|
178
174
|
});
|
|
179
|
-
},
|
|
180
|
-
let { t: r } =
|
|
181
|
-
return /* @__PURE__ */
|
|
175
|
+
}, I = ({ children: e, entityManifest: t, config: n }) => {
|
|
176
|
+
let { t: r } = O(), a = i(n, r);
|
|
177
|
+
return /* @__PURE__ */ E(F, {
|
|
182
178
|
children: e,
|
|
183
179
|
entityManifest: t,
|
|
184
180
|
config: n,
|
|
@@ -186,6 +182,6 @@ var F = (e, t, n, r) => {
|
|
|
186
182
|
});
|
|
187
183
|
};
|
|
188
184
|
//#endregion
|
|
189
|
-
export {
|
|
185
|
+
export { I as BackofficeEntityListPage, I as default };
|
|
190
186
|
|
|
191
187
|
//# sourceMappingURL=BackofficeEntityListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import {\n Suspense,\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListLayoutRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { TableCell } from '@plumile/ui/components/data-table/TableCell.js';\nimport { EyeSvg } from '@plumile/ui/icons/EyeSvg.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport {\n createBackofficeEntityListUiStateKey,\n useBackofficeListFilterDrawerState,\n} from '../provider/BackofficeListUiStateContext.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { BackofficeEntityListRouteProvider } from './BackofficeEntityListRouteContext.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n children?: ReactNode;\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListLayoutRoute;\n};\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityConnectionListPage = ({\n children,\n config,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config' | 'prepared'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const [countFetchKey, setCountFetchKey] = useState(0);\n const refreshRef = useRef<(() => void) | null>(null);\n\n const registerRefresh = useCallback((refresh: (() => void) | null) => {\n refreshRef.current = refresh;\n }, []);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnHover=\"code\"\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listUiStateKey = useMemo(() => {\n return createBackofficeEntityListUiStateKey(config.id);\n }, [config.id]);\n const filterDrawerState = useBackofficeListFilterDrawerState(listUiStateKey);\n\n const handleRefreshRequest = useCallback(() => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n refreshRef.current?.();\n }, []);\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnHover=\"code-and-data\"\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const renderLoadingScaffold = () => {\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={[]}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={false}\n isLoadingMore={false}\n incrementalError={null}\n isRefreshing={false}\n onLoadMore={() => {}}\n onRetryLoadMore={() => {}}\n onRefresh={handleRefreshRequest}\n totalCount={null}\n isLoadingInitial\n filterDrawerState={filterDrawerState}\n />\n );\n };\n\n const contextValue = useMemo(() => {\n return {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n countFetchKey,\n filterDrawerState,\n bumpCountFetchKey: () => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n },\n registerRefresh,\n };\n }, [\n columns,\n config,\n countFetchKey,\n filterDrawerState,\n getRowId,\n gridTemplateColumns,\n headerActions,\n pushState,\n registerRefresh,\n state,\n ]);\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListRouteProvider value={contextValue}>\n <Suspense fallback={renderLoadingScaffold()}>{children}</Suspense>\n </BackofficeEntityListRouteProvider>\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefreshRequest}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n children,\n entityManifest,\n config,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n children={children}\n entityManifest={entityManifest}\n config={config}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import {\n Suspense,\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListLayoutRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { TableCell } from '@plumile/ui/components/data-table/TableCell.js';\nimport { EyeSvg } from '@plumile/ui/icons/EyeSvg.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { BackofficeEntityListRouteProvider } from './BackofficeEntityListRouteContext.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n children?: ReactNode;\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListLayoutRoute;\n};\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityConnectionListPage = ({\n children,\n config,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config' | 'prepared'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const [countFetchKey, setCountFetchKey] = useState(0);\n const refreshRef = useRef<(() => void) | null>(null);\n\n const registerRefresh = useCallback((refresh: (() => void) | null) => {\n refreshRef.current = refresh;\n }, []);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnHover=\"code\"\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n\n const handleRefreshRequest = useCallback(() => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n refreshRef.current?.();\n }, []);\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnHover=\"code-and-data\"\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const renderLoadingScaffold = () => {\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={[]}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={false}\n isLoadingMore={false}\n incrementalError={null}\n isRefreshing={false}\n onLoadMore={() => {}}\n onRetryLoadMore={() => {}}\n onRefresh={handleRefreshRequest}\n totalCount={null}\n isLoadingInitial\n />\n );\n };\n\n const contextValue = useMemo(() => {\n return {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n countFetchKey,\n bumpCountFetchKey: () => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n },\n registerRefresh,\n };\n }, [\n columns,\n config,\n countFetchKey,\n getRowId,\n gridTemplateColumns,\n headerActions,\n pushState,\n registerRefresh,\n state,\n ]);\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListRouteProvider value={contextValue}>\n <Suspense fallback={renderLoadingScaffold()}>{children}</Suspense>\n </BackofficeEntityListRouteProvider>\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefreshRequest}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n children,\n entityManifest,\n config,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n children={children}\n entityManifest={entityManifest}\n config={config}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityListRouteContext.js","names":[],"sources":["../../../src/pages/BackofficeEntityListRouteContext.tsx"],"sourcesContent":["import { createContext, useContext, type JSX } from 'react';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\n\nimport type { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport type {
|
|
1
|
+
{"version":3,"file":"BackofficeEntityListRouteContext.js","names":[],"sources":["../../../src/pages/BackofficeEntityListRouteContext.tsx"],"sourcesContent":["import { createContext, useContext, type JSX } from 'react';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\n\nimport type { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport type { ConnectionListConfig } from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListRouteContextValue = {\n config: ConnectionListConfig;\n state: ReturnType<typeof useBackofficeListUrlState>['state'];\n pushState: ReturnType<typeof useBackofficeListUrlState>['pushState'];\n headerActions: JSX.Element | undefined;\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n getRowId: GetRowId<unknown>;\n countFetchKey: number;\n bumpCountFetchKey: () => void;\n registerRefresh: (refresh: (() => void) | null) => void;\n};\n\nconst BackofficeEntityListRouteContext =\n createContext<BackofficeEntityListRouteContextValue | null>(null);\n\nexport const BackofficeEntityListRouteProvider = ({\n children,\n value,\n}: {\n children: JSX.Element;\n value: BackofficeEntityListRouteContextValue;\n}): JSX.Element => {\n return (\n <BackofficeEntityListRouteContext.Provider value={value}>\n {children}\n </BackofficeEntityListRouteContext.Provider>\n );\n};\n\nexport const useBackofficeEntityListRouteContext =\n (): BackofficeEntityListRouteContextValue => {\n const value = useContext(BackofficeEntityListRouteContext);\n if (value == null) {\n throw new Error('BackofficeEntityListRouteContext is missing.');\n }\n return value;\n };\n"],"mappings":";;;AAsBA,IAAM,IACJ,EAA4D,IAAI,GAErD,KAAqC,EAChD,aACA,eAME,kBAAC,EAAiC,UAAlC;CAAkD;CAC/C;AACwC,CAAA,GAIlC,UACkC;CAC3C,IAAM,IAAQ,EAAW,CAAgC;CACzD,IAAI,KAAS,MACX,MAAU,MAAM,8CAA8C;CAEhE,OAAO;AACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/pages/backofficeDashboardPage.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5b1 txvbqb6bf txvbqb6gz", t = "txvbqb5b1 txvbqb2cx txvbqb6gz txvbqbe3 txvbqb6ct", n = "txvbqb6e7 txvbqb1ct txvbqb1lf";
|
|
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 = "txvbqb5b1 txvbqb2cx txvbqb8dl txvbqb6gz txvbqb1ch txvbqbdqn", t = "txvbqb5b1 txvbqb2cx txvbqb8dl txvbqb6gz txvbqb1ch", n = "txvbqb5b1 txvbqb2cx txvbqbgag txvbqb33v txvbqb3g8 txvbqbms txvbqb10q", r = "txvbqb5b1 txvbqb6bf txvbqb6h9", i = "txvbqb5b1 txvbqb2cx txvbqb6gz txvbqb1ch", a = "txvbqb5b1 txvbqb6bf txvbqb6gz", o = "txvbqb5bv txvbqb2cx txvbqb8db txvbqbldd txvbqb7i7 txvbqbe3";
|
|
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
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/pages/backofficeEntityListPage.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5b1 txvbqb2cx txvbqb6gz txvbqb1ch", t = "txvbqb8dl", n = "c0tad0 txvbqb5bv txvbqb2cx txvbqb8db txvbqbleh txvbqb7jb txvbqbdsv txvbqbd1d txvbqbmw txvbqb8i txvbqbe2 txvbqb3f txvbqb7h txvbqb76 txvbqb7t txvbqbmrt txvbqbok9 qbwcue0 txvbqbpec txvbqbq8k";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { n as actionTrigger, t as actionsColumnCell, e as headerActions };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailLayoutContext.js","names":[],"sources":["../../../../src/pages/detail/BackofficeEntityDetailLayoutContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type {\n BackofficeDetailPageRouteSpec,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\nimport type {
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailLayoutContext.js","names":[],"sources":["../../../../src/pages/detail/BackofficeEntityDetailLayoutContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type {\n BackofficeDetailPageRouteSpec,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\nimport type { NavigationTabItem } from '@plumile/ui/atomic/molecules/tabs/NavigationTabs.js';\n\nexport type BackofficeEntityDetailLayoutContextValue = {\n activePage: BackofficeDetailPageRouteSpec;\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n entityId: string;\n layoutView: unknown;\n tabsItems: readonly NavigationTabItem[];\n visiblePages: readonly BackofficeDetailPageRouteSpec[];\n};\n\nconst BackofficeEntityDetailLayoutContext =\n createContext<BackofficeEntityDetailLayoutContextValue | null>(null);\n\nexport const BackofficeEntityDetailLayoutContextProvider =\n BackofficeEntityDetailLayoutContext.Provider;\n\nexport const useBackofficeEntityDetailLayoutContext =\n (): BackofficeEntityDetailLayoutContextValue => {\n const context = useContext(BackofficeEntityDetailLayoutContext);\n if (context == null) {\n throw new Error(\n 'BackofficeEntityDetailLayoutContext is missing. Ensure detail pages are rendered under the entity layout route.',\n );\n }\n return context;\n };\n"],"mappings":";;AAgBA,IAAM,IACJ,EAA+D,IAAI,GAExD,IACX,EAAoC,UAEzB,UACqC;CAC9C,IAAM,IAAU,EAAW,CAAmC;CAC9D,IAAI,KAAW,MACb,MAAU,MACR,iHACF;CAEF,OAAO;AACT"}
|
|
@@ -5,7 +5,7 @@ import { jsx as r } from "react/jsx-runtime";
|
|
|
5
5
|
import { useTranslation as i } from "react-i18next";
|
|
6
6
|
import a from "@plumile/router/routing/useLocation.js";
|
|
7
7
|
import { BackofficePageHeader as o } from "@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js";
|
|
8
|
-
import {
|
|
8
|
+
import { NavigationTabs as s } from "@plumile/ui/atomic/molecules/tabs/NavigationTabs.js";
|
|
9
9
|
import { DetailPageTemplate as c } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
10
10
|
//#region src/pages/detail/BackofficeEntityDetailManifestFallback.tsx
|
|
11
11
|
var l = (e) => e.trim().replace(/^\/+|\/+$/g, ""), u = (e, t, n, r, i) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailManifestFallback.js","names":[],"sources":["../../../../src/pages/detail/BackofficeEntityDetailManifestFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport type {\n BackofficeDetailPageManifestItem,\n BackofficeEntityManifestItem,\n} from '@plumile/backoffice-core/types.js';\nimport {
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailManifestFallback.js","names":[],"sources":["../../../../src/pages/detail/BackofficeEntityDetailManifestFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport type {\n BackofficeDetailPageManifestItem,\n BackofficeEntityManifestItem,\n} from '@plumile/backoffice-core/types.js';\nimport { NavigationTabs } from '@plumile/ui/atomic/molecules/tabs/NavigationTabs.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeRightPageLayout } from '../../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport type { BackofficeTopbarBreadcrumbItem } from '../../components/backoffice/layout/breadcrumb/types.js';\nimport { BackofficeStaticRouteFallback } from '../../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailManifestFallbackProps = {\n entityManifest: BackofficeEntityManifestItem;\n id: string;\n pageId?: string | null;\n pagePath?: string | null;\n};\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveManifestPage = (\n entityManifest: BackofficeEntityManifestItem,\n id: string,\n pageId: string | null | undefined,\n pagePath: string | null | undefined,\n currentPathname: string,\n): BackofficeDetailPageManifestItem | null => {\n const pages = entityManifest.detailPages ?? [];\n if (pages.length === 0) {\n return null;\n }\n\n const normalizedPagePath = normalizePath(pagePath ?? '');\n if (normalizedPagePath !== '') {\n const byPath = pages.find((page) => {\n return normalizePath(page.pathSegment) === normalizedPagePath;\n });\n if (byPath != null) {\n return byPath;\n }\n }\n\n const normalizedCurrentPathname = normalizePath(currentPathname);\n if (normalizedCurrentPathname !== '') {\n const byCurrentPathname = pages.find((page) => {\n return (\n normalizePath(entityManifest.routes.detailPage(id, page.id)) ===\n normalizedCurrentPathname\n );\n });\n if (byCurrentPathname != null) {\n return byCurrentPathname;\n }\n }\n\n if (pageId != null) {\n const byId = pages.find((page) => {\n return page.id === pageId;\n });\n if (byId != null) {\n return byId;\n }\n }\n\n const defaultPage = pages.find((page) => {\n return page.id === entityManifest.defaultDetailPageId;\n });\n return defaultPage ?? pages[0] ?? null;\n};\n\nexport const BackofficeEntityDetailManifestFallback = ({\n entityManifest,\n id,\n pageId,\n pagePath,\n}: BackofficeEntityDetailManifestFallbackProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { pathname } = useLocation();\n const listLabel = entityManifest.label(tApp);\n const detailLabel =\n entityManifest.detailLabel?.(tApp) ?? t('detail.loadingTitle');\n const activePage = resolveManifestPage(\n entityManifest,\n id,\n pageId,\n pagePath,\n pathname,\n );\n const breadcrumb: BackofficeTopbarBreadcrumbItem[] = [\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: entityManifest.id,\n },\n label: listLabel,\n },\n ];\n\n if (activePage == null) {\n breadcrumb.push({\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: entityManifest.id,\n id,\n },\n label: detailLabel,\n });\n } else {\n breadcrumb.push(\n {\n kind: 'link',\n target: {\n kind: 'entity-detail',\n entityId: entityManifest.id,\n id,\n },\n label: detailLabel,\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail-page',\n entityId: entityManifest.id,\n id,\n pageId: activePage.id,\n },\n label: activePage.label(tApp),\n },\n );\n }\n\n const pages = entityManifest.detailPages ?? [];\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1 && activePage != null) {\n tabsNode = (\n <NavigationTabs\n items={pages.map((page) => {\n return {\n id: page.id,\n label: page.label(tApp),\n preloadOnHover: 'code-and-data',\n to: entityManifest.routes.detailPage(id, page.id),\n };\n })}\n activeId={activePage.id}\n variant=\"underline\"\n />\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={<BackofficePageHeader title={detailLabel} />}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <BackofficeStaticRouteFallback label={t('common.loading')} />\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;AAwBA,IAAM,KAAiB,MACd,EAAM,KAAK,CAAC,CAAC,QAAQ,cAAc,EAAE,GAGxC,KACJ,GACA,GACA,GACA,GACA,MAC4C;CAC5C,IAAM,IAAQ,EAAe,eAAe,CAAC;CAC7C,IAAI,EAAM,WAAW,GACnB,OAAO;CAGT,IAAM,IAAqB,EAAc,KAAY,EAAE;CACvD,IAAI,MAAuB,IAAI;EAC7B,IAAM,IAAS,EAAM,MAAM,MAClB,EAAc,EAAK,WAAW,MAAM,CAC5C;EACD,IAAI,KAAU,MACZ,OAAO;CAEX;CAEA,IAAM,IAA4B,EAAc,CAAe;CAC/D,IAAI,MAA8B,IAAI;EACpC,IAAM,IAAoB,EAAM,MAAM,MAElC,EAAc,EAAe,OAAO,WAAW,GAAI,EAAK,EAAE,CAAC,MAC3D,CAEH;EACD,IAAI,KAAqB,MACvB,OAAO;CAEX;CAEA,IAAI,KAAU,MAAM;EAClB,IAAM,IAAO,EAAM,MAAM,MAChB,EAAK,OAAO,CACpB;EACD,IAAI,KAAQ,MACV,OAAO;CAEX;CAKA,OAHoB,EAAM,MAAM,MACvB,EAAK,OAAO,EAAe,mBAE7B,KAAe,EAAM,MAAM;AACpC,GAEa,KAA0C,EACrD,mBACA,OACA,WACA,kBAC8D;CAC9D,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,gBAAa,EAAY,GAC3B,IAAY,EAAe,MAAM,CAAI,GACrC,IACJ,EAAe,cAAc,CAAI,KAAK,EAAE,qBAAqB,GACzD,IAAa,EACjB,GACA,GACA,GACA,GACA,CACF,GACM,IAA+C,CACnD;EACE,MAAM;EACN,QAAQ;GACN,MAAM;GACN,UAAU,EAAe;EAC3B;EACA,OAAO;CACT,CACF;CAEA,AAAI,KAAc,OAChB,EAAW,KAAK;EACd,MAAM;EACN,QAAQ;GACN,MAAM;GACN,UAAU,EAAe;GACzB;EACF;EACA,OAAO;CACT,CAAC,IAED,EAAW,KACT;EACE,MAAM;EACN,QAAQ;GACN,MAAM;GACN,UAAU,EAAe;GACzB;EACF;EACA,OAAO;CACT,GACA;EACE,MAAM;EACN,QAAQ;GACN,MAAM;GACN,UAAU,EAAe;GACzB;GACA,QAAQ,EAAW;EACrB;EACA,OAAO,EAAW,MAAM,CAAI;CAC9B,CACF;CAGF,IAAM,IAAQ,EAAe,eAAe,CAAC,GACzC,IAA+B;CAkBnC,OAjBI,EAAM,SAAS,KAAK,KAAc,SACpC,IACE,kBAAC,GAAD;EACE,OAAO,EAAM,KAAK,OACT;GACL,IAAI,EAAK;GACT,OAAO,EAAK,MAAM,CAAI;GACtB,gBAAgB;GAChB,IAAI,EAAe,OAAO,WAAW,GAAI,EAAK,EAAE;EAClD,EACD;EACD,UAAU,EAAW;EACrB,SAAQ;CACT,CAAA,IAKH,kBAAC,GAAD;EAAuC;EACrC,UAAA,kBAAC,GAAD;GACE,YAAY,kBAAC,GAAD,EAAsB,OAAO,EAAc,CAAA;GAC7C;GACV,eAAc;GAEd,UAAA,kBAAC,GAAD,EAA+B,OAAO,EAAE,gBAAgB,EAAI,CAAA;EAC1C,CAAA;CACK,CAAA;AAE/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildTabsItems.js","names":[],"sources":["../../../../src/pages/detail/buildTabsItems.ts"],"sourcesContent":["import type { BackofficeDetailPageRouteSpec } from '@plumile/backoffice-core/types.js';\nimport type {
|
|
1
|
+
{"version":3,"file":"buildTabsItems.js","names":[],"sources":["../../../../src/pages/detail/buildTabsItems.ts"],"sourcesContent":["import type { BackofficeDetailPageRouteSpec } from '@plumile/backoffice-core/types.js';\nimport type { NavigationTabItem } from '@plumile/ui/atomic/molecules/tabs/NavigationTabs.js';\nimport type { TFunction } from 'i18next';\n\ntype DetailRoutePage<Node> = BackofficeDetailPageRouteSpec<Node>;\n\nexport const buildTabsItems = <Node>(input: {\n pages: readonly DetailRoutePage<Node>[];\n id: string;\n tApp: TFunction;\n detailPageHref: (id: string, pageId: string) => string;\n}): readonly NavigationTabItem[] => {\n return input.pages.map((page) => {\n return {\n id: page.id,\n label: page.label(input.tApp),\n preloadOnHover: 'code-and-data',\n to: input.detailPageHref(input.id, page.id),\n };\n });\n};\n"],"mappings":";AAMA,IAAa,KAAwB,MAM5B,EAAM,MAAM,KAAK,OACf;CACL,IAAI,EAAK;CACT,OAAO,EAAK,MAAM,EAAM,IAAI;CAC5B,gBAAgB;CAChB,IAAI,EAAM,eAAe,EAAM,IAAI,EAAK,EAAE;AAC5C,EACD"}
|