@plumile/backoffice-react 0.1.167 → 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/login/loginPage.css.js +1 -0
  2. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +50 -49
  3. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  4. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
  5. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +0 -1
  6. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +7 -7
  7. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  8. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +49 -48
  9. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  10. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +0 -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 +112 -90
  22. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  23. package/lib/esm/pages/BackofficeEntityDetailPage.js +158 -155
  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 +22 -13
  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 +1 -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":"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"}
@@ -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"}
@@ -339,9 +339,18 @@ function W(e) {
339
339
  return e == null ? !1 : typeof e == "object" ? Object.values(e).some((e) => e != null) : !0;
340
340
  }
341
341
  function G(e) {
342
- return Array.isArray(e.errors) && e.errors.length > 0 && !W(e.data);
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);
343
352
  }
344
- async function K(e, t, n, r) {
353
+ async function q(e, t, n, r) {
345
354
  let i = e.text;
346
355
  if (i == null) throw Error("Missing GraphQL query text");
347
356
  let a = i;
@@ -381,7 +390,7 @@ async function K(e, t, n, r) {
381
390
  throw Error(`GraphQL HTTP error ${s.status}: ${t}`);
382
391
  }
383
392
  let c = await s.json();
384
- if (Array.isArray(c.errors) && c.errors.length > 0 && j("GraphQL errors", c.errors), G(c)) throw new U(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);
385
394
  return c;
386
395
  } finally {
387
396
  clearTimeout(r);
@@ -396,7 +405,7 @@ async function K(e, t, n, r) {
396
405
  }
397
406
  throw Error("Exhausted retries without returning a result");
398
407
  }
399
- function q(e, t) {
408
+ function J(e, t) {
400
409
  return j("subscription:start", e.name, t), r.create((n) => {
401
410
  let r = e.text;
402
411
  if (r == null || r === "") return n.error(/* @__PURE__ */ Error("Subscription operation text is empty")), () => {};
@@ -421,22 +430,22 @@ function q(e, t) {
421
430
  };
422
431
  });
423
432
  }
424
- function J() {
425
- return n.create(K, q);
426
- }
427
433
  function Y() {
434
+ return n.create(q, J);
435
+ }
436
+ function X() {
428
437
  return c ??= new t({
429
438
  getDataID: S,
430
439
  relayFieldLogger: b,
431
- network: J(),
440
+ network: Y(),
432
441
  store: new a(new i())
433
442
  }), c;
434
443
  }
435
- function X() {
436
- let e = Y(), t = new i();
444
+ function Z() {
445
+ let e = X(), t = new i();
437
446
  e.getStore().publish(t), e.getStore().notify();
438
447
  }
439
- var Z = {
448
+ var Q = {
440
449
  RelayWebSocketClient: N,
441
450
  buildFormData: L,
442
451
  calcBackoff: B,
@@ -446,9 +455,9 @@ var Z = {
446
455
  isNetworkError: H,
447
456
  isRetryableStatus: V,
448
457
  isUploadable: F,
449
- shouldThrowGraphQLResponseError: G
458
+ shouldThrowGraphQLResponseError: K
450
459
  };
451
460
  //#endregion
452
- export { U as GraphQLResponseError, Z as __test, k as configureRelayEnvironment, Y as getEnvironment, J as getNetwork, T as getRelayTransportSnapshot, D as reconnectRelayWebSocket, O as refreshRelayWebSocketAuthentication, X 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 };
453
462
 
454
463
  //# sourceMappingURL=environment.js.map