@plumile/backoffice-react 0.1.166 → 0.1.168

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 (65) 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/components/backoffice/detail/BackofficeDetailRelationListBlock.js +50 -49
  4. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
  6. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +0 -1
  7. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +7 -7
  8. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  9. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +49 -48
  10. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  11. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +27 -0
  12. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -0
  13. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js +12 -8
  14. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
  15. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  16. package/lib/esm/i18n/locales/en/backofficeReact.js +6 -2
  17. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  18. package/lib/esm/i18n/locales/fr/backofficeReact.js +6 -2
  19. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  20. package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
  21. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +107 -81
  22. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  23. package/lib/esm/pages/BackofficeEntityDetailPage.js +206 -203
  24. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  25. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +1 -1
  26. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  27. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -1
  28. package/lib/esm/pages/BackofficeEntityListPage.js +91 -90
  29. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  30. package/lib/esm/provider/entityRegistry.js.map +1 -1
  31. package/lib/esm/relay/createInlineDataReader.js +2 -2
  32. package/lib/esm/relay/createInlineReader.js +3 -3
  33. package/lib/esm/relay/createInlineReader.js.map +1 -1
  34. package/lib/esm/relay/environment.js +37 -12
  35. package/lib/esm/relay/environment.js.map +1 -1
  36. package/lib/esm/relay/typedRelayHooks.js +7 -0
  37. package/lib/esm/relay/typedRelayHooks.js.map +1 -0
  38. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  39. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  40. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +1 -1
  41. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  42. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.d.ts +9 -0
  43. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.d.ts.map +1 -0
  44. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts +6 -1
  45. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts.map +1 -1
  46. package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
  47. package/lib/types/i18n/resources.d.ts +4 -0
  48. package/lib/types/i18n/resources.d.ts.map +1 -1
  49. package/lib/types/pages/BackofficeDashboardWidgetContent.d.ts.map +1 -1
  50. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  51. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  52. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +9 -5
  53. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  54. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  55. package/lib/types/provider/entityRegistry.d.ts.map +1 -1
  56. package/lib/types/relay/createInlineDataReader.d.ts +1 -1
  57. package/lib/types/relay/createInlineDataReader.d.ts.map +1 -1
  58. package/lib/types/relay/createInlineReader.d.ts +0 -1
  59. package/lib/types/relay/createInlineReader.d.ts.map +1 -1
  60. package/lib/types/relay/environment.d.ts +19 -0
  61. package/lib/types/relay/environment.d.ts.map +1 -1
  62. package/lib/types/relay/typedRelayHooks.d.ts +11 -0
  63. package/lib/types/relay/typedRelayHooks.d.ts.map +1 -0
  64. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  65. package/package.json +6 -6
@@ -1,22 +1,23 @@
1
1
  import { useBackofficeReactTranslation as e } from "../i18n/useBackofficeReactTranslation.js";
2
- import { LazyBackofficeEntityActionFormDialog as t } from "../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js";
3
- import { buildDataTableColumns as n } from "../components/backoffice/columns/buildDataTableColumns.js";
4
- import { useBackofficeLoadMore as r } from "../hooks/useBackofficeLoadMore.js";
5
- import { useBackofficeListRefetch as i } from "../hooks/useBackofficeListRefetch.js";
6
- import { BackofficeEntityListScaffold as a } from "../components/backoffice/scaffolds/BackofficeEntityListScaffold.js";
7
- import { BackofficeLazyEntityCountLabel as o } from "../components/backoffice/refs/BackofficeLazyEntityCount.js";
8
- import { BackofficeRightPageLayout as s } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
9
- import { buildEntityListBreadcrumb as c } from "../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js";
10
- import { rowFlagsColumnCell as l } from "../components/backoffice/list/RowFlagsCell.css.js";
11
- import { RowFlagsCell as u } from "../components/backoffice/list/RowFlagsCell.js";
12
- import { useBackofficeListUrlState as d } from "../hooks/useBackofficeListUrlState.js";
13
- import { buildActionsColumn as f, computeActionsColumnWidthPx as p, computeRowFlagsColumnWidthPx as m, isFormMutationAction as h, isRouteAction as g, resolveActionVariant as _, resolveLabel as v, resolveTrackBySize as y } from "./BackofficeEntityListPage.helpers.js";
14
- import { actionTrigger as ee, actionsColumnCell as te, headerActions as b } from "./backofficeEntityListPage.css.js";
2
+ import { useBackofficePaginationFragment as t } from "../relay/typedRelayHooks.js";
3
+ import { LazyBackofficeEntityActionFormDialog as n } from "../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js";
4
+ import { buildDataTableColumns as r } from "../components/backoffice/columns/buildDataTableColumns.js";
5
+ import { useBackofficeLoadMore as i } from "../hooks/useBackofficeLoadMore.js";
6
+ import { useBackofficeListRefetch as a } from "../hooks/useBackofficeListRefetch.js";
7
+ import { BackofficeEntityListScaffold as o } from "../components/backoffice/scaffolds/BackofficeEntityListScaffold.js";
8
+ import { BackofficeLazyEntityCountLabel as s } from "../components/backoffice/refs/BackofficeLazyEntityCount.js";
9
+ import { BackofficeRightPageLayout as c } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
10
+ import { buildEntityListBreadcrumb as l } from "../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js";
11
+ import { rowFlagsColumnCell as u } from "../components/backoffice/list/RowFlagsCell.css.js";
12
+ import { RowFlagsCell as d } from "../components/backoffice/list/RowFlagsCell.js";
13
+ import { useBackofficeListUrlState as f } from "../hooks/useBackofficeListUrlState.js";
14
+ import { buildActionsColumn as p, computeActionsColumnWidthPx as m, computeRowFlagsColumnWidthPx as h, isFormMutationAction as g, isRouteAction as ee, resolveActionVariant as te, resolveLabel as _, resolveTrackBySize as v } from "./BackofficeEntityListPage.helpers.js";
15
+ import { actionTrigger as y, actionsColumnCell as b, headerActions as ne } from "./backofficeEntityListPage.css.js";
15
16
  import { useCallback as x, useMemo as S, useState as C } from "react";
16
- import { jsx as w, jsxs as ne } from "react/jsx-runtime";
17
+ import { jsx as w, jsxs as re } from "react/jsx-runtime";
17
18
  import { useTranslation as T } from "react-i18next";
18
- import { Button as re } from "@plumile/ui/atomic/atoms/button/Button.js";
19
- import { usePaginationFragment as E, usePreloadedQuery as D } from "react-relay";
19
+ import { Button as E } from "@plumile/ui/atomic/atoms/button/Button.js";
20
+ import { usePreloadedQuery as D } from "react-relay";
20
21
  import { BACKOFFICE_LIST_DEFAULTS as O, BACKOFFICE_LIST_REFETCH_POLICY as ie } from "@plumile/backoffice-core/constants.js";
21
22
  import ae from "@plumile/router/routing/Link.js";
22
23
  import { LinkButton as oe } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
@@ -29,9 +30,9 @@ var le = (e, t, n, r) => {
29
30
  let n = [{
30
31
  id: "__rowFlags",
31
32
  header: "",
32
- className: l,
33
+ className: u,
33
34
  mobileRole: "badge",
34
- cell: (e) => /* @__PURE__ */ w(u, {
35
+ cell: (e) => /* @__PURE__ */ w(d, {
35
36
  row: e,
36
37
  flags: t,
37
38
  tApp: r
@@ -44,26 +45,26 @@ var le = (e, t, n, r) => {
44
45
  }
45
46
  let o = 0;
46
47
  i && (o = t.length);
47
- let s = m(o), c = p(n), d = 0;
48
- i && (d = 1);
49
- let f = a.length - d - 1, h = a.slice(d, d + Math.max(0, f)).map((e) => y(e, "1fr")).join(" "), g = "";
50
- return g = i ? `${s}px ${h} ${c}px` : `${h} ${c}px`, {
48
+ let s = h(o), c = m(n), l = 0;
49
+ i && (l = 1);
50
+ let f = a.length - l - 1, p = a.slice(l, l + Math.max(0, f)).map((e) => v(e, "1fr")).join(" "), g = "";
51
+ return g = i ? `${s}px ${p} ${c}px` : `${p} ${c}px`, {
51
52
  columns: a,
52
53
  gridTemplateColumns: g
53
54
  };
54
- }, k = ({ config: c, prepared: l, breadcrumb: u }) => {
55
- let p = c.list, { t: m } = T(), { t: y } = e(), [k, A] = C(null), [j, M] = C(0), N = D(p.query, l.query), { data: P, loadNext: F, hasNext: I, isLoadingNext: L, refetch: R } = E(p.fragment, N), z = p.getConnection(P), B = S(() => z.edges.map((e) => p.toRow(e.node)), [z.edges, p]), { columns: V, gridTemplateColumns: H } = S(() => {
56
- let e = n(p.columns, {
57
- tApp: m,
58
- t: y
59
- }), t = f({
60
- ariaLabel: y("actions.view"),
61
- fallback: y("common.notAvailable"),
62
- className: te,
63
- resolveDetailHref: (e) => c.routes.detail(e),
55
+ }, k = ({ config: l, prepared: u, breadcrumb: d }) => {
56
+ let m = l.list, { t: h } = T(), { t: v } = e(), [k, A] = C(null), [ue, j] = C(0), M = D(m.query, u.query), { data: N, loadNext: P, hasNext: F, isLoadingNext: I, refetch: L } = t(m.fragment, M), R = m.getConnection(N), z = S(() => R.edges.map((e) => m.toRow(e.node)), [R.edges, m]), { columns: B, gridTemplateColumns: V } = S(() => {
57
+ let e = r(m.columns, {
58
+ tApp: h,
59
+ t: v
60
+ }), t = p({
61
+ ariaLabel: v("actions.view"),
62
+ fallback: v("common.notAvailable"),
63
+ className: b,
64
+ resolveDetailHref: (e) => l.routes.detail(e),
64
65
  renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ w(se.Actions, { children: /* @__PURE__ */ w(ae, {
65
66
  to: e,
66
- className: ee,
67
+ className: y,
67
68
  "aria-label": t,
68
69
  title: t,
69
70
  preloadOnMouseEnter: !0,
@@ -73,51 +74,51 @@ var le = (e, t, n, r) => {
73
74
  })
74
75
  }) })
75
76
  });
76
- return le([...e, t], p.rowFlags, 1, m);
77
+ return le([...e, t], m.rowFlags, 1, h);
77
78
  }, [
78
- c.routes,
79
- p.columns,
80
- p.rowFlags,
81
- y,
82
- m
83
- ]), U = x((e) => p.getRowId(e), [p]), { state: W, pushState: ue } = d(c), G = c.listDefaults ?? p.defaultState ?? {
79
+ l.routes,
80
+ m.columns,
81
+ m.rowFlags,
82
+ v,
83
+ h
84
+ ]), H = x((e) => m.getRowId(e), [m]), { state: U, pushState: de } = f(l), W = l.listDefaults ?? m.defaultState ?? {
84
85
  where: null,
85
86
  sort: null
86
- }, K = W.sort ?? G.sort, { pageSize: q } = O, { isRefreshing: de, onRefresh: J } = i({
87
- refetch: R,
87
+ }, G = U.sort ?? W.sort, { pageSize: K } = O, { isRefreshing: fe, onRefresh: q } = a({
88
+ refetch: L,
88
89
  variables: S(() => ({
89
- where: W.where,
90
- sort: K,
91
- count: q,
90
+ where: U.where,
91
+ sort: G,
92
+ count: K,
92
93
  cursor: null
93
94
  }), [
94
- q,
95
95
  K,
96
- W.where
96
+ G,
97
+ U.where
97
98
  ]),
98
99
  defaults: {
99
- where: G.where,
100
- sort: G.sort,
101
- count: q,
100
+ where: W.where,
101
+ sort: W.sort,
102
+ count: K,
102
103
  cursor: null
103
104
  },
104
105
  fetchPolicy: ie,
105
- buildQueryVariables: p.buildQueryVariables
106
- }), Y = x(() => {
107
- M((e) => e + 1), J();
108
- }, [J]), fe = r({
109
- hasNext: I,
110
- isLoadingNext: L,
111
- loadNext: F,
112
- count: q
113
- }), X = S(() => c.listActions ?? [], [c.listActions]), Z = S(() => X.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [X]), pe = S(() => {
106
+ buildQueryVariables: m.buildQueryVariables
107
+ }), J = x(() => {
108
+ j((e) => e + 1), q();
109
+ }, [q]), Y = i({
110
+ hasNext: F,
111
+ isLoadingNext: I,
112
+ loadNext: P,
113
+ count: K
114
+ }), X = S(() => l.listActions ?? [], [l.listActions]), Z = S(() => X.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [X]), pe = S(() => {
114
115
  if (Z.length !== 0) return /* @__PURE__ */ w("div", {
115
- className: b,
116
+ className: ne,
116
117
  children: Z.map((e, t) => {
117
- let { variant: n } = e, r = v(e.label, m), i = r;
118
- e.ariaLabel != null && (i = v(e.ariaLabel, m));
119
- let a = _(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
120
- return g(e) ? /* @__PURE__ */ w(oe, {
118
+ let { variant: n } = e, r = _(e.label, h), i = r;
119
+ e.ariaLabel != null && (i = _(e.ariaLabel, h));
120
+ let a = te(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
121
+ return ee(e) ? /* @__PURE__ */ w(oe, {
121
122
  to: e.to(null),
122
123
  variant: a,
123
124
  size: o,
@@ -125,7 +126,7 @@ var le = (e, t, n, r) => {
125
126
  "aria-label": i,
126
127
  preloadOnMouseEnter: !0,
127
128
  children: r
128
- }, e.id) : h(e) ? /* @__PURE__ */ w(re, {
129
+ }, e.id) : g(e) ? /* @__PURE__ */ w(E, {
129
130
  type: "button",
130
131
  variant: a,
131
132
  size: o,
@@ -138,42 +139,42 @@ var le = (e, t, n, r) => {
138
139
  }, e.id) : null;
139
140
  })
140
141
  });
141
- }, [m, Z]), Q = X.find((e) => e.id === k), $ = null;
142
- return B.length > 0 && ($ = /* @__PURE__ */ w("span", { children: y("list.loaded", { count: B.length }) })), /* @__PURE__ */ ne(s, {
143
- breadcrumb: u,
144
- children: [/* @__PURE__ */ w(a, {
145
- config: c,
146
- state: W,
147
- pushState: ue,
142
+ }, [h, Z]), Q = X.find((e) => e.id === k), $ = null;
143
+ return z.length > 0 && ($ = /* @__PURE__ */ w("span", { children: v("list.loaded", { count: z.length }) })), /* @__PURE__ */ re(c, {
144
+ breadcrumb: d,
145
+ children: [/* @__PURE__ */ w(o, {
146
+ config: l,
147
+ state: U,
148
+ pushState: de,
148
149
  headerActions: pe,
149
- rows: B,
150
- columns: V,
151
- gridTemplateColumns: H,
152
- getRowId: U,
153
- hasNextPage: I,
154
- isLoadingMore: L,
155
- isRefreshing: de,
156
- onLoadMore: fe,
157
- onRefresh: Y,
150
+ rows: z,
151
+ columns: B,
152
+ gridTemplateColumns: V,
153
+ getRowId: H,
154
+ hasNextPage: F,
155
+ isLoadingMore: I,
156
+ isRefreshing: fe,
157
+ onLoadMore: Y,
158
+ onRefresh: J,
158
159
  totalCount: null,
159
- loadedCountLabel: /* @__PURE__ */ w(o, {
160
- count: p.count,
161
- where: W.where,
162
- fetchKey: j,
160
+ loadedCountLabel: /* @__PURE__ */ w(s, {
161
+ count: m.count,
162
+ where: U.where,
163
+ fetchKey: ue,
163
164
  fallback: $,
164
- children: (e) => /* @__PURE__ */ w("span", { children: y("list.showing", {
165
- shown: B.length,
165
+ children: (e) => /* @__PURE__ */ w("span", { children: v("list.showing", {
166
+ shown: z.length,
166
167
  total: e
167
168
  }) })
168
169
  })
169
- }), Q != null && h(Q) && /* @__PURE__ */ w(t, {
170
+ }), Q != null && g(Q) && /* @__PURE__ */ w(n, {
170
171
  isOpen: !0,
171
172
  action: Q,
172
173
  node: null,
173
174
  onClose: () => {
174
175
  A(null);
175
176
  },
176
- onSuccess: Y
177
+ onSuccess: J
177
178
  })]
178
179
  });
179
180
  }, A = ({ entityManifest: e, config: t, prepared: n }) => {
@@ -182,7 +183,7 @@ var le = (e, t, n, r) => {
182
183
  entityManifest: e,
183
184
  config: t,
184
185
  prepared: n,
185
- breadcrumb: c(t, r)
186
+ breadcrumb: l(t, r)
186
187
  });
187
188
  };
188
189
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { type JSX, useCallback, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { 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 { BackofficeLazyEntityCountLabel } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityConnectionListPage = ({\n config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const [countFetchKey, setCountFetchKey] = useState(0);\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = 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 handleRefresh = useCallback(() => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n onRefresh();\n }, [onRefresh]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnMouseEnter\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n let loadedCountFallback: JSX.Element | null = null;\n if (rows.length > 0) {\n loadedCountFallback = (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n const loadedCountLabel = (\n <BackofficeLazyEntityCountLabel\n count={listConfig.count}\n where={state.where}\n fetchKey={countFetchKey}\n fallback={loadedCountFallback}\n >\n {(totalCount) => {\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }}\n </BackofficeLazyEntityCountLabel>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n loadedCountLabel={loadedCountLabel}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityListPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { type JSX, useCallback, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { usePreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { TableCell } from '@plumile/ui/components/data-table/TableCell.js';\nimport { EyeSvg } from '@plumile/ui/icons/EyeSvg.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeLazyEntityCountLabel } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePaginationFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityConnectionListPage = ({\n config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const [countFetchKey, setCountFetchKey] = useState(0);\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = useBackofficePaginationFragment<OperationType, unknown, unknown>(\n listConfig.fragment,\n queryData,\n );\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <Link\n to={href}\n className={pageStyles.actionTrigger}\n aria-label={ariaLabel}\n title={ariaLabel}\n preloadOnMouseEnter\n >\n <EyeSvg width={16} height={16} />\n </Link>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [config.routes, listConfig.columns, listConfig.rowFlags, t, tApp]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleRefresh = useCallback(() => {\n setCountFetchKey((current) => {\n return current + 1;\n });\n onRefresh();\n }, [onRefresh]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n preloadOnMouseEnter\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n let loadedCountFallback: JSX.Element | null = null;\n if (rows.length > 0) {\n loadedCountFallback = (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n const loadedCountLabel = (\n <BackofficeLazyEntityCountLabel\n count={listConfig.count}\n where={state.where}\n fetchKey={countFetchKey}\n fallback={loadedCountFallback}\n >\n {(totalCount) => {\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }}\n </BackofficeLazyEntityCountLabel>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n loadedCountLabel={loadedCountLabel}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"entityRegistry.js","names":[],"sources":["../../../src/provider/entityRegistry.ts"],"sourcesContent":["import {\n resolveBackofficeLoadedFacetModule,\n type ResolveBackofficeEntityOptions,\n} from '@plumile/backoffice-core/resolve.js';\nimport type {\n BackofficeEntityFacetModuleCacheEntry,\n BackofficeEntityLoadMode,\n BackofficeEntityManifestMap,\n BackofficeListDetailFacetLoaderMap,\n BackofficeToolFacetLoaderMap,\n BackofficeResolvedDetailLayoutFacetModule,\n BackofficeResolvedDetailPageFacetModule,\n BackofficeResolvedListFacetModule,\n BackofficeResolvedPickerFacetModule,\n BackofficeResolvedToolFacetModule,\n} from '@plumile/backoffice-core/types.js';\n\nexport type BackofficeEntityRegistry = {\n getManifest: (entityId: string) => BackofficeEntityManifestMap[string] | null;\n getLoadedListEntity: (\n entityId: string,\n ) => BackofficeResolvedListFacetModule | null;\n getLoadedPickerEntity: (\n entityId: string,\n ) => BackofficeResolvedPickerFacetModule | null;\n getLoadedDetailLayoutEntity: (\n entityId: string,\n ) => BackofficeResolvedDetailLayoutFacetModule | null;\n getLoadedDetailPageEntity: (\n entityId: string,\n pageId: string,\n ) => BackofficeResolvedDetailPageFacetModule | null;\n getLoadedToolEntity: (\n entityId: string,\n ) => BackofficeResolvedToolFacetModule | null;\n loadListEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedListFacetModule>;\n loadPickerEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedPickerFacetModule>;\n loadDetailLayoutEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedDetailLayoutFacetModule>;\n loadDetailPageEntity: (\n entityId: string,\n pageId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedDetailPageFacetModule>;\n loadToolEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedToolFacetModule>;\n};\n\nconst DEFAULT_LOAD_MODE: BackofficeEntityLoadMode = 'cache-first';\nconst DETAIL_PAGE_FACET_KIND = 'detail-page';\nconst DETAIL_LAYOUT_FACET_KIND = 'detail-layout';\nconst LIST_FACET_KIND = 'list';\nconst PICKER_FACET_KIND = 'picker';\nconst TOOL_FACET_KIND = 'tool';\n\nconst hasListFacets = (\n manifestItem: BackofficeEntityManifestMap[string],\n): manifestItem is BackofficeEntityManifestMap[string] & {\n facets: BackofficeListDetailFacetLoaderMap;\n} => {\n return manifestItem.kind === 'list-detail';\n};\n\nconst hasToolFacet = (\n manifestItem: BackofficeEntityManifestMap[string],\n): manifestItem is BackofficeEntityManifestMap[string] & {\n facets: BackofficeToolFacetLoaderMap;\n} => {\n return manifestItem.kind === 'tool';\n};\n\nconst buildFacetCacheKey = (\n entityId: string,\n kind: 'list' | 'picker' | 'detail-layout' | 'detail-page' | 'tool',\n pageId?: string,\n): string => {\n if (kind === DETAIL_PAGE_FACET_KIND) {\n return `${entityId}:${kind}:${pageId ?? ''}`;\n }\n return `${entityId}:${kind}`;\n};\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n};\n\nconst getLoadedModule = <TModule>(\n entry: BackofficeEntityFacetModuleCacheEntry | undefined,\n): TModule | null => {\n if (entry?.status !== 'loaded' || entry.module == null) {\n return null;\n }\n return entry.module as TModule;\n};\n\nconst resolveManifest = (\n manifest: BackofficeEntityManifestMap,\n entityId: string,\n): BackofficeEntityManifestMap[string] => {\n const manifestItem = manifest[entityId];\n if (manifestItem == null) {\n throw new Error(`Unknown backoffice entity: ${entityId}`);\n }\n return manifestItem;\n};\n\nexport const createBackofficeEntityRegistry = (\n manifest: BackofficeEntityManifestMap,\n options: ResolveBackofficeEntityOptions,\n): BackofficeEntityRegistry => {\n const cache = new Map<string, BackofficeEntityFacetModuleCacheEntry>();\n\n const getManifest: BackofficeEntityRegistry['getManifest'] = (entityId) => {\n return manifest[entityId] ?? null;\n };\n\n const loadFacet = async <TModule>(\n cacheKey: string,\n loadOptions: { mode?: BackofficeEntityLoadMode } | undefined,\n loader: () => Promise<TModule>,\n ): Promise<TModule> => {\n const resolvedMode = loadOptions?.mode ?? DEFAULT_LOAD_MODE;\n\n if (resolvedMode === 'cache-first') {\n const loadedModule = getLoadedModule<TModule>(cache.get(cacheKey));\n if (loadedModule != null) {\n return loadedModule;\n }\n\n const existing = cache.get(cacheKey);\n if (existing?.status === 'loading' && existing.promise != null) {\n return existing.promise as Promise<TModule>;\n }\n }\n\n const promise = loader()\n .then((module) => {\n cache.set(cacheKey, {\n status: 'loaded',\n module: module as never,\n });\n return module;\n })\n .catch((error: unknown) => {\n const resolvedError = toError(error);\n cache.set(cacheKey, {\n status: 'error',\n error: resolvedError,\n });\n throw resolvedError;\n });\n\n cache.set(cacheKey, {\n status: 'loading',\n promise: promise as never,\n });\n\n return promise;\n };\n\n const getLoadedListEntity: BackofficeEntityRegistry['getLoadedListEntity'] = (\n entityId,\n ) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, LIST_FACET_KIND)),\n );\n };\n\n const getLoadedPickerEntity: BackofficeEntityRegistry['getLoadedPickerEntity'] =\n (entityId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, PICKER_FACET_KIND)),\n );\n };\n\n const getLoadedDetailLayoutEntity: BackofficeEntityRegistry['getLoadedDetailLayoutEntity'] =\n (entityId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, DETAIL_LAYOUT_FACET_KIND)),\n );\n };\n\n const getLoadedDetailPageEntity: BackofficeEntityRegistry['getLoadedDetailPageEntity'] =\n (entityId, pageId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, DETAIL_PAGE_FACET_KIND, pageId)),\n );\n };\n\n const getLoadedToolEntity: BackofficeEntityRegistry['getLoadedToolEntity'] = (\n entityId,\n ) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, TOOL_FACET_KIND)),\n );\n };\n\n const loadListEntity: BackofficeEntityRegistry['loadListEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a list facet.`,\n );\n }\n const facetLoader = manifestItem.facets.list;\n if (facetLoader == null) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a list facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, LIST_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await facetLoader();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== LIST_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a list facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadPickerEntity: BackofficeEntityRegistry['loadPickerEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a picker facet.`,\n );\n }\n const facetLoader = manifestItem.facets.picker;\n if (facetLoader == null) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a picker facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, PICKER_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await facetLoader();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== PICKER_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a picker facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadDetailLayoutEntity: BackofficeEntityRegistry['loadDetailLayoutEntity'] =\n async (entityId, loadOptions) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a detail-layout facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, DETAIL_LAYOUT_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.detailLayout();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== DETAIL_LAYOUT_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a detail-layout facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadDetailPageEntity: BackofficeEntityRegistry['loadDetailPageEntity'] =\n async (entityId, pageId, loadOptions) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a detail-page facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, DETAIL_PAGE_FACET_KIND, pageId),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.detailPage(pageId);\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== DETAIL_PAGE_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a detail-page facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadToolEntity: BackofficeEntityRegistry['loadToolEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasToolFacet(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a tool facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, TOOL_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.tool();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== TOOL_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a tool facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n return {\n getManifest,\n getLoadedListEntity,\n getLoadedPickerEntity,\n getLoadedDetailLayoutEntity,\n getLoadedDetailPageEntity,\n getLoadedToolEntity,\n loadListEntity,\n loadPickerEntity,\n loadDetailLayoutEntity,\n loadDetailPageEntity,\n loadToolEntity,\n };\n};\n\nexport const __test = {\n buildFacetCacheKey,\n resolveManifest,\n toError,\n};\n\nexport default createBackofficeEntityRegistry;\n"],"mappings":"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"}
1
+ {"version":3,"file":"entityRegistry.js","names":[],"sources":["../../../src/provider/entityRegistry.ts"],"sourcesContent":["import {\n resolveBackofficeLoadedFacetModule,\n type ResolveBackofficeEntityOptions,\n} from '@plumile/backoffice-core/resolve.js';\nimport type {\n BackofficeEntityFacetModuleCacheEntry,\n BackofficeEntityLoadMode,\n BackofficeEntityManifestMap,\n BackofficeResolvedEntityFacetModule,\n BackofficeListDetailFacetLoaderMap,\n BackofficeToolFacetLoaderMap,\n BackofficeResolvedDetailLayoutFacetModule,\n BackofficeResolvedDetailPageFacetModule,\n BackofficeResolvedListFacetModule,\n BackofficeResolvedPickerFacetModule,\n BackofficeResolvedToolFacetModule,\n} from '@plumile/backoffice-core/types.js';\n\nexport type BackofficeEntityRegistry = {\n getManifest: (entityId: string) => BackofficeEntityManifestMap[string] | null;\n getLoadedListEntity: (\n entityId: string,\n ) => BackofficeResolvedListFacetModule | null;\n getLoadedPickerEntity: (\n entityId: string,\n ) => BackofficeResolvedPickerFacetModule | null;\n getLoadedDetailLayoutEntity: (\n entityId: string,\n ) => BackofficeResolvedDetailLayoutFacetModule | null;\n getLoadedDetailPageEntity: (\n entityId: string,\n pageId: string,\n ) => BackofficeResolvedDetailPageFacetModule | null;\n getLoadedToolEntity: (\n entityId: string,\n ) => BackofficeResolvedToolFacetModule | null;\n loadListEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedListFacetModule>;\n loadPickerEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedPickerFacetModule>;\n loadDetailLayoutEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedDetailLayoutFacetModule>;\n loadDetailPageEntity: (\n entityId: string,\n pageId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedDetailPageFacetModule>;\n loadToolEntity: (\n entityId: string,\n options?: { mode?: BackofficeEntityLoadMode },\n ) => Promise<BackofficeResolvedToolFacetModule>;\n};\n\nconst DEFAULT_LOAD_MODE: BackofficeEntityLoadMode = 'cache-first';\nconst DETAIL_PAGE_FACET_KIND = 'detail-page';\nconst DETAIL_LAYOUT_FACET_KIND = 'detail-layout';\nconst LIST_FACET_KIND = 'list';\nconst PICKER_FACET_KIND = 'picker';\nconst TOOL_FACET_KIND = 'tool';\n\nconst hasListFacets = (\n manifestItem: BackofficeEntityManifestMap[string],\n): manifestItem is BackofficeEntityManifestMap[string] & {\n facets: BackofficeListDetailFacetLoaderMap;\n} => {\n return manifestItem.kind === 'list-detail';\n};\n\nconst hasToolFacet = (\n manifestItem: BackofficeEntityManifestMap[string],\n): manifestItem is BackofficeEntityManifestMap[string] & {\n facets: BackofficeToolFacetLoaderMap;\n} => {\n return manifestItem.kind === 'tool';\n};\n\nconst buildFacetCacheKey = (\n entityId: string,\n kind: 'list' | 'picker' | 'detail-layout' | 'detail-page' | 'tool',\n pageId?: string,\n): string => {\n if (kind === DETAIL_PAGE_FACET_KIND) {\n return `${entityId}:${kind}:${pageId ?? ''}`;\n }\n return `${entityId}:${kind}`;\n};\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n};\n\nconst getLoadedModule = <TModule>(\n entry: BackofficeEntityFacetModuleCacheEntry | undefined,\n): TModule | null => {\n if (entry?.status !== 'loaded' || entry.module == null) {\n return null;\n }\n return entry.module as TModule;\n};\n\nconst resolveManifest = (\n manifest: BackofficeEntityManifestMap,\n entityId: string,\n): BackofficeEntityManifestMap[string] => {\n const manifestItem = manifest[entityId];\n if (manifestItem == null) {\n throw new Error(`Unknown backoffice entity: ${entityId}`);\n }\n return manifestItem;\n};\n\nexport const createBackofficeEntityRegistry = (\n manifest: BackofficeEntityManifestMap,\n options: ResolveBackofficeEntityOptions,\n): BackofficeEntityRegistry => {\n const cache = new Map<string, BackofficeEntityFacetModuleCacheEntry>();\n\n const getManifest: BackofficeEntityRegistry['getManifest'] = (entityId) => {\n return manifest[entityId] ?? null;\n };\n\n const loadFacet = async <TModule>(\n cacheKey: string,\n loadOptions: { mode?: BackofficeEntityLoadMode } | undefined,\n loader: () => Promise<TModule>,\n ): Promise<TModule> => {\n const resolvedMode = loadOptions?.mode ?? DEFAULT_LOAD_MODE;\n\n if (resolvedMode === 'cache-first') {\n const loadedModule = getLoadedModule<TModule>(cache.get(cacheKey));\n if (loadedModule != null) {\n return loadedModule;\n }\n\n const existing = cache.get(cacheKey);\n if (existing?.status === 'loading' && existing.promise != null) {\n return existing.promise as Promise<TModule>;\n }\n }\n\n const promise = loader()\n .then((module) => {\n cache.set(cacheKey, {\n status: 'loaded',\n module: module as unknown as BackofficeResolvedEntityFacetModule,\n });\n return module;\n })\n .catch((error: unknown) => {\n const resolvedError = toError(error);\n cache.set(cacheKey, {\n status: 'error',\n error: resolvedError,\n });\n throw resolvedError;\n });\n\n cache.set(cacheKey, {\n status: 'loading',\n promise: promise as Promise<BackofficeResolvedEntityFacetModule>,\n });\n\n return promise;\n };\n\n const getLoadedListEntity: BackofficeEntityRegistry['getLoadedListEntity'] = (\n entityId,\n ) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, LIST_FACET_KIND)),\n );\n };\n\n const getLoadedPickerEntity: BackofficeEntityRegistry['getLoadedPickerEntity'] =\n (entityId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, PICKER_FACET_KIND)),\n );\n };\n\n const getLoadedDetailLayoutEntity: BackofficeEntityRegistry['getLoadedDetailLayoutEntity'] =\n (entityId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, DETAIL_LAYOUT_FACET_KIND)),\n );\n };\n\n const getLoadedDetailPageEntity: BackofficeEntityRegistry['getLoadedDetailPageEntity'] =\n (entityId, pageId) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, DETAIL_PAGE_FACET_KIND, pageId)),\n );\n };\n\n const getLoadedToolEntity: BackofficeEntityRegistry['getLoadedToolEntity'] = (\n entityId,\n ) => {\n return getLoadedModule(\n cache.get(buildFacetCacheKey(entityId, TOOL_FACET_KIND)),\n );\n };\n\n const loadListEntity: BackofficeEntityRegistry['loadListEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a list facet.`,\n );\n }\n const facetLoader = manifestItem.facets.list;\n if (facetLoader == null) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a list facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, LIST_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await facetLoader();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== LIST_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a list facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadPickerEntity: BackofficeEntityRegistry['loadPickerEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a picker facet.`,\n );\n }\n const facetLoader = manifestItem.facets.picker;\n if (facetLoader == null) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a picker facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, PICKER_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await facetLoader();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== PICKER_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a picker facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadDetailLayoutEntity: BackofficeEntityRegistry['loadDetailLayoutEntity'] =\n async (entityId, loadOptions) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a detail-layout facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, DETAIL_LAYOUT_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.detailLayout();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== DETAIL_LAYOUT_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a detail-layout facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadDetailPageEntity: BackofficeEntityRegistry['loadDetailPageEntity'] =\n async (entityId, pageId, loadOptions) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasListFacets(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a detail-page facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, DETAIL_PAGE_FACET_KIND, pageId),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.detailPage(pageId);\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== DETAIL_PAGE_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a detail-page facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n const loadToolEntity: BackofficeEntityRegistry['loadToolEntity'] = async (\n entityId,\n loadOptions,\n ) => {\n const manifestItem = resolveManifest(manifest, entityId);\n if (!hasToolFacet(manifestItem)) {\n throw new Error(\n `Backoffice entity ${entityId} does not expose a tool facet.`,\n );\n }\n return loadFacet(\n buildFacetCacheKey(entityId, TOOL_FACET_KIND),\n loadOptions,\n async () => {\n const loaded = await manifestItem.facets.tool();\n const resolved = resolveBackofficeLoadedFacetModule(\n manifestItem,\n loaded,\n options,\n );\n if (resolved.kind !== TOOL_FACET_KIND) {\n throw new Error(\n `Backoffice entity ${entityId} did not resolve to a tool facet.`,\n );\n }\n return resolved;\n },\n );\n };\n\n return {\n getManifest,\n getLoadedListEntity,\n getLoadedPickerEntity,\n getLoadedDetailLayoutEntity,\n getLoadedDetailPageEntity,\n getLoadedToolEntity,\n loadListEntity,\n loadPickerEntity,\n loadDetailLayoutEntity,\n loadDetailPageEntity,\n loadToolEntity,\n };\n};\n\nexport const __test = {\n buildFacetCacheKey,\n resolveManifest,\n toError,\n};\n\nexport default createBackofficeEntityRegistry;\n"],"mappings":";;AA2DA,IAAM,IAA8C,eAC9C,IAAyB,eACzB,IAA2B,iBAC3B,IAAkB,QAClB,IAAoB,UACpB,IAAkB,QAElB,KACJ,MAIO,EAAa,SAAS,eAGzB,KACJ,MAIO,EAAa,SAAS,QAGzB,KACJ,GACA,GACA,MAEI,MAAS,IACJ,GAAG,EAAS,GAAG,EAAK,GAAG,KAAU,OAEnC,GAAG,EAAS,GAAG,KAGlB,KAAW,MACX,aAAiB,QACZ,IAEE,MAAM,OAAO,CAAK,CAAC,GAG1B,KACJ,MAEI,GAAO,WAAW,YAAY,EAAM,UAAU,OACzC,OAEF,EAAM,QAGT,KACJ,GACA,MACwC;CACxC,IAAM,IAAe,EAAS;CAC9B,IAAI,KAAgB,MAClB,MAAU,MAAM,8BAA8B,GAAU;CAE1D,OAAO;AACT,GAEa,KACX,GACA,MAC6B;CAC7B,IAAM,oBAAQ,IAAI,IAAmD,GAE/D,KAAwD,MACrD,EAAS,MAAa,MAGzB,IAAY,OAChB,GACA,GACA,MACqB;EAGrB,KAFqB,GAAa,QAAQ,OAErB,eAAe;GAClC,IAAM,IAAe,EAAyB,EAAM,IAAI,CAAQ,CAAC;GACjE,IAAI,KAAgB,MAClB,OAAO;GAGT,IAAM,IAAW,EAAM,IAAI,CAAQ;GACnC,IAAI,GAAU,WAAW,aAAa,EAAS,WAAW,MACxD,OAAO,EAAS;EAEpB;EAEA,IAAM,IAAU,EAAO,EACpB,MAAM,OACL,EAAM,IAAI,GAAU;GAClB,QAAQ;GACA;EACV,CAAC,GACM,EACR,EACA,OAAO,MAAmB;GACzB,IAAM,IAAgB,EAAQ,CAAK;GAKnC,MAJA,EAAM,IAAI,GAAU;IAClB,QAAQ;IACR,OAAO;GACT,CAAC,GACK;EACR,CAAC;EAOH,OALA,EAAM,IAAI,GAAU;GAClB,QAAQ;GACC;EACX,CAAC,GAEM;CACT;CAqMA,OAAO;EACL;EACA,sBApMA,MAEO,EACL,EAAM,IAAI,EAAmB,GAAU,CAAe,CAAC,CACzD;EAiMA,wBA7LC,MACQ,EACL,EAAM,IAAI,EAAmB,GAAU,CAAiB,CAAC,CAC3D;EA2LF,8BAvLC,MACQ,EACL,EAAM,IAAI,EAAmB,GAAU,CAAwB,CAAC,CAClE;EAqLF,4BAjLC,GAAU,MACF,EACL,EAAM,IAAI,EAAmB,GAAU,GAAwB,CAAM,CAAC,CACxE;EA+KF,sBA3KA,MAEO,EACL,EAAM,IAAI,EAAmB,GAAU,CAAe,CAAC,CACzD;EAwKA,uBApKA,GACA,MACG;GACH,IAAM,IAAe,EAAgB,GAAU,CAAQ;GACvD,IAAI,CAAC,EAAc,CAAY,GAC7B,MAAU,MACR,qBAAqB,EAAS,+BAChC;GAEF,IAAM,IAAc,EAAa,OAAO;GACxC,IAAI,KAAe,MACjB,MAAU,MACR,qBAAqB,EAAS,+BAChC;GAEF,OAAO,EACL,EAAmB,GAAU,CAAe,GAC5C,GACA,YAAY;IAEV,IAAM,IAAW,EACf,GACA,MAHmB,EAAY,GAI/B,CACF;IACA,IAAI,EAAS,SAAS,GACpB,MAAU,MACR,qBAAqB,EAAS,kCAChC;IAEF,OAAO;GACT,CACF;EACF;EAoIE,yBAjIA,GACA,MACG;GACH,IAAM,IAAe,EAAgB,GAAU,CAAQ;GACvD,IAAI,CAAC,EAAc,CAAY,GAC7B,MAAU,MACR,qBAAqB,EAAS,iCAChC;GAEF,IAAM,IAAc,EAAa,OAAO;GACxC,IAAI,KAAe,MACjB,MAAU,MACR,qBAAqB,EAAS,iCAChC;GAEF,OAAO,EACL,EAAmB,GAAU,CAAiB,GAC9C,GACA,YAAY;IAEV,IAAM,IAAW,EACf,GACA,MAHmB,EAAY,GAI/B,CACF;IACA,IAAI,EAAS,SAAS,GACpB,MAAU,MACR,qBAAqB,EAAS,oCAChC;IAEF,OAAO;GACT,CACF;EACF;EAiGE,+BA9FO,GAAU,MAAgB;GAC/B,IAAM,IAAe,EAAgB,GAAU,CAAQ;GACvD,IAAI,CAAC,EAAc,CAAY,GAC7B,MAAU,MACR,qBAAqB,EAAS,wCAChC;GAEF,OAAO,EACL,EAAmB,GAAU,CAAwB,GACrD,GACA,YAAY;IAEV,IAAM,IAAW,EACf,GACA,MAHmB,EAAa,OAAO,aAAa,GAIpD,CACF;IACA,IAAI,EAAS,SAAS,GACpB,MAAU,MACR,qBAAqB,EAAS,2CAChC;IAEF,OAAO;GACT,CACF;EACF;EAsEA,6BAnEO,GAAU,GAAQ,MAAgB;GACvC,IAAM,IAAe,EAAgB,GAAU,CAAQ;GACvD,IAAI,CAAC,EAAc,CAAY,GAC7B,MAAU,MACR,qBAAqB,EAAS,sCAChC;GAEF,OAAO,EACL,EAAmB,GAAU,GAAwB,CAAM,GAC3D,GACA,YAAY;IAEV,IAAM,IAAW,EACf,GACA,MAHmB,EAAa,OAAO,WAAW,CAAM,GAIxD,CACF;IACA,IAAI,EAAS,SAAS,GACpB,MAAU,MACR,qBAAqB,EAAS,yCAChC;IAEF,OAAO;GACT,CACF;EACF;EA2CA,uBAxCA,GACA,MACG;GACH,IAAM,IAAe,EAAgB,GAAU,CAAQ;GACvD,IAAI,CAAC,EAAa,CAAY,GAC5B,MAAU,MACR,qBAAqB,EAAS,+BAChC;GAEF,OAAO,EACL,EAAmB,GAAU,CAAe,GAC5C,GACA,YAAY;IAEV,IAAM,IAAW,EACf,GACA,MAHmB,EAAa,OAAO,KAAK,GAI5C,CACF;IACA,IAAI,EAAS,SAAS,GACpB,MAAU,MACR,qBAAqB,EAAS,kCAChC;IAEF,OAAO;GACT,CACF;EACF;CAcA;AACF,GAEa,IAAS;CACpB;CACA;CACA;AACF"}
@@ -1,2 +1,2 @@
1
- import { createInlineDataReader as e, createInlineReader as t } from "./createInlineReader.js";
2
- export { e as createInlineDataReader, t as createInlineReader };
1
+ import { createInlineDataReader as e } from "./createInlineReader.js";
2
+ export { e as createInlineDataReader };
@@ -1,7 +1,7 @@
1
- import * as e from "react-relay";
1
+ import { readBackofficeInlineData as e } from "./typedRelayHooks.js";
2
2
  //#region src/relay/createInlineReader.ts
3
- var { readInlineData: t } = e, n = (e) => (n) => t(e, n), r = n;
3
+ var t = (t) => (n) => e(t, n);
4
4
  //#endregion
5
- export { n as createInlineDataReader, r as createInlineReader };
5
+ export { t as createInlineDataReader };
6
6
 
7
7
  //# sourceMappingURL=createInlineReader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nconst { readInlineData } = ReactRelay;\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readInlineData(fragment, ref as never);\n };\n};\n\n// Legacy alias kept for incremental migration of existing callsites.\nexport const createInlineReader = createInlineDataReader;\n"],"mappings":";;AAGA,IAAM,EAAE,sBAAmB,GAGd,KACX,OAEQ,MACC,EAAe,GAAU,CAAY,GAKnC,IAAqB"}
1
+ {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import type { GraphQLTaggedNode } from 'relay-runtime';\nimport { readBackofficeInlineData } from './typedRelayHooks.js';\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readBackofficeInlineData(fragment, ref);\n };\n};\n"],"mappings":";;AAIA,IAAa,KACX,OAEQ,MACC,EAAyB,GAAU,CAAG"}
@@ -328,7 +328,29 @@ function V(e) {
328
328
  function H(e) {
329
329
  return e instanceof TypeError || e instanceof Error && e.name === "AbortError";
330
330
  }
331
- async function U(e, t, n, r) {
331
+ var U = class extends Error {
332
+ errors;
333
+ response;
334
+ constructor(e, t) {
335
+ super(e[0]?.message ?? "GraphQL response error"), this.errors = e, this.response = t, this.name = "GraphQLResponseError";
336
+ }
337
+ };
338
+ function W(e) {
339
+ return e == null ? !1 : typeof e == "object" ? Object.values(e).some((e) => e != null) : !0;
340
+ }
341
+ function G(e) {
342
+ let { data: t, errors: n } = e;
343
+ if (typeof t != "object" || !t || !Array.isArray(n) || n.length === 0) return !1;
344
+ let r = t;
345
+ return n.every((e) => {
346
+ let [t, ...n] = e.path ?? [];
347
+ return typeof t != "string" || n.length === 0 ? !1 : Object.prototype.hasOwnProperty.call(r, t) && r[t] == null;
348
+ });
349
+ }
350
+ function K(e) {
351
+ return Array.isArray(e.errors) && e.errors.length > 0 && !W(e.data) && !G(e);
352
+ }
353
+ async function q(e, t, n, r) {
332
354
  let i = e.text;
333
355
  if (i == null) throw Error("Missing GraphQL query text");
334
356
  let a = i;
@@ -368,7 +390,8 @@ async function U(e, t, n, r) {
368
390
  throw Error(`GraphQL HTTP error ${s.status}: ${t}`);
369
391
  }
370
392
  let c = await s.json();
371
- return Array.isArray(c.errors) && c.errors.length > 0 && j("GraphQL errors", c.errors), c;
393
+ if (Array.isArray(c.errors) && c.errors.length > 0 && j("GraphQL errors", c.errors), K(c)) throw new U(c.errors ?? [], c);
394
+ return c;
372
395
  } finally {
373
396
  clearTimeout(r);
374
397
  }
@@ -382,7 +405,7 @@ async function U(e, t, n, r) {
382
405
  }
383
406
  throw Error("Exhausted retries without returning a result");
384
407
  }
385
- function W(e, t) {
408
+ function J(e, t) {
386
409
  return j("subscription:start", e.name, t), r.create((n) => {
387
410
  let r = e.text;
388
411
  if (r == null || r === "") return n.error(/* @__PURE__ */ Error("Subscription operation text is empty")), () => {};
@@ -407,32 +430,34 @@ function W(e, t) {
407
430
  };
408
431
  });
409
432
  }
410
- function G() {
411
- return n.create(U, W);
433
+ function Y() {
434
+ return n.create(q, J);
412
435
  }
413
- function K() {
436
+ function X() {
414
437
  return c ??= new t({
415
438
  getDataID: S,
416
439
  relayFieldLogger: b,
417
- network: G(),
440
+ network: Y(),
418
441
  store: new a(new i())
419
442
  }), c;
420
443
  }
421
- function q() {
422
- let e = K(), t = new i();
444
+ function Z() {
445
+ let e = X(), t = new i();
423
446
  e.getStore().publish(t), e.getStore().notify();
424
447
  }
425
- var J = {
448
+ var Q = {
426
449
  RelayWebSocketClient: N,
427
450
  buildFormData: L,
428
451
  calcBackoff: B,
429
452
  collectFiles: I,
430
453
  getDataId: S,
454
+ hasUsableTopLevelData: W,
431
455
  isNetworkError: H,
432
456
  isRetryableStatus: V,
433
- isUploadable: F
457
+ isUploadable: F,
458
+ shouldThrowGraphQLResponseError: K
434
459
  };
435
460
  //#endregion
436
- export { J as __test, k as configureRelayEnvironment, K as getEnvironment, G as getNetwork, T as getRelayTransportSnapshot, D as reconnectRelayWebSocket, O as refreshRelayWebSocketAuthentication, q as resetRelayStore, E as subscribeRelayTransport };
461
+ export { U as GraphQLResponseError, Q as __test, k as configureRelayEnvironment, X as getEnvironment, Y as getNetwork, T as getRelayTransportSnapshot, D as reconnectRelayWebSocket, O as refreshRelayWebSocketAuthentication, Z as resetRelayStore, E as subscribeRelayTransport };
437
462
 
438
463
  //# sourceMappingURL=environment.js.map