@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
@@ -1,9 +1,10 @@
1
- import { fetchQuery as e } from "relay-runtime";
1
+ import e from "relay-runtime";
2
2
  //#region src/auth/login/synchronizeAuthStatusQuery.ts
3
- async function t(t, n) {
4
- return (await e(t, n, {}, { fetchPolicy: "network-only" }).toPromise())?.isLoggedIn === !0;
3
+ var { fetchQuery: t } = e;
4
+ async function n(e, n) {
5
+ return (await t(e, n, {}, { fetchPolicy: "network-only" }).toPromise())?.isLoggedIn === !0;
5
6
  }
6
7
  //#endregion
7
- export { t as synchronizeAuthStatusQuery };
8
+ export { n as synchronizeAuthStatusQuery };
8
9
 
9
10
  //# sourceMappingURL=synchronizeAuthStatusQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"synchronizeAuthStatusQuery.js","names":[],"sources":["../../../../src/auth/login/synchronizeAuthStatusQuery.ts"],"sourcesContent":["import {\n fetchQuery,\n type GraphQLTaggedNode,\n type IEnvironment,\n type OperationType,\n} from 'relay-runtime';\n\ntype AuthStatusQueryResponse = {\n readonly isLoggedIn?: boolean | null;\n};\n\n/**\n * Forces a fresh auth-status read from network to avoid stale cache guards\n * right after login mutations complete.\n */\nexport async function synchronizeAuthStatusQuery<TQuery extends OperationType>(\n environment: IEnvironment,\n query: GraphQLTaggedNode,\n): Promise<boolean> {\n const response = await fetchQuery<TQuery>(\n environment,\n query,\n {},\n { fetchPolicy: 'network-only' },\n ).toPromise();\n\n const isLoggedIn = (response as AuthStatusQueryResponse | null | undefined)\n ?.isLoggedIn;\n return isLoggedIn === true;\n}\n"],"mappings":";;AAeA,eAAsB,EACpB,GACA,GACkB;AAUlB,SATiB,MAAM,EACrB,GACA,GACA,EAAE,EACF,EAAE,aAAa,gBAAgB,CAChC,CAAC,WAAW,GAGT,eACkB"}
1
+ {"version":3,"file":"synchronizeAuthStatusQuery.js","names":[],"sources":["../../../../src/auth/login/synchronizeAuthStatusQuery.ts"],"sourcesContent":["import RelayRuntime, {\n type GraphQLTaggedNode,\n type IEnvironment,\n type OperationType,\n} from 'relay-runtime';\n\nconst { fetchQuery } = RelayRuntime;\n\ntype AuthStatusQueryResponse = {\n readonly isLoggedIn?: boolean | null;\n};\n\n/**\n * Forces a fresh auth-status read from network to avoid stale cache guards\n * right after login mutations complete.\n */\nexport async function synchronizeAuthStatusQuery<TQuery extends OperationType>(\n environment: IEnvironment,\n query: GraphQLTaggedNode,\n): Promise<boolean> {\n const response = await fetchQuery<TQuery>(\n environment,\n query,\n {},\n { fetchPolicy: 'network-only' },\n ).toPromise();\n\n const isLoggedIn = (response as AuthStatusQueryResponse | null | undefined)\n ?.isLoggedIn;\n return isLoggedIn === true;\n}\n"],"mappings":";;AAMA,IAAM,EAAE,YAAA,MAAe;AAUvB,eAAsB,EACpB,GACA,GACkB;AAUlB,SATiB,MAAM,EACrB,GACA,GACA,EAAE,EACF,EAAE,aAAa,gBAAgB,CAChC,CAAC,WAAW,GAGT,eACkB"}
@@ -1,8 +1,7 @@
1
1
  import { Fragment as e, jsx as t } from "react/jsx-runtime";
2
- import { FormattedDate as n } from "@plumile/ui";
3
- import { Link as r } from "@plumile/router";
4
- import { BACKOFFICE_DATE_TIME_OPTIONS as i } from "@plumile/backoffice-core/constants.js";
5
- import { Tag as a } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
2
+ import { FormattedDate as n, Tag as r } from "@plumile/ui";
3
+ import { Link as i } from "@plumile/router";
4
+ import { BACKOFFICE_DATE_TIME_OPTIONS as a } from "@plumile/backoffice-core/constants.js";
6
5
  //#region src/components/backoffice/columns/buildDataTableColumns.tsx
7
6
  var o = (e, t) => e(t), s = (e, t) => e == null || typeof e == "string" && e.trim() === "" ? t : String(e);
8
7
  function c(c, l) {
@@ -17,7 +16,7 @@ function c(c, l) {
17
16
  case "text": return s(l.value(o), p);
18
17
  case "link": {
19
18
  let e = l.value(o);
20
- return e == null || typeof e == "string" && e.trim() === "" ? p : /* @__PURE__ */ t(r, {
19
+ return e == null || typeof e == "string" && e.trim() === "" ? p : /* @__PURE__ */ t(i, {
21
20
  to: l.to(o),
22
21
  children: e
23
22
  });
@@ -26,7 +25,7 @@ function c(c, l) {
26
25
  let e = l.value(o);
27
26
  if (e == null || e.trim() === "") return p;
28
27
  let { tone: n } = l;
29
- return typeof n == "function" && (n = n(o)), /* @__PURE__ */ t(a, {
28
+ return typeof n == "function" && (n = n(o)), /* @__PURE__ */ t(r, {
30
29
  tone: n,
31
30
  children: e
32
31
  });
@@ -34,13 +33,13 @@ function c(c, l) {
34
33
  case "dateTime": return /* @__PURE__ */ t(n, {
35
34
  value: l.value(o),
36
35
  fallback: p,
37
- options: i
36
+ options: a
38
37
  });
39
38
  case "entityRef": {
40
39
  let e = l.value(o);
41
40
  if (e.trim() === "") return p;
42
41
  let n = f?.(l.entity, e) ?? null;
43
- return n == null ? p : /* @__PURE__ */ t(r, {
42
+ return n == null ? p : /* @__PURE__ */ t(i, {
44
43
  to: n,
45
44
  children: d("actions.view")
46
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"buildDataTableColumns.js","names":[],"sources":["../../../../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Link } from '@plumile/router';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { FormattedDate, type DataTableColumn } from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return <Link to={cell.to(row)}>{value}</Link>;\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const href = resolveEntityHref?.(cell.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{t('actions.view')}</Link>;\n }\n return fallback;\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;;AAWA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGd,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KACzC,IAEF,OAAO,EAAM;AAgBtB,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,MAAG,yBAAsB,GACjC,IAAW,EAAE,sBAAsB;AAKzC,QAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,KACtB,CAEqB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,EAAK;EACzC,MAAM,EAAO;EACb,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;AACjB,WAAQ,EAAK,MAAb;IACE,KAAK,OACH,QAAO,EAAiB,EAAK,MAAM,EAAI,EAAE,EAAS;IAEpD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,EAAI;AAO7B,YALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KAExC,IAEF,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,EAAI;gBAAG;MAAa,CAAA;;IAE/C,KAAK,SAAS;KACZ,IAAM,IAAQ,EAAK,MAAM,EAAI;AAC7B,SAAI,KAAS,QAAQ,EAAM,MAAM,KAAK,GACpC,QAAO;KAET,IAAI,EAAE,YAAS;AAIf,YAHI,OAAO,KAAS,eAClB,IAAO,EAAK,EAAI,GAEX,kBAAC,GAAD;MAAW;gBAAO;MAAY,CAAA;;IAEvC,KAAK,WAEH,QACE,kBAAC,GAAD;KACS,OAHG,EAAK,MAAM,EAAI;KAIf;KACV,SAAS;KACT,CAAA;IAGN,KAAK,aAAa;KAChB,IAAM,IAAK,EAAK,MAAM,EAAI;AAC1B,SAAI,EAAG,MAAM,KAAK,GAChB,QAAO;KAET,IAAM,IAAO,IAAoB,EAAK,QAAQ,EAAG,IAAI;AAIrD,YAHI,KAAQ,OAGL,IAFE,kBAAC,GAAD;MAAM,IAAI;gBAAO,EAAE,eAAe;MAAQ,CAAA;;IAIrD,KAAK,UAAU;KACb,IAAM,IAAW,EAAK,OAAO,EAAI;AAIjC,YAHI,KAAY,QAAQ,MAAa,KAC5B,IAEF,kBAAA,GAAA,EAAA,UAAG,GAAY,CAAA;;IAExB,QACE,QAAO;;;EAId,EACD"}
1
+ {"version":3,"file":"buildDataTableColumns.js","names":[],"sources":["../../../../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Link } from '@plumile/router';\nimport { FormattedDate, Tag, type DataTableColumn } from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return <Link to={cell.to(row)}>{value}</Link>;\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const href = resolveEntityHref?.(cell.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{t('actions.view')}</Link>;\n }\n return fallback;\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;AAUA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGd,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KACzC,IAEF,OAAO,EAAM;AAgBtB,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,MAAG,yBAAsB,GACjC,IAAW,EAAE,sBAAsB;AAKzC,QAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,KACtB,CAEqB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,EAAK;EACzC,MAAM,EAAO;EACb,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;AACjB,WAAQ,EAAK,MAAb;IACE,KAAK,OACH,QAAO,EAAiB,EAAK,MAAM,EAAI,EAAE,EAAS;IAEpD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,EAAI;AAO7B,YALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KAExC,IAEF,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,EAAI;gBAAG;MAAa,CAAA;;IAE/C,KAAK,SAAS;KACZ,IAAM,IAAQ,EAAK,MAAM,EAAI;AAC7B,SAAI,KAAS,QAAQ,EAAM,MAAM,KAAK,GACpC,QAAO;KAET,IAAI,EAAE,YAAS;AAIf,YAHI,OAAO,KAAS,eAClB,IAAO,EAAK,EAAI,GAEX,kBAAC,GAAD;MAAW;gBAAO;MAAY,CAAA;;IAEvC,KAAK,WAEH,QACE,kBAAC,GAAD;KACS,OAHG,EAAK,MAAM,EAAI;KAIf;KACV,SAAS;KACT,CAAA;IAGN,KAAK,aAAa;KAChB,IAAM,IAAK,EAAK,MAAM,EAAI;AAC1B,SAAI,EAAG,MAAM,KAAK,GAChB,QAAO;KAET,IAAM,IAAO,IAAoB,EAAK,QAAQ,EAAG,IAAI;AAIrD,YAHI,KAAQ,OAGL,IAFE,kBAAC,GAAD;MAAM,IAAI;gBAAO,EAAE,eAAe;MAAQ,CAAA;;IAIrD,KAAK,UAAU;KACb,IAAM,IAAW,EAAK,OAAO,EAAI;AAIjC,YAHI,KAAY,QAAQ,MAAa,KAC5B,IAEF,kBAAA,GAAA,EAAA,UAAG,GAAY,CAAA;;IAExB,QACE,QAAO;;;EAId,EACD"}
@@ -1,7 +1,7 @@
1
1
  import { row as e } from "./backofficeDetailBadgeRow.css.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { useTranslation as n } from "react-i18next";
4
- import { Tag as r } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
4
+ import { Tag as r } from "@plumile/ui";
5
5
  //#region src/components/backoffice/detail/BackofficeDetailBadgeRow.tsx
6
6
  var i = ({ items: i }) => {
7
7
  let { t: a } = n();
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailBadgeRow.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailBadgeRow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeBadgeItem } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport * as styles from './backofficeDetailBadgeRow.css.js';\n\nexport type BackofficeDetailBadgeRowProps = {\n items: readonly BackofficeBadgeItem[];\n};\n\nexport const BackofficeDetailBadgeRow = ({\n items,\n}: BackofficeDetailBadgeRowProps): JSX.Element => {\n const { t } = useTranslation();\n return (\n <div className={styles.row}>\n {items.map((item) => {\n const label =\n typeof item.label === 'function' ? item.label(t) : item.label;\n return (\n <Tag key={item.id} tone={item.tone ?? 'neutral'}>\n {label}\n </Tag>\n );\n })}\n </div>\n );\n};\n\nexport default BackofficeDetailBadgeRow;\n"],"mappings":";;;;;AAaA,IAAa,KAA4B,EACvC,eACgD;CAChD,IAAM,EAAE,SAAM,GAAgB;AAC9B,QACE,kBAAC,OAAD;EAAK,WAAW;YACb,EAAM,KAAK,MAAS;GACnB,IAAM,IACJ,OAAO,EAAK,SAAU,aAAa,EAAK,MAAM,EAAE,GAAG,EAAK;AAC1D,UACE,kBAAC,GAAD;IAAmB,MAAM,EAAK,QAAQ;cACnC;IACG,EAFI,EAAK,GAET;IAER;EACE,CAAA"}
1
+ {"version":3,"file":"BackofficeDetailBadgeRow.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailBadgeRow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeBadgeItem } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailBadgeRow.css.js';\n\nexport type BackofficeDetailBadgeRowProps = {\n items: readonly BackofficeBadgeItem[];\n};\n\nexport const BackofficeDetailBadgeRow = ({\n items,\n}: BackofficeDetailBadgeRowProps): JSX.Element => {\n const { t } = useTranslation();\n return (\n <div className={styles.row}>\n {items.map((item) => {\n const label =\n typeof item.label === 'function' ? item.label(t) : item.label;\n return (\n <Tag key={item.id} tone={item.tone ?? 'neutral'}>\n {label}\n </Tag>\n );\n })}\n </div>\n );\n};\n\nexport default BackofficeDetailBadgeRow;\n"],"mappings":";;;;;AAaA,IAAa,KAA4B,EACvC,eACgD;CAChD,IAAM,EAAE,SAAM,GAAgB;AAC9B,QACE,kBAAC,OAAD;EAAK,WAAW;YACb,EAAM,KAAK,MAAS;GACnB,IAAM,IACJ,OAAO,EAAK,SAAU,aAAa,EAAK,MAAM,EAAE,GAAG,EAAK;AAC1D,UACE,kBAAC,GAAD;IAAmB,MAAM,EAAK,QAAQ;cACnC;IACG,EAFI,EAAK,GAET;IAER;EACE,CAAA"}
@@ -1,12 +1,12 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
2
  import { field as t, fullWidth as n, label as r, size as i, value as a } from "./backofficeDetailField.css.js";
3
3
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
- import { cx as c } from "@plumile/ui/theme/tools.js";
5
- import { CopyableText as l } from "@plumile/ui/backoffice/atoms/copyable_text/CopyableText.js";
4
+ import { CopyableText as c } from "@plumile/ui";
5
+ import { cx as l } from "@plumile/ui/theme/tools.js";
6
6
  //#region src/components/backoffice/detail/BackofficeDetailField.tsx
7
7
  var u = ({ label: u, size: d, value: f, copyValue: p, fullWidth: m = !1 }) => {
8
8
  let { t: h } = e(), g = f;
9
- (g == null || typeof g == "string" && g.trim() === "") && (g = h("common.notAvailable")), p != null && p !== "" && (g = /* @__PURE__ */ o(l, {
9
+ (g == null || typeof g == "string" && g.trim() === "") && (g = h("common.notAvailable")), p != null && p !== "" && (g = /* @__PURE__ */ o(c, {
10
10
  value: p,
11
11
  copyValue: p,
12
12
  truncate: !1,
@@ -15,7 +15,7 @@ var u = ({ label: u, size: d, value: f, copyValue: p, fullWidth: m = !1 }) => {
15
15
  }));
16
16
  let _ = [t, i[d]];
17
17
  return m && _.push(n), /* @__PURE__ */ s("div", {
18
- className: c(..._),
18
+ className: l(..._),
19
19
  children: [/* @__PURE__ */ o("span", {
20
20
  className: r,
21
21
  children: u
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailField.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailField.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport type { BackofficeFieldSize } from '@plumile/backoffice-core/types.js';\n\nimport { CopyableText } from '@plumile/ui/backoffice/atoms/copyable_text/CopyableText.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeDetailField.css.js';\n\nexport type BackofficeDetailFieldProps = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode | null | undefined;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport const BackofficeDetailField = ({\n label,\n size,\n value,\n copyValue,\n fullWidth = false,\n}: BackofficeDetailFieldProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n let resolvedValue: ReactNode = value;\n if (\n resolvedValue == null ||\n (typeof resolvedValue === 'string' && resolvedValue.trim() === '')\n ) {\n resolvedValue = t('common.notAvailable');\n }\n\n if (copyValue != null && copyValue !== '') {\n resolvedValue = (\n <CopyableText\n value={copyValue}\n copyValue={copyValue}\n truncate={false}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n }\n\n const fieldClassNames = [styles.field, styles.size[size]];\n if (fullWidth) {\n fieldClassNames.push(styles.fullWidth);\n }\n\n return (\n <div className={cx(...fieldClassNames)}>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>{resolvedValue}</div>\n </div>\n );\n};\n\nexport default BackofficeDetailField;\n"],"mappings":";;;;;;AAmBA,IAAa,KAAyB,EACpC,OAAA,GACA,MAAA,GACA,OAAA,GACA,cACA,WAAA,IAAY,SACiC;CAC7C,IAAM,EAAE,SAAM,GAA+B,EACzC,IAA2B;AAQ/B,EANE,KAAiB,QAChB,OAAO,KAAkB,YAAY,EAAc,MAAM,KAAK,QAE/D,IAAgB,EAAE,sBAAsB,GAGtC,KAAa,QAAQ,MAAc,OACrC,IACE,kBAAC,GAAD;EACE,OAAO;EACI;EACX,UAAU;EACV,WAAW,EAAE,sBAAsB;EACnC,aAAa,EAAE,wBAAwB;EACvC,CAAA;CAIN,IAAM,IAAkB,CAAC,GAAc,EAAY,GAAM;AAKzD,QAJI,KACF,EAAgB,KAAK,EAAiB,EAItC,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAG,EAAgB;YAAtC,CACE,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAa,CAAA,EAC7C,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAoB,CAAA,CAC/C"}
1
+ {"version":3,"file":"BackofficeDetailField.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailField.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport type { BackofficeFieldSize } from '@plumile/backoffice-core/types.js';\n\nimport { CopyableText } from '@plumile/ui';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeDetailField.css.js';\n\nexport type BackofficeDetailFieldProps = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode | null | undefined;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport const BackofficeDetailField = ({\n label,\n size,\n value,\n copyValue,\n fullWidth = false,\n}: BackofficeDetailFieldProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n let resolvedValue: ReactNode = value;\n if (\n resolvedValue == null ||\n (typeof resolvedValue === 'string' && resolvedValue.trim() === '')\n ) {\n resolvedValue = t('common.notAvailable');\n }\n\n if (copyValue != null && copyValue !== '') {\n resolvedValue = (\n <CopyableText\n value={copyValue}\n copyValue={copyValue}\n truncate={false}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n }\n\n const fieldClassNames = [styles.field, styles.size[size]];\n if (fullWidth) {\n fieldClassNames.push(styles.fullWidth);\n }\n\n return (\n <div className={cx(...fieldClassNames)}>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>{resolvedValue}</div>\n </div>\n );\n};\n\nexport default BackofficeDetailField;\n"],"mappings":";;;;;;AAmBA,IAAa,KAAyB,EACpC,OAAA,GACA,MAAA,GACA,OAAA,GACA,cACA,WAAA,IAAY,SACiC;CAC7C,IAAM,EAAE,SAAM,GAA+B,EACzC,IAA2B;AAQ/B,EANE,KAAiB,QAChB,OAAO,KAAkB,YAAY,EAAc,MAAM,KAAK,QAE/D,IAAgB,EAAE,sBAAsB,GAGtC,KAAa,QAAQ,MAAc,OACrC,IACE,kBAAC,GAAD;EACE,OAAO;EACI;EACX,UAAU;EACV,WAAW,EAAE,sBAAsB;EACnC,aAAa,EAAE,wBAAwB;EACvC,CAAA;CAIN,IAAM,IAAkB,CAAC,GAAc,EAAY,GAAM;AAKzD,QAJI,KACF,EAAgB,KAAK,EAAiB,EAItC,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAG,EAAgB;YAAtC,CACE,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAa,CAAA,EAC7C,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAoB,CAAA,CAC/C"}
@@ -1,6 +1,6 @@
1
1
  import { content as e, icon as t, label as n } from "./BackofficeDetailFlagTag.css.js";
2
2
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
- import { Tag as a } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
3
+ import { Tag as a } from "@plumile/ui";
4
4
  //#region src/components/backoffice/detail/BackofficeDetailFlagTag.tsx
5
5
  var o = ({ tone: o, icon: s, label: c }) => {
6
6
  let l = s != null, u = null;
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailFlagTag.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { Tag, type TagTone } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport * as styles from './BackofficeDetailFlagTag.css.js';\n\nexport type BackofficeDetailFlagTagProps = {\n tone: TagTone;\n icon?: ReactNode;\n label: string;\n};\n\nexport const BackofficeDetailFlagTag = ({\n tone,\n icon,\n label,\n}: BackofficeDetailFlagTagProps): JSX.Element => {\n const hasIcon = icon != null;\n let iconNode: ReactNode | null = null;\n if (hasIcon) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n return (\n <Tag tone={tone}>\n <span className={styles.content}>\n {iconNode}\n <span className={styles.label}>{label}</span>\n </span>\n </Tag>\n );\n};\n\nexport default BackofficeDetailFlagTag;\n"],"mappings":";;;;AAYA,IAAa,KAA2B,EACtC,SACA,MAAA,GACA,OAAA,QAC+C;CAC/C,IAAM,IAAU,KAAQ,MACpB,IAA6B;AAKjC,QAJI,MACF,IAAW,kBAAC,QAAD;EAAM,WAAW;YAAc;EAAY,CAAA,GAItD,kBAAC,GAAD;EAAW;YACT,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACG,GACD,kBAAC,QAAD;IAAM,WAAW;cAAe;IAAa,CAAA,CACxC;;EACH,CAAA"}
1
+ {"version":3,"file":"BackofficeDetailFlagTag.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { Tag, type TagTone } from '@plumile/ui';\n\nimport * as styles from './BackofficeDetailFlagTag.css.js';\n\nexport type BackofficeDetailFlagTagProps = {\n tone: TagTone;\n icon?: ReactNode;\n label: string;\n};\n\nexport const BackofficeDetailFlagTag = ({\n tone,\n icon,\n label,\n}: BackofficeDetailFlagTagProps): JSX.Element => {\n const hasIcon = icon != null;\n let iconNode: ReactNode | null = null;\n if (hasIcon) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n return (\n <Tag tone={tone}>\n <span className={styles.content}>\n {iconNode}\n <span className={styles.label}>{label}</span>\n </span>\n </Tag>\n );\n};\n\nexport default BackofficeDetailFlagTag;\n"],"mappings":";;;;AAYA,IAAa,KAA2B,EACtC,SACA,MAAA,GACA,OAAA,QAC+C;CAC/C,IAAM,IAAU,KAAQ,MACpB,IAA6B;AAKjC,QAJI,MACF,IAAW,kBAAC,QAAD;EAAM,WAAW;YAAc;EAAY,CAAA,GAItD,kBAAC,GAAD;EAAW;YACT,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACG,GACD,kBAAC,QAAD;IAAM,WAAW;cAAe;IAAa,CAAA,CACxC;;EACH,CAAA"}
@@ -8,32 +8,32 @@ import { useBackofficeListRefetch as o } from "../../../hooks/useBackofficeListR
8
8
  import { BackofficeEntityListScaffold as s } from "../scaffolds/BackofficeEntityListScaffold.js";
9
9
  import { jsx as c } from "react/jsx-runtime";
10
10
  import { useTranslation as l } from "react-i18next";
11
- import { Suspense as u, useCallback as d, useMemo as f, useState as p } from "react";
12
- import * as m from "react-relay";
13
- import { BACKOFFICE_LIST_REFETCH_POLICY as h, BACKOFFICE_RELATED_TAB_PAGE_SIZE as g } from "@plumile/backoffice-core/constants.js";
14
- import { setWhereValue as _ } from "@plumile/backoffice-core/filters/where.js";
15
- import { BackofficeTableSkeleton as v } from "@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js";
11
+ import { BackofficeTableSkeleton as u } from "@plumile/ui";
12
+ import { Suspense as d, useCallback as f, useMemo as p, useState as m } from "react";
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
16
  //#region src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx
17
- var { useLazyLoadQuery: y, usePaginationFragment: b } = m, x = ({ title: t, config: n, entities: r, whereKey: u, value: m, path: v }) => {
17
+ var { useLazyLoadQuery: y, usePaginationFragment: b } = h, x = ({ title: t, config: n, entities: r, whereKey: u, value: d, path: h }) => {
18
18
  let { t: x } = l(), { t: S } = e();
19
19
  if (n.list.kind === "records") return null;
20
20
  let C = n.list, w = n.listDefaults ?? C.defaultState ?? {
21
21
  where: null,
22
22
  sort: null
23
- }, [T, E] = p({
23
+ }, [T, E] = m({
24
24
  where: w.where,
25
25
  sort: w.sort ?? null
26
- }), D = f(() => m == null || m.trim() === "" ? null : _(T.where, u, m, v), [
27
- v,
26
+ }), D = p(() => d == null || d.trim() === "" ? null : v(T.where, u, d, h), [
27
+ h,
28
28
  T.where,
29
- m,
29
+ d,
30
30
  u
31
- ]), O = D ?? T.where, k = T.sort ?? w.sort, A = f(() => ({
31
+ ]), O = D ?? T.where, k = T.sort ?? w.sort, A = p(() => ({
32
32
  where: O,
33
33
  sort: k,
34
- count: g,
34
+ count: _,
35
35
  cursor: null
36
- }), [O, k]), j = f(() => C.buildVariables == null ? A : C.buildVariables(A), [C, A]), M = y(C.query, j, { fetchPolicy: "store-or-network" }), { data: N, loadNext: P, hasNext: F, isLoadingNext: I, refetch: L } = b(C.fragment, M), R = C.getConnection(N), z = f(() => R.edges.map((e) => C.toRow(e.node)), [R.edges, C]), B = f(() => i(C.columns, {
36
+ }), [O, k]), j = p(() => C.buildVariables == null ? A : C.buildVariables(A), [C, A]), M = y(C.query, j, { fetchPolicy: "store-or-network" }), { data: N, loadNext: P, hasNext: F, isLoadingNext: I, refetch: L } = b(C.fragment, M), R = C.getConnection(N), z = p(() => R.edges.map((e) => C.toRow(e.node)), [R.edges, C]), B = p(() => i(C.columns, {
37
37
  tApp: x,
38
38
  t: S,
39
39
  resolveEntityHref: (e, t) => {
@@ -45,26 +45,26 @@ var { useLazyLoadQuery: y, usePaginationFragment: b } = m, x = ({ title: t, conf
45
45
  C.columns,
46
46
  S,
47
47
  x
48
- ]), V = d((e) => C.getRowId(e), [C]), { onRefresh: H } = o({
48
+ ]), V = f((e) => C.getRowId(e), [C]), { onRefresh: H } = o({
49
49
  refetch: L,
50
50
  variables: A,
51
- defaults: f(() => ({
51
+ defaults: p(() => ({
52
52
  where: D ?? w.where,
53
53
  sort: w.sort,
54
- count: g,
54
+ count: _,
55
55
  cursor: null
56
56
  }), [
57
57
  w.sort,
58
58
  w.where,
59
59
  D
60
60
  ]),
61
- fetchPolicy: h,
61
+ fetchPolicy: g,
62
62
  buildVariables: C.buildVariables
63
63
  }), U = a({
64
64
  hasNext: F,
65
65
  isLoadingNext: I,
66
66
  loadNext: P,
67
- count: g
67
+ count: _
68
68
  });
69
69
  return /* @__PURE__ */ c(s, {
70
70
  config: n,
@@ -84,22 +84,22 @@ var { useLazyLoadQuery: y, usePaginationFragment: b } = m, x = ({ title: t, conf
84
84
  variant: "embedded"
85
85
  });
86
86
  }, S = ({ title: e, targetId: n, whereKey: i, value: a, path: o }) => {
87
- let { entities: s } = t(), l = r(f(() => [n], [n]));
88
- if (l.status === "loading") return /* @__PURE__ */ c(v, { rows: 6 });
87
+ let { entities: s } = t(), l = r(p(() => [n], [n]));
88
+ if (l.status === "loading") return /* @__PURE__ */ c(u, { rows: 6 });
89
89
  if (l.status === "error") return null;
90
- let u = l.modules[n]?.config;
91
- return u == null ? null : /* @__PURE__ */ c(x, {
90
+ let d = l.modules[n]?.config;
91
+ return d == null ? null : /* @__PURE__ */ c(x, {
92
92
  title: e,
93
- config: u,
93
+ config: d,
94
94
  entities: s,
95
95
  whereKey: i,
96
96
  value: a,
97
97
  path: o
98
98
  });
99
99
  }, C = ({ title: e, target: t, whereKey: r, value: i, path: a }) => /* @__PURE__ */ c(n, {
100
- fallback: () => /* @__PURE__ */ c(v, { rows: 6 }),
101
- children: /* @__PURE__ */ c(u, {
102
- fallback: /* @__PURE__ */ c(v, { rows: 6 }),
100
+ fallback: () => /* @__PURE__ */ c(u, { rows: 6 }),
101
+ children: /* @__PURE__ */ c(d, {
102
+ fallback: /* @__PURE__ */ c(u, { rows: 6 }),
103
103
  children: /* @__PURE__ */ c(S, {
104
104
  title: e,
105
105
  targetId: t,
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["/* eslint-disable react-hooks/rules-of-hooks */\nimport { 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 BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.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 { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n target: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeResolvedListFacetConfig;\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n targetId: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n whereKey,\n value,\n path,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n if (config.list.kind === 'records') {\n return null;\n }\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\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 whereKey as never,\n value,\n path,\n );\n }, [path, state.where, value, whereKey]);\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 if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(variablesBase as never);\n }\n return variablesBase;\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables as never,\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 resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n }, [entities, listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row as never);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? (listDefaults.where as never);\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 { onRefresh } = useBackofficeListRefetch({\n refetch: refetch as never,\n variables: variablesBase as never,\n defaults: defaults as never,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables as never,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next as never);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n targetId,\n whereKey,\n value,\n path,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [targetId];\n }, [targetId]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return null;\n }\n\n const config = relatedEntitiesState.modules[targetId]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n entities={entities}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n target,\n whereKey,\n value,\n path,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <BackofficeTableSkeleton rows={6} />;\n }}\n >\n <Suspense fallback={<BackofficeTableSkeleton rows={6} />}>\n <RelationListBlockBody\n title={title}\n targetId={target}\n whereKey={whereKey}\n value={value}\n path={path}\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":["/* eslint-disable react-hooks/rules-of-hooks */\nimport { 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 BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui';\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 { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n target: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeResolvedListFacetConfig;\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n targetId: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n whereKey,\n value,\n path,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n if (config.list.kind === 'records') {\n return null;\n }\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\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 whereKey as never,\n value,\n path,\n );\n }, [path, state.where, value, whereKey]);\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 if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(variablesBase as never);\n }\n return variablesBase;\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables as never,\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 resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n }, [entities, listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row as never);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? (listDefaults.where as never);\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 { onRefresh } = useBackofficeListRefetch({\n refetch: refetch as never,\n variables: variablesBase as never,\n defaults: defaults as never,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables as never,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next as never);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n targetId,\n whereKey,\n value,\n path,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [targetId];\n }, [targetId]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return null;\n }\n\n const config = relatedEntitiesState.modules[targetId]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n entities={entities}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n target,\n whereKey,\n value,\n path,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <BackofficeTableSkeleton rows={6} />;\n }}\n >\n <Suspense fallback={<BackofficeTableSkeleton rows={6} />}>\n <RelationListBlockBody\n title={title}\n targetId={target}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { container as e, value as t } from "./backofficeDetailTaggedValue.css.js";
2
2
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
- import { Tag as i } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
3
+ import { Tag as i } from "@plumile/ui";
4
4
  //#region src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx
5
5
  var a = ({ tag: a, value: o }) => /* @__PURE__ */ r("span", {
6
6
  className: e,
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailTaggedValue.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeBadgeTone } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport * as styles from './backofficeDetailTaggedValue.css.js';\n\nexport type BackofficeDetailTaggedValueProps = {\n tag: { label: string; tone?: BackofficeBadgeTone } | null;\n value: ReactNode;\n};\n\nexport const BackofficeDetailTaggedValue = ({\n tag,\n value,\n}: BackofficeDetailTaggedValueProps): JSX.Element => {\n return (\n <span className={styles.container}>\n {tag != null && <Tag tone={tag.tone}>{tag.label}</Tag>}\n <span className={styles.value}>{value}</span>\n </span>\n );\n};\n\nexport default BackofficeDetailTaggedValue;\n"],"mappings":";;;;AAYA,IAAa,KAA+B,EAC1C,QACA,OAAA,QAGE,kBAAC,QAAD;CAAM,WAAW;WAAjB,CACG,KAAO,QAAQ,kBAAC,GAAD;EAAK,MAAM,EAAI;YAAO,EAAI;EAAY,CAAA,EACtD,kBAAC,QAAD;EAAM,WAAW;YAAe;EAAa,CAAA,CACxC"}
1
+ {"version":3,"file":"BackofficeDetailTaggedValue.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeBadgeTone } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailTaggedValue.css.js';\n\nexport type BackofficeDetailTaggedValueProps = {\n tag: { label: string; tone?: BackofficeBadgeTone } | null;\n value: ReactNode;\n};\n\nexport const BackofficeDetailTaggedValue = ({\n tag,\n value,\n}: BackofficeDetailTaggedValueProps): JSX.Element => {\n return (\n <span className={styles.container}>\n {tag != null && <Tag tone={tag.tone}>{tag.label}</Tag>}\n <span className={styles.value}>{value}</span>\n </span>\n );\n};\n\nexport default BackofficeDetailTaggedValue;\n"],"mappings":";;;;AAYA,IAAa,KAA+B,EAC1C,QACA,OAAA,QAGE,kBAAC,QAAD;CAAM,WAAW;WAAjB,CACG,KAAO,QAAQ,kBAAC,GAAD;EAAK,MAAM,EAAI;YAAO,EAAI;EAAY,CAAA,EACtD,kBAAC,QAAD;EAAM,WAAW;YAAe;EAAa,CAAA,CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildSidebarSections.js","names":[],"sources":["../../../../../src/components/backoffice/layout/buildSidebarSections.tsx"],"sourcesContent":["import { type DragEvent, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeIconComponent,\n} from '../../../provider/types.js';\nimport type { BackofficeSidebarSection } from '@plumile/ui/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.js';\nimport type { SidebarNavSectionItem } from '@plumile/ui/backoffice/molecules/sidebar_nav_section/SidebarNavSection.js';\nimport { GripDotsSvg } from '@plumile/ui/icons/GripDotsSvg.js';\nimport { PinFilledSvg } from '@plumile/ui/icons/PinFilledSvg.js';\nimport { PinSvg } from '@plumile/ui/icons/PinSvg.js';\nimport { SidebarHomeSvg } from '@plumile/ui/icons/SidebarHomeSvg.js';\nimport { SidebarTasksSvg } from '@plumile/ui/icons/SidebarTasksSvg.js';\nimport type { SidebarGroupCollapseState } from '../../../hooks/useSidebarGroupCollapse.js';\nimport * as styles from './backofficeSidebarActions.css.js';\nimport {\n buildEntityGroupLookup,\n isActivePath,\n resolveLabel,\n resolveSidebarGroups,\n} from './sidebarUtils.js';\n\nconst renderIcon = (\n Icon?: BackofficeIconComponent,\n fallback?: ReactNode,\n): ReactNode => {\n if (Icon != null) {\n return <Icon width={18} height={18} aria-hidden=\"true\" />;\n }\n return fallback ?? null;\n};\n\nexport type BuildSidebarSectionsInput = {\n basePath: string;\n pathname: string;\n entities: BackofficeEntityManifestMap;\n sidebar?: BackofficeSidebarConfig;\n permissions: unknown;\n searchQuery?: string;\n tApp: TFunction;\n t: TFunction;\n pinnedEntityIds?: readonly string[];\n onTogglePin?: (entityId: string) => void;\n onReorderPin?: (fromId: string, toId: string) => void;\n collapsedByGroupId?: SidebarGroupCollapseState;\n onGroupCollapsedChange?: (groupId: string, collapsed: boolean) => void;\n};\n\n/**\n * Builds the sidebar sections for the backoffice layout.\n */\nexport function buildSidebarSections(\n input: BuildSidebarSectionsInput,\n): readonly BackofficeSidebarSection[] {\n const {\n basePath,\n pathname,\n entities,\n sidebar,\n permissions,\n searchQuery,\n tApp,\n t,\n pinnedEntityIds = [],\n onTogglePin,\n onReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange,\n } = input;\n\n const groups = resolveSidebarGroups(entities, sidebar);\n const entries = Object.entries(groups);\n const pinnedSet = new Set(pinnedEntityIds);\n const pinLabel = t('sidebar.actions.pin');\n const unpinLabel = t('sidebar.actions.unpin');\n const reorderLabel = t('sidebar.actions.reorder');\n const entityGroupLookup = buildEntityGroupLookup(groups);\n const normalizedQuery = searchQuery?.trim().toLowerCase() ?? '';\n\n const renderPinAction = (entityId: string): ReactNode | null => {\n if (onTogglePin == null) {\n return null;\n }\n const isPinned = pinnedSet.has(entityId);\n let label = pinLabel;\n let Icon = PinSvg;\n if (isPinned) {\n label = unpinLabel;\n Icon = PinFilledSvg;\n }\n\n return (\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-pressed={isPinned}\n aria-label={label}\n title={label}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin(entityId);\n }}\n >\n <Icon width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n };\n\n const buildEntityItem = (inputItem: {\n entityId: string;\n groupId?: string;\n groupIcon?: BackofficeIconComponent;\n enableReorder?: boolean;\n }): SidebarNavSectionItem | null => {\n const { entityId, groupId, groupIcon, enableReorder } = inputItem;\n const config = entities[entityId];\n if (config == null) {\n return null;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n const isEntityVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isEntityVisible === false) {\n return null;\n }\n\n if (config.kind === 'tool') {\n const label = resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n return {\n id: `tool-${entityId}`,\n data: {\n kind: 'tool',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n };\n }\n\n if (!config.hasList) {\n return null;\n }\n\n const label = resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n\n let dragHandleSlot: ReactNode | undefined;\n let onDragStart: ((event: DragEvent) => void) | undefined;\n let onDragOver: ((event: DragEvent) => void) | undefined;\n let onDrop: ((event: DragEvent) => void) | undefined;\n let draggable = false;\n\n if (enableReorder === true && onReorderPin != null) {\n draggable = true;\n dragHandleSlot = (\n <GripDotsSvg width={14} height={14} aria-hidden=\"true\" />\n );\n onDragStart = (event) => {\n const { dataTransfer } = event;\n dataTransfer.effectAllowed = 'move';\n dataTransfer.setData('text/plain', entityId);\n };\n onDragOver = (event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n dataTransfer.dropEffect = 'move';\n };\n onDrop = (event) => {\n event.preventDefault();\n const fromId = event.dataTransfer.getData('text/plain');\n if (fromId === '' || fromId === entityId) {\n return;\n }\n onReorderPin(fromId, entityId);\n };\n }\n\n let dragHandleLabel: string | undefined;\n if (dragHandleSlot != null) {\n dragHandleLabel = reorderLabel;\n }\n\n return {\n id: entityId,\n data: {\n kind: 'entity',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n dragHandleSlot,\n dragHandleLabel,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n };\n };\n\n const sections: BackofficeSidebarSection[] = [];\n\n if (pinnedEntityIds.length > 0) {\n const pinnedItems = pinnedEntityIds\n .map((entityId) => {\n const groupMeta = entityGroupLookup.get(entityId);\n return buildEntityItem({\n entityId,\n groupId: groupMeta?.groupId,\n groupIcon: groupMeta?.icon,\n enableReorder: true,\n });\n })\n .filter((item): item is SidebarNavSectionItem => {\n return item != null;\n });\n\n if (pinnedItems.length > 0) {\n sections.push({\n id: 'pinned',\n title: t('sidebar.sections.pinned'),\n items: pinnedItems,\n collapsible: false,\n });\n }\n }\n\n entries.forEach(([groupId, group], index) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n\n const items: SidebarNavSectionItem[] = [];\n\n if (index === 0) {\n const dashboardDescriptor: BackofficeSidebarItemDescriptor = {\n kind: 'dashboard',\n id: 'dashboard',\n };\n const isDashboardVisible = sidebar?.isItemVisible?.(\n dashboardDescriptor,\n permissions,\n );\n if (isDashboardVisible !== false) {\n const dashboardLabel = t('sidebar.items.dashboard');\n if (\n normalizedQuery !== '' &&\n !dashboardLabel.toLowerCase().includes(normalizedQuery)\n ) {\n return;\n }\n items.push({\n id: 'dashboard',\n data: {\n kind: 'dashboard',\n id: 'dashboard',\n groupId,\n },\n label: dashboardLabel,\n href: basePath,\n icon: renderIcon(\n undefined,\n <SidebarHomeSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, basePath),\n ariaLabel: t('sidebar.items.dashboard'),\n });\n }\n }\n\n if (group.entities != null) {\n group.entities.forEach((entityId) => {\n const item = buildEntityItem({\n entityId,\n groupId,\n groupIcon: group.icon,\n });\n if (item != null) {\n items.push(item);\n }\n });\n }\n\n if (items.length === 0) {\n return;\n }\n\n let title: string | undefined;\n if (group.title != null) {\n title = resolveLabel(group.title, tApp);\n }\n\n const isCollapsed = collapsedByGroupId?.[groupId];\n let onCollapsedChange: ((collapsed: boolean) => void) | undefined;\n if (onGroupCollapsedChange != null) {\n onCollapsedChange = (collapsed: boolean) => {\n onGroupCollapsedChange(groupId, collapsed);\n };\n }\n\n sections.push({\n id: groupId,\n title,\n items,\n collapsible: true,\n defaultCollapsed: true,\n isCollapsed,\n onCollapsedChange,\n });\n });\n\n return sections;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"buildSidebarSections.js","names":[],"sources":["../../../../../src/components/backoffice/layout/buildSidebarSections.tsx"],"sourcesContent":["import { type DragEvent, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeIconComponent,\n} from '../../../provider/types.js';\nimport type { AdminSidebarSection, SidebarNavSectionItem } from '@plumile/ui';\nimport { GripDotsSvg } from '@plumile/ui/icons/GripDotsSvg.js';\nimport { PinFilledSvg } from '@plumile/ui/icons/PinFilledSvg.js';\nimport { PinSvg } from '@plumile/ui/icons/PinSvg.js';\nimport { SidebarHomeSvg } from '@plumile/ui/icons/SidebarHomeSvg.js';\nimport { SidebarTasksSvg } from '@plumile/ui/icons/SidebarTasksSvg.js';\nimport type { SidebarGroupCollapseState } from '../../../hooks/useSidebarGroupCollapse.js';\nimport * as styles from './backofficeSidebarActions.css.js';\nimport {\n buildEntityGroupLookup,\n isActivePath,\n resolveLabel,\n resolveSidebarGroups,\n} from './sidebarUtils.js';\n\nconst renderIcon = (\n Icon?: BackofficeIconComponent,\n fallback?: ReactNode,\n): ReactNode => {\n if (Icon != null) {\n return <Icon width={18} height={18} aria-hidden=\"true\" />;\n }\n return fallback ?? null;\n};\n\nexport type BuildSidebarSectionsInput = {\n basePath: string;\n pathname: string;\n entities: BackofficeEntityManifestMap;\n sidebar?: BackofficeSidebarConfig;\n permissions: unknown;\n searchQuery?: string;\n tApp: TFunction;\n t: TFunction;\n pinnedEntityIds?: readonly string[];\n onTogglePin?: (entityId: string) => void;\n onReorderPin?: (fromId: string, toId: string) => void;\n collapsedByGroupId?: SidebarGroupCollapseState;\n onGroupCollapsedChange?: (groupId: string, collapsed: boolean) => void;\n};\n\n/**\n * Builds the sidebar sections for the backoffice layout.\n */\nexport function buildSidebarSections(\n input: BuildSidebarSectionsInput,\n): readonly AdminSidebarSection[] {\n const {\n basePath,\n pathname,\n entities,\n sidebar,\n permissions,\n searchQuery,\n tApp,\n t,\n pinnedEntityIds = [],\n onTogglePin,\n onReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange,\n } = input;\n\n const groups = resolveSidebarGroups(entities, sidebar);\n const entries = Object.entries(groups);\n const pinnedSet = new Set(pinnedEntityIds);\n const pinLabel = t('sidebar.actions.pin');\n const unpinLabel = t('sidebar.actions.unpin');\n const reorderLabel = t('sidebar.actions.reorder');\n const entityGroupLookup = buildEntityGroupLookup(groups);\n const normalizedQuery = searchQuery?.trim().toLowerCase() ?? '';\n\n const renderPinAction = (entityId: string): ReactNode | null => {\n if (onTogglePin == null) {\n return null;\n }\n const isPinned = pinnedSet.has(entityId);\n let label = pinLabel;\n let Icon = PinSvg;\n if (isPinned) {\n label = unpinLabel;\n Icon = PinFilledSvg;\n }\n\n return (\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-pressed={isPinned}\n aria-label={label}\n title={label}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin(entityId);\n }}\n >\n <Icon width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n };\n\n const buildEntityItem = (inputItem: {\n entityId: string;\n groupId?: string;\n groupIcon?: BackofficeIconComponent;\n enableReorder?: boolean;\n }): SidebarNavSectionItem | null => {\n const { entityId, groupId, groupIcon, enableReorder } = inputItem;\n const config = entities[entityId];\n if (config == null) {\n return null;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n const isEntityVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isEntityVisible === false) {\n return null;\n }\n\n if (config.kind === 'tool') {\n const label = resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n return {\n id: `tool-${entityId}`,\n data: {\n kind: 'tool',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n };\n }\n\n if (!config.hasList) {\n return null;\n }\n\n const label = resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n\n let dragHandleSlot: ReactNode | undefined;\n let onDragStart: ((event: DragEvent) => void) | undefined;\n let onDragOver: ((event: DragEvent) => void) | undefined;\n let onDrop: ((event: DragEvent) => void) | undefined;\n let draggable = false;\n\n if (enableReorder === true && onReorderPin != null) {\n draggable = true;\n dragHandleSlot = (\n <GripDotsSvg width={14} height={14} aria-hidden=\"true\" />\n );\n onDragStart = (event) => {\n const { dataTransfer } = event;\n dataTransfer.effectAllowed = 'move';\n dataTransfer.setData('text/plain', entityId);\n };\n onDragOver = (event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n dataTransfer.dropEffect = 'move';\n };\n onDrop = (event) => {\n event.preventDefault();\n const fromId = event.dataTransfer.getData('text/plain');\n if (fromId === '' || fromId === entityId) {\n return;\n }\n onReorderPin(fromId, entityId);\n };\n }\n\n let dragHandleLabel: string | undefined;\n if (dragHandleSlot != null) {\n dragHandleLabel = reorderLabel;\n }\n\n return {\n id: entityId,\n data: {\n kind: 'entity',\n id: entityId,\n groupId,\n },\n label,\n href: config.routes.list,\n icon: renderIcon(\n groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, config.routes.list),\n ariaLabel: label,\n actionSlot: renderPinAction(entityId),\n dragHandleSlot,\n dragHandleLabel,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n };\n };\n\n const sections: AdminSidebarSection[] = [];\n\n if (pinnedEntityIds.length > 0) {\n const pinnedItems = pinnedEntityIds\n .map((entityId) => {\n const groupMeta = entityGroupLookup.get(entityId);\n return buildEntityItem({\n entityId,\n groupId: groupMeta?.groupId,\n groupIcon: groupMeta?.icon,\n enableReorder: true,\n });\n })\n .filter((item): item is SidebarNavSectionItem => {\n return item != null;\n });\n\n if (pinnedItems.length > 0) {\n sections.push({\n id: 'pinned',\n title: t('sidebar.sections.pinned'),\n items: pinnedItems,\n collapsible: false,\n });\n }\n }\n\n entries.forEach(([groupId, group], index) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n\n const items: SidebarNavSectionItem[] = [];\n\n if (index === 0) {\n const dashboardDescriptor: BackofficeSidebarItemDescriptor = {\n kind: 'dashboard',\n id: 'dashboard',\n };\n const isDashboardVisible = sidebar?.isItemVisible?.(\n dashboardDescriptor,\n permissions,\n );\n if (isDashboardVisible !== false) {\n const dashboardLabel = t('sidebar.items.dashboard');\n if (\n normalizedQuery !== '' &&\n !dashboardLabel.toLowerCase().includes(normalizedQuery)\n ) {\n return;\n }\n items.push({\n id: 'dashboard',\n data: {\n kind: 'dashboard',\n id: 'dashboard',\n groupId,\n },\n label: dashboardLabel,\n href: basePath,\n icon: renderIcon(\n undefined,\n <SidebarHomeSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, basePath),\n ariaLabel: t('sidebar.items.dashboard'),\n });\n }\n }\n\n if (group.entities != null) {\n group.entities.forEach((entityId) => {\n const item = buildEntityItem({\n entityId,\n groupId,\n groupIcon: group.icon,\n });\n if (item != null) {\n items.push(item);\n }\n });\n }\n\n if (items.length === 0) {\n return;\n }\n\n let title: string | undefined;\n if (group.title != null) {\n title = resolveLabel(group.title, tApp);\n }\n\n const isCollapsed = collapsedByGroupId?.[groupId];\n let onCollapsedChange: ((collapsed: boolean) => void) | undefined;\n if (onGroupCollapsedChange != null) {\n onCollapsedChange = (collapsed: boolean) => {\n onGroupCollapsedChange(groupId, collapsed);\n };\n }\n\n sections.push({\n id: groupId,\n title,\n items,\n collapsible: true,\n defaultCollapsed: true,\n isCollapsed,\n onCollapsedChange,\n });\n });\n\n return sections;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mapViewerToSidebarProfileView.js","names":[],"sources":["../../../../../src/components/backoffice/layout/mapViewerToSidebarProfileView.ts"],"sourcesContent":["import type { BackofficeSidebarProfileViewer } from '@plumile/ui/backoffice/molecules/sidebar_profile_menu/BackofficeSidebarProfileMenu.js';\n\nexport type BackofficeViewerIdentity = {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n};\n\ntype MapViewerToSidebarProfileViewInput = {\n viewer: BackofficeViewerIdentity | null | undefined;\n unknownUserLabel: string;\n};\n\nconst sanitizeToken = (value: string | null | undefined): string => {\n return value?.trim() ?? '';\n};\n\nexport const mapViewerToSidebarProfileView = ({\n viewer,\n unknownUserLabel,\n}: MapViewerToSidebarProfileViewInput): BackofficeSidebarProfileViewer => {\n const firstName = sanitizeToken(viewer?.firstName);\n const lastName = sanitizeToken(viewer?.lastName);\n const joinedDisplayName = [firstName, lastName]\n .filter((token) => {\n return token !== '';\n })\n .join(' ')\n .trim();\n let displayName = joinedDisplayName;\n if (displayName === '') {\n displayName = unknownUserLabel;\n }\n\n const email = sanitizeToken(viewer?.email);\n const initialsToken = sanitizeToken(viewer?.initials);\n let initials = initialsToken;\n if (initials === '') {\n initials = '?';\n }\n\n const ariaParts = [displayName];\n if (email !== '') {\n ariaParts.push(email);\n }\n\n return {\n displayName,\n email,\n initials,\n ariaLabel: ariaParts.join(' - '),\n };\n};\n\nexport default mapViewerToSidebarProfileView;\n"],"mappings":";AAeA,IAAM,KAAiB,MACd,GAAO,MAAM,IAAI,IAGb,KAAiC,EAC5C,WACA,0BACwE;CASxE,IAAI,IANsB,CAFR,EAAc,GAAQ,UAAU,EACjC,EAAc,GAAQ,SAAS,CACD,CAC5C,QAAQ,MACA,MAAU,GACjB,CACD,KAAK,IAAI,CACT,MAAM;AAET,CAAI,MAAgB,OAClB,IAAc;CAGhB,IAAM,IAAQ,EAAc,GAAQ,MAAM,EAEtC,IADkB,EAAc,GAAQ,SAAS;AAErD,CAAI,MAAa,OACf,IAAW;CAGb,IAAM,IAAY,CAAC,EAAY;AAK/B,QAJI,MAAU,MACZ,EAAU,KAAK,EAAM,EAGhB;EACL;EACA;EACA;EACA,WAAW,EAAU,KAAK,MAAM;EACjC"}
1
+ {"version":3,"file":"mapViewerToSidebarProfileView.js","names":[],"sources":["../../../../../src/components/backoffice/layout/mapViewerToSidebarProfileView.ts"],"sourcesContent":["import type { BackofficeSidebarProfileViewer } from '@plumile/ui';\n\nexport type BackofficeViewerIdentity = {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n};\n\ntype MapViewerToSidebarProfileViewInput = {\n viewer: BackofficeViewerIdentity | null | undefined;\n unknownUserLabel: string;\n};\n\nconst sanitizeToken = (value: string | null | undefined): string => {\n return value?.trim() ?? '';\n};\n\nexport const mapViewerToSidebarProfileView = ({\n viewer,\n unknownUserLabel,\n}: MapViewerToSidebarProfileViewInput): BackofficeSidebarProfileViewer => {\n const firstName = sanitizeToken(viewer?.firstName);\n const lastName = sanitizeToken(viewer?.lastName);\n const joinedDisplayName = [firstName, lastName]\n .filter((token) => {\n return token !== '';\n })\n .join(' ')\n .trim();\n let displayName = joinedDisplayName;\n if (displayName === '') {\n displayName = unknownUserLabel;\n }\n\n const email = sanitizeToken(viewer?.email);\n const initialsToken = sanitizeToken(viewer?.initials);\n let initials = initialsToken;\n if (initials === '') {\n initials = '?';\n }\n\n const ariaParts = [displayName];\n if (email !== '') {\n ariaParts.push(email);\n }\n\n return {\n displayName,\n email,\n initials,\n ariaLabel: ariaParts.join(' - '),\n };\n};\n\nexport default mapViewerToSidebarProfileView;\n"],"mappings":";AAeA,IAAM,KAAiB,MACd,GAAO,MAAM,IAAI,IAGb,KAAiC,EAC5C,WACA,0BACwE;CASxE,IAAI,IANsB,CAFR,EAAc,GAAQ,UAAU,EACjC,EAAc,GAAQ,SAAS,CACD,CAC5C,QAAQ,MACA,MAAU,GACjB,CACD,KAAK,IAAI,CACT,MAAM;AAET,CAAI,MAAgB,OAClB,IAAc;CAGhB,IAAM,IAAQ,EAAc,GAAQ,MAAM,EAEtC,IADkB,EAAc,GAAQ,SAAS;AAErD,CAAI,MAAa,OACf,IAAW;CAGb,IAAM,IAAY,CAAC,EAAY;AAK/B,QAJI,MAAU,MACZ,EAAU,KAAK,EAAM,EAGhB;EACL;EACA;EACA;EACA,WAAW,EAAU,KAAK,MAAM;EACjC"}
@@ -6,14 +6,13 @@ import { EntityPickerShell as i } from "./shared/EntityPickerShell.js";
6
6
  import { EntityPickerList as a } from "./shared/EntityPickerList.js";
7
7
  import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
8
8
  import { useTranslation as l } from "react-i18next";
9
- import { Button as u } from "@plumile/ui";
10
- import { Suspense as d, useCallback as f, useEffect as p, useMemo as m, useState as h } from "react";
11
- import * as g from "react-relay";
12
- import { Modal as _ } from "@plumile/ui/atomic/atoms/modal/Modal.js";
13
- import { Spinner as v } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
9
+ import { Button as u, Spinner as d } from "@plumile/ui";
10
+ import { Suspense as f, useCallback as p, useEffect as m, useMemo as h, useState as g } from "react";
11
+ import * as _ from "react-relay";
12
+ import { Modal as v } from "@plumile/ui/atomic/atoms/modal/Modal.js";
14
13
  //#region src/components/backoffice/pickers/EntityIdPickerDialog.tsx
15
- var { useFragment: y, useLazyLoadQuery: b } = g, x = "store-and-network", S = (e, t) => e(t), C = ({ config: e, search: t, scope: n, fetchKey: r, onSelectId: i }) => {
16
- let o = m(() => {
14
+ var { useFragment: y, useLazyLoadQuery: b } = _, x = "store-and-network", S = (e, t) => e(t), C = ({ config: e, search: t, scope: n, fetchKey: r, onSelectId: i }) => {
15
+ let o = h(() => {
17
16
  let r = t.trim();
18
17
  if (e.buildVariables != null) return e.buildVariables({
19
18
  search: r,
@@ -33,7 +32,7 @@ var { useFragment: y, useLazyLoadQuery: b } = g, x = "store-and-network", S = (e
33
32
  fetchKey: r
34
33
  }), l = y(e.fragment, c), u = e.getConnection(l);
35
34
  return /* @__PURE__ */ s(a, {
36
- items: m(() => u.edges.map((t) => {
35
+ items: h(() => u.edges.map((t) => {
37
36
  let n = e.toRow(t.node);
38
37
  return {
39
38
  id: e.getRowId(n),
@@ -48,21 +47,21 @@ var { useFragment: y, useLazyLoadQuery: b } = g, x = "store-and-network", S = (e
48
47
  variant: "secondary",
49
48
  onClick: e,
50
49
  children: t
51
- }) }), T = ({ message: e }) => /* @__PURE__ */ s("div", { children: e }), E = ({ isOpen: a, entity: o, title: g, scope: y, onClose: b, onSelectId: x }) => {
52
- let { t: E } = l(), { t: D } = e(), [O, k] = h(""), [A, j] = h(0), M = n(o, { enabled: a }), N;
53
- M.status === "loaded" && (N = M.module.config.picker), p(() => {
50
+ }) }), T = ({ message: e }) => /* @__PURE__ */ s("div", { children: e }), E = ({ isOpen: a, entity: o, title: _, scope: y, onClose: b, onSelectId: x }) => {
51
+ let { t: E } = l(), { t: D } = e(), [O, k] = g(""), [A, j] = g(0), M = n(o, { enabled: a }), N;
52
+ M.status === "loaded" && (N = M.module.config.picker), m(() => {
54
53
  a && (k(""), j((e) => e + 1));
55
54
  }, [a]);
56
- let P = m(() => w(b, D("common.actions.close")), [b, D]), F = f((e) => {
55
+ let P = h(() => w(b, D("common.actions.close")), [b, D]), F = p((e) => {
57
56
  k(e), j((e) => e + 1);
58
- }, []), I = f((e) => {
57
+ }, []), I = p((e) => {
59
58
  x(e), b();
60
59
  }, [b, x]);
61
60
  if (!a) return null;
62
61
  let L;
63
62
  N?.searchPlaceholder != null && (L = S(N.searchPlaceholder, E));
64
63
  let R = O.trim(), z = N?.searchRequired === !0, B;
65
- return B = M.status === "loading" ? /* @__PURE__ */ s(v, {}) : N == null ? /* @__PURE__ */ s(T, { message: D("picker.unavailable", { entity: o }) }) : z && R === "" ? /* @__PURE__ */ s("div", {
64
+ return B = M.status === "loading" ? /* @__PURE__ */ s(d, {}) : N == null ? /* @__PURE__ */ s(T, { message: D("picker.unavailable", { entity: o }) }) : z && R === "" ? /* @__PURE__ */ s("div", {
66
65
  className: r,
67
66
  children: D("picker.searchRequired")
68
67
  }) : /* @__PURE__ */ s(C, {
@@ -71,10 +70,10 @@ var { useFragment: y, useLazyLoadQuery: b } = g, x = "store-and-network", S = (e
71
70
  scope: y,
72
71
  fetchKey: A,
73
72
  onSelectId: I
74
- }), /* @__PURE__ */ s(_, {
73
+ }), /* @__PURE__ */ s(v, {
75
74
  isOpen: a,
76
75
  onClose: b,
77
- title: g,
76
+ title: _,
78
77
  footer: P,
79
78
  children: /* @__PURE__ */ s(i, {
80
79
  search: O,
@@ -93,8 +92,8 @@ var { useFragment: y, useLazyLoadQuery: b } = g, x = "store-and-network", S = (e
93
92
  children: D("common.actions.retry")
94
93
  })] });
95
94
  },
96
- children: /* @__PURE__ */ s(d, {
97
- fallback: /* @__PURE__ */ s(v, {}),
95
+ children: /* @__PURE__ */ s(f, {
96
+ fallback: /* @__PURE__ */ s(d, {}),
98
97
  children: B
99
98
  })
100
99
  })
@@ -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';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport type {\n BackofficeEntityPickerConfig,\n BackofficePickerScope,\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 { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\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;\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<RowRef, RowView extends EntityPickerRowViewModel> = {\n config: BackofficeEntityPickerConfig<RowRef, RowView>;\n search: string;\n scope?: BackofficePickerScope;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\nconst PickerBody = <RowRef, RowView extends EntityPickerRowViewModel>({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps<RowRef, RowView>): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n if (config.buildVariables != null) {\n return config.buildVariables({ search: trimmed, scope });\n }\n let searchValue: string | null = trimmed;\n if (trimmed === '') {\n searchValue = null;\n }\n return {\n search: searchValue,\n scope,\n } as Record<string, unknown>;\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 as never);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node);\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 <EntityPickerList items={items} onSelectId={onSelectId} />;\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 <div>{message}</div>;\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:\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\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 = <Spinner />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = (\n <div className={styles.searchRequiredMessage}>\n {t('picker.searchRequired')}\n </div>\n );\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 isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <div>\n <div>{t('picker.errors.loadFailed')}</div>\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 </div>\n );\n }}\n >\n <Suspense fallback={<Spinner />}>{pickerNode}</Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\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, Spinner } from '@plumile/ui';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport type {\n BackofficeEntityPickerConfig,\n BackofficePickerScope,\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 { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\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;\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<RowRef, RowView extends EntityPickerRowViewModel> = {\n config: BackofficeEntityPickerConfig<RowRef, RowView>;\n search: string;\n scope?: BackofficePickerScope;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\nconst PickerBody = <RowRef, RowView extends EntityPickerRowViewModel>({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps<RowRef, RowView>): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n if (config.buildVariables != null) {\n return config.buildVariables({ search: trimmed, scope });\n }\n let searchValue: string | null = trimmed;\n if (trimmed === '') {\n searchValue = null;\n }\n return {\n search: searchValue,\n scope,\n } as Record<string, unknown>;\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 as never);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node);\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 <EntityPickerList items={items} onSelectId={onSelectId} />;\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 <div>{message}</div>;\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:\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\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 = <Spinner />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = (\n <div className={styles.searchRequiredMessage}>\n {t('picker.searchRequired')}\n </div>\n );\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 isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <div>\n <div>{t('picker.errors.loadFailed')}</div>\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 </div>\n );\n }}\n >\n <Suspense fallback={<Spinner />}>{pickerNode}</Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}