@plumile/backoffice-react 0.1.171 → 0.1.172

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 (52) hide show
  1. package/lib/esm/auth/authRefreshNotice.css.js +0 -1
  2. package/lib/esm/auth/login/loginPage.css.js +1 -0
  3. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +9 -9
  4. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +4 -4
  5. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +0 -1
  6. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js +16 -15
  7. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
  8. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +43 -35
  9. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  10. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +1 -0
  11. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +2 -2
  12. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
  13. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +182 -182
  14. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  15. package/lib/esm/i18n/locales/en/backofficeReact.js +1 -8
  16. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  17. package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -9
  18. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  19. package/lib/esm/index.js +22 -22
  20. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +138 -85
  21. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  22. package/lib/esm/pages/BackofficeEntityDetailPage.js +139 -183
  23. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  24. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +185 -203
  25. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  26. package/lib/esm/pages/BackofficeEntityListPage.js +33 -33
  27. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  28. package/lib/esm/pages/backofficeEntityDetailPage.css.js +2 -2
  29. package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -1
  30. package/lib/esm/style.css +1 -1
  31. package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts +7 -5
  32. package/lib/types/components/backoffice/refs/BackofficeLazyEntityCount.d.ts.map +1 -1
  33. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  34. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts +1 -0
  35. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
  36. package/lib/types/i18n/resources.d.ts +0 -15
  37. package/lib/types/i18n/resources.d.ts.map +1 -1
  38. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  39. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  40. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +2 -13
  41. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  42. package/lib/types/pages/backofficeEntityDetailPage.css.d.ts +1 -0
  43. package/lib/types/pages/backofficeEntityDetailPage.css.d.ts.map +1 -1
  44. package/package.json +6 -6
  45. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +0 -63
  46. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +0 -1
  47. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +0 -134
  48. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +0 -1
  49. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts +0 -11
  50. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +0 -1
  51. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts +0 -10
  52. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +0 -1
@@ -4,114 +4,167 @@ import { useBackofficeFragment as n } from "../relay/typedRelayHooks.js";
4
4
  import { BackofficeDetailBadgeRow as r } from "../components/backoffice/detail/BackofficeDetailBadgeRow.js";
5
5
  import { BackofficeRightPageLayout as i } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
6
6
  import { buildEntityDetailBreadcrumb as a } from "../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js";
7
- import { BackofficeEntityDetailNotFound as o } from "../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js";
8
- import { resolveVisibleDetailPages as s } from "./detail/pageResolution.js";
9
- import { headerBlock as c, headerMeta as l, headerMetaList as u } from "./backofficeEntityDetailPage.css.js";
10
- import { resolveHeaderItems as d } from "./BackofficeEntityDetailPage.view-helpers.js";
11
- import { BackofficeEntityDetailLayoutContextProvider as f } from "./detail/BackofficeEntityDetailLayoutContext.js";
12
- import { buildTabsItems as p } from "./detail/buildTabsItems.js";
13
- import { BackofficeRedirect as m } from "./BackofficeRedirect.js";
14
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
15
- import { useTranslation as v } from "react-i18next";
16
- import * as y from "react-relay";
17
- import { FormattedDate as b } from "@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js";
18
- import { BACKOFFICE_DATE_TIME_OPTIONS as x } from "@plumile/backoffice-core/constants.js";
19
- import S from "@plumile/router/routing/Link.js";
20
- import { Tag as C } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
21
- import { BackofficePageHeader as w } from "@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js";
22
- import T from "@plumile/router/routing/useLocation.js";
23
- import { Tabs as E } from "@plumile/ui/atomic/molecules/tabs/Tabs.js";
24
- import { DetailPageTemplate as D } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
25
- import { BackofficeKeyValueList as O } from "@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js";
7
+ import { BackofficeLazyEntityCount as o } from "../components/backoffice/refs/BackofficeLazyEntityCount.js";
8
+ import { BackofficeEntityDetailNotFound as s } from "../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js";
9
+ import { resolveVisibleDetailPages as c } from "./detail/pageResolution.js";
10
+ import { headerBlock as l, headerMeta as u, headerMetaList as d, headerRelationGroup as ee, relationCountLoading as f } from "./backofficeEntityDetailPage.css.js";
11
+ import { resolveLabel as p, resolveRelationValue as m } from "./BackofficeEntityDetailPage.helpers.js";
12
+ import { resolveHeaderItems as h } from "./BackofficeEntityDetailPage.view-helpers.js";
13
+ import { BackofficeEntityDetailLayoutContextProvider as g } from "./detail/BackofficeEntityDetailLayoutContext.js";
14
+ import { buildTabsItems as te } from "./detail/buildTabsItems.js";
15
+ import { BackofficeRedirect as _ } from "./BackofficeRedirect.js";
16
+ import { useContext as ne } from "react";
17
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
18
+ import { useTranslation as x } from "react-i18next";
19
+ import * as S from "react-relay";
20
+ import { Spinner as C } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
21
+ import w from "@plumile/router/routing/RoutingContext.js";
22
+ import { FormattedDate as T } from "@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js";
23
+ import { BACKOFFICE_DATE_TIME_OPTIONS as E } from "@plumile/backoffice-core/constants.js";
24
+ import D from "@plumile/router/routing/Link.js";
25
+ import { Tag as re } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
26
+ import { buildBackofficeFallbackListHref as ie, buildBackofficeListHref as ae, buildBackofficeListLink as oe } from "@plumile/backoffice-core/state/buildListHref.js";
27
+ import { setWhereValue as se } from "@plumile/backoffice-core/filters/where.js";
28
+ import ce from "@plumile/router/routing/useLocation.js";
29
+ import { BackofficePageHeader as O } from "@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js";
30
+ import { Tabs as k } from "@plumile/ui/atomic/molecules/tabs/Tabs.js";
31
+ import { DetailPageTemplate as A } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
32
+ import { BackofficeKeyValueList as j } from "@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js";
33
+ import { BackofficeRelationsMenu as M } from "@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js";
26
34
  //#region src/pages/BackofficeEntityDetailLayoutPage.tsx
27
- var { usePreloadedQuery: k } = y, A = (e) => e.trim().replace(/^\/+|\/+$/g, ""), j = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", M = ({ config: o, prepared: y, layoutNodeRef: k, children: M }) => {
28
- let { t: N } = v(), { t: P } = e(), { entities: F } = t(), { pathname: I } = T(), L = n(o.layoutPage.fragment, k), R = o.layoutPage.toView(L), z = j(I, y.id, o), B = s({
29
- mainPage: o.pages.mainPage,
30
- subPages: o.pages.subPages,
31
- activePagePath: z,
32
- node: R
35
+ var { usePreloadedQuery: N } = S, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""), F = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", I = () => /* @__PURE__ */ y("span", {
36
+ className: f,
37
+ children: /* @__PURE__ */ y(C, { size: 12 })
38
+ }), L = ({ config: s, prepared: f, layoutNodeRef: S, children: C }) => {
39
+ let { t: N } = x(), { t: L } = e(), { entities: R, entityRegistry: z } = t(), { pathname: B } = ce(), V = ne(w), H = n(s.layoutPage.fragment, S), U = s.layoutPage.toView(H), W = F(B, f.id, s), G = c({
40
+ mainPage: s.pages.mainPage,
41
+ subPages: s.pages.subPages,
42
+ activePagePath: W,
43
+ node: U
33
44
  });
34
- if (!B.hasVisiblePages || B.activePage == null) return /* @__PURE__ */ g(m, { to: o.routes.list });
35
- let { activePage: V } = B;
36
- if (z !== "" && A(V.path) !== A(z)) return /* @__PURE__ */ g(m, { to: o.routes.detailPage(y.id, V.id) });
37
- let H = p({
38
- pages: B.pages,
39
- id: y.id,
45
+ if (!G.hasVisiblePages || G.activePage == null) return /* @__PURE__ */ y(_, { to: s.routes.list });
46
+ let { activePage: K } = G;
47
+ if (W !== "" && P(K.path) !== P(W)) return /* @__PURE__ */ y(_, { to: s.routes.detailPage(f.id, K.id) });
48
+ let q = te({
49
+ pages: G.pages,
50
+ id: f.id,
40
51
  tApp: N,
41
- detailPageHref: o.routes.detailPage
42
- }), U = d(o.header, R, {
52
+ detailPageHref: s.routes.detailPage
53
+ }), J = h(s.header, U, {
43
54
  tApp: N,
44
- t: P,
55
+ t: L,
45
56
  resolveEntityHref: (e, t) => {
46
- let n = F[e];
57
+ let n = R[e];
47
58
  return n == null ? null : n.routes.detail(t);
48
59
  },
49
- renderLink: (e, t) => /* @__PURE__ */ g(S, {
60
+ renderLink: (e, t) => /* @__PURE__ */ y(D, {
50
61
  to: e,
51
62
  preloadOnMouseEnter: !0,
52
63
  children: t
53
64
  }),
54
- renderDate: (e, t) => /* @__PURE__ */ g(b, {
65
+ renderDate: (e, t) => /* @__PURE__ */ y(T, {
55
66
  value: e,
56
- options: x,
67
+ options: E,
57
68
  fallback: t
58
69
  }),
59
- renderTag: (e, t) => /* @__PURE__ */ g(C, {
70
+ renderTag: (e, t) => /* @__PURE__ */ y(re, {
60
71
  tone: e,
61
72
  children: t
62
73
  }),
63
- renderBadgeRow: (e) => /* @__PURE__ */ g(r, { items: e })
64
- }), W = a({
65
- config: o,
74
+ renderBadgeRow: (e) => /* @__PURE__ */ y(r, { items: e })
75
+ }), Y = (s.relations ?? []).flatMap((e) => {
76
+ let { filterId: t, path: n, target: r, whereKey: i } = e, a = m(e.value(U));
77
+ if (a == null) return [];
78
+ let s = R[r];
79
+ if (s?.hasList !== !0) return [];
80
+ let c = se(null, i, a, n);
81
+ if (c == null) return [];
82
+ let l = z.getLoadedListEntity(r), u = t;
83
+ u ?? (u = i, n != null && (u = `${i}.${n.join(".")}`));
84
+ let d;
85
+ return d = l == null ? ie(s.routes.list, c, [{
86
+ id: u,
87
+ value: a
88
+ }]) : ae(l.config, { where: c }), [{
89
+ id: e.id,
90
+ label: p(e.label, N),
91
+ count: /* @__PURE__ */ y(o, {
92
+ entity: r,
93
+ loadingFallback: /* @__PURE__ */ y(I, {}),
94
+ where: c
95
+ }),
96
+ href: d,
97
+ onClick: async (e) => {
98
+ if (V == null || e.defaultPrevented || e.button !== 0 || e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;
99
+ e.preventDefault();
100
+ let t = oe((await z.loadListEntity(r)).config, { where: c }), n = "";
101
+ t.search !== "" && (n = `?${t.search}`), V.history.push({
102
+ pathname: t.pathname,
103
+ search: n,
104
+ hash: ""
105
+ });
106
+ }
107
+ }];
108
+ }), le = a({
109
+ config: s,
66
110
  tApp: N,
67
- entityId: y.id,
68
- layoutView: R,
69
- pageLabel: V.label(N),
70
- pageId: V.id
71
- }), G;
72
- (U.status != null || U.badges != null) && (G = /* @__PURE__ */ _("div", {
73
- className: l,
74
- children: [U.status, U.badges]
75
- }));
76
- let K = null;
77
- U.items != null && U.items.length > 0 && (K = /* @__PURE__ */ g("div", {
111
+ entityId: f.id,
112
+ layoutView: U,
113
+ pageLabel: K.label(N),
114
+ pageId: K.id
115
+ }), X;
116
+ (J.status != null || J.badges != null) && (X = /* @__PURE__ */ b("div", {
78
117
  className: u,
79
- children: /* @__PURE__ */ g(O, { items: U.items })
118
+ children: [J.status, J.badges]
119
+ }));
120
+ let Z = null;
121
+ J.items != null && J.items.length > 0 && (Z = /* @__PURE__ */ y("div", {
122
+ className: d,
123
+ children: /* @__PURE__ */ y(j, { items: J.items })
80
124
  }));
81
- let q = /* @__PURE__ */ _("div", {
82
- className: c,
83
- children: [/* @__PURE__ */ g(w, {
84
- title: U.title,
85
- subtitle: U.subtitle,
86
- meta: G
87
- }), K]
88
- }), J = null;
89
- return B.pages.length > 1 && (J = /* @__PURE__ */ g(E, {
90
- items: H,
91
- activeId: V.id,
125
+ let Q;
126
+ Y.length > 0 && (Q = /* @__PURE__ */ y("div", {
127
+ className: ee,
128
+ children: /* @__PURE__ */ y(M, {
129
+ label: L("relations.menu.label"),
130
+ items: Y
131
+ })
132
+ }));
133
+ let ue = /* @__PURE__ */ b("div", {
134
+ className: l,
135
+ children: [/* @__PURE__ */ y(O, {
136
+ title: J.title,
137
+ subtitle: J.subtitle,
138
+ meta: X,
139
+ actions: Q
140
+ }), Z]
141
+ }), $ = null;
142
+ return G.pages.length > 1 && ($ = /* @__PURE__ */ y(k, {
143
+ items: q,
144
+ activeId: K.id,
92
145
  variant: "underline"
93
- })), /* @__PURE__ */ g(f, {
146
+ })), /* @__PURE__ */ y(g, {
94
147
  value: {
95
- activePage: V,
96
- config: o,
97
- entityId: y.id,
98
- layoutView: R,
99
- tabsItems: H,
100
- visiblePages: B.pages
148
+ activePage: K,
149
+ config: s,
150
+ entityId: f.id,
151
+ layoutView: U,
152
+ tabsItems: q,
153
+ visiblePages: G.pages
101
154
  },
102
- children: /* @__PURE__ */ g(i, {
103
- breadcrumb: W,
104
- children: /* @__PURE__ */ g(D, {
105
- headerNode: q,
106
- tabsNode: J,
155
+ children: /* @__PURE__ */ y(i, {
156
+ breadcrumb: le,
157
+ children: /* @__PURE__ */ y(A, {
158
+ headerNode: ue,
159
+ tabsNode: $,
107
160
  headerDensity: "compact",
108
- children: /* @__PURE__ */ g(h, { children: M })
161
+ children: /* @__PURE__ */ y(v, { children: C })
109
162
  })
110
163
  })
111
164
  });
112
- }, N = ({ config: t, prepared: n, children: r }) => {
113
- let { t: a } = v(), { t: s } = e(), c = k(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
114
- return l == null ? /* @__PURE__ */ g(i, {
165
+ }, R = ({ config: t, prepared: n, children: r }) => {
166
+ let { t: a } = x(), { t: o } = e(), c = N(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
167
+ return l == null ? /* @__PURE__ */ y(i, {
115
168
  breadcrumb: [{
116
169
  kind: "link",
117
170
  target: {
@@ -126,10 +179,10 @@ var { usePreloadedQuery: k } = y, A = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
126
179
  entityId: t.id,
127
180
  id: n.id
128
181
  },
129
- label: s("detail.notFound")
182
+ label: o("detail.notFound")
130
183
  }],
131
- children: /* @__PURE__ */ g(o, { listHref: t.routes.list })
132
- }) : /* @__PURE__ */ g(M, {
184
+ children: /* @__PURE__ */ y(s, { listHref: t.routes.list })
185
+ }) : /* @__PURE__ */ y(L, {
133
186
  config: t,
134
187
  prepared: n,
135
188
  layoutNodeRef: l,
@@ -137,6 +190,6 @@ var { usePreloadedQuery: k } = y, A = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
137
190
  });
138
191
  };
139
192
  //#endregion
140
- export { N as BackofficeEntityDetailLayoutPage, N as default };
193
+ export { R as BackofficeEntityDetailLayoutPage, R as default };
141
194
 
142
195
  //# sourceMappingURL=BackofficeEntityDetailLayoutPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const { pathname } = useLocation();\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnMouseEnter>\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <>{children}</>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnMouseEnter>\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { filterId: configuredFilterId, path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterId = configuredFilterId;\n if (filterId == null) {\n filterId = whereKey;\n if (path != null) {\n filterId = `${whereKey}.${path.join('.')}`;\n }\n }\n\n let href: string;\n if (loadedEntity == null) {\n href = buildBackofficeFallbackListHref(\n entityManifest.routes.list,\n where,\n [\n {\n id: filterId,\n value,\n },\n ],\n );\n } else {\n href = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n href,\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n routing.history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n },\n },\n ];\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <>{children}</>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,IAAM,EAAE,mBAAA,MAAsB,GAExB,KAAiB,MACd,EAAM,KAAK,EAAE,QAAQ,cAAc,EAAE,GAGxC,KACJ,GACA,GACA,MAGmB,CADJ,EAAO,MAAM,UAAU,GAAI,EAAO,MAAM,YAAY,CAAC,CACjD,EAAM,MAAM,MACtB,MAAa,EAAO,OAAO,WAAW,GAAI,EAAK,EAAE,CAEnD,GAAY,QAAQ,IAGvB,UAEF,kBAAC,QAAD;CAAM,WAAW;WACf,kBAAC,GAAD,EAAS,MAAM,GAAK,CAAA;AAChB,CAAA,GAkBJ,KAA2C,EAC/C,WACA,aACA,kBACA,kBAC+D;CAC/D,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,aAAU,sBAAmB,EAAoB,GACnD,EAAE,gBAAa,GAAY,GAC3B,IAAU,GAAW,CAAc,GACnC,IAAa,EACjB,EAAO,WAAW,UAClB,CACF,GAEM,IAAa,EAAO,WAAW,OAAO,CAAU,GAChD,IAAiB,EAAsB,GAAU,EAAS,IAAI,CAAM,GACpE,IAAgB,EAA0B;EAC9C,UAAU,EAAO,MAAM;EACvB,UAAU,EAAO,MAAM;EACvB;EACA,MAAM;CACR,CAAC;CAED,IAAI,CAAC,EAAc,mBAAmB,EAAc,cAAc,MAChE,OAAO,kBAAC,GAAD,EAAoB,IAAI,EAAO,OAAO,KAAO,CAAA;CAGtD,IAAM,EAAE,kBAAe;CACvB,IACE,MAAmB,MACnB,EAAc,EAAW,IAAI,MAAM,EAAc,CAAc,GAE/D,OACE,kBAAC,GAAD,EACE,IAAI,EAAO,OAAO,WAAW,EAAS,IAAI,EAAW,EAAE,EACxD,CAAA;CAIL,IAAM,IAAY,GAAe;EAC/B,OAAO,EAAc;EACrB,IAAI,EAAS;EACb;EACA,gBAAgB,EAAO,OAAO;CAChC,CAAC,GAQK,IAAS,EAAmB,EAAO,QAAQ,GAAY;EAC3D;EACA;EACA,oBAVyB,GAAkB,MAAkB;GAC7D,IAAM,IAAe,EAAS;GAI9B,OAHI,KAAgB,OACX,OAEF,EAAa,OAAO,OAAO,CAAK;EACzC;EAKE,aAAa,GAAM,MAEf,kBAAC,GAAD;GAAM,IAAI;GAAM,qBAAA;aACb;EACG,CAAA;EAGV,aAAa,GAAO,MAEhB,kBAAC,GAAD;GACS;GACP,SAAS;GACC;EACX,CAAA;EAGL,YAAY,GAAM,MACT,kBAAC,IAAD;GAAW;aAAO;EAAW,CAAA;EAEtC,iBAAiB,MACR,kBAAC,GAAD,EAAiC,SAAQ,CAAA;CAEpD,CAAC,GACK,KACJ,EAAO,aAAa,CAAC,GACrB,SAAS,MAAa;EACtB,IAAM,EAAE,UAAU,GAAoB,SAAM,WAAQ,gBAAa,GAC3D,IAAQ,EAAqB,EAAS,MAAM,CAAU,CAAC;EAC7D,IAAI,KAAS,MACX,OAAO,CAAC;EAGV,IAAM,IAAiB,EAAS;EAChC,IAAI,GAAgB,YAAY,IAC9B,OAAO,CAAC;EAGV,IAAM,IAAQ,GAAc,MAAM,GAAU,GAAO,CAAI;EACvD,IAAI,KAAS,MACX,OAAO,CAAC;EAGV,IAAM,IAAe,EAAe,oBAAoB,CAAM,GAC1D,IAAW;EACf,AAAI,MACF,IAAW,GACP,KAAQ,SACV,IAAW,GAAG,EAAS,GAAG,EAAK,KAAK,GAAG;EAI3C,IAAI;EAgBJ,OAfA,AAYE,IAZE,KAAgB,OACX,GACL,EAAe,OAAO,MACtB,GACA,CACE;GACE,IAAI;GACJ;EACF,CACF,CACF,IAEO,GAAwB,EAAa,QAAQ,EAAE,SAAM,CAAC,GAGxD,CACL;GACE,IAAI,EAAS;GACb,OAAO,EAAa,EAAS,OAAO,CAAI;GACxC,OACE,kBAAC,GAAD;IACE,QAAQ;IACR,iBAAiB,kBAAC,GAAD,CAAuB,CAAA;IACjC;GACR,CAAA;GAEH;GACA,SAAS,OAAO,MAAU;IACxB,IACE,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,UAEN;IAGF,EAAM,eAAe;IAGrB,IAAM,IAAO,IAAwB,MADZ,EAAe,eAAe,CAAM,GACb,QAAQ,EAAE,SAAM,CAAC,GAE7D,IAAS;IAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,QAAQ,KAAK;KACnB,UAAU,EAAK;KACf;KACA,MAAM;IACR,CAAC;GACH;EACF,CACF;CACF,CAAC,GACK,KAAa,EAA4B;EAC7C;EACA;EACA,UAAU,EAAS;EACnB;EACA,WAAW,EAAW,MAAM,CAAI;EAChC,QAAQ,EAAW;CACrB,CAAC,GACG;CACJ,CAAI,EAAO,UAAU,QAAQ,EAAO,UAAU,UAC5C,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,EAAO,QACP,EAAO,MACL;;CAGT,IAAI,IAAsC;CAC1C,AAAI,EAAO,SAAS,QAAQ,EAAO,MAAM,SAAS,MAChD,IACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD,EAAwB,OAAO,EAAO,MAAQ,CAAA;CAC3C,CAAA;CAGT,IAAI;CACJ,AAAI,EAAkB,SAAS,MAC7B,IACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD;GACE,OAAO,EAAE,sBAAsB;GAC/B,OAAO;EACR,CAAA;CACE,CAAA;CAIT,IAAM,KACJ,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,GAAD;GACE,OAAO,EAAO;GACd,UAAU,EAAO;GACjB,MAAM;GACN,SAAS;EACV,CAAA,GACA,CACE;KAEH,IAA+B;CAOnC,OANI,EAAc,MAAM,SAAS,MAC/B,IACE,kBAAC,GAAD;EAAM,OAAO;EAAW,UAAU,EAAW;EAAI,SAAQ;CAAa,CAAA,IAKxE,kBAAC,GAAD;EACE,OAAO;GACL;GACA;GACA,UAAU,EAAS;GACnB;GACA;GACA,cAAc,EAAc;EAC9B;YAEA,kBAAC,GAAD;GAAuC;aACrC,kBAAC,GAAD;IACc;IACF;IACV,eAAc;cAEd,kBAAA,GAAA,EAAG,YAAW,CAAA;GACI,CAAA;EACK,CAAA;CACgB,CAAA;AAEjD,GAEa,KAAoC,EAC/C,WACA,aACA,kBACwD;CACxD,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAkB,EACtB,EAAO,WAAW,OAClB,EAAS,WACX,GACM,IAAgB,EAAO,WAAW,YAAY,GAAiB,EACnE,IAAI,EAAS,GACf,CAAC;CA8BD,OA5BI,KAAiB,OAEjB,kBAAC,GAAD;EACE,YAAY,CACV;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAO;GACnB;GACA,OAAO,EAAO,MAAM,CAAI;EAC1B,GACA;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAO;IACjB,IAAI,EAAS;GACf;GACA,OAAO,EAAE,iBAAiB;EAC5B,CACF;YAEA,kBAAC,GAAD,EAAgC,UAAU,EAAO,OAAO,KAAO,CAAA;CACtC,CAAA,IAK7B,kBAAC,GAAD;EACU;EACE;EACK;EAEd;CACsC,CAAA;AAE7C"}