@plumile/backoffice-react 0.1.67 → 0.1.69

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/synchronizeAuthStatusQuery.js +5 -4
  2. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
  3. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +7 -8
  4. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js +1 -1
  6. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  7. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js +4 -4
  8. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js.map +1 -1
  9. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +1 -1
  10. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
  11. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +26 -26
  12. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  13. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +1 -1
  14. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
  15. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  16. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  17. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +17 -18
  18. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  19. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js +7 -8
  20. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js.map +1 -1
  21. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +1 -2
  22. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  23. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js +1 -1
  24. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  25. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +1 -1
  26. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  27. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +4 -11
  28. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  29. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +3 -4
  30. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  31. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +4 -4
  32. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  33. package/lib/esm/index.js +43 -34
  34. package/lib/esm/pages/BackofficeDashboardPage.js +31 -32
  35. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  36. package/lib/esm/pages/BackofficeEntityDetailPage.js +167 -172
  37. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  38. package/lib/esm/pages/BackofficeLayoutPage.js +30 -34
  39. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  40. package/lib/esm/pages/BackofficeToolsOperationPage.js +26 -27
  41. package/lib/esm/pages/BackofficeToolsOperationPage.js.map +1 -1
  42. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  43. package/lib/types/auth/login/synchronizeAuthStatusQuery.d.ts.map +1 -1
  44. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  45. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts +1 -1
  46. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts.map +1 -1
  47. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -2
  48. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  49. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
  50. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
  51. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  52. package/lib/types/components/backoffice/pickers/shared/EntityPickerList.d.ts.map +1 -1
  53. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
  54. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  55. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
  56. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  57. package/lib/types/index.d.ts +11 -2
  58. package/lib/types/index.d.ts.map +1 -1
  59. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  60. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  61. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  62. package/lib/types/pages/BackofficeToolsOperationPage.d.ts.map +1 -1
  63. package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
  64. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  65. package/package.json +5 -5
@@ -8,13 +8,12 @@ import { useBackofficeDashboardConfig as o } from "../provider/useBackofficeLazy
8
8
  import { links as s, tileBody as c, tileCount as l, tilesGrid as u } from "./backofficeDashboardPage.css.js";
9
9
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
10
  import { useTranslation as p } from "react-i18next";
11
- import { DataTable as m, InfoTile as h } from "@plumile/ui";
12
- import { Suspense as g } from "react";
13
- import * as _ from "react-relay";
14
- import { Link as v } from "@plumile/router";
15
- import { DetailPageTemplate as y } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
11
+ import { DataTable as m, DetailPageTemplate as h, InfoTile as g } from "@plumile/ui";
12
+ import { Suspense as _ } from "react";
13
+ import * as v from "react-relay";
14
+ import { Link as y } from "@plumile/router";
16
15
  //#region src/pages/BackofficeDashboardPage.tsx
17
- var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
16
+ var { useLazyLoadQuery: b } = v, x = (e, t) => e(t), S = (e, t) => {
18
17
  switch (e.kind) {
19
18
  case "entityCount":
20
19
  case "shortcut": return e.label;
@@ -23,8 +22,8 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
23
22
  default: return t.title;
24
23
  }
25
24
  }, C = (e) => "query" in e && e.query != null, w = ({ widget: n, globalData: i }) => {
26
- let { t: a } = p(), { t: o } = e(), { entities: u } = t(), g = (e) => "resolve" in n && n.resolve != null ? n.resolve(e) : null;
27
- if (n.kind === "textBlock") return /* @__PURE__ */ d(h, {
25
+ let { t: a } = p(), { t: o } = e(), { entities: u } = t(), h = (e) => "resolve" in n && n.resolve != null ? n.resolve(e) : null;
26
+ if (n.kind === "textBlock") return /* @__PURE__ */ d(g, {
28
27
  title: x(n.title, a),
29
28
  children: /* @__PURE__ */ d("div", {
30
29
  className: c,
@@ -35,20 +34,20 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
35
34
  let e = u[n.entityId];
36
35
  if (e == null) return null;
37
36
  let t = x(n.label, a);
38
- return e.kind === "tool" ? /* @__PURE__ */ d(h, {
37
+ return e.kind === "tool" ? /* @__PURE__ */ d(g, {
39
38
  title: t,
40
39
  children: /* @__PURE__ */ d("div", {
41
40
  className: s,
42
- children: /* @__PURE__ */ d(v, {
41
+ children: /* @__PURE__ */ d(y, {
43
42
  to: e.routes.list,
44
43
  children: o("dashboard.actions.openTool")
45
44
  })
46
45
  })
47
- }) : /* @__PURE__ */ d(h, {
46
+ }) : /* @__PURE__ */ d(g, {
48
47
  title: t,
49
48
  children: /* @__PURE__ */ d("div", {
50
49
  className: s,
51
- children: /* @__PURE__ */ d(v, {
50
+ children: /* @__PURE__ */ d(y, {
52
51
  to: e.routes.list,
53
52
  children: o("dashboard.actions.openList")
54
53
  })
@@ -56,7 +55,7 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
56
55
  });
57
56
  }
58
57
  if (n.kind === "tablePreview") {
59
- let e = g(i);
58
+ let e = h(i);
60
59
  if (e == null) return null;
61
60
  let t = r(e.columns, {
62
61
  tApp: a,
@@ -66,7 +65,7 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
66
65
  return n == null ? null : n.routes.detail(t);
67
66
  }
68
67
  });
69
- return /* @__PURE__ */ d(h, {
68
+ return /* @__PURE__ */ d(g, {
70
69
  title: x(n.title, a),
71
70
  children: /* @__PURE__ */ d(m, {
72
71
  columns: t,
@@ -84,8 +83,8 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
84
83
  if (n.kind === "entityCount") {
85
84
  let e = u[n.entityId];
86
85
  if (e?.kind !== "list-detail") return null;
87
- let t = g(i), r = o("common.notAvailable");
88
- return typeof t?.count == "number" && (r = t.count), /* @__PURE__ */ d(h, {
86
+ let t = h(i), r = o("common.notAvailable");
87
+ return typeof t?.count == "number" && (r = t.count), /* @__PURE__ */ d(g, {
89
88
  title: x(n.label, a),
90
89
  children: /* @__PURE__ */ f("div", {
91
90
  className: c,
@@ -94,7 +93,7 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
94
93
  children: r
95
94
  }), /* @__PURE__ */ d("div", {
96
95
  className: s,
97
- children: /* @__PURE__ */ d(v, {
96
+ children: /* @__PURE__ */ d(y, {
98
97
  to: e.routes.list,
99
98
  children: o("dashboard.actions.openList")
100
99
  })
@@ -108,7 +107,7 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
108
107
  globalData: b(e.query, {}, { fetchPolicy: "store-or-network" })
109
108
  }), E = ({ config: t, globalData: r }) => {
110
109
  let { t: i } = p(), { t: a } = e();
111
- return /* @__PURE__ */ d(y, {
110
+ return /* @__PURE__ */ d(h, {
112
111
  header: {
113
112
  title: x(t.title, i),
114
113
  subtitle: (t.subtitle == null ? void 0 : x(t.subtitle, i)) ?? a("dashboard.subtitle")
@@ -121,15 +120,15 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
121
120
  globalData: r
122
121
  });
123
122
  return /* @__PURE__ */ d(n, {
124
- fallback: () => /* @__PURE__ */ d(h, {
123
+ fallback: () => /* @__PURE__ */ d(g, {
125
124
  title: x(S(e, t), i),
126
125
  children: /* @__PURE__ */ d("div", {
127
126
  className: c,
128
127
  children: a("common.notAvailable")
129
128
  })
130
129
  }),
131
- children: /* @__PURE__ */ d(g, {
132
- fallback: /* @__PURE__ */ d(h, {
130
+ children: /* @__PURE__ */ d(_, {
131
+ fallback: /* @__PURE__ */ d(g, {
133
132
  title: x(S(e, t), i),
134
133
  children: /* @__PURE__ */ d("div", {
135
134
  className: c,
@@ -146,22 +145,22 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
146
145
  config: e,
147
146
  globalData: b(e.query, {}, { fetchPolicy: "store-or-network" })
148
147
  }), O = () => {
149
- let { t: n } = p(), { t: r } = e(), { entities: m } = t(), g = o(), _ = a(r);
150
- if (g == null) {
148
+ let { t: n } = p(), { t: r } = e(), { entities: m } = t(), _ = o(), v = a(r);
149
+ if (_ == null) {
151
150
  let e = Object.values(m).filter((e) => e.kind === "list-detail" && e.hasList).map((e) => ({
152
151
  config: e,
153
152
  label: x(e.label, n)
154
153
  })).sort((e, t) => e.label.localeCompare(t.label));
155
154
  return /* @__PURE__ */ d(i, {
156
- breadcrumb: _,
157
- children: /* @__PURE__ */ d(y, {
155
+ breadcrumb: v,
156
+ children: /* @__PURE__ */ d(h, {
158
157
  header: {
159
158
  title: r("dashboard.title"),
160
159
  subtitle: r("dashboard.subtitle")
161
160
  },
162
161
  children: /* @__PURE__ */ d("div", {
163
162
  className: u,
164
- children: e.map(({ config: e, label: t }) => /* @__PURE__ */ d(h, {
163
+ children: e.map(({ config: e, label: t }) => /* @__PURE__ */ d(g, {
165
164
  title: t,
166
165
  children: /* @__PURE__ */ f("div", {
167
166
  className: c,
@@ -170,7 +169,7 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
170
169
  children: r("common.notAvailable")
171
170
  }), /* @__PURE__ */ d("div", {
172
171
  className: s,
173
- children: /* @__PURE__ */ d(v, {
172
+ children: /* @__PURE__ */ d(y, {
174
173
  to: e.routes.list,
175
174
  children: r("dashboard.actions.openList")
176
175
  })
@@ -181,15 +180,15 @@ var { useLazyLoadQuery: b } = _, x = (e, t) => e(t), S = (e, t) => {
181
180
  })
182
181
  });
183
182
  }
184
- return g.query == null ? /* @__PURE__ */ d(i, {
185
- breadcrumb: _,
183
+ return _.query == null ? /* @__PURE__ */ d(i, {
184
+ breadcrumb: v,
186
185
  children: /* @__PURE__ */ d(E, {
187
- config: g,
186
+ config: _,
188
187
  globalData: null
189
188
  })
190
189
  }) : /* @__PURE__ */ d(i, {
191
- breadcrumb: _,
192
- children: /* @__PURE__ */ d(D, { config: g })
190
+ breadcrumb: v,
191
+ children: /* @__PURE__ */ d(D, { config: _ })
193
192
  });
194
193
  };
195
194
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport { Link } from '@plumile/router';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { DataTable, InfoTile } from '@plumile/ui';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getWidgetLabel = (\n widget: BackofficeDashboardWidget,\n config: BackofficeDashboardConfig,\n): I18nLabel => {\n switch (widget.kind) {\n case 'entityCount':\n case 'shortcut':\n return widget.label;\n case 'tablePreview':\n case 'textBlock':\n return widget.title;\n default:\n return config.title;\n }\n};\n\nconst hasWidgetQuery = (\n widget: BackofficeDashboardWidget,\n): widget is BackofficeDashboardWidget & { query: GraphQLTaggedNode } => {\n return 'query' in widget && widget.query != null;\n};\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <InfoTile title={title}>\n <div className={styles.tileBody}>{body}</div>\n </InfoTile>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n if (entity == null) {\n return null;\n }\n const title = resolveLabel(widget.label, tApp);\n if (entity.kind === 'tool') {\n return (\n <InfoTile title={title}>\n <div className={styles.links}>\n <Link to={entity.routes.list}>\n {t('dashboard.actions.openTool')}\n </Link>\n </div>\n </InfoTile>\n );\n }\n return (\n <InfoTile title={title}>\n <div className={styles.links}>\n <Link to={entity.routes.list}>{t('dashboard.actions.openList')}</Link>\n </div>\n </InfoTile>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return null;\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n },\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <InfoTile title={title}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </InfoTile>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (widget.kind === 'entityCount') {\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return null;\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <InfoTile title={title}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <div className={styles.links}>\n <Link to={entityManifest.routes.list}>\n {t('dashboard.actions.openList')}\n </Link>\n </div>\n </div>\n </InfoTile>\n );\n }\n\n return null;\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <div className={styles.tilesGrid}>\n {config.widgets.map((widget) => {\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <BackofficeErrorBoundary\n key={widget.id}\n fallback={() => {\n return (\n <InfoTile\n title={resolveLabel(getWidgetLabel(widget, config), tApp)}\n >\n <div className={styles.tileBody}>\n {t('common.notAvailable')}\n </div>\n </InfoTile>\n );\n }}\n >\n <Suspense\n fallback={\n <InfoTile\n title={resolveLabel(getWidgetLabel(widget, config), tApp)}\n >\n <div className={styles.tileBody}>{t('common.loading')}</div>\n </InfoTile>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n );\n })}\n </div>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport const BackofficeDashboardPage = (): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const dashboard = useBackofficeDashboardConfig();\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <div className={styles.tilesGrid}>\n {items.map(({ config, label }) => {\n return (\n <InfoTile key={config.id} title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <div className={styles.links}>\n <Link to={config.routes.list}>\n {t('dashboard.actions.openList')}\n </Link>\n </div>\n </div>\n </InfoTile>\n );\n })}\n </div>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport { Link } from '@plumile/router';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { DataTable, DetailPageTemplate, InfoTile } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getWidgetLabel = (\n widget: BackofficeDashboardWidget,\n config: BackofficeDashboardConfig,\n): I18nLabel => {\n switch (widget.kind) {\n case 'entityCount':\n case 'shortcut':\n return widget.label;\n case 'tablePreview':\n case 'textBlock':\n return widget.title;\n default:\n return config.title;\n }\n};\n\nconst hasWidgetQuery = (\n widget: BackofficeDashboardWidget,\n): widget is BackofficeDashboardWidget & { query: GraphQLTaggedNode } => {\n return 'query' in widget && widget.query != null;\n};\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <InfoTile title={title}>\n <div className={styles.tileBody}>{body}</div>\n </InfoTile>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n if (entity == null) {\n return null;\n }\n const title = resolveLabel(widget.label, tApp);\n if (entity.kind === 'tool') {\n return (\n <InfoTile title={title}>\n <div className={styles.links}>\n <Link to={entity.routes.list}>\n {t('dashboard.actions.openTool')}\n </Link>\n </div>\n </InfoTile>\n );\n }\n return (\n <InfoTile title={title}>\n <div className={styles.links}>\n <Link to={entity.routes.list}>{t('dashboard.actions.openList')}</Link>\n </div>\n </InfoTile>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return null;\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n },\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <InfoTile title={title}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </InfoTile>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (widget.kind === 'entityCount') {\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return null;\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <InfoTile title={title}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <div className={styles.links}>\n <Link to={entityManifest.routes.list}>\n {t('dashboard.actions.openList')}\n </Link>\n </div>\n </div>\n </InfoTile>\n );\n }\n\n return null;\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <div className={styles.tilesGrid}>\n {config.widgets.map((widget) => {\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <BackofficeErrorBoundary\n key={widget.id}\n fallback={() => {\n return (\n <InfoTile\n title={resolveLabel(getWidgetLabel(widget, config), tApp)}\n >\n <div className={styles.tileBody}>\n {t('common.notAvailable')}\n </div>\n </InfoTile>\n );\n }}\n >\n <Suspense\n fallback={\n <InfoTile\n title={resolveLabel(getWidgetLabel(widget, config), tApp)}\n >\n <div className={styles.tileBody}>{t('common.loading')}</div>\n </InfoTile>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n );\n })}\n </div>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport const BackofficeDashboardPage = (): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const dashboard = useBackofficeDashboardConfig();\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <div className={styles.tilesGrid}>\n {items.map(({ config, label }) => {\n return (\n <InfoTile key={config.id} title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <div className={styles.links}>\n <Link to={config.routes.list}>\n {t('dashboard.actions.openList')}\n </Link>\n </div>\n </div>\n </InfoTile>\n );\n })}\n </div>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}