@plumile/backoffice-react 0.1.206 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +5 -2
  2. package/lib/esm/auth/authRefreshNotice.css.js +1 -1
  3. package/lib/esm/auth/authStoryFixtures.js +29 -0
  4. package/lib/esm/auth/authStoryFixtures.js.map +1 -0
  5. package/lib/esm/auth/login/loginPage.css.js +1 -1
  6. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -1
  7. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  8. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
  9. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  10. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
  11. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  12. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +13 -13
  13. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  14. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  15. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  16. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  17. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  18. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  19. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  20. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  21. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js +2 -16
  22. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
  23. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
  24. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  25. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  26. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  27. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
  28. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  29. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  30. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
  31. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  32. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  33. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  34. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  35. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  36. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  37. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  38. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  39. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  40. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  41. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
  42. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +311 -351
  43. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  44. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +6 -11
  45. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  46. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  47. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  48. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  49. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  50. package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js +2 -26
  51. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
  52. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  53. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  54. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  55. package/lib/esm/i18n/locales/en/backofficeReact.js +1 -5
  56. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  57. package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -6
  58. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  59. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +1 -1
  60. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  61. package/lib/esm/pages/BackofficeEntityDetailPage.js +158 -158
  62. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  63. package/lib/esm/pages/BackofficeEntityListDataPage.js +60 -62
  64. package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
  65. package/lib/esm/pages/BackofficeEntityListPage.js +87 -91
  66. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  67. package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -1
  68. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  69. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  70. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  71. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
  72. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js +1 -1
  73. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
  74. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  75. package/lib/esm/provider/BackofficeProvider.js +79 -80
  76. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  77. package/lib/esm/relay/typedRelayHooks.js.map +1 -1
  78. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  79. package/lib/esm/style.css +1 -1
  80. package/lib/types/auth/authStoryFixtures.d.ts +3 -0
  81. package/lib/types/auth/authStoryFixtures.d.ts.map +1 -0
  82. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts +3 -17
  83. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts.map +1 -1
  84. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts +2 -6
  85. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts.map +1 -1
  86. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +0 -2
  87. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  88. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +2 -2
  89. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  90. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts +1 -11
  91. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +1 -1
  92. package/lib/types/i18n/resources.d.ts +0 -13
  93. package/lib/types/i18n/resources.d.ts.map +1 -1
  94. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  95. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  96. package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
  97. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  98. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +0 -2
  99. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
  100. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts +2 -2
  101. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts.map +1 -1
  102. package/lib/types/pages/detail/buildTabsItems.d.ts +2 -2
  103. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  104. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  105. package/lib/types/relay/typedRelayHooks.d.ts +3 -5
  106. package/lib/types/relay/typedRelayHooks.d.ts.map +1 -1
  107. package/package.json +17 -17
  108. package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js.map +0 -1
  109. package/lib/esm/provider/BackofficeListUiStateContext.js +0 -88
  110. package/lib/esm/provider/BackofficeListUiStateContext.js.map +0 -1
  111. package/lib/types/provider/BackofficeListUiStateContext.d.ts +0 -21
  112. 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 { createBackofficeEntityListUiStateKey as l, useBackofficeListFilterDrawerState as u } from "../provider/BackofficeListUiStateContext.js";
11
- import { BackofficeEntityListRouteProvider as d } from "./BackofficeEntityListRouteContext.js";
12
- import { buildActionsColumn as f, computeActionsColumnWidthPx as p, computeRowFlagsColumnWidthPx as m, isFormMutationAction as h, isRouteAction as g, resolveActionVariant as _, resolveLabel as v, resolveTrackBySize as y } from "./BackofficeEntityListPage.helpers.js";
13
- import { actionTrigger as b, actionsColumnCell as x, headerActions as S } from "./backofficeEntityListPage.css.js";
14
- import { Suspense as C, useCallback as w, useMemo as T, useRef as E, useState as D } from "react";
15
- import { jsx as O, jsxs as k } from "react/jsx-runtime";
16
- import { useTranslation as A } from "react-i18next";
17
- import { Button as ee } from "@plumile/ui/atomic/atoms/button/Button.js";
18
- import j from "@plumile/router/routing/Link.js";
19
- import { LinkButton as M } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
20
- import { TableCell as N } from "@plumile/ui/components/data-table/TableCell.js";
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 F = (e, t, n, r) => {
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__ */ O(o, {
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 = m(c), u = p(n), d = 0;
45
- i && (d = 1);
46
- let f = s.length - d - 1, h = s.slice(d, d + Math.max(0, f)).map((e) => y(e, "1fr")).join(" "), g = "";
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
- }, I = ({ children: i, config: a, breadcrumb: o }) => {
52
- let p = a.list, { t: m } = A(), { t: y } = e(), [I, L] = D(null), [R, z] = D(0), B = E(null), V = w((e) => {
53
- B.current = e;
54
- }, []), { columns: H, gridTemplateColumns: U } = T(() => {
55
- let e = n(p.columns, {
56
- tApp: m,
57
- t: y
58
- }), t = f({
59
- ariaLabel: y("actions.view"),
60
- fallback: y("common.notAvailable"),
61
- className: x,
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__ */ O(N.Actions, { children: /* @__PURE__ */ O(j, {
62
+ renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ E(M.Actions, { children: /* @__PURE__ */ E(A, {
64
63
  to: e,
65
- className: b,
64
+ className: v,
66
65
  "aria-label": t,
67
66
  title: t,
68
67
  preloadOnHover: "code",
69
- children: /* @__PURE__ */ O(P, {
68
+ children: /* @__PURE__ */ E(N, {
70
69
  width: 16,
71
70
  height: 16
72
71
  })
73
72
  }) })
74
73
  });
75
- return F([...e, t], p.rowFlags, 1, m);
74
+ return P([...e, t], d.rowFlags, 1, f);
76
75
  }, [
77
76
  a.routes,
78
- p.columns,
79
- p.rowFlags,
80
- y,
81
- m
82
- ]), W = w((e) => p.getRowId(e), [p]), { state: G, pushState: K } = c(a), q = T(() => l(a.id), [a.id]), J = u(q), Y = w(() => {
83
- z((e) => e + 1), B.current?.();
84
- }, []), X = T(() => a.listActions ?? [], [a.listActions]), Z = T(() => X.filter((e) => e.isVisible == null || e.isVisible(null)), [X]), Q = T(() => {
85
- if (Z.length !== 0) return /* @__PURE__ */ O("div", {
86
- className: S,
87
- children: Z.map((e, t) => {
88
- let { variant: n } = e, r = v(e.label, m), i = r;
89
- e.ariaLabel != null && (i = v(e.ariaLabel, m));
90
- let a = _(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
91
- if (g(e)) {
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__ */ O(M, {
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 h(e) ? /* @__PURE__ */ O(ee, {
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
- L(e.id);
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
- }, [m, Z]), $ = X.find((e) => e.id === I), te = () => /* @__PURE__ */ O(s, {
115
+ }, [f, J]), X = q.find((e) => e.id === F), Z = () => /* @__PURE__ */ E(s, {
117
116
  config: a,
118
- state: G,
119
- pushState: K,
120
- headerActions: Q,
117
+ state: W,
118
+ pushState: G,
119
+ headerActions: Y,
121
120
  rows: [],
122
- columns: H,
123
- gridTemplateColumns: U,
124
- getRowId: W,
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: Y,
130
+ onRefresh: K,
132
131
  totalCount: null,
133
- isLoadingInitial: !0,
134
- filterDrawerState: J
135
- }), ne = T(() => ({
132
+ isLoadingInitial: !0
133
+ }), Q = C(() => ({
136
134
  config: a,
137
- state: G,
138
- pushState: K,
139
- headerActions: Q,
140
- columns: H,
141
- gridTemplateColumns: U,
142
- getRowId: W,
143
- countFetchKey: R,
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
- z((e) => e + 1);
143
+ R((e) => e + 1);
147
144
  },
148
- registerRefresh: V
145
+ registerRefresh: B
149
146
  }), [
150
- H,
147
+ V,
151
148
  a,
152
- R,
153
- J,
154
- W,
149
+ L,
155
150
  U,
156
- Q,
157
- K,
158
- V,
159
- G
151
+ H,
152
+ Y,
153
+ G,
154
+ B,
155
+ W
160
156
  ]);
161
- return /* @__PURE__ */ k(r, {
157
+ return /* @__PURE__ */ D(r, {
162
158
  breadcrumb: o,
163
- children: [/* @__PURE__ */ O(d, {
164
- value: ne,
165
- children: /* @__PURE__ */ O(C, {
166
- fallback: te(),
159
+ children: [/* @__PURE__ */ E(l, {
160
+ value: Q,
161
+ children: /* @__PURE__ */ E(x, {
162
+ fallback: Z(),
167
163
  children: i
168
164
  })
169
- }), $ != null && h($) && /* @__PURE__ */ O(t, {
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
- L(null);
170
+ I(null);
175
171
  },
176
- onSuccess: Y
172
+ onSuccess: K
177
173
  })]
178
174
  });
179
- }, L = ({ children: e, entityManifest: t, config: n }) => {
180
- let { t: r } = A(), a = i(n, r);
181
- return /* @__PURE__ */ O(I, {
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 { L as BackofficeEntityListPage, L as default };
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 { BackofficeFilterDrawerState } from '../provider/BackofficeListUiStateContext.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 filterDrawerState: BackofficeFilterDrawerState;\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":";;;AAwBA,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
+ {"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 = "txvbqbfpn txvbqbh4x txvbqbhdl", t = "txvbqbfpn txvbqbey txvbqbhdl txvbqb1bgv txvbqb9j", n = "txvbqbbc txvbqbhbs txvbqbmzg";
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 = "txvbqbfpn txvbqbey txvbqblsh txvbqbhdl txvbqbh7g txvbqbv7x", t = "txvbqbfpn txvbqbey txvbqblsh txvbqbhdl txvbqbh7g", n = "txvbqbfpn txvbqbey txvbqb10n4 txvbqbb49 txvbqbbkc txvbqb2sj txvbqb7tt", r = "txvbqbfpn txvbqbh4x txvbqbhdy", i = "txvbqbfpn txvbqbey txvbqbhdl txvbqbh7g", a = "txvbqbfpn txvbqbh4x txvbqbhdl", o = "txvbqbfqq txvbqbey txvbqbls4 txvbqb19fz txvbqbjl1 txvbqb1bgv";
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 = "txvbqbfpn txvbqbey txvbqbhdl txvbqbh7g", t = "txvbqblsh", n = "c0tad0 txvbqbfqq txvbqbey txvbqbls4 txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2 txvbqb2tz txvbqb1b5h txvbqb1bgt txvbqb3f txvbqb7h txvbqb76 txvbqb7t txvbqb1ctz txvbqb1emf qbwcue0 txvbqb1fgi txvbqb1gaq";
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 { TabItem } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\n\nexport type BackofficeEntityDetailLayoutContextValue = {\n activePage: BackofficeDetailPageRouteSpec;\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n entityId: string;\n layoutView: unknown;\n tabsItems: readonly TabItem[];\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"}
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 { Tabs as s } from "@plumile/ui/atomic/molecules/tabs/Tabs.js";
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 { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.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 <Tabs\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
+ {"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 { TabItem } from '@plumile/ui/atomic/molecules/tabs/Tabs.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 TabItem[] => {\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"}
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"}