@plumile/backoffice-react 0.1.156 → 0.1.157

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 (44) hide show
  1. package/lib/esm/auth/authRefreshNotice.css.js +1 -0
  2. package/lib/esm/auth/login/loginPage.css.js +0 -1
  3. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
  4. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +1 -1
  6. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  7. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  8. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -0
  9. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js +31 -0
  10. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -0
  11. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +36 -32
  12. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  13. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +0 -1
  14. package/lib/esm/i18n/locales/en/backofficeReact.js +0 -1
  15. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  16. package/lib/esm/i18n/locales/fr/backofficeReact.js +0 -1
  17. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  18. package/lib/esm/index.js +33 -32
  19. package/lib/esm/pages/BackofficeEntityDetailPage.js +200 -214
  20. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  21. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +0 -1
  22. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  23. package/lib/esm/pages/BackofficeEntityListPage.helpers.js +2 -2
  24. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  25. package/lib/esm/pages/BackofficeEntityListPage.js +76 -269
  26. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  27. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  28. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +1 -1
  29. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -1
  30. package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts +8 -0
  31. package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts.map +1 -0
  32. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts +1 -1
  33. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  34. package/lib/types/i18n/resources.d.ts +0 -2
  35. package/lib/types/i18n/resources.d.ts.map +1 -1
  36. package/lib/types/index.d.ts +1 -0
  37. package/lib/types/index.d.ts.map +1 -1
  38. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  39. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +2 -3
  40. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  41. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  42. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +1 -6
  43. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  44. package/package.json +6 -6
@@ -9,23 +9,20 @@ import { buildEntityListBreadcrumb as s } from "../components/backoffice/layout/
9
9
  import { rowFlagsColumnCell as c } from "../components/backoffice/list/RowFlagsCell.css.js";
10
10
  import { RowFlagsCell as l } from "../components/backoffice/list/RowFlagsCell.js";
11
11
  import { useBackofficeListUrlState as u } from "../hooks/useBackofficeListUrlState.js";
12
- import { buildActionsColumn as d, computeActionsColumnWidthPx as f, computeRowFlagsColumnWidthPx as p, isConnectionListConfig as m, isFormMutationAction as h, isRecordListConfig as g, isRouteAction as ee, resolveActionVariant as te, resolveLabel as _, resolveTrackBySize as v } from "./BackofficeEntityListPage.helpers.js";
13
- import { actionTrigger as ne, actionsColumnCell as re, headerActions as ie } from "./backofficeEntityListPage.css.js";
14
- import { useCallback as y, useEffect as b, useMemo as x, useRef as S, useState as C } from "react";
15
- import { InlineBanner as ae } from "@plumile/ui/components/feedback/InlineBanner.js";
16
- import { Fragment as w, jsx as T, jsxs as oe } from "react/jsx-runtime";
17
- import { useTranslation as E } from "react-i18next";
18
- import { Button as D } from "@plumile/ui/atomic/atoms/button/Button.js";
19
- import { fetchQuery as O } from "relay-runtime";
20
- import { useFragment as se, usePaginationFragment as k, usePreloadedQuery as ce, useRelayEnvironment as A } from "react-relay";
21
- import { BACKOFFICE_LIST_DEFAULTS as le, BACKOFFICE_LIST_REFETCH_POLICY as j } from "@plumile/backoffice-core/constants.js";
22
- import ue from "@plumile/router/routing/Link.js";
23
- import { stableListVariablesKey as M } from "@plumile/backoffice-core/state/stableKey.js";
24
- import { LinkButton as de } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
25
- import { TableCell as fe } from "@plumile/ui/components/data-table/TableCell.js";
26
- import { EyeSvg as pe } from "@plumile/ui/icons/EyeSvg.js";
12
+ import { buildActionsColumn as d, computeActionsColumnWidthPx as f, computeRowFlagsColumnWidthPx as p, isFormMutationAction as m, isRouteAction as h, resolveActionVariant as g, resolveLabel as _, resolveTrackBySize as v } from "./BackofficeEntityListPage.helpers.js";
13
+ import { actionTrigger as y, actionsColumnCell as b, headerActions as x } from "./backofficeEntityListPage.css.js";
14
+ import { useCallback as S, useMemo as C, useState as w } from "react";
15
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
16
+ import { useTranslation as D } from "react-i18next";
17
+ import { Button as O } from "@plumile/ui/atomic/atoms/button/Button.js";
18
+ import { usePaginationFragment as k, usePreloadedQuery as ee } from "react-relay";
19
+ import { BACKOFFICE_LIST_DEFAULTS as te, BACKOFFICE_LIST_REFETCH_POLICY as ne } from "@plumile/backoffice-core/constants.js";
20
+ import re from "@plumile/router/routing/Link.js";
21
+ import { LinkButton as ie } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
22
+ import { TableCell as ae } from "@plumile/ui/components/data-table/TableCell.js";
23
+ import { EyeSvg as A } from "@plumile/ui/icons/EyeSvg.js";
27
24
  //#region src/pages/BackofficeEntityListPage.tsx
28
- var me = "store-or-network", he = (e, t, n, r) => {
25
+ var j = (e, t, n, r) => {
29
26
  let i = t != null && t.length > 0, a = e;
30
27
  if (i) {
31
28
  let n = [{
@@ -53,254 +50,71 @@ var me = "store-or-network", he = (e, t, n, r) => {
53
50
  columns: a,
54
51
  gridTemplateColumns: g
55
52
  };
56
- }, N = ({ config: i, prepared: o }) => {
57
- let { t: s } = E(), { t: c } = e(), [l, f] = C(null), p = A(), m = i.list, g = i.listDefaults ?? m.defaultState ?? {
58
- where: null,
59
- sort: null
60
- }, v = ce(m.query, o.query), k = se(m.fragment, v), j = x(() => m.getRows(k).map((e) => m.toRow(e)), [k, m]), N = x(() => m.getNextCursor?.(v) ?? null, [m, v]), [P, F] = C(j), [I, L] = C(N), [R, z] = C(!1), [B, V] = C(!1), [ge, H] = C(!1);
61
- b(() => {
62
- F(j), L(N);
63
- }, [N, j]);
64
- let { columns: U, gridTemplateColumns: _e } = x(() => {
65
- let e = n(m.columns, {
66
- tApp: s,
67
- t: c
68
- }), t = d({
69
- ariaLabel: c("actions.view"),
70
- fallback: c("common.notAvailable"),
71
- className: re,
72
- resolveDetailHref: (e) => i.routes.detail(e),
73
- renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(fe.Actions, { children: /* @__PURE__ */ T(ue, {
74
- to: e,
75
- className: ne,
76
- "aria-label": t,
77
- title: t,
78
- preloadOnMouseEnter: !0,
79
- children: /* @__PURE__ */ T(pe, {
80
- width: 16,
81
- height: 16
82
- })
83
- }) })
84
- });
85
- return he([...e, t], m.rowFlags, 1, s);
86
- }, [
87
- i.routes,
88
- m.columns,
89
- m.rowFlags,
90
- c,
91
- s
92
- ]), W = y((e) => m.getRowId(e), [m]), { state: G, pushState: ve } = u(i), K = G.sort ?? g.sort, { pageSize: q } = le, ye = y((e) => m.buildQueryVariables(e), [m]), J = S(0), be = S(M({
93
- where: g.where,
94
- sort: g.sort,
95
- count: q
96
- })), Y = y(async (e) => {
97
- let t = J.current + 1;
98
- J.current = t, e.mode === "append" ? z(!0) : V(!0), H(!1);
99
- try {
100
- let n = ye({
101
- where: e.where,
102
- sort: e.sort,
103
- count: e.count,
104
- cursor: e.cursor
105
- }), r = await O(p, m.query, n, { fetchPolicy: me }).toPromise();
106
- if (r == null || J.current !== t) return;
107
- let i = m.getRows(r).map((e) => m.toRow(e));
108
- F((t) => e.mode === "append" ? [...t, ...i] : i), L(m.getNextCursor?.(r) ?? null);
109
- } catch {
110
- J.current === t && H(!0);
111
- } finally {
112
- e.mode === "append" ? z(!1) : V(!1);
113
- }
114
- }, [
115
- ye,
116
- p,
117
- m
118
- ]);
119
- b(() => {
120
- let e = M({
121
- where: G.where,
122
- sort: K,
123
- count: q
124
- });
125
- be.current !== e && (be.current = e, Y({
126
- where: G.where,
127
- sort: K,
128
- count: q,
129
- cursor: null,
130
- mode: "reset"
131
- }).catch(() => {
132
- H(!0);
133
- }));
134
- }, [
135
- q,
136
- K,
137
- Y,
138
- G.where
139
- ]);
140
- let X = y(() => {
141
- B || Y({
142
- where: G.where,
143
- sort: K,
144
- count: q,
145
- cursor: null,
146
- mode: "reset"
147
- }).catch(() => {
148
- H(!0);
149
- });
150
- }, [
151
- B,
152
- q,
153
- K,
154
- Y,
155
- G.where
156
- ]), xe = r({
157
- hasNext: I != null,
158
- isLoadingNext: R,
159
- loadNext: (e) => {
160
- I != null && Y({
161
- where: G.where,
162
- sort: K,
163
- count: e,
164
- cursor: I,
165
- mode: "append"
166
- }).catch(() => {
167
- H(!0);
168
- });
169
- },
170
- count: q
171
- }), Z = x(() => i.listActions ?? [], [i.listActions]), Q = x(() => Z.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [Z]), Se = x(() => {
172
- if (Q.length !== 0) return /* @__PURE__ */ T("div", {
173
- className: ie,
174
- children: Q.map((e, t) => {
175
- let { variant: n } = e, r = _(e.label, s), i = r;
176
- e.ariaLabel != null && (i = _(e.ariaLabel, s));
177
- let a = te(n, t), o = e.size ?? "small", c = e.isDisabled?.(null) === !0;
178
- return ee(e) ? /* @__PURE__ */ T(de, {
179
- to: e.to(null),
180
- variant: a,
181
- size: o,
182
- isDisabled: c,
183
- "aria-label": i,
184
- preloadOnMouseEnter: !0,
185
- children: r
186
- }, e.id) : h(e) ? /* @__PURE__ */ T(D, {
187
- type: "button",
188
- variant: a,
189
- size: o,
190
- disabled: c,
191
- onClick: () => {
192
- f(e.id);
193
- },
194
- "aria-label": i,
195
- children: r
196
- }, e.id) : null;
197
- })
198
- });
199
- }, [s, Q]), $ = Z.find((e) => e.id === l), Ce = null;
200
- return ge && (Ce = /* @__PURE__ */ T(ae, {
201
- tone: "danger",
202
- title: c("list.errors.title"),
203
- actions: /* @__PURE__ */ T(D, {
204
- type: "button",
205
- variant: "secondary",
206
- size: "small",
207
- onClick: X,
208
- children: c("list.actions.retry")
209
- }),
210
- onDismiss: () => {
211
- H(!1);
212
- },
213
- children: c("list.errors.fetchFailed")
214
- })), /* @__PURE__ */ oe(w, { children: [/* @__PURE__ */ T(a, {
215
- config: i,
216
- state: G,
217
- pushState: ve,
218
- headerActions: Se,
219
- rows: P,
220
- columns: U,
221
- gridTemplateColumns: _e,
222
- getRowId: W,
223
- hasNextPage: I != null,
224
- isLoadingMore: R,
225
- isRefreshing: B,
226
- onLoadMore: xe,
227
- onRefresh: X,
228
- totalCount: null,
229
- statusBanner: Ce
230
- }), $ != null && h($) && /* @__PURE__ */ T(t, {
231
- isOpen: !0,
232
- action: $,
233
- node: null,
234
- onClose: () => {
235
- f(null);
236
- },
237
- onSuccess: X
238
- })] });
239
- }, P = ({ config: s, prepared: c, breadcrumb: l }) => {
240
- let f = s.list, { t: p } = E(), { t: m } = e(), [g, v] = C(null), b = ce(f.query, c.query), { data: S, loadNext: ae, hasNext: w, isLoadingNext: O, refetch: se } = k(f.fragment, b), A = f.getConnection(S), M = x(() => A.edges.map((e) => f.toRow(e.node)), [A.edges, f]), { columns: me, gridTemplateColumns: N } = x(() => {
53
+ }, M = ({ config: s, prepared: c, breadcrumb: l }) => {
54
+ let f = s.list, { t: p } = D(), { t: v } = e(), [M, N] = w(null), P = ee(f.query, c.query), { data: F, loadNext: I, hasNext: L, isLoadingNext: R, refetch: z } = k(f.fragment, P), B = f.getConnection(F), V = C(() => B.edges.map((e) => f.toRow(e.node)), [B.edges, f]), { columns: H, gridTemplateColumns: U } = C(() => {
241
55
  let e = n(f.columns, {
242
56
  tApp: p,
243
- t: m
57
+ t: v
244
58
  }), t = d({
245
- ariaLabel: m("actions.view"),
246
- fallback: m("common.notAvailable"),
247
- className: re,
59
+ ariaLabel: v("actions.view"),
60
+ fallback: v("common.notAvailable"),
61
+ className: b,
248
62
  resolveDetailHref: (e) => s.routes.detail(e),
249
- renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(fe.Actions, { children: /* @__PURE__ */ T(ue, {
63
+ renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ T(ae.Actions, { children: /* @__PURE__ */ T(re, {
250
64
  to: e,
251
- className: ne,
65
+ className: y,
252
66
  "aria-label": t,
253
67
  title: t,
254
68
  preloadOnMouseEnter: !0,
255
- children: /* @__PURE__ */ T(pe, {
69
+ children: /* @__PURE__ */ T(A, {
256
70
  width: 16,
257
71
  height: 16
258
72
  })
259
73
  }) })
260
74
  });
261
- return he([...e, t], f.rowFlags, 1, p);
75
+ return j([...e, t], f.rowFlags, 1, p);
262
76
  }, [
263
77
  s.routes,
264
78
  f.columns,
265
79
  f.rowFlags,
266
- m,
80
+ v,
267
81
  p
268
- ]), P = y((e) => f.getRowId(e), [f]), { state: F, pushState: I } = u(s), L = s.listDefaults ?? f.defaultState ?? {
82
+ ]), W = S((e) => f.getRowId(e), [f]), { state: G, pushState: K } = u(s), q = s.listDefaults ?? f.defaultState ?? {
269
83
  where: null,
270
84
  sort: null
271
- }, R = F.sort ?? L.sort, { pageSize: z } = le, { isRefreshing: B, onRefresh: V } = i({
272
- refetch: se,
273
- variables: x(() => ({
274
- where: F.where,
275
- sort: R,
276
- count: z,
85
+ }, J = G.sort ?? q.sort, { pageSize: Y } = te, { isRefreshing: oe, onRefresh: X } = i({
86
+ refetch: z,
87
+ variables: C(() => ({
88
+ where: G.where,
89
+ sort: J,
90
+ count: Y,
277
91
  cursor: null
278
92
  }), [
279
- z,
280
- R,
281
- F.where
93
+ Y,
94
+ J,
95
+ G.where
282
96
  ]),
283
97
  defaults: {
284
- where: L.where,
285
- sort: L.sort,
286
- count: z,
98
+ where: q.where,
99
+ sort: q.sort,
100
+ count: Y,
287
101
  cursor: null
288
102
  },
289
- fetchPolicy: j,
103
+ fetchPolicy: ne,
290
104
  buildQueryVariables: f.buildQueryVariables
291
- }), ge = r({
292
- hasNext: w,
293
- isLoadingNext: O,
294
- loadNext: ae,
295
- count: z
296
- }), H = x(() => s.listActions ?? [], [s.listActions]), U = x(() => H.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [H]), _e = x(() => {
297
- if (U.length !== 0) return /* @__PURE__ */ T("div", {
298
- className: ie,
299
- children: U.map((e, t) => {
105
+ }), se = r({
106
+ hasNext: L,
107
+ isLoadingNext: R,
108
+ loadNext: I,
109
+ count: Y
110
+ }), Z = C(() => s.listActions ?? [], [s.listActions]), Q = C(() => Z.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [Z]), ce = C(() => {
111
+ if (Q.length !== 0) return /* @__PURE__ */ T("div", {
112
+ className: x,
113
+ children: Q.map((e, t) => {
300
114
  let { variant: n } = e, r = _(e.label, p), i = r;
301
115
  e.ariaLabel != null && (i = _(e.ariaLabel, p));
302
- let a = te(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
303
- return ee(e) ? /* @__PURE__ */ T(de, {
116
+ let a = g(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
117
+ return h(e) ? /* @__PURE__ */ T(ie, {
304
118
  to: e.to(null),
305
119
  variant: a,
306
120
  size: o,
@@ -308,64 +122,57 @@ var me = "store-or-network", he = (e, t, n, r) => {
308
122
  "aria-label": i,
309
123
  preloadOnMouseEnter: !0,
310
124
  children: r
311
- }, e.id) : h(e) ? /* @__PURE__ */ T(D, {
125
+ }, e.id) : m(e) ? /* @__PURE__ */ T(O, {
312
126
  type: "button",
313
127
  variant: a,
314
128
  size: o,
315
129
  disabled: s,
316
130
  onClick: () => {
317
- v(e.id);
131
+ N(e.id);
318
132
  },
319
133
  "aria-label": i,
320
134
  children: r
321
135
  }, e.id) : null;
322
136
  })
323
137
  });
324
- }, [p, U]), W = H.find((e) => e.id === g);
325
- return /* @__PURE__ */ oe(o, {
138
+ }, [p, Q]), $ = Z.find((e) => e.id === M);
139
+ return /* @__PURE__ */ E(o, {
326
140
  breadcrumb: l,
327
141
  children: [/* @__PURE__ */ T(a, {
328
142
  config: s,
329
- state: F,
330
- pushState: I,
331
- headerActions: _e,
332
- rows: M,
333
- columns: me,
334
- gridTemplateColumns: N,
335
- getRowId: P,
336
- hasNextPage: w,
337
- isLoadingMore: O,
338
- isRefreshing: B,
339
- onLoadMore: ge,
340
- onRefresh: V,
341
- totalCount: A.totalCount ?? null
342
- }), W != null && h(W) && /* @__PURE__ */ T(t, {
143
+ state: G,
144
+ pushState: K,
145
+ headerActions: ce,
146
+ rows: V,
147
+ columns: H,
148
+ gridTemplateColumns: U,
149
+ getRowId: W,
150
+ hasNextPage: L,
151
+ isLoadingMore: R,
152
+ isRefreshing: oe,
153
+ onLoadMore: se,
154
+ onRefresh: X,
155
+ totalCount: B.totalCount ?? null
156
+ }), $ != null && m($) && /* @__PURE__ */ T(t, {
343
157
  isOpen: !0,
344
- action: W,
158
+ action: $,
345
159
  node: null,
346
160
  onClose: () => {
347
- v(null);
161
+ N(null);
348
162
  },
349
- onSuccess: V
163
+ onSuccess: X
350
164
  })]
351
165
  });
352
- }, F = ({ entityManifest: e, config: t, prepared: n }) => {
353
- let { t: r } = E(), i = s(t, r);
354
- return g(t) ? /* @__PURE__ */ T(o, {
355
- breadcrumb: i,
356
- children: /* @__PURE__ */ T(N, {
357
- entityManifest: e,
358
- config: t,
359
- prepared: n
360
- })
361
- }) : m(t) ? /* @__PURE__ */ T(P, {
166
+ }, N = ({ entityManifest: e, config: t, prepared: n }) => {
167
+ let { t: r } = D();
168
+ return /* @__PURE__ */ T(M, {
362
169
  entityManifest: e,
363
170
  config: t,
364
171
  prepared: n,
365
- breadcrumb: i
366
- }) : null;
172
+ breadcrumb: s(t, r)
173
+ });
367
174
  };
368
175
  //#endregion
369
- export { F as BackofficeEntityListPage, F as default };
176
+ export { N as BackofficeEntityListPage, N as default };
370
177
 
371
178
  //# sourceMappingURL=BackofficeEntityListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import {\n type JSX,\n useCallback,\n useEffect,\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 {\n useFragment,\n usePaginationFragment,\n usePreloadedQuery,\n useRelayEnvironment,\n} from 'react-relay';\nimport { fetchQuery } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.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 { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.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 { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.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 {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isConnectionListConfig,\n isRecordListConfig,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n type RecordListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\ntype RecordFetchMode = 'append' | 'reset';\ntype RecordFetchInput = {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n mode: RecordFetchMode;\n};\n\nconst RECORD_FETCH_POLICY = 'store-or-network' as const;\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 BackofficeEntityRecordListPage = ({\n config,\n prepared,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: RecordListConfig;\n}): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const environment = useRelayEnvironment();\n\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const fragmentData = useFragment(listConfig.fragment, queryData as never);\n\n const initialRows = useMemo(() => {\n return listConfig.getRows(fragmentData).map((row) => {\n return listConfig.toRow(row);\n });\n }, [fragmentData, listConfig]);\n\n const initialCursor = useMemo(() => {\n return listConfig.getNextCursor?.(queryData) ?? null;\n }, [listConfig, queryData]);\n\n const [rows, setRows] = useState(initialRows);\n const [nextCursor, setNextCursor] = useState(initialCursor);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [fetchError, setFetchError] = useState(false);\n\n useEffect(() => {\n setRows(initialRows);\n setNextCursor(initialCursor);\n }, [initialCursor, initialRows]);\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 resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const buildVariables = useCallback(\n (input: {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n }) => {\n return listConfig.buildQueryVariables(input);\n },\n [listConfig],\n );\n\n const requestIdRef = useRef(0);\n const lastRefetchKeyRef = useRef(\n stableListVariablesKey({\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n }),\n );\n\n const runFetch = useCallback(\n async (input: RecordFetchInput) => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (input.mode === 'append') {\n setIsLoadingMore(true);\n } else {\n setIsRefreshing(true);\n }\n setFetchError(false);\n\n try {\n const variables = buildVariables({\n where: input.where,\n sort: input.sort,\n count: input.count,\n cursor: input.cursor,\n });\n\n const response = await fetchQuery(\n environment,\n listConfig.query,\n variables as never,\n { fetchPolicy: RECORD_FETCH_POLICY },\n ).toPromise();\n\n if (response == null || requestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = listConfig.getRows(response as never).map((row) => {\n return listConfig.toRow(row);\n });\n setRows((prev) => {\n if (input.mode === 'append') {\n return [...prev, ...nextRows];\n }\n return nextRows;\n });\n const cursor = listConfig.getNextCursor?.(response) ?? null;\n setNextCursor(cursor);\n } catch {\n if (requestIdRef.current === requestId) {\n setFetchError(true);\n }\n } finally {\n if (input.mode === 'append') {\n setIsLoadingMore(false);\n } else {\n setIsRefreshing(false);\n }\n }\n },\n [buildVariables, environment, listConfig],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [pageSize, resolvedSort, runFetch, state.where]);\n\n const handleRefresh = useCallback(() => {\n if (isRefreshing) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [isRefreshing, pageSize, resolvedSort, runFetch, state.where]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext: nextCursor != null,\n isLoadingNext: isLoadingMore,\n loadNext: (count) => {\n if (nextCursor == null) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count,\n cursor: nextCursor,\n mode: 'append',\n }).catch(() => {\n setFetchError(true);\n });\n },\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 statusBanner: JSX.Element | null = null;\n if (fetchError) {\n statusBanner = (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleRefresh}\n >\n {t('list.actions.retry')}\n </Button>\n }\n onDismiss={() => {\n setFetchError(false);\n }}\n >\n {t('list.errors.fetchFailed')}\n </InlineBanner>\n );\n }\n\n return (\n <>\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={nextCursor != null}\n isLoadingMore={isLoadingMore}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n statusBanner={statusBanner}\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 </>\n );\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\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\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 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 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={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\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 if (isRecordListConfig(config)) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityRecordListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n />\n </BackofficeRightPageLayout>\n );\n }\n if (!isConnectionListConfig(config)) {\n return null;\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 { 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 { usePaginationFragment, usePreloadedQuery } from 'react-relay';\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 { 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 * 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\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\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 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 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={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\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 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAU3E,OAAO,KAAK,EAEV,mCAAmC,EAEpC,MAAM,mCAAmC,CAAC;AAc3C,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mCAAmC,CAAC;IAC9C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAkMF,eAAO,MAAM,iCAAiC,GAAI,6BAI/C,sCAAsC,KAAG,GAAG,CAAC,OAgB/C,CAAC;AAEF,eAAe,iCAAiC,CAAC"}
1
+ {"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAU3E,OAAO,KAAK,EAEV,mCAAmC,EAEpC,MAAM,mCAAmC,CAAC;AAc3C,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mCAAmC,CAAC;IAC9C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAyLF,eAAO,MAAM,iCAAiC,GAAI,6BAI/C,sCAAsC,KAAG,GAAG,CAAC,OAgB/C,CAAC;AAEF,eAAe,iCAAiC,CAAC"}
@@ -3,7 +3,7 @@ import type { MetricTone } from '@plumile/ui/components/dashboard/metric_card/Me
3
3
  export type BackofficeRelationSummaryItem = {
4
4
  readonly id: string;
5
5
  readonly label: string;
6
- readonly count?: number | null;
6
+ readonly count?: ReactNode;
7
7
  readonly href?: string;
8
8
  readonly description?: ReactNode;
9
9
  readonly tone?: MetricTone;
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeRelationsSummaryGrid.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AAK7F,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,mBAG5C,mCAAmC,KAAG,GAAG,CAAC,OAAO,GAAG,IA4CtD,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
1
+ {"version":3,"file":"BackofficeRelationsSummaryGrid.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AAK7F,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,mBAG5C,mCAAmC,KAAG,GAAG,CAAC,OAAO,GAAG,IA4CtD,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type JSX } from 'react';
2
+ export type BackofficeLazyEntityCountProps<Where extends Record<string, unknown> = Record<string, unknown>> = {
3
+ entity: string;
4
+ where: Where | null;
5
+ };
6
+ export declare const BackofficeLazyEntityCount: ({ entity, where, }: BackofficeLazyEntityCountProps) => JSX.Element | null;
7
+ export default BackofficeLazyEntityCount;
8
+ //# sourceMappingURL=BackofficeLazyEntityCount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeLazyEntityCount.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/refs/BackofficeLazyEntityCount.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAW3C,MAAM,MAAM,8BAA8B,CACxC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC7D;IACF,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAsCF,eAAO,MAAM,yBAAyB,GAAI,oBAGvC,8BAA8B,KAAG,GAAG,CAAC,OAAO,GAAG,IAYjD,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type JSX } from 'react';
2
2
  export type BackofficeRelatedCountLinkProps<Where extends Record<string, unknown> = Record<string, unknown>> = {
3
- count: number | null | undefined;
3
+ count?: number | null | undefined;
4
4
  entity: string;
5
5
  where: Where;
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeRelatedCountLink.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/refs/BackofficeRelatedCountLink.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,GAAG,EAAmB,MAAM,OAAO,CAAC;AAa9D,MAAM,MAAM,+BAA+B,CACzC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC7D;IACF,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,2BAIC,+BAA+B,CAAC,KAAK,CAAC,KAAG,GAAG,CAAC,OA2F/C,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
1
+ {"version":3,"file":"BackofficeRelatedCountLink.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/refs/BackofficeRelatedCountLink.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,GAAG,EAAmC,MAAM,OAAO,CAAC;AAc9E,MAAM,MAAM,+BAA+B,CACzC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC7D;IACF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,2BAIC,+BAA+B,CAAC,KAAK,CAAC,KAAG,GAAG,CAAC,OA6F/C,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -377,7 +377,6 @@ export declare const backofficeReactI18nResources: {
377
377
  retry: string;
378
378
  };
379
379
  errors: {
380
- fetchFailed: string;
381
380
  tableFailed: string;
382
381
  title: string;
383
382
  };
@@ -851,7 +850,6 @@ export declare const backofficeReactI18nResources: {
851
850
  retry: string;
852
851
  };
853
852
  errors: {
854
- fetchFailed: string;
855
853
  tableFailed: string;
856
854
  title: string;
857
855
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/i18n/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,SAAS,CAAC;AAI1D,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/B,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC;AAsB/E,wBAAgB,gCAAgC,CAC9C,YAAY,GAAE,QAAa,GAC1B,QAAQ,CAsBV"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/i18n/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,SAAS,CAAC;AAI1D,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/B,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC;AAsB/E,wBAAgB,gCAAgC,CAC9C,YAAY,GAAE,QAAa,GAC1B,QAAQ,CAsBV"}
@@ -19,6 +19,7 @@ export { BackofficeBillingUsageChart, type BackofficeBillingUsageChartBucket, ty
19
19
  export { BackofficeOverviewLayout } from './components/backoffice/overview/BackofficeOverviewLayout.js';
20
20
  export { BackofficeHubTemplate, type BackofficeHubTemplateEmptyState, type BackofficeHubTemplateGroup, type BackofficeHubTemplateItem, type BackofficeHubTemplateItemKind, type BackofficeHubTemplateProps, type BackofficeHubTemplateSearch, } from './components/backoffice/hub/BackofficeHubTemplate.js';
21
21
  export { BackofficeRelatedCountLink } from './components/backoffice/refs/BackofficeRelatedCountLink.js';
22
+ export { BackofficeLazyEntityCount, type BackofficeLazyEntityCountProps, } from './components/backoffice/refs/BackofficeLazyEntityCount.js';
22
23
  export { BackofficeLink, type BackofficeLinkProps, } from './components/backoffice/links/BackofficeLink.js';
23
24
  export { BackofficeInlineLink, type BackofficeInlineLinkProps, } from './components/backoffice/links/BackofficeInlineLink.js';
24
25
  export { BackofficeLinkLabel, type BackofficeLinkLabelProps, } from './components/backoffice/links/BackofficeLinkLabel.js';