@plumile/backoffice-react 0.1.178 → 0.1.181

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 (96) hide show
  1. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +1 -1
  2. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  3. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  4. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
  6. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +1 -1
  7. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  8. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +1 -1
  9. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  10. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +2 -0
  11. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +0 -2
  12. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +1 -1
  13. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  14. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +0 -1
  15. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +2 -2
  16. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
  17. package/lib/esm/components/backoffice/links/BackofficeLink.js +2 -2
  18. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
  19. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +1 -1
  20. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
  21. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +241 -228
  22. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  23. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +2 -2
  24. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
  25. package/lib/esm/hooks/useBackofficeListRefetch.js +18 -16
  26. package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -1
  27. package/lib/esm/hooks/useBackofficeListUrlState.js +23 -21
  28. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  29. package/lib/esm/i18n/locales/en/backofficeReact.js +1 -0
  30. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  31. package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -0
  32. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  33. package/lib/esm/index.js +26 -25
  34. package/lib/esm/pages/BackofficeEntityDetailFramePage.js +45 -0
  35. package/lib/esm/pages/BackofficeEntityDetailFramePage.js.map +1 -0
  36. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +74 -60
  37. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  38. package/lib/esm/pages/BackofficeEntityDetailPage.js +3 -3
  39. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  40. package/lib/esm/pages/BackofficeEntityListDataPage.js +146 -0
  41. package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -0
  42. package/lib/esm/pages/BackofficeEntityListPage.js +121 -132
  43. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  44. package/lib/esm/pages/BackofficeEntityListRouteContext.js +15 -0
  45. package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -0
  46. package/lib/esm/pages/detail/buildTabsItems.js +1 -1
  47. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  48. package/lib/esm/provider/BackofficeProvider.js +63 -63
  49. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  50. package/lib/esm/relay/RelayProvider.js +2 -13
  51. package/lib/esm/relay/environment.js +2 -463
  52. package/lib/esm/relay/shortAccessTokenEnvironment.js +2 -15
  53. package/lib/esm/relay/useRelayOperationActivity.js +2 -0
  54. package/lib/esm/router/createBackofficeRoutes.js +169 -119
  55. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  56. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +3 -2
  57. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -1
  58. package/lib/types/components/backoffice/links/BackofficeLink.d.ts +3 -2
  59. package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -1
  60. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  61. package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts +1 -0
  62. package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts.map +1 -1
  63. package/lib/types/hooks/useBackofficeListRefetch.d.ts +5 -4
  64. package/lib/types/hooks/useBackofficeListRefetch.d.ts.map +1 -1
  65. package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
  66. package/lib/types/i18n/resources.d.ts +2 -0
  67. package/lib/types/i18n/resources.d.ts.map +1 -1
  68. package/lib/types/index.d.ts +3 -2
  69. package/lib/types/index.d.ts.map +1 -1
  70. package/lib/types/pages/BackofficeEntityDetailFramePage.d.ts +14 -0
  71. package/lib/types/pages/BackofficeEntityDetailFramePage.d.ts.map +1 -0
  72. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts +2 -2
  73. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  74. package/lib/types/pages/BackofficeEntityDetailPage.d.ts +2 -11
  75. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  76. package/lib/types/pages/BackofficeEntityListDataPage.d.ts +8 -0
  77. package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -0
  78. package/lib/types/pages/BackofficeEntityListPage.d.ts +5 -4
  79. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  80. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +22 -0
  81. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -0
  82. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  83. package/lib/types/relay/RelayProvider.d.ts +1 -6
  84. package/lib/types/relay/RelayProvider.d.ts.map +1 -1
  85. package/lib/types/relay/environment.d.ts +1 -119
  86. package/lib/types/relay/environment.d.ts.map +1 -1
  87. package/lib/types/relay/shortAccessTokenEnvironment.d.ts +4 -3
  88. package/lib/types/relay/shortAccessTokenEnvironment.d.ts.map +1 -1
  89. package/lib/types/relay/useRelayOperationActivity.d.ts +2 -0
  90. package/lib/types/relay/useRelayOperationActivity.d.ts.map +1 -0
  91. package/lib/types/router/createBackofficeRoutes.d.ts +2 -0
  92. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  93. package/package.json +14 -12
  94. package/lib/esm/relay/RelayProvider.js.map +0 -1
  95. package/lib/esm/relay/environment.js.map +0 -1
  96. package/lib/esm/relay/shortAccessTokenEnvironment.js.map +0 -1
@@ -1,192 +1,181 @@
1
1
  import { useBackofficeReactTranslation as e } from "../i18n/useBackofficeReactTranslation.js";
2
- import { useBackofficePaginationFragment as t } from "../relay/typedRelayHooks.js";
3
- import { LazyBackofficeEntityActionFormDialog as n } from "../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js";
4
- import { buildDataTableColumns as r } from "../components/backoffice/columns/buildDataTableColumns.js";
5
- import { BackofficeRightPageLayout as i } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
6
- import { buildEntityListBreadcrumb as a } from "../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js";
7
- import { rowFlagsColumnCell as o } from "../components/backoffice/list/RowFlagsCell.css.js";
8
- import { RowFlagsCell as s } from "../components/backoffice/list/RowFlagsCell.js";
9
- import { BackofficeLazyEntityCountLabel as c } from "../components/backoffice/refs/BackofficeLazyEntityCount.js";
10
- import { BackofficeEntityListScaffold as l } from "../components/backoffice/scaffolds/BackofficeEntityListScaffold.js";
11
- import { useBackofficeListRefetch as u } from "../hooks/useBackofficeListRefetch.js";
12
- import { useBackofficeListUrlState as d } from "../hooks/useBackofficeListUrlState.js";
13
- import { useBackofficeLoadMore as f } from "../hooks/useBackofficeLoadMore.js";
14
- import { buildActionsColumn as p, computeActionsColumnWidthPx as m, computeRowFlagsColumnWidthPx as h, isFormMutationAction as g, isRouteAction as ee, resolveActionVariant as te, resolveLabel as _, resolveTrackBySize as v } from "./BackofficeEntityListPage.helpers.js";
15
- import { actionTrigger as y, actionsColumnCell as b, headerActions as ne } from "./backofficeEntityListPage.css.js";
16
- import { useCallback as x, useMemo as S, useState as C } from "react";
17
- import { jsx as w, jsxs as re } from "react/jsx-runtime";
18
- import { useTranslation as T } from "react-i18next";
19
- import { Button as E } from "@plumile/ui/atomic/atoms/button/Button.js";
20
- import { usePreloadedQuery as D } from "react-relay";
21
- import { BACKOFFICE_LIST_DEFAULTS as O, BACKOFFICE_LIST_REFETCH_POLICY as ie } from "@plumile/backoffice-core/constants.js";
22
- import ae from "@plumile/router/routing/Link.js";
23
- import { LinkButton as oe } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
24
- import { TableCell as se } from "@plumile/ui/components/data-table/TableCell.js";
25
- import { EyeSvg as ce } from "@plumile/ui/icons/EyeSvg.js";
2
+ import { LazyBackofficeEntityActionFormDialog as t } from "../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js";
3
+ import { buildDataTableColumns as n } from "../components/backoffice/columns/buildDataTableColumns.js";
4
+ import { BackofficeRightPageLayout as r } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
5
+ import { buildEntityListBreadcrumb as i } from "../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js";
6
+ import { rowFlagsColumnCell as a } from "../components/backoffice/list/RowFlagsCell.css.js";
7
+ import { RowFlagsCell as o } from "../components/backoffice/list/RowFlagsCell.js";
8
+ import { BackofficeEntityListScaffold as s } from "../components/backoffice/scaffolds/BackofficeEntityListScaffold.js";
9
+ import { useBackofficeListUrlState as c } from "../hooks/useBackofficeListUrlState.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";
26
21
  //#region src/pages/BackofficeEntityListPage.tsx
27
- var le = (e, t, n, r) => {
28
- let i = t != null && t.length > 0, a = e;
22
+ var P = (e, t, n, r) => {
23
+ let i = t != null && t.length > 0, s = e;
29
24
  if (i) {
30
25
  let n = [{
31
26
  id: "__rowFlags",
32
27
  header: "",
33
- className: o,
28
+ className: a,
34
29
  mobileRole: "badge",
35
- cell: (e) => /* @__PURE__ */ w(s, {
30
+ cell: (e) => /* @__PURE__ */ E(o, {
36
31
  row: e,
37
32
  flags: t,
38
33
  tApp: r
39
34
  })
40
35
  }, ...e], i = n.some((e) => e.isPrimary === !0);
41
- a = n, i || (a = n.map((e, t) => t === 1 ? {
36
+ s = n, i || (s = n.map((e, t) => t === 1 ? {
42
37
  ...e,
43
38
  isPrimary: !0
44
39
  } : e));
45
40
  }
46
41
  let c = 0;
47
42
  i && (c = t.length);
48
- let l = h(c), u = m(n), d = 0;
49
- i && (d = 1);
50
- let f = a.length - d - 1, p = a.slice(d, d + Math.max(0, f)).map((e) => v(e, "1fr")).join(" "), g = "";
51
- return g = i ? `${l}px ${p} ${u}px` : `${p} ${u}px`, {
52
- columns: a,
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 = "";
46
+ return g = i ? `${l}px ${h} ${u}px` : `${h} ${u}px`, {
47
+ columns: s,
53
48
  gridTemplateColumns: g
54
49
  };
55
- }, k = ({ config: a, prepared: o, breadcrumb: s }) => {
56
- let m = a.list, { t: h } = T(), { t: v } = e(), [k, A] = C(null), [ue, j] = C(0), M = D(m.query, o.query), { data: N, loadNext: P, hasNext: F, isLoadingNext: I, refetch: L } = t(m.fragment, M), R = m.getConnection(N), z = S(() => R.edges.map((e) => m.toRow(e.node)), [R.edges, m]), { columns: B, gridTemplateColumns: V } = S(() => {
57
- let e = r(m.columns, {
58
- tApp: h,
59
- t: v
60
- }), t = p({
61
- ariaLabel: v("actions.view"),
62
- fallback: v("common.notAvailable"),
63
- className: b,
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,
64
61
  resolveDetailHref: (e) => a.routes.detail(e),
65
- renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ w(se.Actions, { children: /* @__PURE__ */ w(ae, {
62
+ renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ E(M.Actions, { children: /* @__PURE__ */ E(A, {
66
63
  to: e,
67
- className: y,
64
+ className: v,
68
65
  "aria-label": t,
69
66
  title: t,
70
- preloadOnMouseEnter: !0,
71
- children: /* @__PURE__ */ w(ce, {
67
+ preloadOnHover: "code",
68
+ children: /* @__PURE__ */ E(N, {
72
69
  width: 16,
73
70
  height: 16
74
71
  })
75
72
  }) })
76
73
  });
77
- return le([...e, t], m.rowFlags, 1, h);
74
+ return P([...e, t], d.rowFlags, 1, f);
78
75
  }, [
79
76
  a.routes,
80
- m.columns,
81
- m.rowFlags,
82
- v,
83
- h
84
- ]), H = x((e) => m.getRowId(e), [m]), { state: U, pushState: de } = d(a), W = a.listDefaults ?? m.defaultState ?? {
85
- where: null,
86
- sort: null
87
- }, G = U.sort ?? W.sort, { pageSize: K } = O, { isRefreshing: fe, onRefresh: q } = u({
88
- refetch: L,
89
- variables: S(() => ({
90
- where: U.where,
91
- sort: G,
92
- count: K,
93
- cursor: null
94
- }), [
95
- K,
96
- G,
97
- U.where
98
- ]),
99
- defaults: {
100
- where: W.where,
101
- sort: W.sort,
102
- count: K,
103
- cursor: null
104
- },
105
- fetchPolicy: ie,
106
- buildQueryVariables: m.buildQueryVariables
107
- }), J = x(() => {
108
- j((e) => e + 1), q();
109
- }, [q]), Y = f({
110
- hasNext: F,
111
- isLoadingNext: I,
112
- loadNext: P,
113
- count: K
114
- }), X = S(() => a.listActions ?? [], [a.listActions]), Z = S(() => X.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [X]), pe = S(() => {
115
- if (Z.length !== 0) return /* @__PURE__ */ w("div", {
116
- className: ne,
117
- children: Z.map((e, t) => {
118
- let { variant: n } = e, r = _(e.label, h), i = r;
119
- e.ariaLabel != null && (i = _(e.ariaLabel, h));
120
- let a = te(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
121
- return ee(e) ? /* @__PURE__ */ w(oe, {
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 ? !0 : 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
+ return m(e) ? /* @__PURE__ */ E(j, {
122
91
  to: e.to(null),
123
92
  variant: a,
124
93
  size: o,
125
94
  isDisabled: s,
126
95
  "aria-label": i,
127
- preloadOnMouseEnter: !0,
96
+ preloadOnHover: "code-and-data",
128
97
  children: r
129
- }, e.id) : g(e) ? /* @__PURE__ */ w(E, {
98
+ }, e.id) : p(e) ? /* @__PURE__ */ E(k, {
130
99
  type: "button",
131
100
  variant: a,
132
101
  size: o,
133
102
  disabled: s,
134
103
  onClick: () => {
135
- A(e.id);
104
+ I(e.id);
136
105
  },
137
106
  "aria-label": i,
138
107
  children: r
139
108
  }, e.id) : null;
140
109
  })
141
110
  });
142
- }, [h, Z]), Q = X.find((e) => e.id === k), $ = /* @__PURE__ */ w("span", { children: v("common.loading") });
143
- return z.length > 0 && ($ = /* @__PURE__ */ w("span", { children: v("list.loaded", { count: z.length }) })), /* @__PURE__ */ re(i, {
144
- breadcrumb: s,
145
- children: [/* @__PURE__ */ w(l, {
146
- config: a,
147
- state: U,
148
- pushState: de,
149
- headerActions: pe,
150
- rows: z,
151
- columns: B,
152
- gridTemplateColumns: V,
153
- getRowId: H,
154
- hasNextPage: F,
155
- isLoadingMore: I,
156
- isRefreshing: fe,
157
- onLoadMore: Y,
158
- onRefresh: J,
159
- totalCount: null,
160
- loadedCountLabel: /* @__PURE__ */ w(c, {
161
- count: m.count,
162
- where: U.where,
163
- fetchKey: ue,
164
- loadingFallback: $,
165
- children: (e) => /* @__PURE__ */ w("span", { children: v("list.showing", {
166
- shown: z.length,
167
- total: e
168
- }) })
111
+ }, [f, J]), X = q.find((e) => e.id === F);
112
+ return /* @__PURE__ */ D(r, {
113
+ breadcrumb: o,
114
+ children: [/* @__PURE__ */ E(l, {
115
+ value: C(() => ({
116
+ config: a,
117
+ state: W,
118
+ pushState: G,
119
+ headerActions: Y,
120
+ columns: V,
121
+ gridTemplateColumns: H,
122
+ getRowId: U,
123
+ countFetchKey: L,
124
+ bumpCountFetchKey: () => {
125
+ R((e) => e + 1);
126
+ },
127
+ registerRefresh: B
128
+ }), [
129
+ V,
130
+ a,
131
+ L,
132
+ U,
133
+ H,
134
+ Y,
135
+ G,
136
+ B,
137
+ W
138
+ ]),
139
+ children: /* @__PURE__ */ E(x, {
140
+ fallback: /* @__PURE__ */ E(s, {
141
+ config: a,
142
+ state: W,
143
+ pushState: G,
144
+ headerActions: Y,
145
+ rows: [],
146
+ columns: V,
147
+ gridTemplateColumns: H,
148
+ getRowId: U,
149
+ hasNextPage: !1,
150
+ isLoadingMore: !1,
151
+ isRefreshing: !1,
152
+ onLoadMore: () => {},
153
+ onRefresh: K,
154
+ totalCount: null,
155
+ isLoadingInitial: !0
156
+ }),
157
+ children: i
169
158
  })
170
- }), Q != null && g(Q) && /* @__PURE__ */ w(n, {
159
+ }), X != null && p(X) && /* @__PURE__ */ E(t, {
171
160
  isOpen: !0,
172
- action: Q,
161
+ action: X,
173
162
  node: null,
174
163
  onClose: () => {
175
- A(null);
164
+ I(null);
176
165
  },
177
- onSuccess: J
166
+ onSuccess: K
178
167
  })]
179
168
  });
180
- }, A = ({ entityManifest: e, config: t, prepared: n }) => {
181
- let { t: r } = T();
182
- return /* @__PURE__ */ w(k, {
183
- entityManifest: e,
184
- config: t,
185
- prepared: n,
186
- breadcrumb: a(t, r)
169
+ }, I = ({ children: e, entityManifest: t, config: n }) => {
170
+ let { t: r } = O();
171
+ return /* @__PURE__ */ E(F, {
172
+ children: e,
173
+ entityManifest: t,
174
+ config: n,
175
+ breadcrumb: i(n, r)
187
176
  });
188
177
  };
189
178
  //#endregion
190
- export { A as BackofficeEntityListPage, A as default };
179
+ export { I as BackofficeEntityListPage, I as default };
191
180
 
192
181
  //# sourceMappingURL=BackofficeEntityListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { type JSX, useCallback, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { usePreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\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 { BackofficeLazyEntityCountLabel } from '../components/backoffice/refs/BackofficeLazyEntityCount.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 { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePaginationFragment } from '../relay/typedRelayHooks.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 {\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 entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\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 config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\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\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = useBackofficePaginationFragment<OperationType, unknown, unknown>(\n listConfig.fragment,\n queryData,\n );\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\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 preloadOnMouseEnter\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 listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleRefresh = useCallback(() => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n onRefresh();\n }, [onRefresh]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\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 preloadOnMouseEnter\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 let loadedCountFallback: JSX.Element = <span>{t('common.loading')}</span>;\n if (rows.length > 0) {\n loadedCountFallback = (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n const loadedCountLabel = (\n <BackofficeLazyEntityCountLabel\n count={listConfig.count}\n where={state.where}\n fetchKey={countFetchKey}\n loadingFallback={loadedCountFallback}\n >\n {(totalCount) => {\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }}\n </BackofficeLazyEntityCountLabel>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n loadedCountLabel={loadedCountLabel}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\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 isRefreshing={false}\n onLoadMore={() => {}}\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":";;;;;;;;;;;;;;;;;;;;;AAwDA,IAAM,KACJ,GACA,GACA,GACA,MAIG;CACH,IAAM,IAAW,KAAY,QAAQ,EAAS,SAAS,GAEnD,IAAU;CACd,IAAI,GAAU;EAYZ,IAAM,IAAY,CAAC;GAVjB,IAAI;GACJ,QAAQ;GACR,WAAW;GACX,YAAY;GACZ,OAAO,MACE,kBAAC,GAAD;IAAmB;IAAK,OAAO;IAAgB;GAAO,CAAA;EAK9C,GAAa,GAAG,CAAY,GACzC,IAAa,EAAU,MAAM,MAC1B,EAAI,cAAc,EAC1B;EAGD,AADA,IAAU,GACL,MACH,IAAU,EAAU,KAAK,GAAK,MACxB,MAAU,IACL;GAAE,GAAG;GAAK,WAAW;EAAK,IAE5B,CACR;CAEL;CAEA,IAAI,IAAY;CAChB,AAAI,MACF,IAAY,EAAS;CAEvB,IAAM,IAAe,EAA6B,CAAS,GACrD,IAAiB,EAA4B,CAAW,GAG1D,IAAkB;CACtB,AAAI,MACF,IAAkB;CAEpB,IAAM,IAAc,EAAQ,SAAS,IAAkB,GAEjD,IAAe,EAClB,MAAM,GAAiB,IAAkB,KAAK,IAAI,GAAG,CAAW,CAAC,EACjE,KAAK,MACG,EAAmB,GAAoC,KAAK,CACpE,EACA,KAAK,GAAG,GAEP,IAAsB;CAO1B,OANA,AAGE,IAHE,IACoB,GAAG,EAAa,KAAK,EAAa,GAAG,EAAe,MAEpD,GAAG,EAAa,GAAG,EAAe,KAGnD;EAAE;EAAS;CAAoB;AACxC,GAEM,KAAsC,EAC1C,aACA,WACA,oBAIwB;CACxB,IAAM,IAAa,EAAO,MAEpB,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,CAAC,GAAoB,KAAyB,EAClD,IACF,GACM,CAAC,GAAe,KAAoB,EAAS,CAAC,GAC9C,IAAa,EAA4B,IAAI,GAE7C,IAAkB,GAAa,MAAiC;EACpE,EAAW,UAAU;CACvB,GAAG,CAAC,CAAC,GAEC,EAAE,YAAS,2BAAwB,QAGpC;EACH,IAAM,IAAc,EAAsB,EAAW,SAAS;GAC5D;GACA;EACF,CAAC,GACK,IAAgB,EAAmB;GACvC,WAAW,EAAE,cAAc;GAC3B,UAAU,EAAE,qBAAqB;GACjC,WAAW;GACX,oBAAoB,MACX,EAAO,OAAO,OAAO,CAAE;GAEhC,eAAe,EAAE,SAAM,mBAEnB,kBAAC,EAAU,SAAX,EAAA,UACE,kBAAC,GAAD;IACE,IAAI;IACJ,WAAW;IACX,cAAY;IACZ,OAAO;IACP,gBAAe;cAEf,kBAAC,GAAD;KAAQ,OAAO;KAAI,QAAQ;IAAK,CAAA;GAC5B,CAAA,EACW,CAAA;EAGzB,CAAC;EAED,OAAO,EAAqB,CADR,GAAG,GAAa,CACR,GAAY,EAAW,UAAU,GAAG,CAAI;CACtE,GAAG;EAAC,EAAO;EAAQ,EAAW;EAAS,EAAW;EAAU;EAAG;CAAI,CAAC,GAE9D,IAAW,GACd,MACQ,EAAW,SAAS,CAAG,GAEhC,CAAC,CAAU,CACb,GAEM,EAAE,UAAO,iBAAc,EAA0B,CAAM,GAEvD,IAAuB,QAAkB;EAI7C,AAHA,GAAkB,MACT,IAAU,CAClB,GACD,EAAW,UAAU;CACvB,GAAG,CAAC,CAAC,GAEC,IAAc,QACX,EAAO,eAAe,CAAC,GAC7B,CAAC,EAAO,WAAW,CAAC,GACjB,IAAiB,QACd,EAAY,QAAQ,MACrB,EAAO,aAAa,OACf,KAEF,EAAO,UAAU,IAAI,CAC7B,GACA,CAAC,CAAW,CAAC,GAEV,IAAgB,QAAc;EAC9B,MAAe,WAAW,GAG9B,OACE,kBAAC,OAAD;GAAK,WAAW;aACb,EAAe,KAAK,GAAQ,MAAU;IACrC,IAAM,EAAE,SAAS,MAAkB,GAC7B,IAAQ,EAAa,EAAO,OAAO,CAAI,GACzC,IAAY;IAChB,AAAI,EAAO,aAAa,SACtB,IAAY,EAAa,EAAO,WAAW,CAAI;IAEjD,IAAM,IAAU,EAAqB,GAAe,CAAK,GACnD,IAAO,EAAO,QAAQ,SACtB,IAAa,EAAO,aAAa,IAAI,MAAM;IAqCjD,OAnCI,EAAc,CAAM,IAGpB,kBAAC,GAAD;KAEE,IAJS,EAAO,GAAG,IAIf;KACK;KACH;KACM;KACZ,cAAY;KACZ,gBAAe;eAEd;IACS,GATL,EAAO,EASF,IAIZ,EAAqB,CAAM,IAE3B,kBAAC,GAAD;KAEE,MAAK;KACI;KACH;KACN,UAAU;KACV,eAAe;MACb,EAAsB,EAAO,EAAE;KACjC;KACA,cAAY;eAEX;IACK,GAXD,EAAO,EAWN,IAIL;GACT,CAAC;EACE,CAAA;CAET,GAAG,CAAC,GAAM,CAAc,CAAC,GAEnB,IAAmB,EAAY,MAAM,MAClC,EAAO,OAAO,CACtB;CAqDD,OACE,kBAAC,GAAD;EAAuC;YAAvC,CACE,kBAAC,GAAD;GAAmC,OA/BlB,SACZ;IACL;IACA;IACA;IACA,eAAA;IACA;IACA;IACA;IACA;IACA,yBAAyB;KACvB,GAAkB,MACT,IAAU,CAClB;IACH;IACA;GACF,IACC;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF,CAI8C;aACxC,kBAAC,GAAD;IAAU,UApDZ,kBAAC,GAAD;KACU;KACD;KACI;KACI,eAAA;KACf,MAAM,CAAC;KACE;KACY;KACX;KACV,aAAa;KACb,eAAe;KACf,cAAc;KACd,kBAAkB,CAAC;KACnB,WAAW;KACX,YAAY;KACZ,kBAAA;IACD,CAAA;IAoC+C;GAAmB,CAAA;EAChC,CAAA,GAClC,KAAoB,QAAQ,EAAqB,CAAgB,KAChE,kBAAC,GAAD;GACE,QAAA;GACA,QAAQ;GACR,MAAM;GACN,eAAe;IACb,EAAsB,IAAI;GAC5B;GACA,WAAW;EACZ,CAAA,CAEsB;;AAE/B,GAEa,KAA4B,EACvC,aACA,mBACA,gBACuD;CACvD,IAAM,EAAE,GAAG,MAAS,EAAe;CAGnC,OACE,kBAAC,GAAD;EACY;EACM;EACR;EACI,YAPG,EAA0B,GAAQ,CAOrC;CACb,CAAA;AAEL"}
@@ -0,0 +1,15 @@
1
+ import { createContext as e, useContext as t } from "react";
2
+ import { jsx as n } from "react/jsx-runtime";
3
+ //#region src/pages/BackofficeEntityListRouteContext.tsx
4
+ var r = e(null), i = ({ children: e, value: t }) => /* @__PURE__ */ n(r.Provider, {
5
+ value: t,
6
+ children: e
7
+ }), a = () => {
8
+ let e = t(r);
9
+ if (e == null) throw Error("BackofficeEntityListRouteContext is missing.");
10
+ return e;
11
+ };
12
+ //#endregion
13
+ export { i as BackofficeEntityListRouteProvider, a as useBackofficeEntityListRouteContext };
14
+
15
+ //# sourceMappingURL=BackofficeEntityListRouteContext.js.map
@@ -0,0 +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 { 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"}
@@ -2,7 +2,7 @@
2
2
  var e = (e) => e.pages.map((t) => ({
3
3
  id: t.id,
4
4
  label: t.label(e.tApp),
5
- preloadOnMouseEnter: !0,
5
+ preloadOnHover: "code-and-data",
6
6
  to: e.detailPageHref(e.id, t.id)
7
7
  }));
8
8
  //#endregion
@@ -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 preloadOnMouseEnter: true,\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,qBAAqB;CACrB,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 { 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"}