@plumile/backoffice-react 0.1.107 → 0.1.108

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 (177) hide show
  1. package/lib/esm/auth/TotpQrCode.js +1 -1
  2. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  3. package/lib/esm/auth/login/EmailCapturePanel.js +27 -23
  4. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  5. package/lib/esm/auth/login/MfaChallengeForm.js +38 -36
  6. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  7. package/lib/esm/auth/login/PasskeyLoginForm.js +40 -37
  8. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  9. package/lib/esm/auth/pages/AcceptInvitationScreen.js +63 -62
  10. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  11. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +56 -55
  12. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  13. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +45 -45
  14. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  15. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -0
  16. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  17. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +44 -39
  18. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  19. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +15 -0
  20. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -0
  21. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js +11 -0
  22. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js.map +1 -0
  23. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js +7 -0
  24. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js.map +1 -0
  25. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +15 -0
  26. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -0
  27. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +19 -0
  28. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -0
  29. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +47 -40
  30. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +83 -90
  32. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  33. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +8 -0
  34. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -0
  35. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js +7 -0
  36. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js.map +1 -0
  37. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +8 -0
  38. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -0
  39. package/lib/esm/components/backoffice/detail/BackofficeTechnicalFacts.js +2 -0
  40. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +53 -48
  41. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  42. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js +2 -2
  43. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
  44. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +15 -11
  45. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  46. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +50 -23
  47. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  48. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +69 -69
  49. package/lib/esm/components/backoffice/layout/sidebarUtils.js +16 -16
  50. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  51. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +29 -0
  52. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -0
  53. package/lib/esm/components/backoffice/links/BackofficeLink.js +21 -0
  54. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -0
  55. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +26 -0
  56. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -0
  57. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js +19 -0
  58. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -0
  59. package/lib/esm/components/backoffice/links/backofficeLink.css.js +7 -0
  60. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -0
  61. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js +81 -0
  62. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -0
  63. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js +50 -0
  64. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -0
  65. package/lib/esm/components/backoffice/links/types.js +0 -0
  66. package/lib/esm/components/backoffice/links/useBackofficeLink.js +21 -0
  67. package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -0
  68. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +1 -0
  69. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  70. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +27 -27
  71. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  72. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +24 -21
  73. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  74. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +45 -44
  75. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  76. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +269 -223
  77. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  78. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +25 -30
  79. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  80. package/lib/esm/i18n/locales/en/backofficeReact.js +8 -0
  81. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  82. package/lib/esm/i18n/locales/fr/backofficeReact.js +8 -0
  83. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  84. package/lib/esm/index.js +88 -73
  85. package/lib/esm/pages/BackofficeDashboardPage.js +1 -5
  86. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  87. package/lib/esm/pages/BackofficeEntityDetailPage.js +231 -222
  88. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  89. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +170 -54
  90. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  91. package/lib/esm/pages/BackofficeEntityListPage.js +196 -207
  92. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  93. package/lib/esm/pages/BackofficeHubPage.js +21 -21
  94. package/lib/esm/pages/BackofficeLayoutPage.js +7 -7
  95. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  96. package/lib/esm/router/createBackofficeRoutes.js +132 -126
  97. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  98. package/lib/esm/style.css +1 -1
  99. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  100. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  101. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  102. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  103. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  104. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  105. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  106. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +0 -1
  107. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  108. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +8 -0
  109. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -0
  110. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts +9 -0
  111. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts.map +1 -0
  112. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts +7 -0
  113. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts.map +1 -0
  114. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts +12 -0
  115. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts.map +1 -0
  116. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts +16 -0
  117. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts.map +1 -0
  118. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts +11 -0
  119. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts.map +1 -0
  120. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
  121. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  122. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +6 -0
  123. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -0
  124. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts +7 -0
  125. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts.map +1 -0
  126. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +8 -0
  127. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +1 -0
  128. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts +2 -0
  129. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts.map +1 -0
  130. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
  131. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +1 -0
  132. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
  133. package/lib/types/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.d.ts.map +1 -1
  134. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +10 -8
  135. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
  136. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts +10 -5
  137. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts.map +1 -1
  138. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +6 -2
  139. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  140. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +18 -0
  141. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -0
  142. package/lib/types/components/backoffice/links/BackofficeLink.d.ts +13 -0
  143. package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -0
  144. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts +10 -0
  145. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts.map +1 -0
  146. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts +12 -0
  147. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts.map +1 -0
  148. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts +4 -0
  149. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts.map +1 -0
  150. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts +15 -0
  151. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts.map +1 -0
  152. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts +8 -0
  153. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts.map +1 -0
  154. package/lib/types/components/backoffice/links/types.d.ts +45 -0
  155. package/lib/types/components/backoffice/links/types.d.ts.map +1 -0
  156. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts +7 -0
  157. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts.map +1 -0
  158. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  159. package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -1
  160. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  161. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  162. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +6 -3
  163. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
  164. package/lib/types/i18n/resources.d.ts +16 -0
  165. package/lib/types/i18n/resources.d.ts.map +1 -1
  166. package/lib/types/index.d.ts +24 -1
  167. package/lib/types/index.d.ts.map +1 -1
  168. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  169. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  170. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +49 -22
  171. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  172. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  173. package/lib/types/provider/types.d.ts +26 -22
  174. package/lib/types/provider/types.d.ts.map +1 -1
  175. package/lib/types/router/createBackofficeRoutes.d.ts +36 -1
  176. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  177. package/package.json +7 -7
@@ -7,17 +7,23 @@ var e = (e, t) => e(t), t = (t) => {
7
7
  let i = t.layoutView.id;
8
8
  return typeof i == "string" && i.trim() !== "" ? i : "";
9
9
  }, n = (e) => [{
10
- id: "dashboard",
11
- label: e("dashboard.title"),
12
- isCurrent: !0
10
+ kind: "current",
11
+ target: { kind: "dashboard" },
12
+ label: e("sidebar.items.dashboard")
13
13
  }], r = (e) => [{
14
- id: `hub-${e.id}`,
15
- label: e.title,
16
- isCurrent: !0
14
+ kind: "current",
15
+ target: {
16
+ kind: "hub",
17
+ hubId: e.id
18
+ },
19
+ label: e.title
17
20
  }], i = (t, n) => [{
18
- id: `${t.id}-list`,
19
- label: e(t.label, n),
20
- isCurrent: !0
21
+ kind: "current",
22
+ target: {
23
+ kind: "entity-list",
24
+ entityId: t.id
25
+ },
26
+ label: e(t.label, n)
21
27
  }], a = (n) => {
22
28
  let r = e(n.config.label, n.tApp), i = t({
23
29
  layoutView: n.layoutView,
@@ -26,26 +32,47 @@ var e = (e, t) => e(t), t = (t) => {
26
32
  });
27
33
  return [
28
34
  {
29
- id: `${n.config.id}-list`,
30
- label: r,
31
- to: n.config.routes.list
35
+ kind: "link",
36
+ target: {
37
+ kind: "entity-list",
38
+ entityId: n.config.id
39
+ },
40
+ label: r
32
41
  },
33
42
  {
34
- id: `${n.config.id}-entity-${n.entityId}`,
35
- label: i,
36
- to: n.config.routes.detail(n.entityId)
43
+ kind: "link",
44
+ target: {
45
+ kind: "entity-detail",
46
+ entityId: n.config.id,
47
+ id: n.entityId
48
+ },
49
+ label: i
37
50
  },
38
51
  {
39
- id: `${n.config.id}-page-${n.pageLabel}`,
40
- label: n.pageLabel,
41
- isCurrent: !0
52
+ kind: "current",
53
+ target: {
54
+ kind: "entity-detail-page",
55
+ entityId: n.config.id,
56
+ id: n.entityId,
57
+ pageId: n.pageId ?? n.pageLabel
58
+ },
59
+ label: n.pageLabel
42
60
  }
43
61
  ];
44
- }, o = (e) => [{
45
- id: `tool-${e.title}`,
46
- label: e.title,
47
- isCurrent: !0
48
- }];
62
+ }, o = (e) => {
63
+ let t = {
64
+ kind: "href",
65
+ href: `/tools/${e.title}`
66
+ };
67
+ return e.id != null && (t = {
68
+ kind: "tool",
69
+ toolId: e.id
70
+ }), [{
71
+ kind: "current",
72
+ target: t,
73
+ label: e.title
74
+ }];
75
+ };
49
76
  //#endregion
50
77
  export { n as buildDashboardBreadcrumb, a as buildEntityDetailBreadcrumb, i as buildEntityListBreadcrumb, r as buildHubBreadcrumb, o as buildToolBreadcrumb, t as resolveEntityTitleFromDetailHeader };
51
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n if (typeof titleValue === 'string' && titleValue.trim() !== '') {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n const maybeId = (input.layoutView as { id?: unknown }).id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: 'dashboard',\n label: t('dashboard.title'),\n isCurrent: true,\n },\n ];\n};\n\nexport const buildHubBreadcrumb = (input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `hub-${input.id}`,\n label: input.title,\n isCurrent: true,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = (\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `${config.id}-list`,\n label: resolveLabel(config.label, tApp),\n isCurrent: true,\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = (input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n\n return [\n {\n id: `${input.config.id}-list`,\n label: listLabel,\n to: input.config.routes.list,\n },\n {\n id: `${input.config.id}-entity-${input.entityId}`,\n label: entityTitle,\n to: input.config.routes.detail(input.entityId),\n },\n {\n id: `${input.config.id}-page-${input.pageLabel}`,\n label: input.pageLabel,\n isCurrent: true,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = (input: {\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `tool-${input.title}`,\n label: input.title,\n isCurrent: true,\n },\n ];\n};\n"],"mappings":";AAWA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,KACP;CACD,IAAI,OAAO,KAAe,YAAY,EAAW,MAAM,KAAK,IAC1D,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,KAAK;CAChE,IAAI,EAAM,MAAM,KAAK,IACnB,OAAO;CAGT,IAAM,IAAW,EAAM,WAAgC;CAKvD,OAJI,OAAO,KAAY,YAAY,EAAQ,MAAM,KAAK,KAC7C,IAGF;GAGI,KACX,MAEO,CACL;CACE,IAAI;CACJ,OAAO,EAAE,kBAAkB;CAC3B,WAAW;CACZ,CACF,EAGU,KAAsB,MAI1B,CACL;CACE,IAAI,OAAO,EAAM;CACjB,OAAO,EAAM;CACb,WAAW;CACZ,CACF,EAGU,KACX,GACA,MAEO,CACL;CACE,IAAI,GAAG,EAAO,GAAG;CACjB,OAAO,EAAa,EAAO,OAAO,EAAK;CACvC,WAAW;CACZ,CACF,EAGU,KAA+B,MAQK;CAC/C,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,KAAK,EACxD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;EACb,CAAC;CAEF,OAAO;EACL;GACE,IAAI,GAAG,EAAM,OAAO,GAAG;GACvB,OAAO;GACP,IAAI,EAAM,OAAO,OAAO;GACzB;EACD;GACE,IAAI,GAAG,EAAM,OAAO,GAAG,UAAU,EAAM;GACvC,OAAO;GACP,IAAI,EAAM,OAAO,OAAO,OAAO,EAAM,SAAS;GAC/C;EACD;GACE,IAAI,GAAG,EAAM,OAAO,GAAG,QAAQ,EAAM;GACrC,OAAO,EAAM;GACb,WAAW;GACZ;EACF;GAGU,KAAuB,MAG3B,CACL;CACE,IAAI,QAAQ,EAAM;CAClB,OAAO,EAAM;CACb,WAAW;CACZ,CACF"}
1
+ {"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n BackofficeManifestDetailEntityId,\n BackofficeManifestListEntityId,\n BackofficeManifestToolId,\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n if (typeof titleValue === 'string' && titleValue.trim() !== '') {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n const maybeId = (input.layoutView as { id?: unknown }).id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'dashboard' },\n label: t('sidebar.items.dashboard'),\n },\n ];\n};\n\nexport const buildHubBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'hub', hubId: input.id },\n label: input.title,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: {\n kind: 'entity-list',\n entityId: config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: resolveLabel(config.label, tApp),\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n pageId?: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n\n return [\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: input.config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: listLabel,\n },\n {\n kind: 'link',\n target: {\n kind: 'entity-detail',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n },\n label: entityTitle,\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail-page',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n pageId: input.pageId ?? input.pageLabel,\n } as never,\n label: input.pageLabel,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id?: BackofficeManifestToolId<TManifest> | string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n let target: BackofficeTopbarBreadcrumbItem<TManifest>['target'] = {\n kind: 'href',\n href: `/tools/${input.title}`,\n };\n if (input.id != null) {\n target = {\n kind: 'tool',\n toolId: input.id as BackofficeManifestToolId<TManifest>,\n };\n }\n return [\n {\n kind: 'current',\n target,\n label: input.title,\n },\n ];\n};\n"],"mappings":";AAeA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,KACP;CACD,IAAI,OAAO,KAAe,YAAY,EAAW,MAAM,KAAK,IAC1D,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,KAAK;CAChE,IAAI,EAAM,MAAM,KAAK,IACnB,OAAO;CAGT,IAAM,IAAW,EAAM,WAAgC;CAKvD,OAJI,OAAO,KAAY,YAAY,EAAQ,MAAM,KAAK,KAC7C,IAGF;GAGI,KACX,MAEO,CACL;CACE,MAAM;CACN,QAAQ,EAAE,MAAM,aAAa;CAC7B,OAAO,EAAE,0BAA0B;CACpC,CACF,EAGU,KAEX,MAIO,CACL;CACE,MAAM;CACN,QAAQ;EAAE,MAAM;EAAO,OAAO,EAAM;EAAI;CACxC,OAAO,EAAM;CACd,CACF,EAGU,KAGX,GACA,MAEO,CACL;CACE,MAAM;CACN,QAAQ;EACN,MAAM;EACN,UAAU,EAAO;EAClB;CACD,OAAO,EAAa,EAAO,OAAO,EAAK;CACxC,CACF,EAGU,KAEX,MAS0D;CAC1D,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,KAAK,EACxD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;EACb,CAAC;CAEF,OAAO;EACL;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OAAO;IACxB;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;IACX;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;IACV,QAAQ,EAAM,UAAU,EAAM;IAC/B;GACD,OAAO,EAAM;GACd;EACF;GAGU,KAEX,MAG0D;CAC1D,IAAI,IAA8D;EAChE,MAAM;EACN,MAAM,UAAU,EAAM;EACvB;CAOD,OANI,EAAM,MAAM,SACd,IAAS;EACP,MAAM;EACN,QAAQ,EAAM;EACf,GAEI,CACL;EACE,MAAM;EACN;EACA,OAAO,EAAM;EACd,CACF"}
@@ -1,5 +1,5 @@
1
- import { actionButton as e } from "./backofficeSidebarActions.css.js";
2
- import { buildEntityGroupLookup as t, isActivePath as n, resolveGroupItems as r, resolveHubEntityIds as i, resolveLabel as a, resolveSidebarGroups as o, resolveSidebarHub as s } from "./sidebarUtils.js";
1
+ import { buildEntityGroupLookup as e, isActivePath as t, resolveGroupItems as n, resolveHubEntityIds as r, resolveLabel as i, resolveSidebarGroups as a, resolveSidebarHub as o } from "./sidebarUtils.js";
2
+ import { actionButton as s } from "./backofficeSidebarActions.css.js";
3
3
  import { BackofficeSidebarHistorySvg as c, GripDotsSvg as l, PinFilledSvg as u, PinSvg as d, SidebarHomeSvg as f, SidebarTasksSvg as p } from "@plumile/ui";
4
4
  import { jsx as m } from "react/jsx-runtime";
5
5
  //#region src/components/backoffice/layout/buildSidebarSections.tsx
@@ -9,19 +9,19 @@ var h = (e, t, n = 18) => e == null ? t ?? null : /* @__PURE__ */ m(e, {
9
9
  "aria-hidden": "true"
10
10
  });
11
11
  function g(g) {
12
- let { basePath: _, pathname: v, entities: y, sidebar: b, permissions: x, searchQuery: S, tApp: C, t: w, pinnedEntityIds: T = [], recentItems: E = [], onTogglePin: D, onReorderPin: O, collapsedByGroupId: k, onGroupCollapsedChange: A, sidebarCollapsed: j = !1 } = g, M = o(y, b), N = Object.entries(M), P = new Set(T), F = w("sidebar.actions.pin"), I = w("sidebar.actions.unpin"), L = w("sidebar.actions.reorder"), R = t(M, b), z = S?.trim().toLowerCase() ?? "", B = (e) => z === "" || e.toLowerCase().includes(z), V = (t) => {
12
+ let { basePath: _, pathname: v, entities: y, sidebar: b, permissions: x, searchQuery: S, tApp: C, t: w, pinnedEntityIds: T = [], recentItems: E = [], onTogglePin: D, onReorderPin: O, collapsedByGroupId: k, onGroupCollapsedChange: A, sidebarCollapsed: j = !1 } = g, M = a(y, b), N = Object.entries(M), P = new Set(T), F = w("sidebar.actions.pin"), I = w("sidebar.actions.unpin"), L = w("sidebar.actions.reorder"), R = e(M, b), z = S?.trim().toLowerCase() ?? "", B = (e) => z === "" || e.toLowerCase().includes(z), V = (e) => {
13
13
  if (D == null) return null;
14
- let n = P.has(t), r = F, i = d;
15
- return n && (r = I, i = u), /* @__PURE__ */ m("button", {
14
+ let t = P.has(e), n = F, r = d;
15
+ return t && (n = I, r = u), /* @__PURE__ */ m("button", {
16
16
  type: "button",
17
- className: e,
18
- "aria-pressed": n,
19
- "aria-label": r,
20
- title: r,
21
- onClick: (e) => {
22
- e.preventDefault(), e.stopPropagation(), D(t);
17
+ className: s,
18
+ "aria-pressed": t,
19
+ "aria-label": n,
20
+ title: n,
21
+ onClick: (t) => {
22
+ t.preventDefault(), t.stopPropagation(), D(e);
23
23
  },
24
- children: /* @__PURE__ */ m(i, {
24
+ children: /* @__PURE__ */ m(r, {
25
25
  width: 14,
26
26
  height: 14,
27
27
  "aria-hidden": "true"
@@ -32,58 +32,58 @@ function g(g) {
32
32
  kind: "dashboard",
33
33
  id: "dashboard"
34
34
  }, x) === !1) return null;
35
- let t = w("sidebar.items.dashboard");
36
- return B(t) ? {
35
+ let n = w("sidebar.items.dashboard");
36
+ return B(n) ? {
37
37
  id: "dashboard",
38
38
  data: {
39
39
  kind: "dashboard",
40
40
  id: "dashboard",
41
41
  groupId: e
42
42
  },
43
- label: t,
43
+ label: n,
44
44
  href: _,
45
45
  icon: h(void 0, /* @__PURE__ */ m(f, {
46
46
  width: 18,
47
47
  height: 18,
48
48
  "aria-hidden": "true"
49
49
  })),
50
- isActive: n(v, _),
51
- ariaLabel: t
50
+ isActive: t(v, _),
51
+ ariaLabel: n
52
52
  } : null;
53
53
  }, U = (e) => {
54
- let { entityId: t, groupId: r, groupIcon: i, itemIcon: o, itemLabel: s, enableReorder: c } = e, u = y[t];
54
+ let { entityId: n, groupId: r, groupIcon: a, itemIcon: o, itemLabel: s, enableReorder: c } = e, u = y[n];
55
55
  if (u == null) return null;
56
56
  let d = {
57
57
  kind: "entity",
58
- id: t
58
+ id: n
59
59
  };
60
60
  if (u.kind === "tool" && (d = {
61
61
  kind: "tool",
62
- id: t
62
+ id: n
63
63
  }), b?.isItemVisible?.(d, x) === !1) return null;
64
64
  if (u.kind === "tool") {
65
- let e = s ?? a(u.label, C);
65
+ let e = s ?? i(u.label, C);
66
66
  return z !== "" && !e.toLowerCase().includes(z) ? null : {
67
- id: `tool-${t}`,
67
+ id: `tool-${n}`,
68
68
  data: {
69
69
  kind: "tool",
70
- id: t,
70
+ id: n,
71
71
  groupId: r
72
72
  },
73
73
  label: e,
74
74
  href: u.routes.list,
75
- icon: h(o ?? i, /* @__PURE__ */ m(p, {
75
+ icon: h(o ?? a, /* @__PURE__ */ m(p, {
76
76
  width: 18,
77
77
  height: 18,
78
78
  "aria-hidden": "true"
79
79
  })),
80
- isActive: n(v, u.routes.list),
80
+ isActive: t(v, u.routes.list),
81
81
  ariaLabel: e,
82
- actionSlot: V(t)
82
+ actionSlot: V(n)
83
83
  };
84
84
  }
85
85
  if (!u.hasList) return null;
86
- let f = s ?? a(u.label, C);
86
+ let f = s ?? i(u.label, C);
87
87
  if (z !== "" && !f.toLowerCase().includes(z)) return null;
88
88
  let g, _, S, w, T = !1;
89
89
  c === !0 && O != null && (T = !0, g = /* @__PURE__ */ m(l, {
@@ -91,35 +91,35 @@ function g(g) {
91
91
  height: 14,
92
92
  "aria-hidden": "true"
93
93
  }), _ = (e) => {
94
- let { dataTransfer: n } = e;
95
- n.effectAllowed = "move", n.setData("text/plain", t);
94
+ let { dataTransfer: t } = e;
95
+ t.effectAllowed = "move", t.setData("text/plain", n);
96
96
  }, S = (e) => {
97
97
  e.preventDefault();
98
98
  let { dataTransfer: t } = e;
99
99
  t.dropEffect = "move";
100
100
  }, w = (e) => {
101
101
  e.preventDefault();
102
- let n = e.dataTransfer.getData("text/plain");
103
- n === "" || n === t || O(n, t);
102
+ let t = e.dataTransfer.getData("text/plain");
103
+ t === "" || t === n || O(t, n);
104
104
  });
105
105
  let E;
106
106
  return g != null && (E = L), {
107
- id: t,
107
+ id: n,
108
108
  data: {
109
109
  kind: "entity",
110
- id: t,
110
+ id: n,
111
111
  groupId: r
112
112
  },
113
113
  label: f,
114
114
  href: u.routes.list,
115
- icon: h(o ?? i, /* @__PURE__ */ m(p, {
115
+ icon: h(o ?? a, /* @__PURE__ */ m(p, {
116
116
  width: 18,
117
117
  height: 18,
118
118
  "aria-hidden": "true"
119
119
  })),
120
- isActive: n(v, u.routes.list),
120
+ isActive: t(v, u.routes.list),
121
121
  ariaLabel: f,
122
- actionSlot: V(t),
122
+ actionSlot: V(n),
123
123
  dragHandleSlot: g,
124
124
  dragHandleLabel: E,
125
125
  draggable: T,
@@ -128,12 +128,12 @@ function g(g) {
128
128
  onDrop: w
129
129
  };
130
130
  }, W = (e) => {
131
- let { hub: t, groupId: r, icon: o } = e, s = {
131
+ let { hub: n, groupId: a, icon: o } = e, s = {
132
132
  kind: "hub",
133
- id: t.id
133
+ id: n.id
134
134
  };
135
135
  if (b?.isItemVisible?.(s, x) === !1) return null;
136
- let c = i(t), l = c.map((e) => y[e] ?? null).filter((e) => {
136
+ let c = r(n), l = c.map((e) => y[e] ?? null).filter((e) => {
137
137
  if (e == null) return !1;
138
138
  let t = "entity";
139
139
  e.kind === "tool" && (t = "tool");
@@ -144,18 +144,18 @@ function g(g) {
144
144
  return !(b?.isItemVisible?.(n, x) === !1 || e.kind !== "tool" && !e.hasList);
145
145
  });
146
146
  if (c.length > 0 && l.length === 0) return null;
147
- let u = a(t.title, C), d = B(u), f = l.some((e) => B(a(e.label, C)));
147
+ let u = i(n.title, C), d = B(u), f = l.some((e) => B(i(e.label, C)));
148
148
  if (!d && !f) return null;
149
- let g = n(v, t.href) || l.some((e) => n(v, e.routes.list));
149
+ let g = t(v, n.href) || l.some((e) => t(v, e.routes.list));
150
150
  return {
151
- id: `hub-${t.id}`,
151
+ id: `hub-${n.id}`,
152
152
  data: {
153
153
  kind: "hub",
154
- id: t.id,
155
- groupId: r
154
+ id: n.id,
155
+ groupId: a
156
156
  },
157
157
  label: u,
158
- href: t.href,
158
+ href: n.href,
159
159
  icon: h(o, /* @__PURE__ */ m(p, {
160
160
  width: 18,
161
161
  height: 18,
@@ -169,11 +169,11 @@ function g(g) {
169
169
  let e = K.map((e) => {
170
170
  if (e.kind === "dashboard") return H();
171
171
  if (e.kind === "hub") return W({
172
- hub: s(e, b),
172
+ hub: o(e, b),
173
173
  icon: e.icon
174
174
  });
175
175
  let t;
176
- return e.label != null && (t = a(e.label, C)), U({
176
+ return e.label != null && (t = i(e.label, C)), U({
177
177
  entityId: e.id,
178
178
  itemIcon: e.icon,
179
179
  itemLabel: t
@@ -211,11 +211,11 @@ function g(g) {
211
211
  if (E.length > 0) {
212
212
  let e = E.map((e) => {
213
213
  if (y[e.id] == null) return null;
214
- let t = {
214
+ let n = {
215
215
  kind: e.kind,
216
216
  id: e.id
217
217
  };
218
- if (b?.isItemVisible?.(t, x) === !1 || z !== "" && !e.label.toLowerCase().includes(z)) return null;
218
+ if (b?.isItemVisible?.(n, x) === !1 || z !== "" && !e.label.toLowerCase().includes(z)) return null;
219
219
  let r = R.get(e.id);
220
220
  return {
221
221
  id: `recent-${e.kind}-${e.id}`,
@@ -231,7 +231,7 @@ function g(g) {
231
231
  height: 18,
232
232
  "aria-hidden": "true"
233
233
  })),
234
- isActive: n(v, e.href),
234
+ isActive: t(v, e.href),
235
235
  ariaLabel: e.label
236
236
  };
237
237
  }).filter((e) => e != null);
@@ -249,37 +249,37 @@ function g(g) {
249
249
  }
250
250
  return N.forEach(([e, t]) => {
251
251
  if (t.isVisible != null && !t.isVisible(x)) return;
252
- let n = [], i = r(t);
253
- i.length > 0 && i.forEach((r) => {
254
- if (r.kind === "dashboard") {
252
+ let r = [], a = n(t);
253
+ a.length > 0 && a.forEach((n) => {
254
+ if (n.kind === "dashboard") {
255
255
  let t = H(e);
256
- t != null && n.push(t);
256
+ t != null && r.push(t);
257
257
  return;
258
258
  }
259
- if (r.kind === "hub") {
259
+ if (n.kind === "hub") {
260
260
  let i = W({
261
- hub: s(r, b),
261
+ hub: o(n, b),
262
262
  groupId: e,
263
- icon: r.icon ?? t.icon
263
+ icon: n.icon ?? t.icon
264
264
  });
265
- i != null && n.push(i);
265
+ i != null && r.push(i);
266
266
  return;
267
267
  }
268
- let i;
269
- r.label != null && (i = a(r.label, C));
270
- let o = U({
271
- entityId: r.id,
268
+ let a;
269
+ n.label != null && (a = i(n.label, C));
270
+ let s = U({
271
+ entityId: n.id,
272
272
  groupId: e,
273
273
  groupIcon: t.icon,
274
- itemIcon: r.icon,
275
- itemLabel: i
274
+ itemIcon: n.icon,
275
+ itemLabel: a
276
276
  });
277
- o != null && n.push(o);
277
+ s != null && r.push(s);
278
278
  });
279
- let o = n;
280
- if (j && t.behavior?.showInCollapsedRail !== !0 && (o = n.filter((e) => e.id === "dashboard" || e.isActive === !0)), o.length === 0) return;
279
+ let s = r;
280
+ if (j && t.behavior?.showInCollapsedRail !== !0 && (s = r.filter((e) => e.id === "dashboard" || e.isActive === !0)), s.length === 0) return;
281
281
  let c;
282
- t.title != null && (c = a(t.title, C));
282
+ t.title != null && (c = i(t.title, C));
283
283
  let l = k?.[e], u;
284
284
  A != null && (u = (t) => {
285
285
  A(e, t);
@@ -287,7 +287,7 @@ function g(g) {
287
287
  id: e,
288
288
  title: c,
289
289
  icon: h(t.icon, void 0, 16),
290
- items: o,
290
+ items: s,
291
291
  collapsible: t.behavior?.collapsible ?? !0,
292
292
  defaultCollapsed: t.behavior?.defaultCollapsed ?? !0,
293
293
  isCollapsed: l,
@@ -15,38 +15,38 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
15
15
  ...e,
16
16
  groups: e.groups ?? n?.groups ?? []
17
17
  };
18
- }, s = (e) => {
18
+ }, s = (e, t) => o(e, t), c = (e) => {
19
19
  let t = [], n = /* @__PURE__ */ new Set();
20
20
  return e.groups.forEach((e) => {
21
21
  e.items.forEach((e) => {
22
22
  n.has(e.id) || (n.add(e.id), t.push(e.id));
23
23
  });
24
24
  }), t;
25
- }, c = (e, t) => {
25
+ }, l = (e, t) => {
26
26
  let n = [], r = /* @__PURE__ */ new Set();
27
27
  return Object.entries(e).forEach(([e, i]) => {
28
28
  a(i).forEach((a) => {
29
29
  a.kind !== "hub" || r.has(a.id) || (r.add(a.id), n.push({
30
30
  groupId: e,
31
- hub: o(a, t),
31
+ hub: s(a, t),
32
32
  icon: a.icon ?? i.icon
33
33
  }));
34
34
  });
35
35
  }), Object.values(t?.hubs ?? {}).forEach((e) => {
36
36
  r.has(e.id) || (r.add(e.id), n.push({
37
37
  groupId: null,
38
- hub: o(e, t),
38
+ hub: s(e, t),
39
39
  icon: e.icon
40
40
  }));
41
41
  }), n;
42
- }, l = (e, t) => a(e).flatMap((e) => e.kind === "entity" || e.kind === "tool" ? [e.id] : e.kind === "hub" ? s(o(e, t)) : []), u = (e, t) => {
42
+ }, u = (e, t) => a(e).flatMap((e) => e.kind === "entity" || e.kind === "tool" ? [e.id] : e.kind === "hub" ? c(s(e, t)) : []), d = (e, t) => {
43
43
  let n = /* @__PURE__ */ new Map();
44
44
  return Object.entries(e).forEach(([e, r]) => {
45
45
  a(r).forEach((i) => {
46
46
  if (i.kind !== "dashboard") {
47
47
  if (i.kind === "hub") {
48
- let a = o(i, t);
49
- s(a).forEach((t) => {
48
+ let a = s(i, t);
49
+ c(a).forEach((t) => {
50
50
  n.has(t) || n.set(t, {
51
51
  groupId: e,
52
52
  groupIcon: r.icon,
@@ -63,7 +63,7 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
63
63
  }
64
64
  });
65
65
  }), n;
66
- }, d = (e, t, n, r) => {
66
+ }, f = (e, t, n, r) => {
67
67
  let i = t[e];
68
68
  if (i == null) return !1;
69
69
  let a = {
@@ -74,25 +74,25 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
74
74
  kind: "tool",
75
75
  id: e
76
76
  }), n?.isItemVisible == null ? i.kind === "tool" ? !0 : i.hasList : n.isItemVisible(a, r);
77
- }, f = (e, t, n, r) => {
77
+ }, p = (e, t, n, r) => {
78
78
  let i = [], a = /* @__PURE__ */ new Set();
79
79
  return Object.entries(e).forEach(([, e]) => {
80
- e.isVisible != null && !e.isVisible(r) || l(e, n).forEach((e) => {
81
- a.has(e) || d(e, t, n, r) && (a.add(e), i.push(e));
80
+ e.isVisible != null && !e.isVisible(r) || u(e, n).forEach((e) => {
81
+ a.has(e) || f(e, t, n, r) && (a.add(e), i.push(e));
82
82
  });
83
83
  }), i;
84
- }, p = (e, n) => {
84
+ }, m = (e, n) => {
85
85
  let r = Object.entries(n);
86
86
  for (let [n, i] of r) if (i.kind === "tool") {
87
87
  if (t(e, i.routes.list)) return n;
88
88
  } else if (i.hasList && t(e, i.routes.list)) return n;
89
89
  return null;
90
- }, m = (e, t, n, r, i) => {
91
- if (t == null || !d(t, n, r, i)) return null;
92
- for (let [n, a] of Object.entries(e)) if ((a.isVisible == null || a.isVisible(i)) && l(a, r).includes(t)) return n;
90
+ }, h = (e, t, n, r, i) => {
91
+ if (t == null || !f(t, n, r, i)) return null;
92
+ for (let [n, a] of Object.entries(e)) if ((a.isVisible == null || a.isVisible(i)) && u(a, r).includes(t)) return n;
93
93
  return null;
94
94
  };
95
95
  //#endregion
96
- export { n as buildDefaultGroups, u as buildEntityGroupLookup, t as isActivePath, p as resolveActiveEntityId, m as resolveActiveGroupId, l as resolveGroupEntityIds, a as resolveGroupItems, s as resolveHubEntityIds, i as resolveItemDescriptor, e as resolveLabel, r as resolveSidebarGroups, o as resolveSidebarHub, c as resolveSidebarHubEntries, f as resolveVisibleEntityIds };
96
+ export { n as buildDefaultGroups, d as buildEntityGroupLookup, t as isActivePath, m as resolveActiveEntityId, h as resolveActiveGroupId, u as resolveGroupEntityIds, a as resolveGroupItems, c as resolveHubEntityIds, i as resolveItemDescriptor, e as resolveLabel, r as resolveSidebarGroups, s as resolveSidebarHub, l as resolveSidebarHubEntries, o as resolveSidebarHubFor, p as resolveVisibleEntityIds };
97
97
 
98
98
  //# sourceMappingURL=sidebarUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebarUtils.js","names":[],"sources":["../../../../../src/components/backoffice/layout/sidebarUtils.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeIconComponent,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeSidebarItemConfig,\n BackofficeSidebarHubConfig,\n BackofficeResolvedSidebarHubConfig,\n} from '../../../provider/types.js';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isActivePath = (pathname: string, href: string): boolean => {\n if (pathname === href) {\n return true;\n }\n if (href !== '/' && pathname.startsWith(`${href}/`)) {\n return true;\n }\n return false;\n};\n\nexport const buildDefaultGroups = (\n entities: BackofficeEntityManifestMap,\n): Record<string, BackofficeSidebarGroupConfig> => {\n const entityIds = Object.keys(entities);\n\n return {\n main: {\n entities: entityIds,\n },\n };\n};\n\nexport const resolveSidebarGroups = (\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n): Record<string, BackofficeSidebarGroupConfig> => {\n return sidebar?.groups ?? buildDefaultGroups(entities);\n};\n\nexport type EntityGroupLookup = Map<\n string,\n {\n groupId: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n }\n>;\n\nexport const resolveItemDescriptor = (\n item: BackofficeSidebarItemConfig,\n): BackofficeSidebarItemDescriptor => {\n if (item.kind === 'dashboard') {\n return { kind: 'dashboard', id: item.id ?? 'dashboard' };\n }\n return { kind: item.kind, id: item.id };\n};\n\nexport const resolveGroupItems = (\n group: BackofficeSidebarGroupConfig,\n): readonly BackofficeSidebarItemConfig[] => {\n if (group.items != null) {\n return group.items;\n }\n return (\n group.entities?.map((entityId) => {\n return { kind: 'entity', id: entityId } as const;\n }) ?? []\n );\n};\n\nexport const resolveSidebarHub = (\n item: BackofficeSidebarHubConfig,\n sidebar: BackofficeSidebarConfig | undefined,\n): BackofficeResolvedSidebarHubConfig => {\n const registeredHub = sidebar?.hubs?.[item.id];\n return {\n ...registeredHub,\n ...item,\n groups: item.groups ?? registeredHub?.groups ?? [],\n };\n};\n\nexport const resolveHubEntityIds = (\n hub: BackofficeResolvedSidebarHubConfig,\n): readonly string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n hub.groups.forEach((group) => {\n group.items.forEach((item) => {\n if (seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push(item.id);\n });\n });\n return output;\n};\n\nexport type ResolvedSidebarHubEntry = {\n groupId: string | null;\n hub: BackofficeResolvedSidebarHubConfig;\n icon?: BackofficeIconComponent;\n};\n\nexport const resolveSidebarHubEntries = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar: BackofficeSidebarConfig | undefined,\n): readonly ResolvedSidebarHubEntry[] => {\n const output: ResolvedSidebarHubEntry[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind !== 'hub' || seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push({\n groupId,\n hub: resolveSidebarHub(item, sidebar),\n icon: item.icon ?? group.icon,\n });\n });\n });\n\n Object.values(sidebar?.hubs ?? {}).forEach((hub) => {\n if (seen.has(hub.id)) {\n return;\n }\n seen.add(hub.id);\n output.push({\n groupId: null,\n hub: resolveSidebarHub(hub, sidebar),\n icon: hub.icon,\n });\n });\n\n return output;\n};\n\nexport const resolveGroupEntityIds = (\n group: BackofficeSidebarGroupConfig,\n sidebar?: BackofficeSidebarConfig,\n): readonly string[] => {\n return resolveGroupItems(group).flatMap((item) => {\n if (item.kind === 'entity' || item.kind === 'tool') {\n return [item.id];\n }\n if (item.kind === 'hub') {\n return resolveHubEntityIds(resolveSidebarHub(item, sidebar));\n }\n return [];\n });\n};\n\nexport const buildEntityGroupLookup = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar?: BackofficeSidebarConfig,\n): EntityGroupLookup => {\n const lookup: EntityGroupLookup = new Map();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind === 'dashboard') {\n return;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHub(item, sidebar);\n resolveHubEntityIds(hub).forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon ?? hub.icon,\n });\n }\n });\n return;\n }\n\n if (!lookup.has(item.id)) {\n lookup.set(item.id, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon,\n });\n }\n });\n });\n\n return lookup;\n};\n\nconst isEntityVisible = (\n entityId: string,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): boolean => {\n const config = entities[entityId];\n if (config == null) {\n return false;\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\n if (sidebar?.isItemVisible != null) {\n return sidebar.isItemVisible(descriptor, permissions);\n }\n\n if (config.kind === 'tool') {\n return true;\n }\n return config.hasList;\n};\n\nexport const resolveVisibleEntityIds = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n resolveGroupEntityIds(group, sidebar).forEach((entityId) => {\n if (seen.has(entityId)) {\n return;\n }\n if (!isEntityVisible(entityId, entities, sidebar, permissions)) {\n return;\n }\n seen.add(entityId);\n output.push(entityId);\n });\n });\n\n return output;\n};\n\nexport const resolveActiveEntityId = (\n pathname: string,\n entities: BackofficeEntityManifestMap,\n): string | null => {\n const entries = Object.entries(entities);\n for (const [entityId, config] of entries) {\n if (config.kind === 'tool') {\n if (isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n } else if (config.hasList && isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n }\n return null;\n};\n\nexport const resolveActiveGroupId = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n activeEntityId: string | null,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string | null => {\n if (activeEntityId == null) {\n return null;\n }\n\n if (!isEntityVisible(activeEntityId, entities, sidebar, permissions)) {\n return null;\n }\n\n for (const [groupId, group] of Object.entries(groups)) {\n const isVisible = group.isVisible == null || group.isVisible(permissions);\n if (\n isVisible &&\n resolveGroupEntityIds(group, sidebar).includes(activeEntityId)\n ) {\n return groupId;\n }\n }\n\n return null;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebarUtils.js","names":[],"sources":["../../../../../src/components/backoffice/layout/sidebarUtils.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeIconComponent,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeSidebarItemConfig,\n BackofficeSidebarHubConfig,\n BackofficeSidebarHubGroupConfig,\n BackofficeResolvedSidebarHubConfig,\n} from '../../../provider/types.js';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isActivePath = (pathname: string, href: string): boolean => {\n if (pathname === href) {\n return true;\n }\n if (href !== '/' && pathname.startsWith(`${href}/`)) {\n return true;\n }\n return false;\n};\n\nexport const buildDefaultGroups = (\n entities: BackofficeEntityManifestMap,\n): Record<string, BackofficeSidebarGroupConfig> => {\n const entityIds = Object.keys(entities);\n\n return {\n main: {\n entities: entityIds,\n },\n };\n};\n\nexport const resolveSidebarGroups = (\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n): Record<string, BackofficeSidebarGroupConfig> => {\n return sidebar?.groups ?? buildDefaultGroups(entities);\n};\n\nexport type EntityGroupLookup = Map<\n string,\n {\n groupId: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n }\n>;\n\nexport const resolveItemDescriptor = (\n item: BackofficeSidebarItemConfig,\n): BackofficeSidebarItemDescriptor => {\n if (item.kind === 'dashboard') {\n return { kind: 'dashboard', id: item.id ?? 'dashboard' };\n }\n return { kind: item.kind, id: item.id };\n};\n\nexport const resolveGroupItems = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n group: BackofficeSidebarGroupConfig<TManifest>,\n): readonly BackofficeSidebarItemConfig<TManifest>[] => {\n if (group.items != null) {\n return group.items;\n }\n return (group.entities?.map((entityId) => {\n return { kind: 'entity', id: entityId } as const;\n }) ?? []) as unknown as readonly BackofficeSidebarItemConfig<TManifest>[];\n};\n\nexport type BackofficeResolvedSidebarHubConfigFor<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = BackofficeSidebarHubConfig<TManifest> & {\n groups: readonly BackofficeSidebarHubGroupConfig<TManifest>[];\n};\n\nexport const resolveSidebarHubFor = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n item: BackofficeSidebarHubConfig<TManifest>,\n sidebar: BackofficeSidebarConfig<TManifest> | undefined,\n): BackofficeResolvedSidebarHubConfigFor<TManifest> => {\n const registeredHub = sidebar?.hubs?.[item.id];\n return {\n ...registeredHub,\n ...item,\n groups: item.groups ?? registeredHub?.groups ?? [],\n };\n};\n\nexport const resolveSidebarHub = (\n item: BackofficeSidebarHubConfig,\n sidebar: BackofficeSidebarConfig | undefined,\n): BackofficeResolvedSidebarHubConfig => {\n return resolveSidebarHubFor(item, sidebar);\n};\n\nexport const resolveHubEntityIds = (\n hub: BackofficeResolvedSidebarHubConfig,\n): readonly string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n hub.groups.forEach((group) => {\n group.items.forEach((item) => {\n if (seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push(item.id);\n });\n });\n return output;\n};\n\nexport type ResolvedSidebarHubEntry = {\n groupId: string | null;\n hub: BackofficeResolvedSidebarHubConfig;\n icon?: BackofficeIconComponent;\n};\n\nexport const resolveSidebarHubEntries = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar: BackofficeSidebarConfig | undefined,\n): readonly ResolvedSidebarHubEntry[] => {\n const output: ResolvedSidebarHubEntry[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind !== 'hub' || seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push({\n groupId,\n hub: resolveSidebarHub(item, sidebar),\n icon: item.icon ?? group.icon,\n });\n });\n });\n\n Object.values(sidebar?.hubs ?? {}).forEach((hub) => {\n if (seen.has(hub.id)) {\n return;\n }\n seen.add(hub.id);\n output.push({\n groupId: null,\n hub: resolveSidebarHub(hub, sidebar),\n icon: hub.icon,\n });\n });\n\n return output;\n};\n\nexport const resolveGroupEntityIds = (\n group: BackofficeSidebarGroupConfig,\n sidebar?: BackofficeSidebarConfig,\n): readonly string[] => {\n return resolveGroupItems(group).flatMap((item) => {\n if (item.kind === 'entity' || item.kind === 'tool') {\n return [item.id];\n }\n if (item.kind === 'hub') {\n return resolveHubEntityIds(resolveSidebarHub(item, sidebar));\n }\n return [];\n });\n};\n\nexport const buildEntityGroupLookup = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar?: BackofficeSidebarConfig,\n): EntityGroupLookup => {\n const lookup: EntityGroupLookup = new Map();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind === 'dashboard') {\n return;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHub(item, sidebar);\n resolveHubEntityIds(hub).forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon ?? hub.icon,\n });\n }\n });\n return;\n }\n\n if (!lookup.has(item.id)) {\n lookup.set(item.id, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon,\n });\n }\n });\n });\n\n return lookup;\n};\n\nconst isEntityVisible = (\n entityId: string,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): boolean => {\n const config = entities[entityId];\n if (config == null) {\n return false;\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\n if (sidebar?.isItemVisible != null) {\n return sidebar.isItemVisible(descriptor, permissions);\n }\n\n if (config.kind === 'tool') {\n return true;\n }\n return config.hasList;\n};\n\nexport const resolveVisibleEntityIds = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n resolveGroupEntityIds(group, sidebar).forEach((entityId) => {\n if (seen.has(entityId)) {\n return;\n }\n if (!isEntityVisible(entityId, entities, sidebar, permissions)) {\n return;\n }\n seen.add(entityId);\n output.push(entityId);\n });\n });\n\n return output;\n};\n\nexport const resolveActiveEntityId = (\n pathname: string,\n entities: BackofficeEntityManifestMap,\n): string | null => {\n const entries = Object.entries(entities);\n for (const [entityId, config] of entries) {\n if (config.kind === 'tool') {\n if (isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n } else if (config.hasList && isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n }\n return null;\n};\n\nexport const resolveActiveGroupId = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n activeEntityId: string | null,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string | null => {\n if (activeEntityId == null) {\n return null;\n }\n\n if (!isEntityVisible(activeEntityId, entities, sidebar, permissions)) {\n return null;\n }\n\n for (const [groupId, group] of Object.entries(groups)) {\n const isVisible = group.isVisible == null || group.isVisible(permissions);\n if (\n isVisible &&\n resolveGroupEntityIds(group, sidebar).includes(activeEntityId)\n ) {\n return groupId;\n }\n }\n\n return null;\n};\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { BackofficeLinkContent as e } from "./BackofficeLinkContent.js";
2
+ import { useBackofficeLink as t } from "./useBackofficeLink.js";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ import { Link as r } from "@plumile/router";
5
+ //#region src/components/backoffice/links/BackofficeInlineLink.tsx
6
+ var i = ({ target: i, label: a, className: o, title: s, ariaLabel: c, icon: l = "auto", openInNewTab: u = !1, endAdornment: d, onClick: f, children: p }) => {
7
+ let m = t(i, { label: p ?? a }), h = {};
8
+ return u && (h = {
9
+ target: "_blank",
10
+ rel: "noreferrer"
11
+ }), /* @__PURE__ */ n(r, {
12
+ to: m.href,
13
+ className: o,
14
+ title: s,
15
+ "aria-label": c,
16
+ onClick: f,
17
+ ...h,
18
+ children: /* @__PURE__ */ n(e, {
19
+ icon: m.icon,
20
+ label: m.label,
21
+ showIcon: l === "auto",
22
+ endAdornment: d
23
+ })
24
+ });
25
+ };
26
+ //#endregion
27
+ export { i as BackofficeInlineLink, i as default };
28
+
29
+ //# sourceMappingURL=BackofficeInlineLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeInlineLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeInlineLink.tsx"],"sourcesContent":["import { type JSX, type MouseEventHandler, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeLinkContent } from './BackofficeLinkContent.js';\nimport type { BackofficeLinkTarget } from './types.js';\nimport { useBackofficeLink } from './useBackofficeLink.js';\n\nexport type BackofficeInlineLinkProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n className?: string;\n title?: string;\n ariaLabel?: string;\n icon?: 'auto' | 'none';\n openInNewTab?: boolean;\n endAdornment?: ReactNode;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n children?: ReactNode;\n};\n\nexport const BackofficeInlineLink = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>({\n target,\n label,\n className,\n title,\n ariaLabel,\n icon = 'auto',\n openInNewTab = false,\n endAdornment,\n onClick,\n children,\n}: BackofficeInlineLinkProps<TManifest>): JSX.Element => {\n const link = useBackofficeLink(target, {\n label: children ?? label,\n });\n\n let linkProps: { target?: '_blank'; rel?: 'noreferrer' } = {};\n if (openInNewTab) {\n linkProps = { target: '_blank', rel: 'noreferrer' };\n }\n\n return (\n <Link\n to={link.href}\n className={className}\n title={title}\n aria-label={ariaLabel}\n onClick={onClick}\n {...linkProps}\n >\n <BackofficeLinkContent\n icon={link.icon}\n label={link.label}\n showIcon={icon === 'auto'}\n endAdornment={endAdornment}\n />\n </Link>\n );\n};\n\nexport default BackofficeInlineLink;\n"],"mappings":";;;;;AAwBA,IAAa,KAEX,EACA,WACA,UACA,cACA,UACA,cACA,UAAO,QACP,kBAAe,IACf,iBACA,YACA,kBACuD;CACvD,IAAM,IAAO,EAAkB,GAAQ,EACrC,OAAO,KAAY,GACpB,CAAC,EAEE,IAAuD,EAAE;CAK7D,OAJI,MACF,IAAY;EAAE,QAAQ;EAAU,KAAK;EAAc,GAInD,kBAAC,GAAD;EACE,IAAI,EAAK;EACE;EACJ;EACP,cAAY;EACH;EACT,GAAI;YAEJ,kBAAC,GAAD;GACE,MAAM,EAAK;GACX,OAAO,EAAK;GACZ,UAAU,MAAS;GACL;GACd,CAAA;EACG,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { BackofficeLinkContent as e } from "./BackofficeLinkContent.js";
2
+ import { useBackofficeLink as t } from "./useBackofficeLink.js";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ import { Link as r } from "@plumile/router";
5
+ //#region src/components/backoffice/links/BackofficeLink.tsx
6
+ var i = ({ target: i, label: a, className: o, icon: s = "auto", children: c }) => {
7
+ let l = t(i, { label: c ?? a });
8
+ return /* @__PURE__ */ n(r, {
9
+ to: l.href,
10
+ className: o,
11
+ children: /* @__PURE__ */ n(e, {
12
+ icon: l.icon,
13
+ label: l.label,
14
+ showIcon: s === "auto"
15
+ })
16
+ });
17
+ };
18
+ //#endregion
19
+ export { i as BackofficeLink, i as default };
20
+
21
+ //# sourceMappingURL=BackofficeLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeLink.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeLinkContent } from './BackofficeLinkContent.js';\nimport type { BackofficeLinkTarget } from './types.js';\nimport { useBackofficeLink } from './useBackofficeLink.js';\n\nexport type BackofficeLinkProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n className?: string;\n icon?: 'auto' | 'none';\n children?: ReactNode;\n};\n\nexport const BackofficeLink = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>({\n target,\n label,\n className,\n icon = 'auto',\n children,\n}: BackofficeLinkProps<TManifest>): JSX.Element => {\n const link = useBackofficeLink(target, {\n label: children ?? label,\n });\n\n return (\n <Link to={link.href} className={className}>\n <BackofficeLinkContent\n icon={link.icon}\n label={link.label}\n showIcon={icon === 'auto'}\n />\n </Link>\n );\n};\n\nexport default BackofficeLink;\n"],"mappings":";;;;;AAmBA,IAAa,KAEX,EACA,WACA,UACA,cACA,UAAO,QACP,kBACiD;CACjD,IAAM,IAAO,EAAkB,GAAQ,EACrC,OAAO,KAAY,GACpB,CAAC;CAEF,OACE,kBAAC,GAAD;EAAM,IAAI,EAAK;EAAiB;YAC9B,kBAAC,GAAD;GACE,MAAM,EAAK;GACX,OAAO,EAAK;GACZ,UAAU,MAAS;GACnB,CAAA;EACG,CAAA"}