@plumile/backoffice-react 0.1.101 → 0.1.103

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 (94) hide show
  1. package/lib/esm/{BackofficeAcceptInvitationPage-CEtApVwL.js → BackofficeAcceptInvitationPage-BfRsORii.js} +3 -3
  2. package/lib/esm/{BackofficeAcceptInvitationPage-CEtApVwL.js.map → BackofficeAcceptInvitationPage-BfRsORii.js.map} +1 -1
  3. package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js +344 -0
  4. package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js.map +1 -0
  5. package/lib/esm/{BackofficeEntityActionFormDialog-BgRTJ_JS.js → BackofficeEntityActionFormDialog-BgMuhyU8.js} +2 -2
  6. package/lib/esm/{BackofficeEntityActionFormDialog-BgRTJ_JS.js.map → BackofficeEntityActionFormDialog-BgMuhyU8.js.map} +1 -1
  7. package/lib/esm/{BackofficeEntityDetailLayoutContext-C_tBqkVq.js → BackofficeEntityDetailLayoutContext-DeuH5PCW.js} +1 -1
  8. package/lib/esm/{BackofficeEntityDetailLayoutContext-C_tBqkVq.js.map → BackofficeEntityDetailLayoutContext-DeuH5PCW.js.map} +1 -1
  9. package/lib/esm/{BackofficeEntityDetailLayoutPage-DXjRqvcZ.js → BackofficeEntityDetailLayoutPage-Duc_DcIV.js} +2 -2
  10. package/lib/esm/{BackofficeEntityDetailLayoutPage-DXjRqvcZ.js.map → BackofficeEntityDetailLayoutPage-Duc_DcIV.js.map} +1 -1
  11. package/lib/esm/{BackofficeEntityDetailPage-CwzKp_Yw.js → BackofficeEntityDetailPage-ChxBrqz8.js} +7 -6
  12. package/lib/esm/{BackofficeEntityDetailPage-CwzKp_Yw.js.map → BackofficeEntityDetailPage-ChxBrqz8.js.map} +1 -1
  13. package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-DRWTeox-.js → BackofficeEntityDetailUnknownPageRedirect-xupMeril.js} +2 -2
  14. package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-DRWTeox-.js.map → BackofficeEntityDetailUnknownPageRedirect-xupMeril.js.map} +1 -1
  15. package/lib/esm/{BackofficeEntityListPage-DVT3rrfa.js → BackofficeEntityListPage-BACvfX6c.js} +5 -4
  16. package/lib/esm/{BackofficeEntityListPage-DVT3rrfa.js.map → BackofficeEntityListPage-BACvfX6c.js.map} +1 -1
  17. package/lib/esm/BackofficeHubPage-BsUXulN0.js +136 -0
  18. package/lib/esm/BackofficeHubPage-BsUXulN0.js.map +1 -0
  19. package/lib/esm/BackofficeLayoutPage-r6dXo9SI.js +699 -0
  20. package/lib/esm/BackofficeLayoutPage-r6dXo9SI.js.map +1 -0
  21. package/lib/esm/{BackofficeLoginPage-Cc3kcOQV.js → BackofficeLoginPage-BMPhO1cr.js} +4 -4
  22. package/lib/esm/{BackofficeLoginPage-Cc3kcOQV.js.map → BackofficeLoginPage-BMPhO1cr.js.map} +1 -1
  23. package/lib/esm/{BackofficePasswordResetCompletePage-CF_0t3Nq.js → BackofficePasswordResetCompletePage-OApMUiOi.js} +3 -3
  24. package/lib/esm/{BackofficePasswordResetCompletePage-CF_0t3Nq.js.map → BackofficePasswordResetCompletePage-OApMUiOi.js.map} +1 -1
  25. package/lib/esm/{BackofficePasswordResetRequestPage-BJOrQXcy.js → BackofficePasswordResetRequestPage-DPDImb37.js} +2 -2
  26. package/lib/esm/{BackofficePasswordResetRequestPage-BJOrQXcy.js.map → BackofficePasswordResetRequestPage-DPDImb37.js.map} +1 -1
  27. package/lib/esm/BackofficePermissionsContext-CmWwudBU.js +11 -0
  28. package/lib/esm/BackofficePermissionsContext-CmWwudBU.js.map +1 -0
  29. package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js +53 -0
  30. package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js.map +1 -0
  31. package/lib/esm/{BackofficeTopbarPortalContext-iD7dm4_h.js → BackofficeTopbarPortalContext-CphoSrZD.js} +1 -1
  32. package/lib/esm/{BackofficeTopbarPortalContext-iD7dm4_h.js.map → BackofficeTopbarPortalContext-CphoSrZD.js.map} +1 -1
  33. package/lib/esm/{BackofficeVerifyEmailPage-C81LlsNM.js → BackofficeVerifyEmailPage-DHuSOxDf.js} +3 -3
  34. package/lib/esm/{BackofficeVerifyEmailPage-C81LlsNM.js.map → BackofficeVerifyEmailPage-DHuSOxDf.js.map} +1 -1
  35. package/lib/esm/{LazyBackofficeEntityActionFormDialog-L8xwaGqH.js → LazyBackofficeEntityActionFormDialog-uyYFFJGM.js} +93 -45
  36. package/lib/esm/LazyBackofficeEntityActionFormDialog-uyYFFJGM.js.map +1 -0
  37. package/lib/esm/backoffice-react.js +289 -254
  38. package/lib/esm/backoffice-react.js.map +1 -1
  39. package/lib/esm/{backofficeAuthPaths-BiJvoI5Q.js → backofficeAuthPaths-2KMmkBLv.js} +1 -1
  40. package/lib/esm/{backofficeAuthPaths-BiJvoI5Q.js.map → backofficeAuthPaths-2KMmkBLv.js.map} +1 -1
  41. package/lib/esm/{buildBreadcrumbs-CqF9Nh6x.js → buildBreadcrumbs-C9cyiXb7.js} +8 -4
  42. package/lib/esm/buildBreadcrumbs-C9cyiXb7.js.map +1 -0
  43. package/lib/esm/buildDataTableColumns-DGPjPK4N.js +66 -0
  44. package/lib/esm/buildDataTableColumns-DGPjPK4N.js.map +1 -0
  45. package/lib/esm/sidebarUtils-BZETlHea.js +74 -0
  46. package/lib/esm/sidebarUtils-BZETlHea.js.map +1 -0
  47. package/lib/esm/style.css +1 -1
  48. package/lib/esm/{toastViewAction-BGTS7vqm.js → toastViewAction-DJkv_4p9.js} +1 -1
  49. package/lib/esm/{toastViewAction-BGTS7vqm.js.map → toastViewAction-DJkv_4p9.js.map} +1 -1
  50. package/lib/esm/{useBackofficeAuth-ers1FUGe.js → useBackofficeAuth-DVAXNAjP.js} +1 -1
  51. package/lib/esm/{useBackofficeAuth-ers1FUGe.js.map → useBackofficeAuth-DVAXNAjP.js.map} +1 -1
  52. package/lib/esm/{useBackofficeLazyValue-Bh_13h8A.js → useBackofficeLazyValue-CoIAK-5N.js} +1 -1
  53. package/lib/esm/{useBackofficeLazyValue-Bh_13h8A.js.map → useBackofficeLazyValue-CoIAK-5N.js.map} +1 -1
  54. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  55. package/lib/types/components/backoffice/layout/BackofficePermissionsContext.d.ts +8 -0
  56. package/lib/types/components/backoffice/layout/BackofficePermissionsContext.d.ts.map +1 -0
  57. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +4 -0
  58. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
  59. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  60. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +11 -3
  61. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  62. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  63. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts +14 -0
  64. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -0
  65. package/lib/types/hooks/useBackofficeSidebarPins.d.ts +1 -0
  66. package/lib/types/hooks/useBackofficeSidebarPins.d.ts.map +1 -1
  67. package/lib/types/hooks/useSidebarGroupCollapse.d.ts +2 -0
  68. package/lib/types/hooks/useSidebarGroupCollapse.d.ts.map +1 -1
  69. package/lib/types/i18n/resources.d.ts +28 -2
  70. package/lib/types/i18n/resources.d.ts.map +1 -1
  71. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  72. package/lib/types/pages/BackofficeDashboardPage.helpers.d.ts.map +1 -1
  73. package/lib/types/pages/BackofficeHubPage.d.ts +8 -0
  74. package/lib/types/pages/BackofficeHubPage.d.ts.map +1 -0
  75. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  76. package/lib/types/pages/backofficeDashboardPage.css.d.ts +12 -0
  77. package/lib/types/pages/backofficeDashboardPage.css.d.ts.map +1 -1
  78. package/lib/types/pages/backofficeHubPage.css.d.ts +15 -0
  79. package/lib/types/pages/backofficeHubPage.css.d.ts.map +1 -0
  80. package/lib/types/provider/types.d.ts +27 -5
  81. package/lib/types/provider/types.d.ts.map +1 -1
  82. package/lib/types/router/createBackofficeRoutes.d.ts +6 -1
  83. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  84. package/package.json +5 -5
  85. package/lib/esm/BackofficeDashboardPage-r8vK_JA6.js +0 -196
  86. package/lib/esm/BackofficeDashboardPage-r8vK_JA6.js.map +0 -1
  87. package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js +0 -609
  88. package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js.map +0 -1
  89. package/lib/esm/BackofficeRightPageLayout-hexJmpam.js +0 -113
  90. package/lib/esm/BackofficeRightPageLayout-hexJmpam.js.map +0 -1
  91. package/lib/esm/LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map +0 -1
  92. package/lib/esm/buildBreadcrumbs-CqF9Nh6x.js.map +0 -1
  93. package/lib/esm/sidebarUtils-DVkLmFbS.js +0 -52
  94. package/lib/esm/sidebarUtils-DVkLmFbS.js.map +0 -1
@@ -4,7 +4,7 @@ import { n, r, t as i } from "./EntityFilterValue-BWUdPBwp.js";
4
4
  import { i as a, t as o } from "./EntityIdPickerDialog-Yhmr-WsV.js";
5
5
  import { Suspense as s, lazy as c, startTransition as l, useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
6
6
  import { useTranslation as ee } from "react-i18next";
7
- import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeLoadMore as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, Button as g, FilterChipRow as se, GlobalSearchInput as ce, InlineBanner as le, ListPageTemplate as ue, ResponsiveRecordList as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
7
+ import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeInfiniteListStatus as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, Button as g, FilterChipRow as se, GlobalSearchInput as ce, InlineBanner as le, ListPageTemplate as ue, ResponsiveRecordList as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
8
8
  import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
9
9
  import { readWhereValue as x, setWhereValue as S } from "@plumile/backoffice-core/filters/where.js";
10
10
  import { stableListVariablesKey as C } from "@plumile/backoffice-core/state/stableKey.js";
@@ -57,8 +57,39 @@ function T({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariabl
57
57
  ]) };
58
58
  }
59
59
  //#endregion
60
+ //#region src/hooks/useBackofficeInfiniteScrollSentinel.ts
61
+ function pe({ enabled: e, hasNextPage: t, isLoading: n, onIntersect: r, root: i = null, rootMargin: a = "360px 0px", threshold: o = 0 }) {
62
+ let [s, c] = m(null), l = p(r);
63
+ return d(() => {
64
+ l.current = r;
65
+ }, [r]), d(() => {
66
+ if (!e || !t || n || s == null) return () => {};
67
+ if (typeof IntersectionObserver > "u") return l.current(), () => {};
68
+ let r = new IntersectionObserver((e) => {
69
+ e[0]?.isIntersecting === !0 && l.current();
70
+ }, {
71
+ root: i,
72
+ rootMargin: a,
73
+ threshold: o
74
+ });
75
+ return r.observe(s), () => {
76
+ r.disconnect();
77
+ };
78
+ }, [
79
+ e,
80
+ t,
81
+ n,
82
+ s,
83
+ i,
84
+ a,
85
+ o
86
+ ]), { sentinelRef: u((e) => {
87
+ c(e);
88
+ }, []) };
89
+ }
90
+ //#endregion
60
91
  //#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
61
- var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", he = "txvbqb9ip txvbqbai7 txvbqbaog", ge = "txvbqb97 txvbqbamp txvbqbv9z", E = (e, t) => e(t), D = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), _e = (e, t, n) => {
92
+ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", ge = "txvbqb9ip txvbqbai7 txvbqbaog", _e = "txvbqb97 txvbqbamp txvbqbv9z", E = (e, t) => e(t), D = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), ve = (e, t, n) => {
62
93
  if (t == null) return null;
63
94
  if (Array.isArray(t)) {
64
95
  let e = t.map((e) => {
@@ -76,7 +107,7 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
76
107
  id: r
77
108
  }) : e.kind === "enum" ? n.enumLabel(r) : r;
78
109
  }, O = (i) => {
79
- let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns: T, hasNextPage: O, isLoadingMore: k, onLoadMore: A, onRefresh: j, totalCount: M, emptyState: N, header: P, headerActions: ve, isLoadingInitial: F = !1, variant: ye = "page", showFilters: be = !0 } = i, I = l.list, L = l.listDefaults ?? I.defaultState ?? {
110
+ let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns: T, hasNextPage: O, isLoadingMore: k, onLoadMore: A, onRefresh: j, totalCount: M, emptyState: N, header: P, headerActions: ye, isLoadingInitial: F = !1, variant: be = "page", showFilters: xe = !0 } = i, I = l.list, L = l.listDefaults ?? I.defaultState ?? {
80
111
  where: null,
81
112
  sort: null
82
113
  }, R = f(() => w.some((e) => e.isPrimary === !0) || w.length === 0 ? w : w.map((e, t) => {
@@ -92,7 +123,7 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
92
123
  }), [w]), z = f(() => {
93
124
  let e = [];
94
125
  for (let t of I.filters) {
95
- let n = D(t, d.where), r = _e(t, n, {
126
+ let n = D(t, d.where), r = ve(t, n, {
96
127
  enumLabel: (e) => {
97
128
  if (t.kind !== "enum") return e;
98
129
  let n = t.options.find((t) => t.value === e);
@@ -140,7 +171,7 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
140
171
  s
141
172
  ]), B = u(() => {
142
173
  p({ ...L });
143
- }, [L, p]), [xe, V] = m(!1), [H, U] = m(""), [W, G] = m(null), K = u((e) => {
174
+ }, [L, p]), [Se, V] = m(!1), [H, U] = m(""), [W, G] = m(null), K = u((e) => {
144
175
  let t = e.whereKey ?? e.id, r = D(e, d.where), i = "";
145
176
  typeof r == "string" && (i = r);
146
177
  let o = E(e.label, s);
@@ -156,7 +187,7 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
156
187
  });
157
188
  },
158
189
  placeholder: n,
159
- className: me
190
+ className: he
160
191
  });
161
192
  }
162
193
  if (e.kind === "enum") return /* @__PURE__ */ y(_, {
@@ -252,17 +283,25 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
252
283
  d,
253
284
  c,
254
285
  s
255
- ]), q = f(() => I.filters.some((e) => e.placement != null), [I.filters]), J = f(() => I.filters.length === 0 ? [] : q ? I.filters.filter((e) => e.placement === "quick" || e.placement === "both") : I.filters.slice(0, 3), [I.filters, q]), Y = f(() => I.filters.filter((e) => e.placement == null ? !0 : e.placement === "drawer" || e.placement === "both"), [I.filters]), X = f(() => J.find((e) => e.kind === "text"), [J]), Se = f(() => {
286
+ ]), q = f(() => I.filters.some((e) => e.placement != null), [I.filters]), J = f(() => {
287
+ if (I.filters.length === 0) return [];
288
+ let e = I.ui?.toolbar?.maxPromotedFilters ?? 3;
289
+ return q ? I.filters.filter((e) => e.placement === "quick" || e.placement === "both") : I.filters.slice(0, e);
290
+ }, [
291
+ I.filters,
292
+ I.ui?.toolbar,
293
+ q
294
+ ]), Y = f(() => I.filters.filter((e) => e.placement == null ? !0 : e.placement === "drawer" || e.placement === "both"), [I.filters]), X = f(() => J.find((e) => e.kind === "text"), [J]), Ce = f(() => {
256
295
  let e = J.filter((e) => e !== X);
257
296
  return e.length === 0 ? null : /* @__PURE__ */ y("div", {
258
- className: pe,
297
+ className: me,
259
298
  children: e.map((e) => /* @__PURE__ */ y("span", { children: K(e) }, e.id))
260
299
  });
261
300
  }, [
262
301
  J,
263
302
  K,
264
303
  X
265
- ]), Ce = f(() => X == null ? null : K(X), [K, X]), we = f(() => {
304
+ ]), we = f(() => X == null ? null : K(X), [K, X]), Te = f(() => {
266
305
  if (I.sorts.length === 0) return null;
267
306
  let e = I.sorts[0];
268
307
  return e == null ? null : /* @__PURE__ */ y(_, {
@@ -284,10 +323,10 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
284
323
  p,
285
324
  d,
286
325
  s
287
- ]), Te = f(() => /* @__PURE__ */ y(se, {
326
+ ]), Ee = f(() => /* @__PURE__ */ y(se, {
288
327
  chips: z,
289
328
  onClearAll: B
290
- }), [z, B]), Ee = f(() => {
329
+ }), [z, B]), De = f(() => {
291
330
  if (Y.length === 0) return [];
292
331
  let e = H.trim().toLowerCase(), t = [];
293
332
  for (let n of Y) {
@@ -311,7 +350,7 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
311
350
  K,
312
351
  c,
313
352
  s
314
- ]), De = f(() => {
353
+ ]), Oe = f(() => {
315
354
  if (Y.length === 0) return null;
316
355
  let e = z.length, t = c("filters.allFilters");
317
356
  return e > 0 && (t = c("filters.allFiltersWithCount", { count: e })), /* @__PURE__ */ y(g, {
@@ -327,18 +366,18 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
327
366
  z.length,
328
367
  Y.length,
329
368
  c
330
- ]), Oe = /* @__PURE__ */ y(te, {
331
- isOpen: xe,
369
+ ]), ke = /* @__PURE__ */ y(te, {
370
+ isOpen: Se,
332
371
  onClose: () => {
333
372
  V(!1), U("");
334
373
  },
335
- sections: Ee,
374
+ sections: De,
336
375
  searchValue: H,
337
376
  onSearchChange: (e) => {
338
377
  U(e);
339
378
  },
340
379
  onReset: B
341
- }), ke = f(() => N ?? (F ? /* @__PURE__ */ y(ae, {}) : z.length > 0 ? /* @__PURE__ */ y(h, {
380
+ }), Ae = f(() => N ?? (F ? /* @__PURE__ */ y(ae, {}) : z.length > 0 ? /* @__PURE__ */ y(h, {
342
381
  title: c("emptyState.listEmpty.title"),
343
382
  description: c("emptyState.listEmptyFiltered.description"),
344
383
  actions: /* @__PURE__ */ y(g, {
@@ -357,14 +396,19 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
357
396
  B,
358
397
  F,
359
398
  c
360
- ]), Ae = f(() => typeof M == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
399
+ ]), je = f(() => typeof M == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
361
400
  shown: x.length,
362
401
  total: M
363
402
  }) }) : null, [
364
403
  x.length,
365
404
  c,
366
405
  M
367
- ]), Z = P?.title ?? E(I.title, s), je = P?.subtitle, Me = R.find((e) => e.mobileRole === "action" || e.id === "actions"), Ne = /* @__PURE__ */ y(t, {
406
+ ]), { sentinelRef: Me } = pe({
407
+ enabled: !0,
408
+ hasNextPage: O,
409
+ isLoading: k,
410
+ onIntersect: A
411
+ }), Z = P?.title ?? E(I.title, s), Ne = P?.subtitle, Pe = R.find((e) => e.mobileRole === "action" || e.id === "actions"), Fe = /* @__PURE__ */ y(t, {
368
412
  fallback: (e) => {
369
413
  let { reset: t } = e;
370
414
  return /* @__PURE__ */ y(le, {
@@ -386,17 +430,18 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
386
430
  columns: R,
387
431
  rows: x,
388
432
  getRowId: C,
389
- emptyState: ke,
433
+ emptyState: Ae,
390
434
  className: fe,
391
435
  gridTemplateColumns: T,
392
- mode: I.responsive?.mode ?? "auto",
393
- density: I.responsive?.density ?? "compact",
394
- renderAction: (e) => Me?.cell(e) ?? null
436
+ mode: I.ui?.displayMode ?? I.responsive?.mode ?? "auto",
437
+ density: I.ui?.density ?? I.responsive?.density ?? "compact",
438
+ renderAction: (e) => Pe?.cell(e) ?? null
395
439
  })
396
- }), Q = be ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
397
- searchSlot: Ce,
398
- filtersSlot: /* @__PURE__ */ b(v, { children: [Se, De] }),
399
- sortSlot: we,
440
+ }), Q = xe ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
441
+ searchSlot: we,
442
+ promotedFiltersSlot: Ce,
443
+ allFiltersSlot: Oe,
444
+ sortSlot: Te,
400
445
  refreshSlot: /* @__PURE__ */ y(g, {
401
446
  type: "button",
402
447
  variant: "text",
@@ -407,8 +452,8 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
407
452
  },
408
453
  children: c("list.actions.refresh")
409
454
  }),
410
- chipsSlot: Te
411
- }), Oe] }) : null, Pe = /* @__PURE__ */ b("div", { children: [Ne, /* @__PURE__ */ y(o, {
455
+ chipsSlot: Ee
456
+ }), ke] }) : null, $ = /* @__PURE__ */ b("div", { children: [Fe, /* @__PURE__ */ y(o, {
412
457
  isOpen: W != null,
413
458
  entity: W?.entity ?? l.id,
414
459
  title: W?.label ?? c("picker.title"),
@@ -424,29 +469,32 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
424
469
  where: t
425
470
  });
426
471
  }
427
- })] }), $ = /* @__PURE__ */ y(re, {
472
+ })] }), Ie = /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y("div", {
473
+ ref: Me,
474
+ "aria-hidden": "true"
475
+ }), /* @__PURE__ */ y(re, {
476
+ loadedCount: x.length,
477
+ totalCount: M,
428
478
  hasNextPage: O,
429
479
  isLoading: k,
430
- meta: Ae,
431
- loadMoreLabel: c("list.loadMore.more"),
432
- endLabel: c("list.loadMore.end"),
480
+ loadedLabel: je,
433
481
  loadingLabel: c("list.loadMore.loading"),
434
- onLoadMore: A
435
- });
436
- return ye === "embedded" ? /* @__PURE__ */ y(r, {
482
+ endLabel: c("list.loadMore.end")
483
+ })] });
484
+ return be === "embedded" ? /* @__PURE__ */ y(r, {
437
485
  config: l,
438
486
  state: d,
439
487
  pushState: p,
440
488
  children: /* @__PURE__ */ b("div", {
441
- className: he,
489
+ className: ge,
442
490
  children: [
443
491
  /* @__PURE__ */ y("div", {
444
- className: ge,
492
+ className: _e,
445
493
  children: Z
446
494
  }),
447
495
  Q,
448
- Pe,
449
- $
496
+ $,
497
+ Ie
450
498
  ]
451
499
  })
452
500
  }) : /* @__PURE__ */ y(r, {
@@ -456,19 +504,19 @@ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", h
456
504
  children: /* @__PURE__ */ y(ue, {
457
505
  headerNode: /* @__PURE__ */ y(ie, {
458
506
  title: Z,
459
- subtitle: je,
460
- actions: ve
507
+ subtitle: Ne,
508
+ actions: ye
461
509
  }),
462
510
  toolbarNode: Q,
463
- tableNode: Pe,
464
- tableFooterNode: $
511
+ tableNode: $,
512
+ tableFooterNode: Ie
465
513
  })
466
514
  });
467
- }, k = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BgRTJ_JS.js")).BackofficeEntityActionFormDialog })), A = (e) => /* @__PURE__ */ y(s, {
515
+ }, k = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BgMuhyU8.js")).BackofficeEntityActionFormDialog })), A = (e) => /* @__PURE__ */ y(s, {
468
516
  fallback: null,
469
517
  children: /* @__PURE__ */ y(k, { ...e })
470
518
  });
471
519
  //#endregion
472
520
  export { w as i, O as n, T as r, A as t };
473
521
 
474
- //# sourceMappingURL=LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map
522
+ //# sourceMappingURL=LazyBackofficeEntityActionFormDialog-uyYFFJGM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LazyBackofficeEntityActionFormDialog-uyYFFJGM.js","names":[],"sources":["../../src/hooks/useBackofficeLoadMore.ts","../../src/hooks/useBackofficeListRefetch.ts","../../src/hooks/useBackofficeInfiniteScrollSentinel.ts","../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts","../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx","../../src/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { startTransition, useCallback } from 'react';\n\ntype Params = {\n hasNext: boolean;\n isLoadingNext: boolean;\n loadNext: (count: number) => void;\n count: number;\n};\n\n/**\n * Wraps Relay `loadNext()` with consistent guards and `startTransition()`.\n */\nexport function useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count,\n}: Params): () => void {\n return useCallback(() => {\n if (!hasNext || isLoadingNext) {\n return;\n }\n\n startTransition(() => {\n loadNext(count);\n });\n }, [count, hasNext, isLoadingNext, loadNext]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { FetchPolicy } from 'relay-runtime';\n\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type { BackofficeListVariables } from '@plumile/backoffice-core/types.js';\n\ntype RefetchFn<TVariables> = (\n vars: TVariables,\n opts: { fetchPolicy: FetchPolicy },\n) => void;\n\ntype Params<Where, Sort extends string, Variables> = {\n refetch: RefetchFn<Variables>;\n variables: BackofficeListVariables<Where, Sort>;\n defaults: BackofficeListVariables<Where, Sort>;\n fetchPolicy: FetchPolicy;\n buildVariables?: (input: BackofficeListVariables<Where, Sort>) => Variables;\n};\n\n/**\n * Standardizes refetch behavior for backoffice list components:\n * - Refetches when list URL state changes (where/sort/count), gated by a stable key.\n * - Exposes a manual refresh callback using the same variables.\n *\n * This hook must not call Relay hooks (`useFragment`, `usePaginationFragment`, ...).\n */\nexport function useBackofficeListRefetch<\n Where,\n Sort extends string,\n Variables extends Record<string, unknown>,\n>({\n refetch,\n variables,\n defaults,\n fetchPolicy,\n buildVariables,\n}: Params<Where, Sort, Variables>): { onRefresh: () => void } {\n const lastRefetchKeyRef = useRef<string | null>(\n stableListVariablesKey({\n where: defaults.where,\n sort: defaults.sort,\n count: defaults.count,\n }),\n );\n\n const resolveVariables = useCallback(\n (input: BackofficeListVariables<Where, Sort>) => {\n if (buildVariables != null) {\n return buildVariables(input);\n }\n return input as unknown as Variables;\n },\n [buildVariables],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: variables.where,\n sort: variables.sort,\n count: variables.count,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n const onRefresh = useCallback(() => {\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n return { onRefresh };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport type UseBackofficeInfiniteScrollSentinelOptions = {\n enabled: boolean;\n hasNextPage: boolean;\n isLoading: boolean;\n root?: Element | null;\n rootMargin?: string;\n threshold?: number;\n onIntersect: () => void;\n};\n\nexport type UseBackofficeInfiniteScrollSentinelResult = {\n sentinelRef: (node: HTMLElement | null) => void;\n};\n\n/**\n * Observes a sentinel element and triggers pagination when it enters the viewport.\n */\nexport function useBackofficeInfiniteScrollSentinel({\n enabled,\n hasNextPage,\n isLoading,\n onIntersect,\n root = null,\n rootMargin = '360px 0px',\n threshold = 0,\n}: UseBackofficeInfiniteScrollSentinelOptions): UseBackofficeInfiniteScrollSentinelResult {\n const [node, setNode] = useState<HTMLElement | null>(null);\n const onIntersectRef = useRef(onIntersect);\n\n useEffect(() => {\n onIntersectRef.current = onIntersect;\n }, [onIntersect]);\n\n useEffect(() => {\n if (!enabled || !hasNextPage || isLoading || node == null) {\n return () => {};\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n onIntersectRef.current();\n return () => {};\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting === true) {\n onIntersectRef.current();\n }\n },\n {\n root,\n rootMargin,\n threshold,\n },\n );\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, [enabled, hasNextPage, isLoading, node, root, rootMargin, threshold]);\n\n const sentinelRef = useCallback((next: HTMLElement | null) => {\n setNode(next);\n }, []);\n\n return { sentinelRef };\n}\n","import { sprinkles } from '@plumile/ui';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: 72,\n maxWidth: 'full',\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n","/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n BackofficeEmptyState,\n BackofficeFilterDrawer,\n BackofficeFilterField,\n BackofficeInfiniteListStatus,\n BackofficePageHeader,\n BackofficeTableSkeleton,\n BackofficeTableToolbar,\n Button,\n FilterChipRow,\n GlobalSearchInput,\n InlineBanner,\n ListPageTemplate,\n ResponsiveRecordList,\n SimpleSelect,\n type FilterChip,\n type DataTableColumn,\n type GetRowId,\n denseTableClass,\n} from '@plumile/ui';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = raw\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n if (\n typeof entry !== 'string' &&\n typeof entry !== 'number' &&\n typeof entry !== 'boolean'\n ) {\n return null;\n }\n const value = String(entry).trim();\n if (value === '') {\n return null;\n }\n return value;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n\n if (normalized.length === 0) {\n return null;\n }\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\ntype Props<\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n> = {\n config: BackofficeResolvedListFacetConfig<Where, Sort>;\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n emptyState?: JSX.Element;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n props: Props<RowView, Where, Sort>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n onLoadMore,\n onRefresh,\n totalCount,\n emptyState,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);\n const [filterSearch, setFilterSearch] = useState('');\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof Where;\n label: string;\n path?: readonly string[];\n scope?: BackofficePickerScope;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<Where>): JSX.Element => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <GlobalSearchInput\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (displayValue: string | null = null) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label) => {\n return renderField(label);\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next as Sort,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, tApp]);\n\n const chipsNode = useMemo(() => {\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.allFilters');\n if (activeCount > 0) {\n label = t('filters.allFiltersWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, t]);\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n setIsFilterDrawerOpen(false);\n setFilterSearch('');\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return <BackofficeTableSkeleton />;\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo(() => {\n if (typeof totalCount !== 'number') {\n return null;\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [rows.length, t, totalCount]);\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: true,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\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={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeTableToolbar\n searchSlot={searchNode}\n promotedFiltersSlot={quickFiltersNode}\n allFiltersSlot={allFiltersNode}\n sortSlot={sortNode}\n refreshSlot={\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n disabled={onRefresh == null}\n onClick={() => {\n if (onRefresh != null) {\n onRefresh();\n }\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n }\n chipsSlot={chipsNode}\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div>\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const tableFooterNode = (\n <>\n <div ref={sentinelRef} aria-hidden=\"true\" />\n <BackofficeInfiniteListStatus\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n loadedLabel={tableFooterMeta}\n loadingLabel={t('list.loadMore.loading')}\n endLabel={t('list.loadMore.end')}\n />\n </>\n );\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport type { BackofficeEntityActionFormDialogProps } from './BackofficeEntityActionFormDialog.js';\n\nconst BackofficeEntityActionFormDialog = lazy(async () => {\n const module = await import('./BackofficeEntityActionFormDialog.js');\n return { default: module.BackofficeEntityActionFormDialog };\n});\n\nexport const LazyBackofficeEntityActionFormDialog = <Node,>(\n props: BackofficeEntityActionFormDialogProps<Node>,\n): JSX.Element => {\n const Dialog = BackofficeEntityActionFormDialog as <TNode>(\n dialogProps: BackofficeEntityActionFormDialogProps<TNode>,\n ) => JSX.Element;\n\n return (\n <Suspense fallback={null}>\n <Dialog {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeEntityActionFormDialog;\n"],"mappings":"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"}