@plumile/backoffice-react 0.1.187 → 0.1.189

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 (145) hide show
  1. package/lib/esm/auth/authRefreshNotice.css.js +1 -2
  2. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  3. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  4. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  5. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  6. package/lib/esm/auth/login/loginPage.css.js +2 -1
  7. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
  8. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  9. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  10. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  11. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  12. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +346 -403
  13. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  14. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
  15. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  16. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
  17. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  18. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  19. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  20. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +3 -3
  21. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
  22. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  23. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  24. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +10 -10
  25. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  26. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -2
  27. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  28. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  29. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  30. package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/detailPayloadUtils.js.map +1 -1
  32. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  33. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  34. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  35. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +4 -4
  36. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  37. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  38. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
  39. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  40. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  41. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  42. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  43. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  44. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  45. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  46. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -1
  47. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -1
  48. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +2 -1
  49. package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
  50. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  51. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  52. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
  53. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  54. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +1 -1
  55. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  56. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
  57. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  58. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  59. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  60. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js +1 -1
  61. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +1 -1
  62. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +285 -269
  63. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  64. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  65. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +4 -4
  66. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  67. package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js.map +1 -1
  68. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
  69. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +4 -4
  70. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  71. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  72. package/lib/esm/filters/filterHelpers.js +1 -1
  73. package/lib/esm/filters/filterHelpers.js.map +1 -1
  74. package/lib/esm/hooks/useAuth.js.map +1 -1
  75. package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
  76. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
  77. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  78. package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
  79. package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
  80. package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
  81. package/lib/esm/i18n/createI18nInstance.js.map +1 -1
  82. package/lib/esm/i18n/locales/en/backofficeReact.js +406 -405
  83. package/lib/esm/i18n/locales/fr/backofficeReact.js +408 -407
  84. package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -1
  85. package/lib/esm/i18n/resources.js +1 -1
  86. package/lib/esm/i18n/resources.js.map +1 -1
  87. package/lib/esm/i18n/useBackofficeFormats.js.map +1 -1
  88. package/lib/esm/modules/base64.js.map +1 -1
  89. package/lib/esm/modules/formatFileSize.js.map +1 -1
  90. package/lib/esm/modules/uploads.js +17 -17
  91. package/lib/esm/modules/uploads.js.map +1 -1
  92. package/lib/esm/modules/webauthn.js.map +1 -1
  93. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +1 -1
  94. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -1
  95. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -1
  96. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -1
  97. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js +1 -1
  98. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js.map +1 -1
  99. package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +1 -1
  100. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +1 -1
  101. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
  102. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +1 -1
  103. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  104. package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
  105. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  106. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  107. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  108. package/lib/esm/pages/BackofficeEntityListPage.helpers.js +5 -5
  109. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  110. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  111. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  112. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  113. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  114. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
  115. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  116. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  117. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  118. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  119. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
  120. package/lib/esm/pages/detail/pageResolution.js.map +1 -1
  121. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  122. package/lib/esm/provider/entityRegistry.js.map +1 -1
  123. package/lib/esm/provider/lazyValue.js.map +1 -1
  124. package/lib/esm/provider/useBackofficeEntityLoader.js.map +1 -1
  125. package/lib/esm/relay/connectionUtils.js.map +1 -1
  126. package/lib/esm/relay/envHelpers.js.map +1 -1
  127. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  128. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  129. package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
  130. package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
  131. package/lib/esm/style.css +1 -1
  132. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  133. package/lib/types/components/backoffice/detail/BackofficeLifecycleTimelineSection.d.ts.map +1 -1
  134. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  135. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  136. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +1 -1
  137. package/lib/types/filters/filterHelpers.d.ts.map +1 -1
  138. package/lib/types/hooks/useAuth.d.ts.map +1 -1
  139. package/lib/types/modules/uploads.d.ts.map +1 -1
  140. package/lib/types/modules/webauthn.d.ts.map +1 -1
  141. package/lib/types/pages/BackofficePasswordResetRequestPage.d.ts.map +1 -1
  142. package/lib/types/pages/BackofficeVerifyEmailPage.d.ts.map +1 -1
  143. package/lib/types/pages/detail/pageResolution.d.ts.map +1 -1
  144. package/lib/types/provider/types.d.ts.map +1 -1
  145. package/package.json +16 -16
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/filters/entityIdFilterField.css.ts
3
- var e = "txvbqbfpn txvbqbey txvbqb19q3 txvbqbu4k txvbqbv7x", t = "oa1uye0 txvbqb10mx txvbqb11ki txvbqb13cs txvbqbyov txvbqbfq0 txvbqbey txvbqbfvs txvbqbv7x txvbqb2up txvbqb28o txvbqb2sj txvbqb1cw txvbqb1b7z txvbqb1bg1 txvbqb7g txvbqb76 txvbqb7t", n = "oa1uye1 txvbqb6 txvbqbfpn txvbqbh4x txvbqbls4 txvbqbv7x txvbqb19uf txvbqb18dc txvbqbv txvbqb1tv txvbqb1b4r txvbqb1bg1 txvbqbwvi", r = "txvbqbfpn txvbqbh4x txvbqbls4 txvbqbi8a txvbqbv7x txvbqb19uf txvbqbu4k", i = "txvbqbfvs txvbqbv7x txvbqbfpn txvbqbey txvbqbwr6", a = "txvbqbfox txvbqb1bg5 txvbqb96 txvbqbhb2 txvbqbv7x txvbqbwr6 txvbqb18ef txvbqb1avz", o = "txvbqbfox txvbqbv7x txvbqbwr6 txvbqb18ef txvbqb1avz txvbqb9j txvbqbhbf", s = "txvbqbfox txvbqbv7x txvbqbwr6 txvbqb18ef txvbqb1avz txvbqb1bg5 txvbqb9j", c = "oa1uye3 oa1uye2 txvbqb6 txvbqbfqq txvbqbey txvbqbgr txvbqbls4 txvbqb19gp txvbqbjm4 txvbqbwvi txvbqb2tz txvbqb1tv txvbqb1b4r txvbqb1bg5 txvbqbv txvbqb7h txvbqb75 txvbqb7t", l = "oa1uye4 oa1uye2 txvbqb6 txvbqbfqq txvbqbey txvbqbgr txvbqbls4 txvbqb19gp txvbqbjm4 txvbqbwvi txvbqb2tz txvbqb1tv txvbqb1b4r txvbqb1bg5 txvbqbv txvbqb7h txvbqb75 txvbqb7t", u = "txvbqb19fm txvbqbjl1";
3
+ var e = "txvbqbfpn txvbqbey txvbqb19qg txvbqbu4k txvbqbv7x", t = "oa1uye0 txvbqb10na txvbqb11kv txvbqb13d5 txvbqbyp8 txvbqbfq0 txvbqbey txvbqbfvs txvbqbv7x txvbqb2up txvbqb28o txvbqb2sj txvbqb1cw txvbqb1b8p txvbqb1bgr txvbqb7g txvbqb76 txvbqb7t", n = "oa1uye1 txvbqb6 txvbqbfpn txvbqbh4x txvbqbls4 txvbqbv7x txvbqb19us txvbqb18dp txvbqbv txvbqb1tv txvbqb1b5h txvbqb1bgr txvbqbwvv", r = "txvbqbfpn txvbqbh4x txvbqbls4 txvbqbi8a txvbqbv7x txvbqb19us txvbqbu4k", i = "txvbqbfvs txvbqbv7x txvbqbfpn txvbqbey txvbqbwr6", a = "txvbqbfox txvbqb1bgv txvbqb96 txvbqbhb2 txvbqbv7x txvbqbwr6 txvbqb18es txvbqb1awp", o = "txvbqbfox txvbqbv7x txvbqbwr6 txvbqb18es txvbqb1awp txvbqb9j txvbqbhbf", s = "txvbqbfox txvbqbv7x txvbqbwr6 txvbqb18es txvbqb1awp txvbqb1bgv txvbqb9j", c = "oa1uye3 oa1uye2 txvbqb6 txvbqbfqq txvbqbey txvbqbgr txvbqbls4 txvbqb19h2 txvbqbjm4 txvbqbwvv txvbqb2tz txvbqb1tv txvbqb1b5h txvbqb1bgv txvbqbv txvbqb7h txvbqb75 txvbqb7t", l = "oa1uye4 oa1uye2 txvbqb6 txvbqbfqq txvbqbey txvbqbgr txvbqbls4 txvbqb19h2 txvbqbjm4 txvbqbwvv txvbqb2tz txvbqb1tv txvbqb1b5h txvbqb1bgv txvbqbv txvbqb7h txvbqb75 txvbqb7t", u = "txvbqb19fz txvbqbjl1";
4
4
  //#endregion
5
5
  export { u as actionIcon, l as clearButton, e as container, r as content, a as labelText, c as pickActionButton, n as pickerButton, t as pickerControl, s as placeholder, i as valueBox, o as valueText };
6
6
 
@@ -22,7 +22,7 @@ var _ = /* @__PURE__ */ d(g, {
22
22
  children: [/* @__PURE__ */ f("div", {
23
23
  className: r,
24
24
  children: [e.icon != null && /* @__PURE__ */ d("span", {
25
- className: "txvbqbfqq txvbqbey txvbqbls4 txvbqb19h2 txvbqbjmh txvbqb2tz txvbqb1b83 txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1bg3 txvbqbh6d txvbqbsdq",
25
+ className: "txvbqbfqq txvbqbey txvbqbls4 txvbqb19hf txvbqbjmh txvbqb2tz txvbqb1b8t txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1bgt txvbqbh6d txvbqbsdq",
26
26
  "aria-hidden": "true",
27
27
  children: e.icon
28
28
  }), /* @__PURE__ */ f("span", {
@@ -31,7 +31,7 @@ var _ = /* @__PURE__ */ d(g, {
31
31
  className: a,
32
32
  children: e.title
33
33
  }), e.description != null && /* @__PURE__ */ d("span", {
34
- className: "txvbqb1bg5 txvbqb9j",
34
+ className: "txvbqb1bgv txvbqb9j",
35
35
  children: e.description
36
36
  })]
37
37
  })]
@@ -55,11 +55,11 @@ var _ = /* @__PURE__ */ d(g, {
55
55
  children: e.label
56
56
  }),
57
57
  n && /* @__PURE__ */ d("span", {
58
- className: "txvbqb1bg5 txvbqb9j txvbqbo5p txvbqbws9",
58
+ className: "txvbqb1bgv txvbqb9j txvbqbo5p txvbqbws9",
59
59
  children: e.description
60
60
  }),
61
61
  r && /* @__PURE__ */ d("span", {
62
- className: "txvbqb1bg5 txvbqb96 txvbqbhb2 txvbqb6a txvbqbmur",
62
+ className: "txvbqb1bgv txvbqb96 txvbqbhb2 txvbqb6a txvbqbmur",
63
63
  children: e.metaLabel
64
64
  })
65
65
  ]
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/hub/backofficeHubTemplate.css.ts
3
- var e = "txvbqbfpn txvbqbh4x txvbqbheo", t = "txvbqbtyf", n = "txvbqbfpn txvbqbh4x txvbqbhf1", r = "txvbqbfpn txvbqbh4x txvbqbhdy", i = "txvbqbfpn txvbqbel txvbqbhdy", a = "txvbqbfqq txvbqbey txvbqbls4 txvbqb19h2 txvbqbjmh txvbqb2tz txvbqb1b83 txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1bg3 txvbqbh6d txvbqbsdq", o = "txvbqbfpn txvbqbh4x txvbqbhd8 txvbqbv7x", s = "txvbqba9 txvbqbhbf txvbqb1bg1 txvbqbo7v", c = "txvbqb1bg5 txvbqb9j", l = "txvbqbfq0 txvbqbje6 txvbqbhdy", u = "u4nszr0 txvbqbfpn txvbqbel txvbqbhdy txvbqbwwl txvbqb2tz txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1b7z txvbqb1bg1 txvbqb3f txvbqbv7x txvbqb7g txvbqb76 txvbqb7t", d = "txvbqbfqq txvbqbey txvbqbls4 txvbqb19hf txvbqbjmu txvbqb2tz txvbqb1b83 txvbqb1bg3 txvbqbh6d", f = "txvbqbfpn txvbqbh4x txvbqbhd8 txvbqbv7x", p = "txvbqbhbf txvbqb1bg1 txvbqbws9", m = "txvbqb1bg5 txvbqb9j txvbqbo5p txvbqbws9", h = "txvbqb1bg5 txvbqb96 txvbqbhb2 txvbqb6a txvbqbmur";
3
+ var e = "txvbqbfpn txvbqbh4x txvbqbheo", t = "txvbqbtyf", n = "txvbqbfpn txvbqbh4x txvbqbhf1", r = "txvbqbfpn txvbqbh4x txvbqbhdy", i = "txvbqbfpn txvbqbel txvbqbhdy", a = "txvbqbfqq txvbqbey txvbqbls4 txvbqb19hf txvbqbjmh txvbqb2tz txvbqb1b8t txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1bgt txvbqbh6d txvbqbsdq", o = "txvbqbfpn txvbqbh4x txvbqbhd8 txvbqbv7x", s = "txvbqba9 txvbqbhbf txvbqb1bgr txvbqbo7v", c = "txvbqb1bgv txvbqb9j", l = "txvbqbfq0 txvbqbje6 txvbqbhdy", u = "u4nszr0 txvbqbfpn txvbqbel txvbqbhdy txvbqbwwy txvbqb2tz txvbqb28o txvbqb2sj txvbqb1d9 txvbqb1b8p txvbqb1bgr txvbqb3f txvbqbv7x txvbqb7g txvbqb76 txvbqb7t", d = "txvbqbfqq txvbqbey txvbqbls4 txvbqb19hs txvbqbjmu txvbqb2tz txvbqb1b8t txvbqb1bgt txvbqbh6d", f = "txvbqbfpn txvbqbh4x txvbqbhd8 txvbqbv7x", p = "txvbqbhbf txvbqb1bgr txvbqbws9", m = "txvbqb1bgv txvbqb9j txvbqbo5p txvbqbws9", h = "txvbqb1bgv txvbqb96 txvbqbhb2 txvbqb6a txvbqbmur";
4
4
  //#endregion
5
5
  export { e as content, l as grid, r as group, c as groupDescription, i as groupHeader, o as groupHeading, a as groupIcon, s as groupTitle, n as groups, u as item, f as itemContent, m as itemDescription, d as itemIcon, h as itemMeta, p as itemTitle, t as search };
6
6
 
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/layout/backofficeSidebarActions.css.ts
3
- var e = "_1xws1b00 txvbqbfqq txvbqbey txvbqbls4 txvbqb19gc txvbqbjlr txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b4r txvbqbv txvbqbwvi txvbqb7h txvbqb76 txvbqb7t";
3
+ var e = "_1xws1b00 txvbqbfqq txvbqbey txvbqbls4 txvbqb19gp txvbqbjlr txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b5h txvbqbv txvbqbwvv txvbqb7h txvbqb76 txvbqb7t";
4
4
  //#endregion
5
5
  export { e as actionButton };
6
6
 
@@ -31,13 +31,13 @@ var g = (e) => {
31
31
  children: [/* @__PURE__ */ p("li", {
32
32
  className: o,
33
33
  children: [x && /* @__PURE__ */ f("span", {
34
- className: "_80s44h1 _80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b4r txvbqb1bg3 txvbqbv txvbqbwvi txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cta txvbqb1eom qbwcue4 txvbqb1f7o txvbqb1fe4 qbwcue0 txvbqb1ffs txvbqb1ga0 qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19h2 txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f txvbqb1b83 txvbqb1bg1",
34
+ className: "_80s44h1 _80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b5h txvbqb1bgt txvbqbv txvbqbwvv txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cu0 txvbqb1epc qbwcue4 txvbqb1f8e txvbqb1feu qbwcue0 txvbqb1fgi txvbqb1gaq qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f txvbqb1b8t txvbqb1bgr",
35
35
  "aria-current": "page",
36
36
  title: b,
37
37
  children: w
38
38
  }), !x && /* @__PURE__ */ f(m, {
39
39
  to: y,
40
- className: "_80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b4r txvbqb1bg3 txvbqbv txvbqbwvi txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cta txvbqb1eom qbwcue4 txvbqb1f7o txvbqb1fe4 qbwcue0 txvbqb1ffs txvbqb1ga0 qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19h2 txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f",
40
+ className: "_80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b5h txvbqb1bgt txvbqbv txvbqbwvv txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cu0 txvbqb1epc qbwcue4 txvbqb1f8e txvbqb1feu qbwcue0 txvbqb1fgi txvbqb1gaq qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f",
41
41
  "aria-label": b,
42
42
  title: b,
43
43
  preloadOnHover: "code-and-data",
@@ -1 +1 @@
1
- {"version":3,"file":"assertValidBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts"],"sourcesContent":["import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nconst getBreadcrumbItemId = (item: BackofficeTopbarBreadcrumbItem): string => {\n const { target } = item as {\n readonly target?: BackofficeTopbarBreadcrumbItem['target'];\n };\n if (target == null) {\n return '';\n }\n if (target.kind === 'dashboard') {\n return 'dashboard';\n }\n if (target.kind === 'entity-list') {\n return `${target.entityId}-list`;\n }\n if (target.kind === 'entity-detail') {\n return `${target.entityId}-entity-${target.id}`;\n }\n if (target.kind === 'entity-detail-page') {\n return `${target.entityId}-page-${target.id}-${target.pageId}`;\n }\n if (target.kind === 'tool') {\n return `tool-${target.toolId}`;\n }\n if (target.kind === 'hub') {\n return `hub-${target.hubId}`;\n }\n return `href-${target.href}`;\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n const id = getBreadcrumbItemId(item);\n if (id.trim() === '') {\n throw formatContractError('INVALID_SEGMENT_ID', `index=${index}`);\n }\n\n if (seen.has(id)) {\n throw formatContractError('INVALID_SEGMENT_ID', `duplicate id=\"${id}\"`);\n }\n seen.add(id);\n });\n\n const last = items[items.length - 1];\n if (last?.kind !== 'current') {\n throw formatContractError('MISSING_CURRENT_SEGMENT');\n }\n\n return items;\n};\n"],"mappings":";AAKA,IAAM,KACJ,GACA,MAGa,MADT,KAAW,OACI,gCAAgC,MAElC,gCAAgC,EAAK,IAAI,EAAQ,EAFT,GAKrD,KAAuB,MAAiD;CAC5E,IAAM,EAAE,cAAW;CAwBnB,OArBI,KAAU,OACL,KAEL,EAAO,SAAS,cACX,cAEL,EAAO,SAAS,gBACX,GAAG,EAAO,SAAS,SAExB,EAAO,SAAS,kBACX,GAAG,EAAO,SAAS,UAAU,EAAO,OAEzC,EAAO,SAAS,uBACX,GAAG,EAAO,SAAS,QAAQ,EAAO,GAAG,GAAG,EAAO,WAEpD,EAAO,SAAS,SACX,QAAQ,EAAO,WAEpB,EAAO,SAAS,QACX,OAAO,EAAO,UAEhB,QAAQ,EAAO;AACxB,GAEa,KACX,MAC8C;CAC9C,IAAI,KAAS,MACX,MAAM,EAAoB,oBAAoB;CAEhD,IAAI,EAAM,WAAW,GACnB,MAAM,EAAoB,kBAAkB;CAG9C,IAAM,oBAAO,IAAI,IAAY;CAc7B,IAbA,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAM,IAAK,EAAoB,CAAI;EACnC,IAAI,EAAG,KAAK,MAAM,IAChB,MAAM,EAAoB,sBAAsB,SAAS,GAAO;EAGlE,IAAI,EAAK,IAAI,CAAE,GACb,MAAM,EAAoB,sBAAsB,iBAAiB,EAAG,EAAE;EAExE,EAAK,IAAI,CAAE;CACb,CAAC,GAEY,EAAM,EAAM,SAAS,IACxB,SAAS,WACjB,MAAM,EAAoB,yBAAyB;CAGrD,OAAO;AACT"}
1
+ {"version":3,"file":"assertValidBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts"],"sourcesContent":["import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nconst getBreadcrumbItemId = (item: BackofficeTopbarBreadcrumbItem): string => {\n const { target } = item as {\n readonly target?: BackofficeTopbarBreadcrumbItem['target'];\n };\n if (target == null) {\n return '';\n }\n if (target.kind === 'dashboard') {\n return 'dashboard';\n }\n if (target.kind === 'entity-list') {\n return `${target.entityId}-list`;\n }\n if (target.kind === 'entity-detail') {\n return `${target.entityId}-entity-${target.id}`;\n }\n if (target.kind === 'entity-detail-page') {\n return `${target.entityId}-page-${target.id}-${target.pageId}`;\n }\n if (target.kind === 'tool') {\n return `tool-${target.toolId}`;\n }\n if (target.kind === 'hub') {\n return `hub-${target.hubId}`;\n }\n return `href-${target.href}`;\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n const id = getBreadcrumbItemId(item);\n if (id.trim() === '') {\n throw formatContractError('INVALID_SEGMENT_ID', `index=${index}`);\n }\n\n if (seen.has(id)) {\n throw formatContractError('INVALID_SEGMENT_ID', `duplicate id=\"${id}\"`);\n }\n seen.add(id);\n });\n\n const last = items[items.length - 1];\n if (last?.kind !== 'current') {\n throw formatContractError('MISSING_CURRENT_SEGMENT');\n }\n\n return items;\n};\n"],"mappings":";AAKA,IAAM,KACJ,GACA,MAGa,MADT,KAAW,OACI,gCAAgC,MAElC,gCAAgC,EAAK,IAAI,EAAQ,EAFT,GAKrD,KAAuB,MAAiD;CAC5E,IAAM,EAAE,cAAW;CAwBnB,OArBI,KAAU,OACL,KAEL,EAAO,SAAS,cACX,cAEL,EAAO,SAAS,gBACX,GAAG,EAAO,SAAS,SAExB,EAAO,SAAS,kBACX,GAAG,EAAO,SAAS,UAAU,EAAO,OAEzC,EAAO,SAAS,uBACX,GAAG,EAAO,SAAS,QAAQ,EAAO,GAAG,GAAG,EAAO,WAEpD,EAAO,SAAS,SACX,QAAQ,EAAO,WAEpB,EAAO,SAAS,QACX,OAAO,EAAO,UAEhB,QAAQ,EAAO;AACxB,GAEa,KACX,MAC8C;CAC9C,IAAI,KAAS,MACX,MAAM,EAAoB,oBAAoB;CAEhD,IAAI,EAAM,WAAW,GACnB,MAAM,EAAoB,kBAAkB;CAG9C,IAAM,oBAAO,IAAI,IAAY;CAc7B,IAbA,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAM,IAAK,EAAoB,CAAI;EACnC,IAAI,EAAG,KAAK,MAAM,IAChB,MAAM,EAAoB,sBAAsB,SAAS,GAAO;EAGlE,IAAI,EAAK,IAAI,CAAE,GACb,MAAM,EAAoB,sBAAsB,iBAAiB,EAAG,EAAE;EAExE,EAAK,IAAI,CAAE;CACb,CAAC,GAEY,EAAM,EAAM,SAAS,EAC9B,EAAM,SAAS,WACjB,MAAM,EAAoB,yBAAyB;CAGrD,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  /* empty css */
3
3
  //#region src/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.ts
4
- var e = "txvbqbfpn txvbqbey txvbqb19uf txvbqbv7x txvbqbu4k", t = "txvbqbfpn txvbqbey txvbqbhdl txvbqbo7v txvbqbwvi txvbqbo6s txvbqbh7g txvbqbv7x txvbqbu4k", n = "txvbqbfqq txvbqbey txvbqbhdl txvbqbv7x", r = "txvbqb1bg3 txvbqb9j txvbqbo5p", i = "_80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b4r txvbqb1bg3 txvbqbv txvbqbwvi txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cta txvbqb1eom qbwcue4 txvbqb1f7o txvbqb1fe4 qbwcue0 txvbqb1ffs txvbqb1ga0 qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19h2 txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f", a = "_80s44h1 _80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b4r txvbqb1bg3 txvbqbv txvbqbwvi txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cta txvbqb1eom qbwcue4 txvbqb1f7o txvbqb1fe4 qbwcue0 txvbqb1ffs txvbqb1ga0 qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19h2 txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f txvbqb1b83 txvbqb1bg1", o = "_4k5f060 txvbqb1tv txvbqb2rt txvbqb1j txvbqbk07 txvbqbonr txvbqbwr6 txvbqbwvi txvbqb13hu txvbqb18f5 txvbqblvq txvbqb19us", s = "_80s44h2 qbwcuep qbwcuen txvbqbfqq txvbqbey txvbqbhd8 txvbqb1bg1 txvbqb3f txvbqb7h txvbqb75 txvbqb7t qbwcueo txvbqb1gct qbwcue0 txvbqb1ffs txvbqb1ga0 txvbqb1bg3 txvbqb9j txvbqbo5p txvbqbv7x txvbqbu4k txvbqbws9", c = "txvbqb1bg1 txvbqb9j txvbqbo5p txvbqbhbf txvbqbv7x txvbqbu4k txvbqbws9";
4
+ var e = "txvbqbfpn txvbqbey txvbqb19us txvbqbv7x txvbqbu4k", t = "txvbqbfpn txvbqbey txvbqbhdl txvbqbo7v txvbqbwvv txvbqbo6s txvbqbh7g txvbqbv7x txvbqbu4k", n = "txvbqbfqq txvbqbey txvbqbhdl txvbqbv7x", r = "txvbqb1bgt txvbqb9j txvbqbo5p", i = "_80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b5h txvbqb1bgt txvbqbv txvbqbwvv txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cu0 txvbqb1epc qbwcue4 txvbqb1f8e txvbqb1feu qbwcue0 txvbqb1fgi txvbqb1gaq qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f", a = "_80s44h1 _80s44h0 qbwcuej qbwcueh txvbqbfqq txvbqbey txvbqbls4 txvbqb1tv txvbqb2rt txvbqb2tz txvbqb1b5h txvbqb1bgt txvbqbv txvbqbwvv txvbqb7h txvbqb76 txvbqb7t qbwcuei txvbqb1cu0 txvbqb1epc qbwcue4 txvbqb1f8e txvbqb1feu qbwcue0 txvbqb1fgi txvbqb1gaq qbwcuex qbwcuer txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2 txvbqb3f txvbqb1b8t txvbqb1bgr", o = "_4k5f060 txvbqb1tv txvbqb2rt txvbqb1j txvbqbk07 txvbqbonr txvbqbwr6 txvbqbwvv txvbqb13i7 txvbqb18fi txvbqblvq txvbqb19v5", s = "_80s44h2 qbwcuep qbwcuen txvbqbfqq txvbqbey txvbqbhd8 txvbqb1bgr txvbqb3f txvbqb7h txvbqb75 txvbqb7t qbwcueo txvbqb1gdj qbwcue0 txvbqb1fgi txvbqb1gaq txvbqb1bgt txvbqb9j txvbqbo5p txvbqbv7x txvbqbu4k txvbqbws9", c = "txvbqb1bgr txvbqb9j txvbqbo5p txvbqbhbf txvbqbv7x txvbqbu4k txvbqbws9";
5
5
  //#endregion
6
6
  export { c as current, a as homeCurrent, o as homeLabel, i as homeLink, n as item, s as link, t as list, e as nav, r as separator };
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"buildSidebarSections.js","names":[],"sources":["../../../../../src/components/backoffice/layout/buildSidebarSections.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeDashboardRegistration,\n BackofficeSidebarItemDescriptor,\n BackofficeIconComponent,\n BackofficeSidebarRecentItem,\n} from '../../../provider/types.js';\nimport type {\n SidebarNavigationItem,\n SidebarNavigationSection,\n} from '@plumile/ui/components/navigation/sidebar/SidebarNavigation.js';\nimport { BackofficeSidebarHistorySvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarHistorySvg.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 { findBackofficeDashboardRegistration } from '../../../provider/dashboardRegistrations.js';\nimport * as styles from './backofficeSidebarActions.css.js';\nimport {\n buildEntityGroupLookup,\n isActivePath,\n joinBackofficePath,\n resolveLabel,\n resolveGroupItems,\n resolveHubEntityIds,\n resolveSidebarHub,\n resolveSidebarGroups,\n} from './sidebarUtils.js';\n\nconst renderIcon = (\n Icon?: BackofficeIconComponent,\n fallback?: ReactNode,\n size = 18,\n): ReactNode => {\n if (Icon != null) {\n return <Icon width={size} height={size} aria-hidden=\"true\" />;\n }\n return fallback ?? null;\n};\n\nexport type BuildSidebarSectionsInput = {\n basePath: string;\n pathname: string;\n entities: BackofficeEntityManifestMap;\n dashboards?: readonly BackofficeDashboardRegistration[];\n sidebar?: BackofficeSidebarConfig;\n permissions: unknown;\n searchQuery?: string;\n tApp: TFunction;\n t: TFunction;\n pinnedEntityIds?: readonly string[];\n recentItems?: readonly BackofficeSidebarRecentItem[];\n onTogglePin?: (entityId: string) => void;\n onReorderPin?: (fromId: string, toId: string) => void;\n collapsedByGroupId?: SidebarGroupCollapseState;\n onGroupCollapsedChange?: (groupId: string, collapsed: boolean) => void;\n sidebarCollapsed?: boolean;\n};\n\n/**\n * Builds the sidebar sections for the backoffice layout.\n */\nexport function buildSidebarSections(\n input: BuildSidebarSectionsInput,\n): readonly SidebarNavigationSection[] {\n const {\n basePath,\n pathname,\n entities,\n dashboards = [],\n sidebar,\n permissions,\n searchQuery,\n tApp,\n t,\n pinnedEntityIds = [],\n recentItems = [],\n onTogglePin,\n onReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange,\n sidebarCollapsed = false,\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, sidebar);\n const normalizedQuery = searchQuery?.trim().toLowerCase() ?? '';\n\n const labelMatchesQuery = (label: string): boolean => {\n return (\n normalizedQuery === '' || label.toLowerCase().includes(normalizedQuery)\n );\n };\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 buildDashboardItem = (\n inputItem?: {\n id?: string;\n icon?: BackofficeIconComponent;\n label?: string;\n },\n groupId?: string,\n ): SidebarNavigationItem | null => {\n const dashboardId = inputItem?.id ?? 'dashboard';\n const dashboardDescriptor: BackofficeSidebarItemDescriptor = {\n kind: 'dashboard',\n id: dashboardId,\n };\n const isDashboardVisible = sidebar?.isItemVisible?.(\n dashboardDescriptor,\n permissions,\n );\n if (isDashboardVisible === false) {\n return null;\n }\n\n const registration = findBackofficeDashboardRegistration(\n dashboards,\n dashboardId,\n );\n let label = inputItem?.label;\n if (label == null && registration != null) {\n label = resolveLabel(registration.label, tApp);\n }\n label ??= t('sidebar.items.dashboard');\n if (!labelMatchesQuery(label)) {\n return null;\n }\n\n let href = basePath;\n let id = 'dashboard';\n if (dashboardId !== 'dashboard') {\n href = joinBackofficePath(basePath, `dashboard/${dashboardId}`);\n id = `dashboard-${dashboardId}`;\n }\n\n let isActive = isActivePath(pathname, href);\n if (dashboardId === 'dashboard') {\n isActive = pathname === basePath || pathname === `${basePath}/dashboard`;\n }\n\n return {\n id,\n data: {\n kind: 'dashboard',\n id: dashboardId,\n groupId,\n },\n label,\n href,\n icon: renderIcon(\n inputItem?.icon ?? registration?.icon,\n <SidebarHomeSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive,\n ariaLabel: label,\n };\n };\n\n const buildEntityItem = (inputItem: {\n entityId: string;\n groupId?: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n itemLabel?: string;\n enableReorder?: boolean;\n sectionId?: string;\n }): SidebarNavigationItem | null => {\n const {\n entityId,\n groupId,\n groupIcon,\n itemIcon,\n itemLabel,\n enableReorder,\n sectionId,\n } = 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 = itemLabel ?? resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n\n let actionsVisibility: SidebarNavigationItem['actionsVisibility'];\n if (sectionId !== 'pinned' && pinnedSet.has(entityId)) {\n actionsVisibility = 'always';\n }\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 itemIcon ?? 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 actionsVisibility,\n };\n }\n\n if (!config.hasList) {\n return null;\n }\n\n const label = itemLabel ?? 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 if (enableReorder === true && onReorderPin != null) {\n dragHandleSlot = (\n <GripDotsSvg width={14} height={14} aria-hidden=\"true\" />\n );\n }\n\n let dragHandleLabel: string | undefined;\n if (dragHandleSlot != null) {\n dragHandleLabel = reorderLabel;\n }\n\n let actionsVisibility: SidebarNavigationItem['actionsVisibility'];\n if (sectionId !== 'pinned' && pinnedSet.has(entityId)) {\n actionsVisibility = 'always';\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 itemIcon ?? 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 actionsVisibility,\n dragHandleSlot,\n dragHandleLabel,\n };\n };\n\n const buildHubItem = (inputItem: {\n hub: ReturnType<typeof resolveSidebarHub>;\n groupId?: string;\n icon?: BackofficeIconComponent;\n }): SidebarNavigationItem | null => {\n const { hub, groupId, icon } = inputItem;\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'hub',\n id: hub.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n const childEntityIds = resolveHubEntityIds(hub);\n const visibleChildConfigs = childEntityIds\n .map((entityId) => {\n return entities[entityId] ?? null;\n })\n .filter((config): config is BackofficeEntityManifestMap[string] => {\n if (config == null) {\n return false;\n }\n let childKind: BackofficeSidebarItemDescriptor['kind'] = 'entity';\n if (config.kind === 'tool') {\n childKind = 'tool';\n }\n const childDescriptor: BackofficeSidebarItemDescriptor = {\n kind: childKind,\n id: config.id,\n };\n const isChildVisible = sidebar?.isItemVisible?.(\n childDescriptor,\n permissions,\n );\n if (isChildVisible === false) {\n return false;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return false;\n }\n return true;\n });\n if (childEntityIds.length > 0 && visibleChildConfigs.length === 0) {\n return null;\n }\n const label = resolveLabel(hub.title, tApp);\n const matchesHub = labelMatchesQuery(label);\n const matchesChild = visibleChildConfigs.some((config) => {\n return labelMatchesQuery(resolveLabel(config.label, tApp));\n });\n if (!matchesHub && !matchesChild) {\n return null;\n }\n const isActive =\n isActivePath(pathname, hub.href) ||\n visibleChildConfigs.some((config) => {\n return isActivePath(pathname, config.routes.list);\n });\n return {\n id: `hub-${hub.id}`,\n data: {\n kind: 'hub',\n id: hub.id,\n groupId,\n },\n label,\n href: hub.href,\n icon: renderIcon(\n icon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive,\n ariaLabel: label,\n };\n };\n\n const sections: SidebarNavigationSection[] = [];\n\n const primaryItems = sidebar?.primaryItems ?? [];\n if (primaryItems.length > 0) {\n const primarySectionItems = primaryItems\n .map((primaryItem): SidebarNavigationItem | null => {\n if (primaryItem.kind === 'dashboard') {\n let itemLabel: string | undefined;\n if (primaryItem.label != null) {\n itemLabel = resolveLabel(primaryItem.label, tApp);\n }\n return buildDashboardItem({\n id: primaryItem.id,\n icon: primaryItem.icon,\n label: itemLabel,\n });\n }\n if (primaryItem.kind === 'hub') {\n const hub = resolveSidebarHub(primaryItem, sidebar);\n return buildHubItem({\n hub,\n icon: primaryItem.icon,\n });\n }\n let itemLabel: string | undefined;\n if (primaryItem.label != null) {\n itemLabel = resolveLabel(primaryItem.label, tApp);\n }\n return buildEntityItem({\n entityId: primaryItem.id,\n itemIcon: primaryItem.icon,\n itemLabel,\n sectionId: 'primary',\n });\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (primarySectionItems.length > 0) {\n sections.push({\n id: 'primary',\n items: primarySectionItems,\n collapsible: false,\n });\n }\n }\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?.groupIcon,\n itemIcon: groupMeta?.itemIcon,\n enableReorder: true,\n sectionId: 'pinned',\n });\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (pinnedItems.length > 0) {\n let reorder: SidebarNavigationSection['reorder'];\n if (onReorderPin != null && pinnedItems.length > 1) {\n reorder = {\n enabled: true,\n onReorder: onReorderPin,\n };\n }\n let sectionItems = pinnedItems;\n if (reorder == null) {\n sectionItems = pinnedItems.map((item) => {\n const { dragHandleSlot, dragHandleLabel, ...rest } = item;\n return rest;\n });\n }\n\n sections.push({\n id: 'pinned',\n title: t('sidebar.sections.pinned'),\n icon: renderIcon(\n undefined,\n <PinSvg width={16} height={16} aria-hidden=\"true\" />,\n ),\n items: sectionItems,\n collapsible: false,\n reorder,\n });\n }\n }\n\n if (recentItems.length > 0) {\n const recentSectionItems = recentItems\n .map((recentItem): SidebarNavigationItem | null => {\n const config = entities[recentItem.id];\n if (config == null) {\n return null;\n }\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: recentItem.kind,\n id: recentItem.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n if (\n normalizedQuery !== '' &&\n !recentItem.label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n const groupMeta = entityGroupLookup.get(recentItem.id);\n return {\n id: `recent-${recentItem.kind}-${recentItem.id}`,\n data: {\n kind: recentItem.kind,\n id: recentItem.id,\n groupId: groupMeta?.groupId,\n },\n label: recentItem.label,\n href: recentItem.href,\n icon: renderIcon(\n groupMeta?.itemIcon ?? groupMeta?.groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, recentItem.href),\n ariaLabel: recentItem.label,\n } satisfies SidebarNavigationItem;\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (recentSectionItems.length > 0) {\n sections.push({\n id: 'recent',\n title: t('sidebar.sections.recent'),\n icon: renderIcon(\n undefined,\n <BackofficeSidebarHistorySvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n />,\n ),\n items: recentSectionItems,\n collapsible: false,\n });\n }\n }\n\n entries.forEach(([groupId, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n\n const items: SidebarNavigationItem[] = [];\n\n const groupItems = resolveGroupItems(group);\n if (groupItems.length > 0) {\n groupItems.forEach((groupItem) => {\n if (groupItem.kind === 'dashboard') {\n let itemLabel: string | undefined;\n if (groupItem.label != null) {\n itemLabel = resolveLabel(groupItem.label, tApp);\n }\n const item = buildDashboardItem(\n {\n id: groupItem.id,\n icon: groupItem.icon ?? group.icon,\n label: itemLabel,\n },\n groupId,\n );\n if (item != null) {\n items.push(item);\n }\n return;\n }\n if (groupItem.kind === 'hub') {\n const hub = resolveSidebarHub(groupItem, sidebar);\n const item = buildHubItem({\n hub,\n groupId,\n icon: groupItem.icon ?? group.icon,\n });\n if (item != null) {\n items.push(item);\n }\n return;\n }\n let itemLabel: string | undefined;\n if (groupItem.label != null) {\n itemLabel = resolveLabel(groupItem.label, tApp);\n }\n const item = buildEntityItem({\n entityId: groupItem.id,\n groupId,\n groupIcon: group.icon,\n itemIcon: groupItem.icon,\n itemLabel,\n sectionId: groupId,\n });\n if (item != null) {\n items.push(item);\n }\n });\n }\n\n let sectionItems: SidebarNavigationItem[] = items;\n if (sidebarCollapsed && group.behavior?.showInCollapsedRail !== true) {\n sectionItems = items.filter((item) => {\n return item.data?.kind === 'dashboard' || item.isActive === true;\n });\n }\n\n if (sectionItems.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 icon: renderIcon(group.icon, undefined, 16),\n items: sectionItems,\n collapsible: group.behavior?.collapsible ?? true,\n defaultCollapsed: group.behavior?.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 ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeDashboardRegistration,\n BackofficeSidebarItemDescriptor,\n BackofficeIconComponent,\n BackofficeSidebarRecentItem,\n} from '../../../provider/types.js';\nimport type {\n SidebarNavigationItem,\n SidebarNavigationSection,\n} from '@plumile/ui/components/navigation/sidebar/SidebarNavigation.js';\nimport { BackofficeSidebarHistorySvg } from '@plumile/ui/icons/backoffice/BackofficeSidebarHistorySvg.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 { findBackofficeDashboardRegistration } from '../../../provider/dashboardRegistrations.js';\nimport * as styles from './backofficeSidebarActions.css.js';\nimport {\n buildEntityGroupLookup,\n isActivePath,\n joinBackofficePath,\n resolveLabel,\n resolveGroupItems,\n resolveHubEntityIds,\n resolveSidebarHub,\n resolveSidebarGroups,\n} from './sidebarUtils.js';\n\nconst renderIcon = (\n Icon?: BackofficeIconComponent,\n fallback?: ReactNode,\n size = 18,\n): ReactNode => {\n if (Icon != null) {\n return <Icon width={size} height={size} aria-hidden=\"true\" />;\n }\n return fallback ?? null;\n};\n\nexport type BuildSidebarSectionsInput = {\n basePath: string;\n pathname: string;\n entities: BackofficeEntityManifestMap;\n dashboards?: readonly BackofficeDashboardRegistration[];\n sidebar?: BackofficeSidebarConfig;\n permissions: unknown;\n searchQuery?: string;\n tApp: TFunction;\n t: TFunction;\n pinnedEntityIds?: readonly string[];\n recentItems?: readonly BackofficeSidebarRecentItem[];\n onTogglePin?: (entityId: string) => void;\n onReorderPin?: (fromId: string, toId: string) => void;\n collapsedByGroupId?: SidebarGroupCollapseState;\n onGroupCollapsedChange?: (groupId: string, collapsed: boolean) => void;\n sidebarCollapsed?: boolean;\n};\n\n/**\n * Builds the sidebar sections for the backoffice layout.\n */\nexport function buildSidebarSections(\n input: BuildSidebarSectionsInput,\n): readonly SidebarNavigationSection[] {\n const {\n basePath,\n pathname,\n entities,\n dashboards = [],\n sidebar,\n permissions,\n searchQuery,\n tApp,\n t,\n pinnedEntityIds = [],\n recentItems = [],\n onTogglePin,\n onReorderPin,\n collapsedByGroupId,\n onGroupCollapsedChange,\n sidebarCollapsed = false,\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, sidebar);\n const normalizedQuery = searchQuery?.trim().toLowerCase() ?? '';\n\n const labelMatchesQuery = (label: string): boolean => {\n return (\n normalizedQuery === '' || label.toLowerCase().includes(normalizedQuery)\n );\n };\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 buildDashboardItem = (\n inputItem?: {\n id?: string;\n icon?: BackofficeIconComponent;\n label?: string;\n },\n groupId?: string,\n ): SidebarNavigationItem | null => {\n const dashboardId = inputItem?.id ?? 'dashboard';\n const dashboardDescriptor: BackofficeSidebarItemDescriptor = {\n kind: 'dashboard',\n id: dashboardId,\n };\n const isDashboardVisible = sidebar?.isItemVisible?.(\n dashboardDescriptor,\n permissions,\n );\n if (isDashboardVisible === false) {\n return null;\n }\n\n const registration = findBackofficeDashboardRegistration(\n dashboards,\n dashboardId,\n );\n let label = inputItem?.label;\n if (label == null && registration != null) {\n label = resolveLabel(registration.label, tApp);\n }\n label ??= t('sidebar.items.dashboard');\n if (!labelMatchesQuery(label)) {\n return null;\n }\n\n let href = basePath;\n let id = 'dashboard';\n if (dashboardId !== 'dashboard') {\n href = joinBackofficePath(basePath, `dashboard/${dashboardId}`);\n id = `dashboard-${dashboardId}`;\n }\n\n let isActive = isActivePath(pathname, href);\n if (dashboardId === 'dashboard') {\n isActive = pathname === basePath || pathname === `${basePath}/dashboard`;\n }\n\n return {\n id,\n data: {\n kind: 'dashboard',\n id: dashboardId,\n groupId,\n },\n label,\n href,\n icon: renderIcon(\n inputItem?.icon ?? registration?.icon,\n <SidebarHomeSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive,\n ariaLabel: label,\n };\n };\n\n const buildEntityItem = (inputItem: {\n entityId: string;\n groupId?: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n itemLabel?: string;\n enableReorder?: boolean;\n sectionId?: string;\n }): SidebarNavigationItem | null => {\n const {\n entityId,\n groupId,\n groupIcon,\n itemIcon,\n itemLabel,\n enableReorder,\n sectionId,\n } = 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 = itemLabel ?? resolveLabel(config.label, tApp);\n if (\n normalizedQuery !== '' &&\n !label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n\n let actionsVisibility: SidebarNavigationItem['actionsVisibility'];\n if (sectionId !== 'pinned' && pinnedSet.has(entityId)) {\n actionsVisibility = 'always';\n }\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 itemIcon ?? 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 actionsVisibility,\n };\n }\n\n if (!config.hasList) {\n return null;\n }\n\n const label = itemLabel ?? 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 if (enableReorder === true && onReorderPin != null) {\n dragHandleSlot = (\n <GripDotsSvg width={14} height={14} aria-hidden=\"true\" />\n );\n }\n\n let dragHandleLabel: string | undefined;\n if (dragHandleSlot != null) {\n dragHandleLabel = reorderLabel;\n }\n\n let actionsVisibility: SidebarNavigationItem['actionsVisibility'];\n if (sectionId !== 'pinned' && pinnedSet.has(entityId)) {\n actionsVisibility = 'always';\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 itemIcon ?? 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 actionsVisibility,\n dragHandleSlot,\n dragHandleLabel,\n };\n };\n\n const buildHubItem = (inputItem: {\n hub: ReturnType<typeof resolveSidebarHub>;\n groupId?: string;\n icon?: BackofficeIconComponent;\n }): SidebarNavigationItem | null => {\n const { hub, groupId, icon } = inputItem;\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'hub',\n id: hub.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n const childEntityIds = resolveHubEntityIds(hub);\n const visibleChildConfigs = childEntityIds\n .map((entityId) => {\n return entities[entityId] ?? null;\n })\n .filter((config): config is BackofficeEntityManifestMap[string] => {\n if (config == null) {\n return false;\n }\n let childKind: BackofficeSidebarItemDescriptor['kind'] = 'entity';\n if (config.kind === 'tool') {\n childKind = 'tool';\n }\n const childDescriptor: BackofficeSidebarItemDescriptor = {\n kind: childKind,\n id: config.id,\n };\n const isChildVisible = sidebar?.isItemVisible?.(\n childDescriptor,\n permissions,\n );\n if (isChildVisible === false) {\n return false;\n }\n if (config.kind !== 'tool' && !config.hasList) {\n return false;\n }\n return true;\n });\n if (childEntityIds.length > 0 && visibleChildConfigs.length === 0) {\n return null;\n }\n const label = resolveLabel(hub.title, tApp);\n const matchesHub = labelMatchesQuery(label);\n const matchesChild = visibleChildConfigs.some((config) => {\n return labelMatchesQuery(resolveLabel(config.label, tApp));\n });\n if (!matchesHub && !matchesChild) {\n return null;\n }\n const isActive =\n isActivePath(pathname, hub.href) ||\n visibleChildConfigs.some((config) => {\n return isActivePath(pathname, config.routes.list);\n });\n return {\n id: `hub-${hub.id}`,\n data: {\n kind: 'hub',\n id: hub.id,\n groupId,\n },\n label,\n href: hub.href,\n icon: renderIcon(\n icon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive,\n ariaLabel: label,\n };\n };\n\n const sections: SidebarNavigationSection[] = [];\n\n const primaryItems = sidebar?.primaryItems ?? [];\n if (primaryItems.length > 0) {\n const primarySectionItems = primaryItems\n .map((primaryItem): SidebarNavigationItem | null => {\n if (primaryItem.kind === 'dashboard') {\n let itemLabel: string | undefined;\n if (primaryItem.label != null) {\n itemLabel = resolveLabel(primaryItem.label, tApp);\n }\n return buildDashboardItem({\n id: primaryItem.id,\n icon: primaryItem.icon,\n label: itemLabel,\n });\n }\n if (primaryItem.kind === 'hub') {\n const hub = resolveSidebarHub(primaryItem, sidebar);\n return buildHubItem({\n hub,\n icon: primaryItem.icon,\n });\n }\n let itemLabel: string | undefined;\n if (primaryItem.label != null) {\n itemLabel = resolveLabel(primaryItem.label, tApp);\n }\n return buildEntityItem({\n entityId: primaryItem.id,\n itemIcon: primaryItem.icon,\n itemLabel,\n sectionId: 'primary',\n });\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (primarySectionItems.length > 0) {\n sections.push({\n id: 'primary',\n items: primarySectionItems,\n collapsible: false,\n });\n }\n }\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?.groupIcon,\n itemIcon: groupMeta?.itemIcon,\n enableReorder: true,\n sectionId: 'pinned',\n });\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (pinnedItems.length > 0) {\n let reorder: SidebarNavigationSection['reorder'];\n if (onReorderPin != null && pinnedItems.length > 1) {\n reorder = {\n enabled: true,\n onReorder: onReorderPin,\n };\n }\n let sectionItems = pinnedItems;\n if (reorder == null) {\n sectionItems = pinnedItems.map((item) => {\n const { dragHandleSlot, dragHandleLabel, ...rest } = item;\n return rest;\n });\n }\n\n sections.push({\n id: 'pinned',\n title: t('sidebar.sections.pinned'),\n icon: renderIcon(\n undefined,\n <PinSvg width={16} height={16} aria-hidden=\"true\" />,\n ),\n items: sectionItems,\n collapsible: false,\n reorder,\n });\n }\n }\n\n if (recentItems.length > 0) {\n const recentSectionItems = recentItems\n .map((recentItem): SidebarNavigationItem | null => {\n const config = entities[recentItem.id];\n if (config == null) {\n return null;\n }\n const descriptor: BackofficeSidebarItemDescriptor = {\n kind: recentItem.kind,\n id: recentItem.id,\n };\n const isVisible = sidebar?.isItemVisible?.(descriptor, permissions);\n if (isVisible === false) {\n return null;\n }\n if (\n normalizedQuery !== '' &&\n !recentItem.label.toLowerCase().includes(normalizedQuery)\n ) {\n return null;\n }\n const groupMeta = entityGroupLookup.get(recentItem.id);\n return {\n id: `recent-${recentItem.kind}-${recentItem.id}`,\n data: {\n kind: recentItem.kind,\n id: recentItem.id,\n groupId: groupMeta?.groupId,\n },\n label: recentItem.label,\n href: recentItem.href,\n icon: renderIcon(\n groupMeta?.itemIcon ?? groupMeta?.groupIcon,\n <SidebarTasksSvg width={18} height={18} aria-hidden=\"true\" />,\n ),\n isActive: isActivePath(pathname, recentItem.href),\n ariaLabel: recentItem.label,\n } satisfies SidebarNavigationItem;\n })\n .filter((item): item is SidebarNavigationItem => {\n return item != null;\n });\n\n if (recentSectionItems.length > 0) {\n sections.push({\n id: 'recent',\n title: t('sidebar.sections.recent'),\n icon: renderIcon(\n undefined,\n <BackofficeSidebarHistorySvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n />,\n ),\n items: recentSectionItems,\n collapsible: false,\n });\n }\n }\n\n entries.forEach(([groupId, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n\n const items: SidebarNavigationItem[] = [];\n\n const groupItems = resolveGroupItems(group);\n if (groupItems.length > 0) {\n groupItems.forEach((groupItem) => {\n if (groupItem.kind === 'dashboard') {\n let itemLabel: string | undefined;\n if (groupItem.label != null) {\n itemLabel = resolveLabel(groupItem.label, tApp);\n }\n const item = buildDashboardItem(\n {\n id: groupItem.id,\n icon: groupItem.icon ?? group.icon,\n label: itemLabel,\n },\n groupId,\n );\n if (item != null) {\n items.push(item);\n }\n return;\n }\n if (groupItem.kind === 'hub') {\n const hub = resolveSidebarHub(groupItem, sidebar);\n const item = buildHubItem({\n hub,\n groupId,\n icon: groupItem.icon ?? group.icon,\n });\n if (item != null) {\n items.push(item);\n }\n return;\n }\n let itemLabel: string | undefined;\n if (groupItem.label != null) {\n itemLabel = resolveLabel(groupItem.label, tApp);\n }\n const item = buildEntityItem({\n entityId: groupItem.id,\n groupId,\n groupIcon: group.icon,\n itemIcon: groupItem.icon,\n itemLabel,\n sectionId: groupId,\n });\n if (item != null) {\n items.push(item);\n }\n });\n }\n\n let sectionItems: SidebarNavigationItem[] = items;\n if (sidebarCollapsed && group.behavior?.showInCollapsedRail !== true) {\n sectionItems = items.filter((item) => {\n return item.data?.kind === 'dashboard' || item.isActive === true;\n });\n }\n\n if (sectionItems.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 icon: renderIcon(group.icon, undefined, 16),\n items: sectionItems,\n collapsible: group.behavior?.collapsible ?? true,\n defaultCollapsed: group.behavior?.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 { SidebarProfileViewer } from '@plumile/ui/components/navigation/sidebar/SidebarProfileMenu.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): SidebarProfileViewer => {\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,KAAK,KAAK,IAGb,KAAiC,EAC5C,WACA,0BAC8D;CAS9D,IAAI,IANsB,CAFR,EAAc,GAAQ,SAEb,GADV,EAAc,GAAQ,QACD,CAAQ,EAC3C,QAAQ,MACA,MAAU,EAClB,EACA,KAAK,GAAG,EACR,KACe;CAClB,AAAI,MAAgB,OAClB,IAAc;CAGhB,IAAM,IAAQ,EAAc,GAAQ,KAAK,GAErC,IADkB,EAAc,GAAQ,QAC7B;CACf,AAAI,MAAa,OACf,IAAW;CAGb,IAAM,IAAY,CAAC,CAAW;CAK9B,OAJI,MAAU,MACZ,EAAU,KAAK,CAAK,GAGf;EACL;EACA;EACA;EACA,WAAW,EAAU,KAAK,KAAK;CACjC;AACF"}
1
+ {"version":3,"file":"mapViewerToSidebarProfileView.js","names":[],"sources":["../../../../../src/components/backoffice/layout/mapViewerToSidebarProfileView.ts"],"sourcesContent":["import type { SidebarProfileViewer } from '@plumile/ui/components/navigation/sidebar/SidebarProfileMenu.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): SidebarProfileViewer => {\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,KAAK,KAAK,IAGb,KAAiC,EAC5C,WACA,0BAC8D;CAS9D,IAAI,IANsB,CAFR,EAAc,GAAQ,SAEb,GADV,EAAc,GAAQ,QACD,CAAQ,CAAC,CAC5C,QAAQ,MACA,MAAU,EAClB,CAAC,CACD,KAAK,GAAG,CAAC,CACT,KACe;CAClB,AAAI,MAAgB,OAClB,IAAc;CAGhB,IAAM,IAAQ,EAAc,GAAQ,KAAK,GAErC,IADkB,EAAc,GAAQ,QAC7B;CACf,AAAI,MAAa,OACf,IAAW;CAGb,IAAM,IAAY,CAAC,CAAW;CAK9B,OAJI,MAAU,MACZ,EAAU,KAAK,CAAK,GAGf;EACL;EACA;EACA;EACA,WAAW,EAAU,KAAK,KAAK;CACjC;AACF"}
@@ -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 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 joinBackofficePath = (\n basePath: string,\n pathSegment: string,\n): string => {\n const normalizedBasePath = basePath.replace(/\\/+$/g, '');\n const normalizedPathSegment = pathSegment.replace(/^\\/+/g, '');\n if (normalizedBasePath === '') {\n return `/${normalizedPathSegment}`;\n }\n return `${normalizedBasePath}/${normalizedPathSegment}`;\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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"}
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 joinBackofficePath = (\n basePath: string,\n pathSegment: string,\n): string => {\n const normalizedBasePath = basePath.replace(/\\/+$/g, '');\n const normalizedPathSegment = pathSegment.replace(/^\\/+/g, '');\n if (normalizedBasePath === '') {\n return `/${normalizedPathSegment}`;\n }\n return `${normalizedBasePath}/${normalizedPathSegment}`;\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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"}
@@ -5,7 +5,7 @@ var i = ({ icon: i, label: a, showIcon: o = !0, endAdornment: s }) => /* @__PURE
5
5
  className: e,
6
6
  children: [
7
7
  o && i != null && /* @__PURE__ */ n("span", {
8
- className: "txvbqbfqq txvbqbey txvbqbls4 txvbqb1bcb txvbqbfwv txvbqb1abr txvbqbkh6",
8
+ className: "txvbqbfqq txvbqbey txvbqbls4 txvbqb1bd1 txvbqbfwv txvbqb1ac4 txvbqbkh6",
9
9
  "aria-hidden": "true",
10
10
  children: /* @__PURE__ */ n(i, {
11
11
  width: 14,
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/links/backofficeLink.css.ts
3
- var e = "txvbqbfqq txvbqbey txvbqbhd8", t = "txvbqbfqq txvbqbey txvbqbls4 txvbqb1bcb txvbqbfwv txvbqb1abr txvbqbkh6", n = "txvbqbv7x";
3
+ var e = "txvbqbfqq txvbqbey txvbqbhd8", t = "txvbqbfqq txvbqbey txvbqbls4 txvbqb1bd1 txvbqbfwv txvbqb1ac4 txvbqbkh6", n = "txvbqbv7x";
4
4
  //#endregion
5
5
  export { e as content, t as icon, n as label };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"resolveBackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeLink.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport { buildBackofficeFallbackListHref } from '@plumile/backoffice-core/state/buildListHref.js';\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeSidebarConfig } from '../../../provider/types.js';\nimport {\n joinBackofficePath,\n resolveSidebarHub,\n} from '../layout/sidebarUtils.js';\nimport { resolveBackofficeTargetIcon } from './resolveBackofficeTargetIcon.js';\nimport type { BackofficeLinkTarget, BackofficeResolvedLink } from './types.js';\n\nconst requireEntity = (\n manifest: BackofficeEntityManifestMap,\n entityId: string,\n) => {\n const entity = manifest[entityId];\n if (entity == null) {\n throw new Error(`Unknown backoffice entity: ${entityId}`);\n }\n return entity;\n};\n\nconst resolveHubHref = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.href;\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).href;\n }\n }\n }\n\n throw new Error(`Unknown backoffice hub: ${hubId}`);\n};\n\nconst resolveHubLabel = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n tApp: TFunction,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.title(tApp);\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).title(tApp);\n }\n }\n }\n\n return hubId;\n};\n\nexport const resolveBackofficeLink = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n manifest: TManifest;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n tApp: TFunction;\n dashboardHref?: string;\n dashboardLabel?: string;\n}): BackofficeResolvedLink => {\n const manifest = input.manifest as BackofficeEntityManifestMap;\n const sidebar = input.sidebar as BackofficeSidebarConfig | undefined;\n const target = input.target as BackofficeLinkTarget;\n const icon = resolveBackofficeTargetIcon({\n target: input.target,\n sidebar: input.sidebar,\n });\n\n if (target.kind === 'dashboard') {\n const dashboardId = target.id ?? 'dashboard';\n const href = input.dashboardHref ?? '/';\n if (dashboardId !== 'dashboard') {\n return {\n id: `dashboard-${dashboardId}`,\n href: joinBackofficePath(href, `dashboard/${dashboardId}`),\n label: input.label ?? dashboardId,\n icon,\n };\n }\n return {\n id: 'dashboard',\n href,\n label: input.label ?? input.dashboardLabel ?? 'Dashboard',\n icon,\n };\n }\n\n if (target.kind === 'entity-list') {\n const entity = requireEntity(manifest, target.entityId);\n const { state } = target;\n let href = entity.routes.list;\n if (state != null) {\n href = buildBackofficeFallbackListHref(\n entity.routes.list,\n state.where ?? null,\n state.filters,\n );\n }\n return {\n id: `${target.entityId}-list`,\n href,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'entity-detail') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-entity-${target.id}`,\n href: entity.routes.detail(target.id),\n label: input.label ?? target.id,\n icon,\n };\n }\n\n if (target.kind === 'entity-detail-page') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-page-${target.id}-${target.pageId}`,\n href: entity.routes.detailPage(target.id, target.pageId),\n label: input.label ?? target.pageId,\n icon,\n };\n }\n\n if (target.kind === 'tool') {\n const entity = requireEntity(manifest, target.toolId);\n return {\n id: `tool-${target.toolId}`,\n href: entity.routes.list,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'hub') {\n return {\n id: `hub-${target.hubId}`,\n href: resolveHubHref(sidebar, target.hubId),\n label: input.label ?? resolveHubLabel(sidebar, target.hubId, input.tApp),\n icon,\n };\n }\n\n return {\n id: `href-${target.href}`,\n href: target.href,\n label: input.label ?? target.href,\n icon,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolveBackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeLink.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport { buildBackofficeFallbackListHref } from '@plumile/backoffice-core/state/buildListHref.js';\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeSidebarConfig } from '../../../provider/types.js';\nimport {\n joinBackofficePath,\n resolveSidebarHub,\n} from '../layout/sidebarUtils.js';\nimport { resolveBackofficeTargetIcon } from './resolveBackofficeTargetIcon.js';\nimport type { BackofficeLinkTarget, BackofficeResolvedLink } from './types.js';\n\nconst requireEntity = (\n manifest: BackofficeEntityManifestMap,\n entityId: string,\n) => {\n const entity = manifest[entityId];\n if (entity == null) {\n throw new Error(`Unknown backoffice entity: ${entityId}`);\n }\n return entity;\n};\n\nconst resolveHubHref = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.href;\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).href;\n }\n }\n }\n\n throw new Error(`Unknown backoffice hub: ${hubId}`);\n};\n\nconst resolveHubLabel = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n tApp: TFunction,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.title(tApp);\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).title(tApp);\n }\n }\n }\n\n return hubId;\n};\n\nexport const resolveBackofficeLink = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n manifest: TManifest;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n tApp: TFunction;\n dashboardHref?: string;\n dashboardLabel?: string;\n}): BackofficeResolvedLink => {\n const manifest = input.manifest as BackofficeEntityManifestMap;\n const sidebar = input.sidebar as BackofficeSidebarConfig | undefined;\n const target = input.target as BackofficeLinkTarget;\n const icon = resolveBackofficeTargetIcon({\n target: input.target,\n sidebar: input.sidebar,\n });\n\n if (target.kind === 'dashboard') {\n const dashboardId = target.id ?? 'dashboard';\n const href = input.dashboardHref ?? '/';\n if (dashboardId !== 'dashboard') {\n return {\n id: `dashboard-${dashboardId}`,\n href: joinBackofficePath(href, `dashboard/${dashboardId}`),\n label: input.label ?? dashboardId,\n icon,\n };\n }\n return {\n id: 'dashboard',\n href,\n label: input.label ?? input.dashboardLabel ?? 'Dashboard',\n icon,\n };\n }\n\n if (target.kind === 'entity-list') {\n const entity = requireEntity(manifest, target.entityId);\n const { state } = target;\n let href = entity.routes.list;\n if (state != null) {\n href = buildBackofficeFallbackListHref(\n entity.routes.list,\n state.where ?? null,\n state.filters,\n );\n }\n return {\n id: `${target.entityId}-list`,\n href,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'entity-detail') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-entity-${target.id}`,\n href: entity.routes.detail(target.id),\n label: input.label ?? target.id,\n icon,\n };\n }\n\n if (target.kind === 'entity-detail-page') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-page-${target.id}-${target.pageId}`,\n href: entity.routes.detailPage(target.id, target.pageId),\n label: input.label ?? target.pageId,\n icon,\n };\n }\n\n if (target.kind === 'tool') {\n const entity = requireEntity(manifest, target.toolId);\n return {\n id: `tool-${target.toolId}`,\n href: entity.routes.list,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'hub') {\n return {\n id: `hub-${target.hubId}`,\n href: resolveHubHref(sidebar, target.hubId),\n label: input.label ?? resolveHubLabel(sidebar, target.hubId, input.tApp),\n icon,\n };\n }\n\n return {\n id: `href-${target.href}`,\n href: target.href,\n label: input.label ?? target.href,\n icon,\n };\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveBackofficeTargetIcon.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeTargetIcon.ts"],"sourcesContent":["import type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeIconComponent,\n BackofficeSidebarConfig,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemConfig,\n} from '../../../provider/types.js';\nimport {\n resolveGroupItems,\n resolveSidebarHubFor,\n} from '../layout/sidebarUtils.js';\nimport type { BackofficeLinkTarget } from './types.js';\n\nconst getTargetId = (\n target: BackofficeLinkTarget,\n): { kind: 'dashboard' | 'entity' | 'tool' | 'hub' | 'href'; id: string } => {\n if (target.kind === 'dashboard') {\n return { kind: 'dashboard', id: target.id ?? 'dashboard' };\n }\n if (target.kind === 'entity-list') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail-page') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'tool') {\n return { kind: 'tool', id: target.toolId };\n }\n if (target.kind === 'hub') {\n return { kind: 'hub', id: target.hubId };\n }\n return { kind: 'href', id: target.href };\n};\n\nconst resolveItemIcon = <TManifest extends BackofficeEntityManifestMap>(\n item: BackofficeSidebarItemConfig<TManifest>,\n target: ReturnType<typeof getTargetId>,\n group: BackofficeSidebarGroupConfig<TManifest>,\n sidebar: BackofficeSidebarConfig<TManifest> | undefined,\n): BackofficeIconComponent | undefined => {\n if (target.kind === 'dashboard') {\n if (item.kind === 'dashboard' && (item.id ?? 'dashboard') === target.id) {\n return item.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'hub') {\n if (item.kind === 'hub' && item.id === target.id) {\n const hub = resolveSidebarHubFor(item, sidebar);\n return item.icon ?? hub.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'entity' || target.kind === 'tool') {\n if (item.kind === target.kind && item.id === target.id) {\n return item.icon ?? group.icon;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHubFor(item, sidebar);\n for (const hubGroup of hub.groups) {\n const hubItem = hubGroup.items.find((candidate) => {\n return candidate.kind === target.kind && candidate.id === target.id;\n });\n if (hubItem != null) {\n return (\n hubItem.icon ?? hubGroup.icon ?? item.icon ?? hub.icon ?? group.icon\n );\n }\n }\n }\n }\n\n return undefined;\n};\n\nexport const resolveBackofficeTargetIcon = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n}): BackofficeIconComponent | undefined => {\n const target = getTargetId(input.target);\n if (target.kind === 'href') {\n return undefined;\n }\n\n for (const group of Object.values(input.sidebar?.groups ?? {})) {\n for (const item of resolveGroupItems(group)) {\n const icon = resolveItemIcon(item, target, group, input.sidebar);\n if (icon != null) {\n return icon;\n }\n }\n }\n\n if (target.kind === 'hub') {\n return input.sidebar?.hubs?.[target.id]?.icon;\n }\n\n return undefined;\n};\n"],"mappings":";;AAcA,IAAM,KACJ,MAEI,EAAO,SAAS,cACX;CAAE,MAAM;CAAa,IAAI,EAAO,MAAM;AAAY,IAEvD,EAAO,SAAS,iBAGhB,EAAO,SAAS,mBAGhB,EAAO,SAAS,uBACX;CAAE,MAAM;CAAU,IAAI,EAAO;AAAS,IAE3C,EAAO,SAAS,SACX;CAAE,MAAM;CAAQ,IAAI,EAAO;AAAO,IAEvC,EAAO,SAAS,QACX;CAAE,MAAM;CAAO,IAAI,EAAO;AAAM,IAElC;CAAE,MAAM;CAAQ,IAAI,EAAO;AAAK,GAGnC,KACJ,GACA,GACA,GACA,MACwC;CACxC,IAAI,EAAO,SAAS,aAIlB,OAHI,EAAK,SAAS,gBAAgB,EAAK,MAAM,iBAAiB,EAAO,KAC5D,EAAK,QAAQ,EAAM,OAE5B;CAGF,IAAI,EAAO,SAAS,OAAO;EACzB,IAAI,EAAK,SAAS,SAAS,EAAK,OAAO,EAAO,IAAI;GAChD,IAAM,IAAM,EAAqB,GAAM,CAAO;GAC9C,OAAO,EAAK,QAAQ,EAAI,QAAQ,EAAM;EACxC;EACA;CACF;CAEA,IAAI,EAAO,SAAS,YAAY,EAAO,SAAS,QAAQ;EACtD,IAAI,EAAK,SAAS,EAAO,QAAQ,EAAK,OAAO,EAAO,IAClD,OAAO,EAAK,QAAQ,EAAM;EAG5B,IAAI,EAAK,SAAS,OAAO;GACvB,IAAM,IAAM,EAAqB,GAAM,CAAO;GAC9C,KAAK,IAAM,KAAY,EAAI,QAAQ;IACjC,IAAM,IAAU,EAAS,MAAM,MAAM,MAC5B,EAAU,SAAS,EAAO,QAAQ,EAAU,OAAO,EAAO,EAClE;IACD,IAAI,KAAW,MACb,OACE,EAAQ,QAAQ,EAAS,QAAQ,EAAK,QAAQ,EAAI,QAAQ,EAAM;GAGtE;EACF;CACF;AAGF,GAEa,KAEX,MAGyC;CACzC,IAAM,IAAS,EAAY,EAAM,MAAM;CACnC,MAAO,SAAS,QAIpB;OAAK,IAAM,KAAS,OAAO,OAAO,EAAM,SAAS,UAAU,CAAC,CAAC,GAC3D,KAAK,IAAM,KAAQ,EAAkB,CAAK,GAAG;GAC3C,IAAM,IAAO,EAAgB,GAAM,GAAQ,GAAO,EAAM,OAAO;GAC/D,IAAI,KAAQ,MACV,OAAO;EAEX;EAGF,IAAI,EAAO,SAAS,OAClB,OAAO,EAAM,SAAS,OAAO,EAAO,KAAK;CAJzC;AAQJ"}
1
+ {"version":3,"file":"resolveBackofficeTargetIcon.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeTargetIcon.ts"],"sourcesContent":["import type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeIconComponent,\n BackofficeSidebarConfig,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemConfig,\n} from '../../../provider/types.js';\nimport {\n resolveGroupItems,\n resolveSidebarHubFor,\n} from '../layout/sidebarUtils.js';\nimport type { BackofficeLinkTarget } from './types.js';\n\nconst getTargetId = (\n target: BackofficeLinkTarget,\n): { kind: 'dashboard' | 'entity' | 'tool' | 'hub' | 'href'; id: string } => {\n if (target.kind === 'dashboard') {\n return { kind: 'dashboard', id: target.id ?? 'dashboard' };\n }\n if (target.kind === 'entity-list') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail-page') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'tool') {\n return { kind: 'tool', id: target.toolId };\n }\n if (target.kind === 'hub') {\n return { kind: 'hub', id: target.hubId };\n }\n return { kind: 'href', id: target.href };\n};\n\nconst resolveItemIcon = <TManifest extends BackofficeEntityManifestMap>(\n item: BackofficeSidebarItemConfig<TManifest>,\n target: ReturnType<typeof getTargetId>,\n group: BackofficeSidebarGroupConfig<TManifest>,\n sidebar: BackofficeSidebarConfig<TManifest> | undefined,\n): BackofficeIconComponent | undefined => {\n if (target.kind === 'dashboard') {\n if (item.kind === 'dashboard' && (item.id ?? 'dashboard') === target.id) {\n return item.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'hub') {\n if (item.kind === 'hub' && item.id === target.id) {\n const hub = resolveSidebarHubFor(item, sidebar);\n return item.icon ?? hub.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'entity' || target.kind === 'tool') {\n if (item.kind === target.kind && item.id === target.id) {\n return item.icon ?? group.icon;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHubFor(item, sidebar);\n for (const hubGroup of hub.groups) {\n const hubItem = hubGroup.items.find((candidate) => {\n return candidate.kind === target.kind && candidate.id === target.id;\n });\n if (hubItem != null) {\n return (\n hubItem.icon ?? hubGroup.icon ?? item.icon ?? hub.icon ?? group.icon\n );\n }\n }\n }\n }\n\n return undefined;\n};\n\nexport const resolveBackofficeTargetIcon = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n}): BackofficeIconComponent | undefined => {\n const target = getTargetId(input.target);\n if (target.kind === 'href') {\n return undefined;\n }\n\n for (const group of Object.values(input.sidebar?.groups ?? {})) {\n for (const item of resolveGroupItems(group)) {\n const icon = resolveItemIcon(item, target, group, input.sidebar);\n if (icon != null) {\n return icon;\n }\n }\n }\n\n if (target.kind === 'hub') {\n return input.sidebar?.hubs?.[target.id]?.icon;\n }\n\n return undefined;\n};\n"],"mappings":";;AAcA,IAAM,KACJ,MAEI,EAAO,SAAS,cACX;CAAE,MAAM;CAAa,IAAI,EAAO,MAAM;AAAY,IAEvD,EAAO,SAAS,iBAGhB,EAAO,SAAS,mBAGhB,EAAO,SAAS,uBACX;CAAE,MAAM;CAAU,IAAI,EAAO;AAAS,IAE3C,EAAO,SAAS,SACX;CAAE,MAAM;CAAQ,IAAI,EAAO;AAAO,IAEvC,EAAO,SAAS,QACX;CAAE,MAAM;CAAO,IAAI,EAAO;AAAM,IAElC;CAAE,MAAM;CAAQ,IAAI,EAAO;AAAK,GAGnC,KACJ,GACA,GACA,GACA,MACwC;CACxC,IAAI,EAAO,SAAS,aAIlB,OAHI,EAAK,SAAS,gBAAgB,EAAK,MAAM,iBAAiB,EAAO,KAC5D,EAAK,QAAQ,EAAM,OAE5B;CAGF,IAAI,EAAO,SAAS,OAAO;EACzB,IAAI,EAAK,SAAS,SAAS,EAAK,OAAO,EAAO,IAAI;GAChD,IAAM,IAAM,EAAqB,GAAM,CAAO;GAC9C,OAAO,EAAK,QAAQ,EAAI,QAAQ,EAAM;EACxC;EACA;CACF;CAEA,IAAI,EAAO,SAAS,YAAY,EAAO,SAAS,QAAQ;EACtD,IAAI,EAAK,SAAS,EAAO,QAAQ,EAAK,OAAO,EAAO,IAClD,OAAO,EAAK,QAAQ,EAAM;EAG5B,IAAI,EAAK,SAAS,OAAO;GACvB,IAAM,IAAM,EAAqB,GAAM,CAAO;GAC9C,KAAK,IAAM,KAAY,EAAI,QAAQ;IACjC,IAAM,IAAU,EAAS,MAAM,MAAM,MAC5B,EAAU,SAAS,EAAO,QAAQ,EAAU,OAAO,EAAO,EAClE;IACD,IAAI,KAAW,MACb,OACE,EAAQ,QAAQ,EAAS,QAAQ,EAAK,QAAQ,EAAI,QAAQ,EAAM;GAGtE;EACF;CACF;AAGF,GAEa,KAEX,MAGyC;CACzC,IAAM,IAAS,EAAY,EAAM,MAAM;CACnC,MAAO,SAAS,QAIpB;OAAK,IAAM,KAAS,OAAO,OAAO,EAAM,SAAS,UAAU,CAAC,CAAC,GAC3D,KAAK,IAAM,KAAQ,EAAkB,CAAK,GAAG;GAC3C,IAAM,IAAO,EAAgB,GAAM,GAAQ,GAAO,EAAM,OAAO;GAC/D,IAAI,KAAQ,MACV,OAAO;EAEX;EAGF,IAAI,EAAO,SAAS,OAClB,OAAO,EAAM,SAAS,OAAO,EAAO,GAAG,EAAE;CAJzC;AAQJ"}
@@ -1,6 +1,7 @@
1
+ /* empty css */
1
2
  /* empty css */
2
3
  //#region src/components/backoffice/list/RowFlagsCell.css.ts
3
- var e = "txvbqb10m7 txvbqb11js txvbqb12h0 txvbqbxt3 txvbqbls4", t = "txvbqbfqq txvbqbey txvbqbls4 txvbqbi8n txvbqb19uf", n = "qbwcuex qbwcuer txvbqbfqq txvbqbey txvbqbls4 txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19h2 txvbqbjmh txvbqbvat txvbqbub2";
4
+ var e = "txvbqb10mk txvbqb11k5 txvbqb12hd txvbqbxtg txvbqbls4", t = "txvbqbfqq txvbqbey txvbqbls4 txvbqbi8n txvbqb19us", n = "qbwcuex qbwcuer txvbqbfqq txvbqbey txvbqbls4 txvbqbh6d txvbqbo4m qbwcue11 qbwcuev txvbqb19hf txvbqbjmh txvbqbvat txvbqbub2";
4
5
  //#endregion
5
6
  export { t as container, n as flag, e as rowFlagsColumnCell };
6
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"RowFlagsCell.js","names":[],"sources":["../../../../../src/components/backoffice/list/RowFlagsCell.tsx"],"sourcesContent":["import { useMemo, type JSX, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeRowFlagSpec } from '@plumile/backoffice-core/types.js';\n\nimport * as styles from './RowFlagsCell.css.js';\n\nexport type RowFlagsCellProps<Row> = {\n row: Row;\n flags: readonly BackofficeRowFlagSpec<Row>[];\n tApp: TFunction;\n};\n\n/**\n * Renders row-level flags (icons) in a dedicated compact column.\n */\nexport const RowFlagsCell = <Row,>({\n row,\n flags,\n tApp,\n}: RowFlagsCellProps<Row>): JSX.Element => {\n const resolved = useMemo(() => {\n const out: { id: string; node: ReactNode; label: string }[] = [];\n for (const flag of flags) {\n const node = flag.render(row) as ReactNode;\n if (node != null && node !== '' && node !== false) {\n out.push({ id: flag.id, node, label: flag.label(row)(tApp) });\n }\n }\n return out;\n }, [flags, row, tApp]);\n\n const ariaLabel = resolved\n .map((entry) => {\n return entry.label.trim();\n })\n .filter((label) => {\n return label !== '';\n })\n .join(', ');\n\n let ariaLabelProp: string | undefined;\n if (ariaLabel !== '') {\n ariaLabelProp = ariaLabel;\n }\n\n return (\n <div className={styles.container} aria-label={ariaLabelProp}>\n {resolved.map((entry) => {\n return (\n <span\n key={entry.id}\n className={styles.flag}\n title={entry.label}\n role=\"img\"\n aria-label={entry.label}\n >\n {entry.node}\n </span>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;AAgBA,IAAa,KAAsB,EACjC,QACA,UACA,cACyC;CACzC,IAAM,IAAW,QAAc;EAC7B,IAAM,IAAwD,CAAC;EAC/D,KAAK,IAAM,KAAQ,GAAO;GACxB,IAAM,IAAO,EAAK,OAAO,CAAG;GAC5B,AAAI,KAAQ,QAAQ,MAAS,MAAM,MAAS,MAC1C,EAAI,KAAK;IAAE,IAAI,EAAK;IAAI;IAAM,OAAO,EAAK,MAAM,CAAG,EAAE,CAAI;GAAE,CAAC;EAEhE;EACA,OAAO;CACT,GAAG;EAAC;EAAO;EAAK;CAAI,CAAC,GAEf,IAAY,EACf,KAAK,MACG,EAAM,MAAM,KAAK,CACzB,EACA,QAAQ,MACA,MAAU,EAClB,EACA,KAAK,IAAI,GAER;CAKJ,OAJI,MAAc,OAChB,IAAgB,IAIhB,kBAAC,OAAD;EAAK,WAAW;EAAkB,cAAY;YAC3C,EAAS,KAAK,MAEX,kBAAC,QAAD;GAEE,WAAW;GACX,OAAO,EAAM;GACb,MAAK;GACL,cAAY,EAAM;aAEjB,EAAM;EACH,GAPC,EAAM,EAOP,CAET;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"RowFlagsCell.js","names":[],"sources":["../../../../../src/components/backoffice/list/RowFlagsCell.tsx"],"sourcesContent":["import { useMemo, type JSX, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeRowFlagSpec } from '@plumile/backoffice-core/types.js';\n\nimport * as styles from './RowFlagsCell.css.js';\n\nexport type RowFlagsCellProps<Row> = {\n row: Row;\n flags: readonly BackofficeRowFlagSpec<Row>[];\n tApp: TFunction;\n};\n\n/**\n * Renders row-level flags (icons) in a dedicated compact column.\n */\nexport const RowFlagsCell = <Row,>({\n row,\n flags,\n tApp,\n}: RowFlagsCellProps<Row>): JSX.Element => {\n const resolved = useMemo(() => {\n const out: { id: string; node: ReactNode; label: string }[] = [];\n for (const flag of flags) {\n const node = flag.render(row) as ReactNode;\n if (node != null && node !== '' && node !== false) {\n out.push({ id: flag.id, node, label: flag.label(row)(tApp) });\n }\n }\n return out;\n }, [flags, row, tApp]);\n\n const ariaLabel = resolved\n .map((entry) => {\n return entry.label.trim();\n })\n .filter((label) => {\n return label !== '';\n })\n .join(', ');\n\n let ariaLabelProp: string | undefined;\n if (ariaLabel !== '') {\n ariaLabelProp = ariaLabel;\n }\n\n return (\n <div className={styles.container} aria-label={ariaLabelProp}>\n {resolved.map((entry) => {\n return (\n <span\n key={entry.id}\n className={styles.flag}\n title={entry.label}\n role=\"img\"\n aria-label={entry.label}\n >\n {entry.node}\n </span>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;AAgBA,IAAa,KAAsB,EACjC,QACA,UACA,cACyC;CACzC,IAAM,IAAW,QAAc;EAC7B,IAAM,IAAwD,CAAC;EAC/D,KAAK,IAAM,KAAQ,GAAO;GACxB,IAAM,IAAO,EAAK,OAAO,CAAG;GAC5B,AAAI,KAAQ,QAAQ,MAAS,MAAM,MAAS,MAC1C,EAAI,KAAK;IAAE,IAAI,EAAK;IAAI;IAAM,OAAO,EAAK,MAAM,CAAG,CAAC,CAAC,CAAI;GAAE,CAAC;EAEhE;EACA,OAAO;CACT,GAAG;EAAC;EAAO;EAAK;CAAI,CAAC,GAEf,IAAY,EACf,KAAK,MACG,EAAM,MAAM,KAAK,CACzB,CAAC,CACD,QAAQ,MACA,MAAU,EAClB,CAAC,CACD,KAAK,IAAI,GAER;CAKJ,OAJI,MAAc,OAChB,IAAgB,IAIhB,kBAAC,OAAD;EAAK,WAAW;EAAkB,cAAY;YAC3C,EAAS,KAAK,MAEX,kBAAC,QAAD;GAEE,WAAW;GACX,OAAO,EAAM;GACb,MAAK;GACL,cAAY,EAAM;aAEjB,EAAM;EACH,GAPC,EAAM,EAOP,CAET;CACE,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport {\n BackofficePickerList,\n BackofficePickerShell,\n type BackofficePickerItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { useBackofficeFragment } from '../../../relay/typedRelayHooks.js';\n\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useBackofficeFragment<unknown, unknown>(\n config.fragment,\n queryData,\n );\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly BackofficePickerItem[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return (\n <BackofficePickerList\n items={items}\n onSelectItem={(item) => {\n onSelectId(item.id);\n }}\n />\n );\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeRuntimeEntityPickerConfig\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={footer}\n initialFocus=\"first-form-control\"\n >\n <BackofficePickerShell\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchAriaLabel={resolvedSearchPlaceholder}\n searchName=\"backoffice-entity-picker-search\"\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </BackofficePickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport {\n BackofficePickerList,\n BackofficePickerShell,\n type BackofficePickerItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_picker/BackofficePicker.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { useBackofficeFragment } from '../../../relay/typedRelayHooks.js';\n\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, string>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useBackofficeFragment<unknown, unknown>(\n config.fragment,\n queryData,\n );\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly BackofficePickerItem[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return (\n <BackofficePickerList\n items={items}\n onSelectItem={(item) => {\n onSelectId(item.id);\n }}\n />\n );\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n BackofficeRuntimeEntityPickerConfig | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={footer}\n initialFocus=\"first-form-control\"\n >\n <BackofficePickerShell\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchAriaLabel={resolvedSearchPlaceholder}\n searchName=\"backoffice-entity-picker-search\"\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </BackofficePickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/pickers/entityIdPickerDialog.css.ts
3
- var e = "txvbqb10lu txvbqb11jf txvbqb12i3 txvbqbxu6 txvbqb1bg3 txvbqb9j txvbqb18dp", t = "txvbqb10mx txvbqb11ki txvbqb12ig txvbqbxuj txvbqbfpn txvbqbey txvbqbls4 txvbqbhdl txvbqb1bg3", n = "txvbqb9j txvbqb1bg3";
3
+ var e = "txvbqb10m7 txvbqb11js txvbqb12ig txvbqbxuj txvbqb1bgt txvbqb9j txvbqb18e2", t = "txvbqb10na txvbqb11kv txvbqb12it txvbqbxuw txvbqbfpn txvbqbey txvbqbls4 txvbqbhdl txvbqb1bgt", n = "txvbqb9j txvbqb1bgt";
4
4
  //#endregion
5
5
  export { n as loadingLabel, t as loadingState, e as searchRequiredMessage };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeLazyEntityCount.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeLazyEntityCount.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useLazyLoadQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficeRuntimeEntityCountConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst COUNT_FETCH_POLICY = 'store-or-network' as const;\n\nexport type BackofficeLazyEntityCountProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n entity: string;\n where: Where | null;\n loadingFallback: ReactNode;\n errorFallback?: ReactNode;\n};\n\ntype BackofficeEntityCountValueProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n count: BackofficeRuntimeEntityCountConfig<Where>;\n where: Where | null;\n fetchKey?: string | number;\n children?: (value: number) => ReactNode;\n};\n\nexport type BackofficeLazyEntityCountLabelProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = BackofficeEntityCountValueProps<Where> & {\n loadingFallback: ReactNode;\n errorFallback?: ReactNode;\n};\n\nconst BackofficeEntityCountValue = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n count,\n where,\n fetchKey,\n children,\n}: BackofficeEntityCountValueProps<Where>): JSX.Element | null => {\n const variables = count.buildVariables({ where });\n const data = useLazyLoadQuery<OperationType>(count.query, variables, {\n fetchPolicy: COUNT_FETCH_POLICY,\n fetchKey,\n });\n const value = count.getCount(data);\n if (value == null) {\n return null;\n }\n if (children == null) {\n return <>{value}</>;\n }\n return <>{children(value)}</>;\n};\n\nexport const BackofficeLazyEntityCountLabel = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n loadingFallback,\n errorFallback = null,\n ...props\n}: BackofficeLazyEntityCountLabelProps<Where>): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <>{errorFallback}</>;\n }}\n >\n <Suspense fallback={loadingFallback}>\n <BackofficeEntityCountValue {...props} />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nconst BackofficeLazyEntityCountBody = ({\n entity,\n loadingFallback,\n where,\n}: BackofficeLazyEntityCountProps): JSX.Element | null => {\n const relatedEntitiesState = useBackofficeListEntitiesLoader([entity]);\n if (relatedEntitiesState.status !== 'loaded') {\n return <>{loadingFallback}</>;\n }\n\n const config = relatedEntitiesState.modules[entity]?.config;\n if (config == null) {\n return null;\n }\n\n return <BackofficeEntityCountValue count={config.list.count} where={where} />;\n};\n\nexport const BackofficeLazyEntityCount = ({\n entity,\n errorFallback = null,\n loadingFallback,\n where,\n}: BackofficeLazyEntityCountProps): JSX.Element | null => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <>{errorFallback}</>;\n }}\n >\n <Suspense fallback={loadingFallback}>\n <BackofficeLazyEntityCountBody\n entity={entity}\n loadingFallback={loadingFallback}\n where={where}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeLazyEntityCount;\n"],"mappings":";;;;;;AASA,IAAM,IAAqB,oBA2BrB,KAEJ,EACA,UACA,UACA,aACA,kBACgE;CAChE,IAAM,IAAY,EAAM,eAAe,EAAE,SAAM,CAAC,GAC1C,IAAO,EAAgC,EAAM,OAAO,GAAW;EACnE,aAAa;EACb;CACF,CAAC,GACK,IAAQ,EAAM,SAAS,CAAI;CAOjC,OANI,KAAS,OACJ,OAEL,KAAY,OACP,kBAAA,GAAA,EAAA,UAAG,EAAQ,CAAA,IAEb,kBAAA,GAAA,EAAA,UAAG,EAAS,CAAK,EAAI,CAAA;AAC9B,GAEa,KAEX,EACA,oBACA,mBAAgB,MAChB,GAAG,QAGD,kBAAC,GAAD;CACE,gBACS,kBAAA,GAAA,EAAA,UAAG,EAAgB,CAAA;WAG5B,kBAAC,GAAD;EAAU,UAAU;YAClB,kBAAC,GAAD,EAA4B,GAAI,EAAQ,CAAA;CAChC,CAAA;AACa,CAAA,GAIvB,KAAiC,EACrC,WACA,oBACA,eACwD;CACxD,IAAM,IAAuB,EAAgC,CAAC,CAAM,CAAC;CACrE,IAAI,EAAqB,WAAW,UAClC,OAAO,kBAAA,GAAA,EAAA,UAAG,EAAkB,CAAA;CAG9B,IAAM,IAAS,EAAqB,QAAQ,IAAS;CAKrD,OAJI,KAAU,OACL,OAGF,kBAAC,GAAD;EAA4B,OAAO,EAAO,KAAK;EAAc;CAAQ,CAAA;AAC9E,GAEa,KAA6B,EACxC,WACA,mBAAgB,MAChB,oBACA,eAGE,kBAAC,GAAD;CACE,gBACS,kBAAA,GAAA,EAAA,UAAG,EAAgB,CAAA;WAG5B,kBAAC,GAAD;EAAU,UAAU;YAClB,kBAAC,GAAD;GACU;GACS;GACV;EACR,CAAA;CACO,CAAA;AACa,CAAA"}
1
+ {"version":3,"file":"BackofficeLazyEntityCount.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeLazyEntityCount.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useLazyLoadQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficeRuntimeEntityCountConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst COUNT_FETCH_POLICY = 'store-or-network' as const;\n\nexport type BackofficeLazyEntityCountProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n entity: string;\n where: Where | null;\n loadingFallback: ReactNode;\n errorFallback?: ReactNode;\n};\n\ntype BackofficeEntityCountValueProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n count: BackofficeRuntimeEntityCountConfig<Where>;\n where: Where | null;\n fetchKey?: string | number;\n children?: (value: number) => ReactNode;\n};\n\nexport type BackofficeLazyEntityCountLabelProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = BackofficeEntityCountValueProps<Where> & {\n loadingFallback: ReactNode;\n errorFallback?: ReactNode;\n};\n\nconst BackofficeEntityCountValue = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n count,\n where,\n fetchKey,\n children,\n}: BackofficeEntityCountValueProps<Where>): JSX.Element | null => {\n const variables = count.buildVariables({ where });\n const data = useLazyLoadQuery<OperationType>(count.query, variables, {\n fetchPolicy: COUNT_FETCH_POLICY,\n fetchKey,\n });\n const value = count.getCount(data);\n if (value == null) {\n return null;\n }\n if (children == null) {\n return <>{value}</>;\n }\n return <>{children(value)}</>;\n};\n\nexport const BackofficeLazyEntityCountLabel = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n loadingFallback,\n errorFallback = null,\n ...props\n}: BackofficeLazyEntityCountLabelProps<Where>): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <>{errorFallback}</>;\n }}\n >\n <Suspense fallback={loadingFallback}>\n <BackofficeEntityCountValue {...props} />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nconst BackofficeLazyEntityCountBody = ({\n entity,\n loadingFallback,\n where,\n}: BackofficeLazyEntityCountProps): JSX.Element | null => {\n const relatedEntitiesState = useBackofficeListEntitiesLoader([entity]);\n if (relatedEntitiesState.status !== 'loaded') {\n return <>{loadingFallback}</>;\n }\n\n const config = relatedEntitiesState.modules[entity]?.config;\n if (config == null) {\n return null;\n }\n\n return <BackofficeEntityCountValue count={config.list.count} where={where} />;\n};\n\nexport const BackofficeLazyEntityCount = ({\n entity,\n errorFallback = null,\n loadingFallback,\n where,\n}: BackofficeLazyEntityCountProps): JSX.Element | null => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <>{errorFallback}</>;\n }}\n >\n <Suspense fallback={loadingFallback}>\n <BackofficeLazyEntityCountBody\n entity={entity}\n loadingFallback={loadingFallback}\n where={where}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeLazyEntityCount;\n"],"mappings":";;;;;;AASA,IAAM,IAAqB,oBA2BrB,KAEJ,EACA,UACA,UACA,aACA,kBACgE;CAChE,IAAM,IAAY,EAAM,eAAe,EAAE,SAAM,CAAC,GAC1C,IAAO,EAAgC,EAAM,OAAO,GAAW;EACnE,aAAa;EACb;CACF,CAAC,GACK,IAAQ,EAAM,SAAS,CAAI;CAOjC,OANI,KAAS,OACJ,OAEL,KAAY,OACP,kBAAA,GAAA,EAAA,UAAG,EAAQ,CAAA,IAEb,kBAAA,GAAA,EAAA,UAAG,EAAS,CAAK,EAAI,CAAA;AAC9B,GAEa,KAEX,EACA,oBACA,mBAAgB,MAChB,GAAG,QAGD,kBAAC,GAAD;CACE,gBACS,kBAAA,GAAA,EAAA,UAAG,EAAgB,CAAA;WAG5B,kBAAC,GAAD;EAAU,UAAU;YAClB,kBAAC,GAAD,EAA4B,GAAI,EAAQ,CAAA;CAChC,CAAA;AACa,CAAA,GAIvB,KAAiC,EACrC,WACA,oBACA,eACwD;CACxD,IAAM,IAAuB,EAAgC,CAAC,CAAM,CAAC;CACrE,IAAI,EAAqB,WAAW,UAClC,OAAO,kBAAA,GAAA,EAAA,UAAG,EAAkB,CAAA;CAG9B,IAAM,IAAS,EAAqB,QAAQ,EAAO,EAAE;CAKrD,OAJI,KAAU,OACL,OAGF,kBAAC,GAAD;EAA4B,OAAO,EAAO,KAAK;EAAc;CAAQ,CAAA;AAC9E,GAEa,KAA6B,EACxC,WACA,mBAAgB,MAChB,oBACA,eAGE,kBAAC,GAAD;CACE,gBACS,kBAAA,GAAA,EAAA,UAAG,EAAgB,CAAA;WAG5B,kBAAC,GAAD;EAAU,UAAU;YAClB,kBAAC,GAAD;GACU;GACS;GACV;EACR,CAAA;CACO,CAAA;AACa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeRelatedCountLink.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeRelatedCountLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport { resolveBackofficeLink } from '../links/resolveBackofficeLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport { BackofficeLazyEntityCount } from './BackofficeLazyEntityCount.js';\n\nimport * as styles from './backofficeRelatedCountLink.css.js';\n\nexport type BackofficeRelatedCountLinkProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n count?: number | null | undefined;\n entity: string;\n where: Where;\n};\n\nexport const BackofficeRelatedCountLink = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n count,\n entity,\n where,\n}: BackofficeRelatedCountLinkProps<Where>): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityManifest, entityRegistry, sidebar } =\n useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const targetManifest = entities[entity];\n if (targetManifest == null) {\n return <span>{count ?? 0}</span>;\n }\n const entityLabel = targetManifest.label(tApp);\n const actionLabel = t('relations.openFilteredList', {\n label: entityLabel,\n });\n const loadingLabel = t('common.loading');\n const loadedEntity = entityRegistry.getLoadedListEntity(entity);\n let countNode: ReactNode = (\n <BackofficeLazyEntityCount\n entity={entity}\n loadingFallback={\n <span className={styles.countLoading}>\n <Spinner ariaLabel={loadingLabel} size={12} />\n </span>\n }\n where={where}\n />\n );\n if (typeof count === 'number' && Number.isFinite(count)) {\n countNode = count;\n }\n const target = {\n kind: 'entity-list',\n entityId: entity,\n state: { where },\n } as BackofficeLinkTarget;\n\n const navigateWithLoadedEntity = async (\n history: NonNullable<typeof routing>['history'],\n ): Promise<void> => {\n const listEntity = await entityRegistry.loadListEntity(entity);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n };\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (\n loadedEntity != null ||\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n const { history } = routing;\n navigateWithLoadedEntity(history).catch(() => {\n const link = resolveBackofficeLink({\n target,\n manifest: entityManifest,\n sidebar,\n tApp,\n });\n const fallbackUrl = new URL(link.href, window.location.origin);\n history.push({\n pathname: fallbackUrl.pathname,\n search: fallbackUrl.search,\n hash: fallbackUrl.hash,\n });\n });\n };\n\n return (\n <BackofficeInlineLink\n target={target}\n className={styles.link}\n title={actionLabel}\n ariaLabel={actionLabel}\n onClick={handleClick}\n endAdornment={\n <span className={styles.icon} aria-hidden=\"true\">\n ›\n </span>\n }\n >\n <span className={styles.count}>{countNode}</span>\n </BackofficeInlineLink>\n );\n};\n\nexport default BackofficeRelatedCountLink;\n"],"mappings":";;;;;;;;;;;;;AAuBA,IAAa,KAEX,EACA,OAAA,GACA,WACA,eACyD;CACzD,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,aAAU,mBAAgB,mBAAgB,eAChD,EAAoB,GAChB,IAAU,EAAW,CAAc,GACnC,IAAiB,EAAS;CAChC,IAAI,KAAkB,MACpB,OAAO,kBAAC,QAAD,EAAA,UAAO,KAAS,EAAQ,CAAA;CAGjC,IAAM,IAAc,EAAE,8BAA8B,EAClD,OAFkB,EAAe,MAAM,CAEhC,EACT,CAAC,GACK,IAAe,EAAE,gBAAgB,GACjC,IAAe,EAAe,oBAAoB,CAAM,GAC1D,IACF,kBAAC,GAAD;EACU;EACR,iBACE,kBAAC,QAAD;GAAM,WAAW;aACf,kBAAC,GAAD;IAAS,WAAW;IAAc,MAAM;GAAK,CAAA;EACzC,CAAA;EAED;CACR,CAAA;CAEH,AAAI,OAAO,KAAU,YAAY,OAAO,SAAS,CAAK,MACpD,IAAY;CAEd,IAAM,IAAS;EACb,MAAM;EACN,UAAU;EACV,OAAO,EAAE,SAAM;CACjB,GAEM,IAA2B,OAC/B,MACkB;EAElB,IAAM,IAAO,GAAwB,MADZ,EAAe,eAAe,CAAM,GACb,QAAQ,EAAE,SAAM,CAAC,GAE7D,IAAS;EAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,KAAK;GACX,UAAU,EAAK;GACf;GACA,MAAM;EACR,CAAC;CACH;CAkCA,OACE,kBAAC,GAAD;EACU;EACR,WAAW;EACX,OAAO;EACP,WAAW;EACX,UAtCiB,MAAyC;GAC5D,IACE,KAAgB,QAChB,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,UAEN;GAGF,EAAM,eAAe;GACrB,IAAM,EAAE,eAAY;GACpB,EAAyB,CAAO,EAAE,YAAY;IAC5C,IAAM,IAAO,EAAsB;KACjC;KACA,UAAU;KACV;KACA;IACF,CAAC,GACK,IAAc,IAAI,IAAI,EAAK,MAAM,OAAO,SAAS,MAAM;IAC7D,EAAQ,KAAK;KACX,UAAU,EAAY;KACtB,QAAQ,EAAY;KACpB,MAAM,EAAY;IACpB,CAAC;GACH,CAAC;EACH;EASI,cACE,kBAAC,QAAD;GAAM,WAAW;GAAa,eAAY;aAAO;EAE3C,CAAA;YAGR,kBAAC,QAAD;GAAM,WAAW;aAAe;EAAgB,CAAA;CAC5B,CAAA;AAE1B"}
1
+ {"version":3,"file":"BackofficeRelatedCountLink.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeRelatedCountLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport { resolveBackofficeLink } from '../links/resolveBackofficeLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport { BackofficeLazyEntityCount } from './BackofficeLazyEntityCount.js';\n\nimport * as styles from './backofficeRelatedCountLink.css.js';\n\nexport type BackofficeRelatedCountLinkProps<\n Where extends Record<string, unknown> = Record<string, unknown>,\n> = {\n count?: number | null | undefined;\n entity: string;\n where: Where;\n};\n\nexport const BackofficeRelatedCountLink = <\n Where extends Record<string, unknown> = Record<string, unknown>,\n>({\n count,\n entity,\n where,\n}: BackofficeRelatedCountLinkProps<Where>): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityManifest, entityRegistry, sidebar } =\n useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const targetManifest = entities[entity];\n if (targetManifest == null) {\n return <span>{count ?? 0}</span>;\n }\n const entityLabel = targetManifest.label(tApp);\n const actionLabel = t('relations.openFilteredList', {\n label: entityLabel,\n });\n const loadingLabel = t('common.loading');\n const loadedEntity = entityRegistry.getLoadedListEntity(entity);\n let countNode: ReactNode = (\n <BackofficeLazyEntityCount\n entity={entity}\n loadingFallback={\n <span className={styles.countLoading}>\n <Spinner ariaLabel={loadingLabel} size={12} />\n </span>\n }\n where={where}\n />\n );\n if (typeof count === 'number' && Number.isFinite(count)) {\n countNode = count;\n }\n const target = {\n kind: 'entity-list',\n entityId: entity,\n state: { where },\n } as BackofficeLinkTarget;\n\n const navigateWithLoadedEntity = async (\n history: NonNullable<typeof routing>['history'],\n ): Promise<void> => {\n const listEntity = await entityRegistry.loadListEntity(entity);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n };\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (\n loadedEntity != null ||\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n const { history } = routing;\n navigateWithLoadedEntity(history).catch(() => {\n const link = resolveBackofficeLink({\n target,\n manifest: entityManifest,\n sidebar,\n tApp,\n });\n const fallbackUrl = new URL(link.href, window.location.origin);\n history.push({\n pathname: fallbackUrl.pathname,\n search: fallbackUrl.search,\n hash: fallbackUrl.hash,\n });\n });\n };\n\n return (\n <BackofficeInlineLink\n target={target}\n className={styles.link}\n title={actionLabel}\n ariaLabel={actionLabel}\n onClick={handleClick}\n endAdornment={\n <span className={styles.icon} aria-hidden=\"true\">\n ›\n </span>\n }\n >\n <span className={styles.count}>{countNode}</span>\n </BackofficeInlineLink>\n );\n};\n\nexport default BackofficeRelatedCountLink;\n"],"mappings":";;;;;;;;;;;;;AAuBA,IAAa,KAEX,EACA,OAAA,GACA,WACA,eACyD;CACzD,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,aAAU,mBAAgB,mBAAgB,eAChD,EAAoB,GAChB,IAAU,EAAW,CAAc,GACnC,IAAiB,EAAS;CAChC,IAAI,KAAkB,MACpB,OAAO,kBAAC,QAAD,EAAA,UAAO,KAAS,EAAQ,CAAA;CAGjC,IAAM,IAAc,EAAE,8BAA8B,EAClD,OAFkB,EAAe,MAAM,CAEhC,EACT,CAAC,GACK,IAAe,EAAE,gBAAgB,GACjC,IAAe,EAAe,oBAAoB,CAAM,GAC1D,IACF,kBAAC,GAAD;EACU;EACR,iBACE,kBAAC,QAAD;GAAM,WAAW;aACf,kBAAC,GAAD;IAAS,WAAW;IAAc,MAAM;GAAK,CAAA;EACzC,CAAA;EAED;CACR,CAAA;CAEH,AAAI,OAAO,KAAU,YAAY,OAAO,SAAS,CAAK,MACpD,IAAY;CAEd,IAAM,IAAS;EACb,MAAM;EACN,UAAU;EACV,OAAO,EAAE,SAAM;CACjB,GAEM,IAA2B,OAC/B,MACkB;EAElB,IAAM,IAAO,GAAwB,MADZ,EAAe,eAAe,CAAM,EAAA,CACb,QAAQ,EAAE,SAAM,CAAC,GAE7D,IAAS;EAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,KAAK;GACX,UAAU,EAAK;GACf;GACA,MAAM;EACR,CAAC;CACH;CAkCA,OACE,kBAAC,GAAD;EACU;EACR,WAAW;EACX,OAAO;EACP,WAAW;EACX,UAtCiB,MAAyC;GAC5D,IACE,KAAgB,QAChB,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,UAEN;GAGF,EAAM,eAAe;GACrB,IAAM,EAAE,eAAY;GACpB,EAAyB,CAAO,CAAC,CAAC,YAAY;IAC5C,IAAM,IAAO,EAAsB;KACjC;KACA,UAAU;KACV;KACA;IACF,CAAC,GACK,IAAc,IAAI,IAAI,EAAK,MAAM,OAAO,SAAS,MAAM;IAC7D,EAAQ,KAAK;KACX,UAAU,EAAY;KACtB,QAAQ,EAAY;KACpB,MAAM,EAAY;IACpB,CAAC;GACH,CAAC;EACH;EASI,cACE,kBAAC,QAAD;GAAM,WAAW;GAAa,eAAY;aAAO;EAE3C,CAAA;YAGR,kBAAC,QAAD;GAAM,WAAW;aAAe;EAAgB,CAAA;CAC5B,CAAA;AAE1B"}
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/refs/backofficeEntityIdRef.css.ts
3
- var e = "qbwcuep qbwcuen txvbqbfqq txvbqbey txvbqbhd8 txvbqb1bg1 txvbqb3f txvbqb7h txvbqb75 txvbqb7t qbwcueo txvbqb1gct qbwcue0 txvbqb1ffs txvbqb1ga0";
3
+ var e = "qbwcuep qbwcuen txvbqbfqq txvbqbey txvbqbhd8 txvbqb1bgr txvbqb3f txvbqb7h txvbqb75 txvbqb7t qbwcueo txvbqb1gdj qbwcue0 txvbqb1fgi txvbqb1gaq";
4
4
  //#endregion
5
5
  export { e as link };
6
6