@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,3 +1,4 @@
1
+ /* empty css */
1
2
  /* empty css */
2
3
  //#region src/auth/login/loginPage.css.ts
3
4
  var e = "txvbqbfpn txvbqbh4x txvbqbheb", t = "txvbqbfpn txvbqbh4x txvbqb19uf", n = "txvbqb1bg3 txvbqb9j txvbqbo7v txvbqbny4", r = "txvbqbey txvbqb1bg3 txvbqbfpn txvbqbhdl txvbqbs00 txvbqbp6j", i = "txvbqb1b9r txvbqbk07 txvbqbfvs txvbqb2wi txvbqb1bk3", a = "txvbqbey txvbqbfpn txvbqbh7g txvbqbhdy txvbqblt7 txvbqbrza", o = "w8yhmy0 txvbqb1b4r txvbqb1tv txvbqb2rt txvbqb1bhb txvbqbv txvbqbhbf txvbqbwvi txvbqb3f txvbqb7h txvbqb76 txvbqb7t txvbqb1etp txvbqb1gct", s = "txvbqb10o0 txvbqb11ll txvbqb12j6 txvbqbxv9 txvbqbc7z txvbqbc27 txvbqbci3 txvbqbce4", c = "txvbqbfpn txvbqbh4x txvbqbheb", l = "txvbqb19uf", u = "txvbqbo7v txvbqbam txvbqbhbs txvbqb1bhb txvbqbmu1", d = "txvbqbrzn", f = "w8yhmy1 txvbqb1f2 txvbqb29r txvbqb2sj txvbqb1bhb txvbqb1b9n txvbqb7h txvbqb75 txvbqb7t";
@@ -1,85 +1,86 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
2
  import { BackofficeErrorBoundary as t } from "../errors/BackofficeErrorBoundary.js";
3
3
  import { useBackofficeListEntitiesLoader as n } from "../../../provider/useBackofficeEntityLoader.js";
4
- import { buildDataTableColumns as r } from "../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 "../scaffolds/BackofficeEntityListScaffold.js";
8
- import { BackofficeLazyEntityCountLabel as s } from "../refs/BackofficeLazyEntityCount.js";
9
- import { Suspense as c, useCallback as l, useMemo as u, useState as d } from "react";
10
- import { InlineBanner as f } from "@plumile/ui/components/feedback/InlineBanner.js";
11
- import { jsx as p } from "react/jsx-runtime";
12
- import { useTranslation as m } from "react-i18next";
13
- import * as h from "react-relay";
14
- import { BACKOFFICE_LIST_REFETCH_POLICY as g, BACKOFFICE_RELATED_TAB_PAGE_SIZE as _ } from "@plumile/backoffice-core/constants.js";
15
- import { setWhereValue as v } from "@plumile/backoffice-core/filters/where.js";
16
- import { BackofficeTableSkeleton as y } from "@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js";
4
+ import { useBackofficePaginationFragment as r } from "../../../relay/typedRelayHooks.js";
5
+ import { buildDataTableColumns as i } from "../columns/buildDataTableColumns.js";
6
+ import { useBackofficeLoadMore as a } from "../../../hooks/useBackofficeLoadMore.js";
7
+ import { useBackofficeListRefetch as o } from "../../../hooks/useBackofficeListRefetch.js";
8
+ import { BackofficeEntityListScaffold as s } from "../scaffolds/BackofficeEntityListScaffold.js";
9
+ import { BackofficeLazyEntityCountLabel as c } from "../refs/BackofficeLazyEntityCount.js";
10
+ import { Suspense as l, useCallback as u, useMemo as d, useState as f } from "react";
11
+ import { InlineBanner as p } from "@plumile/ui/components/feedback/InlineBanner.js";
12
+ import { jsx as m } from "react/jsx-runtime";
13
+ import { useTranslation as h } from "react-i18next";
14
+ import * as g from "react-relay";
15
+ import { BACKOFFICE_LIST_REFETCH_POLICY as _, BACKOFFICE_RELATED_TAB_PAGE_SIZE as v } from "@plumile/backoffice-core/constants.js";
16
+ import { setWhereValue as y } from "@plumile/backoffice-core/filters/where.js";
17
+ import { BackofficeTableSkeleton as b } from "@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js";
17
18
  //#region src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx
18
- var { useLazyLoadQuery: b, usePaginationFragment: x } = h, S = () => {
19
+ var { useLazyLoadQuery: x } = g, S = () => {
19
20
  let { t } = e();
20
- return /* @__PURE__ */ p(y, {
21
+ return /* @__PURE__ */ m(b, {
21
22
  rows: 6,
22
23
  ariaLabel: t("common.loading")
23
24
  });
24
- }, C = ({ title: t, config: n, relation: c, value: f }) => {
25
- let { t: h } = m(), { t: y } = e(), S = n.list, C = n.listDefaults ?? S.defaultState ?? {
25
+ }, C = ({ title: t, config: n, relation: l, value: p }) => {
26
+ let { t: g } = h(), { t: b } = e(), S = n.list, C = n.listDefaults ?? S.defaultState ?? {
26
27
  where: null,
27
28
  sort: null
28
- }, [w, T] = d({
29
+ }, [w, T] = f({
29
30
  where: C.where,
30
31
  sort: C.sort ?? null
31
- }), [E, D] = d(0), O = u(() => f == null || f.trim() === "" ? null : v(w.where, c.whereKey, f, c.path), [
32
- c.path,
33
- c.whereKey,
32
+ }), [E, D] = f(0), O = d(() => p == null || p.trim() === "" ? null : y(w.where, l.whereKey, p, l.path), [
33
+ l.path,
34
+ l.whereKey,
34
35
  w.where,
35
- f
36
- ]), k = O ?? w.where, A = w.sort ?? C.sort, j = u(() => ({
36
+ p
37
+ ]), k = O ?? w.where, A = w.sort ?? C.sort, j = d(() => ({
37
38
  where: k,
38
39
  sort: A,
39
- count: _,
40
+ count: v,
40
41
  cursor: null
41
- }), [k, A]), M = u(() => S.buildQueryVariables(j), [S, j]), N = b(S.query, M, { fetchPolicy: "store-or-network" }), { data: P, loadNext: F, hasNext: I, isLoadingNext: L, refetch: R } = x(S.fragment, N), z = S.getConnection(P), B = u(() => z.edges.map((e) => S.toRow(e.node)), [z.edges, S]), V = u(() => r(S.columns, {
42
- tApp: h,
43
- t: y
42
+ }), [k, A]), M = d(() => S.buildQueryVariables(j), [S, j]), N = x(S.query, M, { fetchPolicy: "store-or-network" }), { data: P, loadNext: F, hasNext: I, isLoadingNext: L, refetch: R } = r(S.fragment, N), z = S.getConnection(P), B = d(() => z.edges.map((e) => S.toRow(e.node)), [z.edges, S]), V = d(() => i(S.columns, {
43
+ tApp: g,
44
+ t: b
44
45
  }), [
45
46
  S.columns,
46
- y,
47
- h
48
- ]), H = l((e) => S.getRowId(e), [S]), { isRefreshing: U, onRefresh: W } = a({
47
+ b,
48
+ g
49
+ ]), H = u((e) => S.getRowId(e), [S]), { isRefreshing: U, onRefresh: W } = o({
49
50
  refetch: R,
50
51
  variables: j,
51
- defaults: u(() => ({
52
+ defaults: d(() => ({
52
53
  where: O ?? C.where,
53
54
  sort: C.sort,
54
- count: _,
55
+ count: v,
55
56
  cursor: null
56
57
  }), [
57
58
  C.sort,
58
59
  C.where,
59
60
  O
60
61
  ]),
61
- fetchPolicy: g,
62
+ fetchPolicy: _,
62
63
  buildQueryVariables: S.buildQueryVariables
63
- }), G = l(() => {
64
+ }), G = u(() => {
64
65
  D((e) => e + 1), W();
65
- }, [W]), K = i({
66
+ }, [W]), K = a({
66
67
  hasNext: I,
67
68
  isLoadingNext: L,
68
69
  loadNext: F,
69
- count: _
70
+ count: v
70
71
  }), q = null;
71
- B.length > 0 && (q = /* @__PURE__ */ p("span", { children: y("list.loaded", { count: B.length }) }));
72
- let J = /* @__PURE__ */ p(s, {
72
+ B.length > 0 && (q = /* @__PURE__ */ m("span", { children: b("list.loaded", { count: B.length }) }));
73
+ let J = /* @__PURE__ */ m(c, {
73
74
  count: S.count,
74
75
  where: k,
75
76
  fetchKey: E,
76
77
  fallback: q,
77
- children: (e) => /* @__PURE__ */ p("span", { children: y("list.showing", {
78
+ children: (e) => /* @__PURE__ */ m("span", { children: b("list.showing", {
78
79
  shown: B.length,
79
80
  total: e
80
81
  }) })
81
82
  });
82
- return /* @__PURE__ */ p(o, {
83
+ return /* @__PURE__ */ m(s, {
83
84
  config: n,
84
85
  state: w,
85
86
  pushState: (e) => {
@@ -99,28 +100,28 @@ var { useLazyLoadQuery: b, usePaginationFragment: x } = h, S = () => {
99
100
  variant: "embedded"
100
101
  });
101
102
  }, w = ({ title: t, relation: r, value: i }) => {
102
- let { t: a } = e(), o = n(u(() => [r.target], [r.target]));
103
- if (o.status === "loading") return /* @__PURE__ */ p(y, {
103
+ let { t: a } = e(), o = n(d(() => [r.target], [r.target]));
104
+ if (o.status === "loading") return /* @__PURE__ */ m(b, {
104
105
  rows: 6,
105
106
  ariaLabel: a("common.loading")
106
107
  });
107
- if (o.status === "error") return /* @__PURE__ */ p(f, {
108
+ if (o.status === "error") return /* @__PURE__ */ m(p, {
108
109
  tone: "warning",
109
110
  title: a("relations.unavailable.title"),
110
111
  children: a("relations.unavailable.description")
111
112
  });
112
113
  let s = o.modules[r.target]?.config;
113
- return s == null ? null : /* @__PURE__ */ p(C, {
114
+ return s == null ? null : /* @__PURE__ */ m(C, {
114
115
  title: t,
115
116
  config: s,
116
117
  relation: r,
117
118
  value: i
118
119
  });
119
- }, T = ({ title: e, relation: n, value: r }) => /* @__PURE__ */ p(t, {
120
- fallback: () => /* @__PURE__ */ p(S, {}),
121
- children: /* @__PURE__ */ p(c, {
122
- fallback: /* @__PURE__ */ p(S, {}),
123
- children: /* @__PURE__ */ p(w, {
120
+ }, T = ({ title: e, relation: n, value: r }) => /* @__PURE__ */ m(t, {
121
+ fallback: () => /* @__PURE__ */ m(S, {}),
122
+ children: /* @__PURE__ */ m(l, {
123
+ fallback: /* @__PURE__ */ m(S, {}),
124
+ children: /* @__PURE__ */ m(w, {
124
125
  title: e,
125
126
  relation: n,
126
127
  value: r
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { BackofficeLazyEntityCountLabel } from '../refs/BackofficeLazyEntityCount.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n const [countFetchKey, setCountFetchKey] = useState(0);\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n relation.whereKey as never,\n value,\n relation.path,\n );\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\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 const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n }, [listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\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: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\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={effectiveWhere}\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 <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\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 variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { useBackofficePaginationFragment } from '../../../relay/typedRelayHooks.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { BackofficeLazyEntityCountLabel } from '../refs/BackofficeLazyEntityCount.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<\n BackofficeListState<Record<string, unknown>, string>\n >({\n where: listDefaults.where,\n sort: listDefaults.sort ?? null,\n });\n const [countFetchKey, setCountFetchKey] = useState(0);\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(state.where, relation.whereKey, value, relation.path);\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? state.where;\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere,\n sort: resolvedSort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\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 const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n }, [listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\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: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\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={effectiveWhere}\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 <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns}\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 variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ /* empty css */
1
2
  /* empty css */
2
3
  //#region src/components/backoffice/detail/backofficeDetailRelationLink.css.ts
3
4
  var e = "_93gupm0 qbwcueg qbwcuee txvbqb2tz txvbqb1bg1 txvbqb3f txvbqb7g txvbqb76 txvbqb7t qbwcuef txvbqb1ct1 txvbqb1dsd qbwcue0 txvbqb1ffs txvbqb1ga0 txvbqb10mx txvbqb11ki txvbqb12hq txvbqbxtt txvbqb7h txvbqb75 txvbqbfpn txvbqblt7 txvbqbhdy txvbqb28o txvbqb2sj txvbqbik txvbqb1b4r txvbqbey txvbqbem txvbqbh4k txvbqbh4y txvbqb1ct4 txvbqb1dsg", t = "txvbqb9j txvbqbhb2 txvbqbv7x txvbqbws9", n = "txvbqbfqq txvbqbey txvbqbhd8 txvbqbh6d txvbqbv7x", r = "txvbqb96 txvbqb1bg3 txvbqbws9 txvbqb18e2", i = "txvbqbfqq txvbqbey txvbqbls4 txvbqb1bg5 txvbqb9j txvbqbmzg";
@@ -1,4 +1,3 @@
1
- /* empty css */
2
1
  /* empty css */
3
2
  //#region src/components/backoffice/filters/deferredFilterSearchInput.css.ts
4
3
  var e = "txvbqb19uf", t = "ds2thc0 txvbqbfqq txvbqbey txvbqbi8a", n = "ds2thc1 txvbqb6 txvbqbfqq txvbqbey txvbqbls4 txvbqb19gp txvbqbjm4 txvbqbwvi txvbqb2tz txvbqb1tv txvbqb1b4r txvbqb1bg5 txvbqbv txvbqb7h txvbqb75 txvbqb7t", r = "txvbqbfqq txvbqb19gp txvbqbjm4 txvbqbh6d";
@@ -27,7 +27,12 @@ var e = (e, t) => e(t), t = (t) => {
27
27
  layoutView: n.layoutView,
28
28
  detailHeader: n.config.header,
29
29
  tApp: n.tApp
30
- });
30
+ }), a = {
31
+ kind: "entity-detail-page",
32
+ entityId: n.config.id,
33
+ id: n.entityId,
34
+ pageId: n.pageId ?? n.pageLabel
35
+ };
31
36
  return [
32
37
  {
33
38
  kind: "link",
@@ -48,12 +53,7 @@ var e = (e, t) => e(t), t = (t) => {
48
53
  },
49
54
  {
50
55
  kind: "current",
51
- target: {
52
- kind: "entity-detail-page",
53
- entityId: n.config.id,
54
- id: n.entityId,
55
- pageId: n.pageId ?? n.pageLabel
56
- },
56
+ target: a,
57
57
  label: n.pageLabel
58
58
  }
59
59
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n BackofficeManifestDetailEntityId,\n BackofficeManifestListEntityId,\n BackofficeManifestToolId,\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n const maybeId = (input.layoutView as { id?: unknown }).id;\n let normalizedId: string | null = null;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n normalizedId = maybeId.trim();\n }\n if (\n typeof titleValue === 'string' &&\n titleValue.trim() !== '' &&\n titleValue.trim() !== normalizedId\n ) {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'dashboard' },\n label: t('sidebar.items.dashboard'),\n },\n ];\n};\n\nexport const buildHubBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'hub', hubId: input.id },\n label: input.title,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: {\n kind: 'entity-list',\n entityId: config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: resolveLabel(config.label, tApp),\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n pageId?: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n\n return [\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: input.config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: listLabel,\n },\n {\n kind: 'link',\n target: {\n kind: 'entity-detail',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n },\n label: entityTitle,\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail-page',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n pageId: input.pageId ?? input.pageLabel,\n } as never,\n label: input.pageLabel,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id?: BackofficeManifestToolId<TManifest> | string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n let target: BackofficeTopbarBreadcrumbItem<TManifest>['target'] = {\n kind: 'href',\n href: `/tools/${input.title}`,\n };\n if (input.id != null) {\n target = {\n kind: 'tool',\n toolId: input.id as BackofficeManifestToolId<TManifest>,\n };\n }\n return [\n {\n kind: 'current',\n target,\n label: input.title,\n },\n ];\n};\n"],"mappings":";AAeA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGN,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,IACR,GACM,IAAW,EAAM,WAAgC,IACnD,IAA8B;CAIlC,IAHI,OAAO,KAAY,YAAY,EAAQ,KAAK,MAAM,OACpD,IAAe,EAAQ,KAAK,IAG5B,OAAO,KAAe,YACtB,EAAW,KAAK,MAAM,MACtB,EAAW,KAAK,MAAM,GAEtB,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,IAAI;CAK/D,OAJI,EAAM,KAAK,MAAM,KAId,KAHE;AAIX,GAEa,KACX,MAEO,CACL;CACE,MAAM;CACN,QAAQ,EAAE,MAAM,YAAY;CAC5B,OAAO,EAAE,yBAAyB;AACpC,CACF,GAGW,KAEX,MAIO,CACL;CACE,MAAM;CACN,QAAQ;EAAE,MAAM;EAAO,OAAO,EAAM;CAAG;CACvC,OAAO,EAAM;AACf,CACF,GAGW,KAGX,GACA,MAEO,CACL;CACE,MAAM;CACN,QAAQ;EACN,MAAM;EACN,UAAU,EAAO;CACnB;CACA,OAAO,EAAa,EAAO,OAAO,CAAI;AACxC,CACF,GAGW,KAEX,MAS0D;CAC1D,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,IAAI,GACvD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;CACd,CAAC;CAED,OAAO;EACL;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OAAO;GACzB;GACA,OAAO;EACT;EACA;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;GACZ;GACA,OAAO;EACT;EACA;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;IACV,QAAQ,EAAM,UAAU,EAAM;GAChC;GACA,OAAO,EAAM;EACf;CACF;AACF,GAEa,KAEX,MAG0D;CAC1D,IAAI,IAA8D;EAChE,MAAM;EACN,MAAM,UAAU,EAAM;CACxB;CAOA,OANI,EAAM,MAAM,SACd,IAAS;EACP,MAAM;EACN,QAAQ,EAAM;CAChB,IAEK,CACL;EACE,MAAM;EACN;EACA,OAAO,EAAM;CACf,CACF;AACF"}
1
+ {"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n BackofficeManifestDetailEntityId,\n BackofficeManifestListEntityId,\n BackofficeManifestToolId,\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n const maybeId = (input.layoutView as { id?: unknown }).id;\n let normalizedId: string | null = null;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n normalizedId = maybeId.trim();\n }\n if (\n typeof titleValue === 'string' &&\n titleValue.trim() !== '' &&\n titleValue.trim() !== normalizedId\n ) {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'dashboard' },\n label: t('sidebar.items.dashboard'),\n },\n ];\n};\n\nexport const buildHubBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'hub', hubId: input.id },\n label: input.title,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: {\n kind: 'entity-list',\n entityId: config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: resolveLabel(config.label, tApp),\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n pageId?: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n const currentTarget = {\n kind: 'entity-detail-page',\n entityId: input.config.id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n pageId: input.pageId ?? input.pageLabel,\n } as unknown as BackofficeTopbarBreadcrumbItem<TManifest>['target'];\n\n return [\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: input.config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: listLabel,\n },\n {\n kind: 'link',\n target: {\n kind: 'entity-detail',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n },\n label: entityTitle,\n },\n {\n kind: 'current',\n target: currentTarget,\n label: input.pageLabel,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id?: BackofficeManifestToolId<TManifest> | string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n let target: BackofficeTopbarBreadcrumbItem<TManifest>['target'] = {\n kind: 'href',\n href: `/tools/${input.title}`,\n };\n if (input.id != null) {\n target = {\n kind: 'tool',\n toolId: input.id as BackofficeManifestToolId<TManifest>,\n };\n }\n return [\n {\n kind: 'current',\n target,\n label: input.title,\n },\n ];\n};\n"],"mappings":";AAeA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGN,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,IACR,GACM,IAAW,EAAM,WAAgC,IACnD,IAA8B;CAIlC,IAHI,OAAO,KAAY,YAAY,EAAQ,KAAK,MAAM,OACpD,IAAe,EAAQ,KAAK,IAG5B,OAAO,KAAe,YACtB,EAAW,KAAK,MAAM,MACtB,EAAW,KAAK,MAAM,GAEtB,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,IAAI;CAK/D,OAJI,EAAM,KAAK,MAAM,KAId,KAHE;AAIX,GAEa,KACX,MAEO,CACL;CACE,MAAM;CACN,QAAQ,EAAE,MAAM,YAAY;CAC5B,OAAO,EAAE,yBAAyB;AACpC,CACF,GAGW,KAEX,MAIO,CACL;CACE,MAAM;CACN,QAAQ;EAAE,MAAM;EAAO,OAAO,EAAM;CAAG;CACvC,OAAO,EAAM;AACf,CACF,GAGW,KAGX,GACA,MAEO,CACL;CACE,MAAM;CACN,QAAQ;EACN,MAAM;EACN,UAAU,EAAO;CACnB;CACA,OAAO,EAAa,EAAO,OAAO,CAAI;AACxC,CACF,GAGW,KAEX,MAS0D;CAC1D,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,IAAI,GACvD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;CACd,CAAC,GACK,IAAgB;EACpB,MAAM;EACN,UAAU,EAAM,OAAO;EACvB,IAAI,EAAM;EACV,QAAQ,EAAM,UAAU,EAAM;CAChC;CAEA,OAAO;EACL;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OAAO;GACzB;GACA,OAAO;EACT;EACA;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;GACZ;GACA,OAAO;EACT;EACA;GACE,MAAM;GACN,QAAQ;GACR,OAAO,EAAM;EACf;CACF;AACF,GAEa,KAEX,MAG0D;CAC1D,IAAI,IAA8D;EAChE,MAAM;EACN,MAAM,UAAU,EAAM;CACxB;CAOA,OANI,EAAM,MAAM,SACd,IAAS;EACP,MAAM;EACN,QAAQ,EAAM;CAChB,IAEK,CACL;EACE,MAAM;EACN;EACA,OAAO,EAAM;CACf,CACF;AACF"}
@@ -1,20 +1,21 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
2
  import { BackofficeErrorBoundary as t } from "../errors/BackofficeErrorBoundary.js";
3
3
  import { useBackofficePickerEntityLoader as n } from "../../../provider/useBackofficeEntityLoader.js";
4
- import { loadingLabel as r, loadingState as i } from "./entityIdPickerDialog.css.js";
5
- import { Suspense as a, useCallback as o, useEffect as s, useMemo as c, useState as l } from "react";
6
- import { InlineBanner as u } from "@plumile/ui/components/feedback/InlineBanner.js";
7
- import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
8
- import { useTranslation as m } from "react-i18next";
9
- import { Button as h } from "@plumile/ui/atomic/atoms/button/Button.js";
10
- import * as g from "react-relay";
11
- import { Modal as _ } from "@plumile/ui/atomic/atoms/modal/Modal.js";
12
- import { Spinner as v } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
13
- import { BackofficeEmptyState as y } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
14
- import { BackofficePickerList as b, BackofficePickerShell as x } from "@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js";
4
+ import { useBackofficeFragment as r } from "../../../relay/typedRelayHooks.js";
5
+ import { loadingLabel as i, loadingState as a } from "./entityIdPickerDialog.css.js";
6
+ import { Suspense as o, useCallback as s, useEffect as c, useMemo as l, useState as u } from "react";
7
+ import { InlineBanner as d } from "@plumile/ui/components/feedback/InlineBanner.js";
8
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
9
+ import { useTranslation as h } from "react-i18next";
10
+ import { Button as g } from "@plumile/ui/atomic/atoms/button/Button.js";
11
+ import * as _ from "react-relay";
12
+ import { Modal as v } from "@plumile/ui/atomic/atoms/modal/Modal.js";
13
+ import { Spinner as y } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
14
+ import { BackofficeEmptyState as b } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
15
+ import { BackofficePickerList as x, BackofficePickerShell as S } from "@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js";
15
16
  //#region src/components/backoffice/pickers/EntityIdPickerDialog.tsx
16
- var { useFragment: S, useLazyLoadQuery: C } = g, w = "store-and-network", T = (e, t) => e(t), E = ({ config: e, search: t, scope: n, fetchKey: r, onSelectId: i }) => {
17
- let a = c(() => {
17
+ var { useLazyLoadQuery: C } = _, w = "store-and-network", T = (e, t) => e(t), E = ({ config: e, search: t, scope: n, fetchKey: i, onSelectId: a }) => {
18
+ let o = l(() => {
18
19
  let r = t.trim();
19
20
  return e.buildQueryVariables({
20
21
  search: r,
@@ -24,95 +25,95 @@ var { useFragment: S, useLazyLoadQuery: C } = g, w = "store-and-network", T = (e
24
25
  e,
25
26
  n,
26
27
  t
27
- ]), o = C(e.query, a, {
28
+ ]), s = C(e.query, o, {
28
29
  fetchPolicy: w,
29
- fetchKey: r
30
- }), s = S(e.fragment, o), l = e.getConnection(s);
31
- return /* @__PURE__ */ f(b, {
32
- items: c(() => l.edges.map((t) => {
30
+ fetchKey: i
31
+ }), c = r(e.fragment, s), u = e.getConnection(c);
32
+ return /* @__PURE__ */ p(x, {
33
+ items: l(() => u.edges.map((t) => {
33
34
  let n = e.toRow(t.node);
34
35
  return {
35
36
  id: e.getRowId(n),
36
37
  title: n.title,
37
38
  subtitle: n.subtitle
38
39
  };
39
- }), [e, l.edges]),
40
+ }), [e, u.edges]),
40
41
  onSelectItem: (e) => {
41
- i(e.id);
42
+ a(e.id);
42
43
  }
43
44
  });
44
- }, D = (e, t) => /* @__PURE__ */ f(d, { children: /* @__PURE__ */ f(h, {
45
+ }, D = (e, t) => /* @__PURE__ */ p(f, { children: /* @__PURE__ */ p(g, {
45
46
  type: "button",
46
47
  variant: "secondary",
47
48
  onClick: e,
48
49
  children: t
49
- }) }), O = ({ message: e }) => /* @__PURE__ */ f(u, {
50
+ }) }), O = ({ message: e }) => /* @__PURE__ */ p(d, {
50
51
  tone: "warning",
51
52
  title: e,
52
53
  children: null
53
- }), k = ({ label: e }) => /* @__PURE__ */ p("div", {
54
- className: i,
54
+ }), k = ({ label: e }) => /* @__PURE__ */ m("div", {
55
+ className: a,
55
56
  role: "status",
56
57
  "aria-live": "polite",
57
- children: [/* @__PURE__ */ f(v, {
58
+ children: [/* @__PURE__ */ p(y, {
58
59
  size: 18,
59
60
  ariaLabel: e
60
- }), /* @__PURE__ */ f("span", {
61
- className: r,
61
+ }), /* @__PURE__ */ p("span", {
62
+ className: i,
62
63
  children: e
63
64
  })]
64
- }), A = ({ isOpen: r, entity: i, title: d, scope: p, onClose: g, onSelectId: v }) => {
65
- let { t: b } = m(), { t: S } = e(), [C, w] = l(""), [A, j] = l(0), M = n(i, { enabled: r }), N;
66
- M.status === "loaded" && (N = M.module.config.picker), s(() => {
65
+ }), A = ({ isOpen: r, entity: i, title: a, scope: f, onClose: m, onSelectId: _ }) => {
66
+ let { t: y } = h(), { t: x } = e(), [C, w] = u(""), [A, j] = u(0), M = n(i, { enabled: r }), N;
67
+ M.status === "loaded" && (N = M.module.config.picker), c(() => {
67
68
  r && (w(""), j((e) => e + 1));
68
69
  }, [r]);
69
- let P = c(() => D(g, S("common.actions.close")), [g, S]), F = o((e) => {
70
+ let P = l(() => D(m, x("common.actions.close")), [m, x]), F = s((e) => {
70
71
  w(e), j((e) => e + 1);
71
- }, []), I = o((e) => {
72
- v(e), g();
73
- }, [g, v]);
72
+ }, []), I = s((e) => {
73
+ _(e), m();
74
+ }, [m, _]);
74
75
  if (!r) return null;
75
76
  let L;
76
- N?.searchPlaceholder != null && (L = T(N.searchPlaceholder, b));
77
+ N?.searchPlaceholder != null && (L = T(N.searchPlaceholder, y));
77
78
  let R = C.trim(), z = N?.searchRequired === !0, B;
78
- return B = M.status === "loading" ? /* @__PURE__ */ f(k, { label: S("common.loading") }) : N == null ? /* @__PURE__ */ f(O, { message: S("picker.unavailable", { entity: i }) }) : z && R === "" ? /* @__PURE__ */ f(y, { title: S("picker.searchRequired") }) : /* @__PURE__ */ f(E, {
79
+ return B = M.status === "loading" ? /* @__PURE__ */ p(k, { label: x("common.loading") }) : N == null ? /* @__PURE__ */ p(O, { message: x("picker.unavailable", { entity: i }) }) : z && R === "" ? /* @__PURE__ */ p(b, { title: x("picker.searchRequired") }) : /* @__PURE__ */ p(E, {
79
80
  config: N,
80
81
  search: C,
81
- scope: p,
82
+ scope: f,
82
83
  fetchKey: A,
83
84
  onSelectId: I
84
- }), /* @__PURE__ */ f(_, {
85
+ }), /* @__PURE__ */ p(v, {
85
86
  isOpen: r,
86
- onClose: g,
87
- title: d,
87
+ onClose: m,
88
+ title: a,
88
89
  footer: P,
89
90
  initialFocus: "first-form-control",
90
- children: /* @__PURE__ */ f(x, {
91
+ children: /* @__PURE__ */ p(S, {
91
92
  searchValue: C,
92
93
  onSearchChange: F,
93
94
  searchPlaceholder: L,
94
95
  searchAriaLabel: L,
95
96
  searchName: "backoffice-entity-picker-search",
96
97
  searchEnabled: N?.searchEnabled ?? !0,
97
- children: /* @__PURE__ */ f(t, {
98
+ children: /* @__PURE__ */ p(t, {
98
99
  fallback: (e) => {
99
100
  let { reset: t } = e;
100
- return /* @__PURE__ */ f(u, {
101
+ return /* @__PURE__ */ p(d, {
101
102
  tone: "danger",
102
- title: S("picker.errors.loadFailed"),
103
- actions: /* @__PURE__ */ f(h, {
103
+ title: x("picker.errors.loadFailed"),
104
+ actions: /* @__PURE__ */ p(g, {
104
105
  type: "button",
105
106
  variant: "secondary",
106
107
  onClick: () => {
107
108
  t(), j((e) => e + 1);
108
109
  },
109
- children: S("common.actions.retry")
110
+ children: x("common.actions.retry")
110
111
  }),
111
112
  children: null
112
113
  });
113
114
  },
114
- children: /* @__PURE__ */ f(a, {
115
- fallback: /* @__PURE__ */ f(k, { label: S("common.loading") }),
115
+ children: /* @__PURE__ */ p(o, {
116
+ fallback: /* @__PURE__ */ p(k, { label: x("common.loading") }),
116
117
  children: B
117
118
  })
118
119
  })
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport {\n BackofficePickerList,\n BackofficePickerShell,\n type BackofficePickerItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly BackofficePickerItem[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return (\n <BackofficePickerList\n items={items}\n onSelectItem={(item) => {\n onSelectId(item.id);\n }}\n />\n );\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeRuntimeEntityPickerConfig\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={footer}\n initialFocus=\"first-form-control\"\n >\n <BackofficePickerShell\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchAriaLabel={resolvedSearchPlaceholder}\n searchName=\"backoffice-entity-picker-search\"\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </BackofficePickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport {\n BackofficePickerList,\n BackofficePickerShell,\n type BackofficePickerItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { useBackofficeFragment } from '../../../relay/typedRelayHooks.js';\n\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useBackofficeFragment<unknown, unknown>(\n config.fragment,\n queryData,\n );\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly BackofficePickerItem[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return (\n <BackofficePickerList\n items={items}\n onSelectItem={(item) => {\n onSelectId(item.id);\n }}\n />\n );\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeRuntimeEntityPickerConfig\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={footer}\n initialFocus=\"first-form-control\"\n >\n <BackofficePickerShell\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchAriaLabel={resolvedSearchPlaceholder}\n searchName=\"backoffice-entity-picker-search\"\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </BackofficePickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- /* empty css */
2
1
  /* empty css */
3
2
  //#region src/components/backoffice/refs/backofficeRelatedCountLink.css.ts
4
3
  var e = "qbwcuem qbwcuek txvbqb10mk txvbqb11k5 txvbqb12hd txvbqbxtg txvbqbfqq txvbqbey txvbqbls4 txvbqbhd8 txvbqbvb6 txvbqb1bg1 txvbqb1b81 txvbqb1d9 txvbqb2sj txvbqb29r txvbqb2wi txvbqbhbf txvbqbo4m txvbqb3f txvbqb7g txvbqb75 txvbqb7t qbwcuel txvbqb1etp txvbqb1cst txvbqb1dth txvbqb1e2l qbwcue0 txvbqb1ffs txvbqb1ga0", t = "txvbqbv8n txvbqb18dp txvbqbh86", n = "kk18lv0 txvbqbh6d txvbqb1bg3 txvbqb9j txvbqbo4m txvbqb7h txvbqb75 txvbqb7t";
@@ -0,0 +1,27 @@
1
+ import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
+ import { BackofficeEntityDetailScaffold as t } from "./BackofficeEntityDetailScaffold.js";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ import { LinkButton as r } from "@plumile/ui/atomic/atoms/button/LinkButton.js";
5
+ //#region src/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.tsx
6
+ var i = ({ listHref: t }) => {
7
+ let { t: i } = e();
8
+ return {
9
+ title: i("detail.notFound"),
10
+ description: i("detail.notFoundDescription"),
11
+ actions: /* @__PURE__ */ n(r, {
12
+ to: t,
13
+ variant: "secondary",
14
+ size: "small",
15
+ preloadOnMouseEnter: !0,
16
+ children: i("detail.actions.backToList")
17
+ })
18
+ };
19
+ }, a = ({ listHref: e }) => /* @__PURE__ */ n(t, {
20
+ node: null,
21
+ notFound: i({ listHref: e }),
22
+ render: () => null
23
+ });
24
+ //#endregion
25
+ export { a as BackofficeEntityDetailNotFound, a as default, i as useBackofficeEntityDetailNotFoundState };
26
+
27
+ //# sourceMappingURL=BackofficeEntityDetailNotFound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeEntityDetailNotFound.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport {\n BackofficeEntityDetailScaffold,\n type BackofficeEntityDetailNotFoundState,\n} from './BackofficeEntityDetailScaffold.js';\n\nexport type BackofficeEntityDetailNotFoundProps = {\n listHref: string;\n};\n\nexport const useBackofficeEntityDetailNotFoundState = ({\n listHref,\n}: BackofficeEntityDetailNotFoundProps): BackofficeEntityDetailNotFoundState => {\n const { t } = useBackofficeReactTranslation();\n\n return {\n title: t('detail.notFound'),\n description: t('detail.notFoundDescription'),\n actions: (\n <LinkButton\n to={listHref}\n variant=\"secondary\"\n size=\"small\"\n preloadOnMouseEnter\n >\n {t('detail.actions.backToList')}\n </LinkButton>\n ),\n };\n};\n\nexport const BackofficeEntityDetailNotFound = ({\n listHref,\n}: BackofficeEntityDetailNotFoundProps): JSX.Element => {\n const notFound = useBackofficeEntityDetailNotFoundState({ listHref });\n\n return (\n <BackofficeEntityDetailScaffold\n node={null}\n notFound={notFound}\n render={() => {\n return null;\n }}\n />\n );\n};\n\nexport default BackofficeEntityDetailNotFound;\n"],"mappings":";;;;;AAcA,IAAa,KAA0C,EACrD,kBAC8E;CAC9E,IAAM,EAAE,SAAM,EAA8B;CAE5C,OAAO;EACL,OAAO,EAAE,iBAAiB;EAC1B,aAAa,EAAE,4BAA4B;EAC3C,SACE,kBAAC,GAAD;GACE,IAAI;GACJ,SAAQ;GACR,MAAK;GACL,qBAAA;aAEC,EAAE,2BAA2B;EACpB,CAAA;CAEhB;AACF,GAEa,KAAkC,EAC7C,kBAKE,kBAAC,GAAD;CACE,MAAM;CACI,UALG,EAAuC,EAAE,YAAS,CAKrD;CACV,cACS;AAEV,CAAA"}
@@ -1,12 +1,16 @@
1
- import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
- import { jsx as t } from "react/jsx-runtime";
3
- import { BackofficeEmptyState as n } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { BackofficeEmptyState as t } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
4
3
  //#region src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx
5
- var r = ({ node: r, render: i, notFound: a }) => {
6
- let { t: o } = e(), s = a ?? o("detail.notFound");
7
- return r == null ? /* @__PURE__ */ t(n, { title: s }) : i(r) ?? /* @__PURE__ */ t(n, { title: s });
8
- };
4
+ var n = ({ node: n, render: r, notFound: i }) => n == null ? /* @__PURE__ */ e(t, {
5
+ title: i.title,
6
+ description: i.description,
7
+ actions: i.actions
8
+ }) : r(n) ?? /* @__PURE__ */ e(t, {
9
+ title: i.title,
10
+ description: i.description,
11
+ actions: i.actions
12
+ });
9
13
  //#endregion
10
- export { r as BackofficeEntityDetailScaffold, r as default };
14
+ export { n as BackofficeEntityDetailScaffold, n as default };
11
15
 
12
16
  //# sourceMappingURL=BackofficeEntityDetailScaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailScaffoldProps<\n NodeUnion extends { __typename: string },\n> = {\n node: NodeUnion | null | undefined;\n render: (node: NodeUnion) => JSX.Element | null;\n notFound?: ReactNode;\n};\n\nexport const BackofficeEntityDetailScaffold = <\n NodeUnion extends { __typename: string },\n>({\n node,\n render,\n notFound,\n}: BackofficeEntityDetailScaffoldProps<NodeUnion>): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedNotFound = notFound ?? t('detail.notFound');\n if (node == null) {\n return <BackofficeEmptyState title={resolvedNotFound} />;\n }\n\n const content = render(node);\n if (content == null) {\n return <BackofficeEmptyState title={resolvedNotFound} />;\n }\n\n return content;\n};\n\nexport default BackofficeEntityDetailScaffold;\n"],"mappings":";;;;AAaA,IAAa,KAEX,EACA,SACA,WACA,kBACiE;CACjE,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAmB,KAAY,EAAE,iBAAiB;CAUxD,OATI,KAAQ,OACH,kBAAC,GAAD,EAAsB,OAAO,EAAmB,CAAA,IAGzC,EAAO,CACnB,KACK,kBAAC,GAAD,EAAsB,OAAO,EAAmB,CAAA;AAI3D"}
1
+ {"version":3,"file":"BackofficeEntityDetailScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\n\nexport type BackofficeEntityDetailNotFoundState = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n};\n\nexport type BackofficeEntityDetailScaffoldProps<\n NodeUnion extends { __typename: string },\n> = {\n node: NodeUnion | null | undefined;\n render: (node: NodeUnion) => JSX.Element | null;\n notFound: BackofficeEntityDetailNotFoundState;\n};\n\nexport const BackofficeEntityDetailScaffold = <\n NodeUnion extends { __typename: string },\n>({\n node,\n render,\n notFound,\n}: BackofficeEntityDetailScaffoldProps<NodeUnion>): JSX.Element => {\n if (node == null) {\n return (\n <BackofficeEmptyState\n title={notFound.title}\n description={notFound.description}\n actions={notFound.actions}\n />\n );\n }\n\n const content = render(node);\n if (content == null) {\n return (\n <BackofficeEmptyState\n title={notFound.title}\n description={notFound.description}\n actions={notFound.actions}\n />\n );\n }\n\n return content;\n};\n\nexport default BackofficeEntityDetailScaffold;\n"],"mappings":";;;AAkBA,IAAa,KAEX,EACA,SACA,WACA,kBAEI,KAAQ,OAER,kBAAC,GAAD;CACE,OAAO,EAAS;CAChB,aAAa,EAAS;CACtB,SAAS,EAAS;AACnB,CAAA,IAIW,EAAO,CACnB,KAEA,kBAAC,GAAD;CACE,OAAO,EAAS;CAChB,aAAa,EAAS;CACtB,SAAS,EAAS;AACnB,CAAA"}