@plumile/backoffice-react 0.1.106 → 0.1.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/lib/esm/auth/TotpQrCode.js +1 -1
  2. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  3. package/lib/esm/auth/login/EmailCapturePanel.js +27 -23
  4. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  5. package/lib/esm/auth/login/MfaChallengeForm.js +38 -36
  6. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  7. package/lib/esm/auth/login/PasskeyLoginForm.js +40 -37
  8. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  9. package/lib/esm/auth/pages/AcceptInvitationScreen.js +63 -62
  10. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  11. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +56 -55
  12. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  13. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +45 -45
  14. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  15. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -0
  16. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  17. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +44 -39
  18. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  19. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +15 -0
  20. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -0
  21. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js +11 -0
  22. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js.map +1 -0
  23. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js +7 -0
  24. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js.map +1 -0
  25. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +15 -0
  26. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -0
  27. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +19 -0
  28. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -0
  29. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +47 -40
  30. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +83 -90
  32. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  33. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +8 -0
  34. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -0
  35. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js +7 -0
  36. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js.map +1 -0
  37. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +8 -0
  38. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -0
  39. package/lib/esm/components/backoffice/detail/BackofficeTechnicalFacts.js +2 -0
  40. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +53 -48
  41. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  42. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js +2 -2
  43. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
  44. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +15 -11
  45. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  46. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +50 -23
  47. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  48. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +69 -69
  49. package/lib/esm/components/backoffice/layout/sidebarUtils.js +16 -16
  50. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  51. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +29 -0
  52. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -0
  53. package/lib/esm/components/backoffice/links/BackofficeLink.js +21 -0
  54. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -0
  55. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +26 -0
  56. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -0
  57. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js +19 -0
  58. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -0
  59. package/lib/esm/components/backoffice/links/backofficeLink.css.js +7 -0
  60. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -0
  61. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js +81 -0
  62. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -0
  63. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js +50 -0
  64. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -0
  65. package/lib/esm/components/backoffice/links/types.js +0 -0
  66. package/lib/esm/components/backoffice/links/useBackofficeLink.js +21 -0
  67. package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -0
  68. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +1 -0
  69. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  70. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +27 -27
  71. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  72. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +24 -21
  73. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  74. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +45 -44
  75. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  76. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +269 -223
  77. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  78. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +25 -30
  79. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  80. package/lib/esm/i18n/locales/en/backofficeReact.js +8 -0
  81. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  82. package/lib/esm/i18n/locales/fr/backofficeReact.js +8 -0
  83. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  84. package/lib/esm/index.js +88 -73
  85. package/lib/esm/pages/BackofficeDashboardPage.js +1 -5
  86. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  87. package/lib/esm/pages/BackofficeEntityDetailPage.js +231 -222
  88. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  89. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +170 -54
  90. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  91. package/lib/esm/pages/BackofficeEntityListPage.js +196 -207
  92. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  93. package/lib/esm/pages/BackofficeHubPage.js +21 -21
  94. package/lib/esm/pages/BackofficeLayoutPage.js +7 -7
  95. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  96. package/lib/esm/router/createBackofficeRoutes.js +132 -126
  97. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  98. package/lib/esm/style.css +1 -1
  99. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  100. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  101. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  102. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  103. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  104. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  105. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  106. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +0 -1
  107. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  108. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +8 -0
  109. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -0
  110. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts +9 -0
  111. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts.map +1 -0
  112. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts +7 -0
  113. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts.map +1 -0
  114. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts +12 -0
  115. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts.map +1 -0
  116. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts +16 -0
  117. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts.map +1 -0
  118. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts +11 -0
  119. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts.map +1 -0
  120. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
  121. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  122. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +6 -0
  123. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -0
  124. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts +7 -0
  125. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts.map +1 -0
  126. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +8 -0
  127. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +1 -0
  128. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts +2 -0
  129. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts.map +1 -0
  130. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
  131. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +1 -0
  132. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
  133. package/lib/types/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.d.ts.map +1 -1
  134. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +10 -8
  135. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
  136. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts +10 -5
  137. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts.map +1 -1
  138. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +6 -2
  139. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  140. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +18 -0
  141. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -0
  142. package/lib/types/components/backoffice/links/BackofficeLink.d.ts +13 -0
  143. package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -0
  144. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts +10 -0
  145. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts.map +1 -0
  146. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts +12 -0
  147. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts.map +1 -0
  148. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts +4 -0
  149. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts.map +1 -0
  150. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts +15 -0
  151. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts.map +1 -0
  152. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts +8 -0
  153. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts.map +1 -0
  154. package/lib/types/components/backoffice/links/types.d.ts +45 -0
  155. package/lib/types/components/backoffice/links/types.d.ts.map +1 -0
  156. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts +7 -0
  157. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts.map +1 -0
  158. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  159. package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -1
  160. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  161. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  162. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +6 -3
  163. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
  164. package/lib/types/i18n/resources.d.ts +16 -0
  165. package/lib/types/i18n/resources.d.ts.map +1 -1
  166. package/lib/types/index.d.ts +24 -1
  167. package/lib/types/index.d.ts.map +1 -1
  168. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  169. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  170. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +49 -22
  171. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  172. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  173. package/lib/types/provider/types.d.ts +26 -22
  174. package/lib/types/provider/types.d.ts.map +1 -1
  175. package/lib/types/router/createBackofficeRoutes.d.ts +36 -1
  176. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  177. package/package.json +7 -7
package/lib/esm/index.js CHANGED
@@ -1,73 +1,88 @@
1
- import { AuthRefreshNotice as e, useAuthRefreshStateSnapshot as t } from "./auth/AuthRefreshNotice.js";
2
- import { TotpQrCode as n, buildTotpOtpAuthUri as r } from "./auth/TotpQrCode.js";
3
- import { LoginFlow as i } from "./auth/login/LoginFlow.js";
4
- import { synchronizeAuthStatusQuery as a } from "./auth/login/synchronizeAuthStatusQuery.js";
5
- import { AcceptInvitationScreen as o } from "./auth/pages/AcceptInvitationScreen.js";
6
- import { PasswordResetCompleteScreen as s } from "./auth/pages/PasswordResetCompleteScreen.js";
7
- import { PasswordResetRequestScreen as c } from "./auth/pages/PasswordResetRequestScreen.js";
8
- import { VerifyEmailScreen as l } from "./auth/pages/VerifyEmailScreen.js";
9
- import { requireField as u, requireLinkedRecordId as d, resolveAgentStartOutcome as f, resolveMutationOutcome as p } from "./relay/mutationResult.js";
10
- import { useBackofficeConfig as m } from "./provider/BackofficeConfigContext.js";
11
- import { EntityIdFilterField as h } from "./components/backoffice/filters/EntityIdFilterField.js";
12
- import { BackofficeErrorBoundary as g } from "./components/backoffice/errors/BackofficeErrorBoundary.js";
13
- import { EntityIdPickerDialog as _ } from "./components/backoffice/pickers/EntityIdPickerDialog.js";
14
- import { buildDataTableColumns as v } from "./components/backoffice/columns/buildDataTableColumns.js";
15
- import { BackofficeDetailField as y } from "./components/backoffice/detail/BackofficeDetailField.js";
16
- import { BackofficeDetailSection as b } from "./components/backoffice/detail/BackofficeDetailSection.js";
17
- import { BackofficeReferenceValue as x } from "./components/backoffice/detail/BackofficeReferenceValue.js";
18
- import { BackofficeAuditMetadataPanel as S } from "./components/backoffice/detail/BackofficeAuditMetadataPanel.js";
19
- import { BackofficeDetailBadgeRow as C } from "./components/backoffice/detail/BackofficeDetailBadgeRow.js";
20
- import { formatJsonPayload as w, formatListAsMarkdown as T } from "./components/backoffice/detail/detailPayloadUtils.js";
21
- import { BackofficeDetailPayload as E } from "./components/backoffice/detail/BackofficeDetailPayload.js";
22
- import { EntityFilterValue as D, EntityFilterValueText as O } from "./components/backoffice/filters/EntityFilterValue.js";
23
- import { BackofficeListToolbar as k } from "./components/backoffice/lists/BackofficeListToolbar.js";
24
- import { BackofficeFilterAction as A } from "./components/backoffice/filters/BackofficeFilterAction.js";
25
- import { BackofficeFilterableCell as j } from "./components/backoffice/shared/BackofficeFilterableCell.js";
26
- import { BackofficeEntityLink as M } from "./components/backoffice/refs/BackofficeEntityLink.js";
27
- import { BackofficeEntityRefLink as N } from "./components/backoffice/detail/BackofficeEntityRefLink.js";
28
- import { BackofficeStatusMetaBadge as P } from "./components/backoffice/detail/BackofficeStatusMetaBadge.js";
29
- import { BackofficeEntitySummaryHeader as F } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
30
- import { BackofficeEnumLabel as I } from "./components/backoffice/detail/BackofficeEnumLabel.js";
31
- import { BackofficeKpiStrip as L } from "./components/backoffice/detail/BackofficeKpiStrip.js";
32
- import { BackofficeLifecycleTimelineSection as R } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
33
- import { BackofficePayloadInspectorSection as z } from "./components/backoffice/detail/BackofficePayloadInspectorSection.js";
34
- import { BackofficeRelationsSummaryGrid as B } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
35
- import { BackofficeScopeStack as V } from "./components/backoffice/detail/BackofficeScopeStack.js";
36
- import { BackofficeTokenUsageBreakdown as H } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
37
- import { BackofficeUsageCostBreakdown as U } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
38
- import { createBackofficeEntityLinkProps as W } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
39
- import { BackofficeHubTemplate as G } from "./components/backoffice/hub/BackofficeHubTemplate.js";
40
- import { BackofficeRightPageLayout as K } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
41
- import { BackofficeOverviewLayout as q } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
42
- import { BackofficeRelatedCountLink as J } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
43
- import { BackofficeTabbedDetailShell as Y } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
44
- import { BackofficeFormattedCurrency as X } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
45
- import { BackofficeFormattedNumber as Z } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
46
- import { BackofficeInlineFilterRow as Q } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
47
- import { BackofficeToolsDocPanel as $ } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
48
- import { BackofficeToolsErrorFallback as ee } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
49
- import { BackofficeToolsJsonForm as te } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
50
- import { BackofficeToolsQueryBoundary as ne } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
51
- import { parseToolJson as re } from "./components/backoffice/tools/parseToolJson.js";
52
- import { configureRelayEnvironment as ie, getEnvironment as ae, getNetwork as oe, getRelayTransportSnapshot as se, reconnectRelayWebSocket as ce, resetRelayStore as le, subscribeRelayTransport as ue } from "./relay/environment.js";
53
- import { base64UrlToBuffer as de, bufferToBase64Url as fe, mapWebAuthnRegistrationError as pe, parseSignCount as me } from "./modules/webauthn.js";
54
- import { createUseAuth as he } from "./hooks/useAuth.js";
55
- import { useBackofficeListUrlState as ge } from "./hooks/useBackofficeListUrlState.js";
56
- import { useConditionalSubscription as _e } from "./hooks/useConditionalSubscription.js";
57
- import ve from "./hooks/useCopyToClipboard.js";
58
- import ye from "./hooks/useInfiniteConnection.js";
59
- import { useRefetchNeededReload as be } from "./hooks/useRefetchNeededReload.js";
60
- import { createI18nInstance as xe } from "./i18n/createI18nInstance.js";
61
- import { backofficeReactI18nResources as Se, withBackofficeReactI18nResources as Ce } from "./i18n/resources.js";
62
- import { useReviewStatusLabel as we } from "./i18n/useReviewStatusLabel.js";
63
- import { RelayProvider as Te } from "./relay/RelayProvider.js";
64
- import { BackofficeProvider as Ee } from "./provider/BackofficeProvider.js";
65
- import { createBackofficeLazyValue as De } from "./provider/lazyValue.js";
66
- import { decodeBase64ToUtf8 as Oe, encodeUtf8ToBase64 as ke } from "./modules/base64.js";
67
- import { formatFileSize as Ae } from "./modules/formatFileSize.js";
68
- import { resolveVisibleDetailPages as je } from "./pages/detail/pageResolution.js";
69
- import { createInlineDataReader as Me } from "./relay/createInlineReader.js";
70
- import { appendNodeToConnections as Ne } from "./relay/connectionUtils.js";
71
- import { identityView as Pe } from "./relay/identityView.js";
72
- import { useCursorResumableSubscription as Fe } from "./subscriptions/useCursorResumableSubscription.js";
73
- export { o as AcceptInvitationScreen, e as AuthRefreshNotice, S as BackofficeAuditMetadataPanel, C as BackofficeDetailBadgeRow, y as BackofficeDetailField, E as BackofficeDetailPayload, b as BackofficeDetailSection, M as BackofficeEntityLink, N as BackofficeEntityRefLink, F as BackofficeEntitySummaryHeader, I as BackofficeEnumLabel, g as BackofficeErrorBoundary, A as BackofficeFilterAction, j as BackofficeFilterableCell, X as BackofficeFormattedCurrency, Z as BackofficeFormattedNumber, G as BackofficeHubTemplate, Q as BackofficeInlineFilterRow, L as BackofficeKpiStrip, R as BackofficeLifecycleTimelineSection, k as BackofficeListToolbar, q as BackofficeOverviewLayout, z as BackofficePayloadInspectorSection, Ee as BackofficeProvider, x as BackofficeReferenceValue, J as BackofficeRelatedCountLink, B as BackofficeRelationsSummaryGrid, K as BackofficeRightPageLayout, V as BackofficeScopeStack, P as BackofficeStatusMetaBadge, Y as BackofficeTabbedDetailShell, H as BackofficeTokenUsageBreakdown, $ as BackofficeToolsDocPanel, ee as BackofficeToolsErrorFallback, te as BackofficeToolsJsonForm, ne as BackofficeToolsQueryBoundary, U as BackofficeUsageCostBreakdown, D as EntityFilterValue, O as EntityFilterValueText, h as EntityIdFilterField, _ as EntityIdPickerDialog, i as LoginFlow, s as PasswordResetCompleteScreen, c as PasswordResetRequestScreen, Te as RelayProvider, n as TotpQrCode, l as VerifyEmailScreen, Ne as appendNodeToConnections, Se as backofficeReactI18nResources, de as base64UrlToBuffer, fe as bufferToBase64Url, v as buildDataTableColumns, r as buildTotpOtpAuthUri, ie as configureRelayEnvironment, W as createBackofficeEntityLinkProps, De as createBackofficeLazyValue, xe as createI18nInstance, Me as createInlineDataReader, he as createUseAuth, Oe as decodeBase64ToUtf8, ke as encodeUtf8ToBase64, Ae as formatFileSize, w as formatJsonPayload, T as formatListAsMarkdown, ae as getEnvironment, oe as getNetwork, se as getRelayTransportSnapshot, Pe as identityView, pe as mapWebAuthnRegistrationError, me as parseSignCount, re as parseToolJson, ce as reconnectRelayWebSocket, u as requireField, d as requireLinkedRecordId, le as resetRelayStore, f as resolveAgentStartOutcome, p as resolveMutationOutcome, je as resolveVisibleDetailPages, ue as subscribeRelayTransport, a as synchronizeAuthStatusQuery, t as useAuthRefreshStateSnapshot, m as useBackofficeConfig, ge as useBackofficeListUrlState, _e as useConditionalSubscription, ve as useCopyToClipboard, Fe as useCursorResumableSubscription, ye as useInfiniteConnection, be as useRefetchNeededReload, we as useReviewStatusLabel, Ce as withBackofficeReactI18nResources };
1
+ import { AuthRefreshNotice as ee, useAuthRefreshStateSnapshot as te } from "./auth/AuthRefreshNotice.js";
2
+ import { TotpQrCode as e, buildTotpOtpAuthUri as t } from "./auth/TotpQrCode.js";
3
+ import { LoginFlow as n } from "./auth/login/LoginFlow.js";
4
+ import { synchronizeAuthStatusQuery as r } from "./auth/login/synchronizeAuthStatusQuery.js";
5
+ import { AcceptInvitationScreen as i } from "./auth/pages/AcceptInvitationScreen.js";
6
+ import { PasswordResetCompleteScreen as a } from "./auth/pages/PasswordResetCompleteScreen.js";
7
+ import { PasswordResetRequestScreen as o } from "./auth/pages/PasswordResetRequestScreen.js";
8
+ import { VerifyEmailScreen as s } from "./auth/pages/VerifyEmailScreen.js";
9
+ import { requireField as c, requireLinkedRecordId as l, resolveAgentStartOutcome as u, resolveMutationOutcome as d } from "./relay/mutationResult.js";
10
+ import { useBackofficeConfig as f } from "./provider/BackofficeConfigContext.js";
11
+ import { EntityIdFilterField as p } from "./components/backoffice/filters/EntityIdFilterField.js";
12
+ import { BackofficeErrorBoundary as m } from "./components/backoffice/errors/BackofficeErrorBoundary.js";
13
+ import { EntityIdPickerDialog as h } from "./components/backoffice/pickers/EntityIdPickerDialog.js";
14
+ import { resolveBackofficeTargetIcon as g } from "./components/backoffice/links/resolveBackofficeTargetIcon.js";
15
+ import { resolveBackofficeLink as _ } from "./components/backoffice/links/resolveBackofficeLink.js";
16
+ import { useBackofficeLink as v } from "./components/backoffice/links/useBackofficeLink.js";
17
+ import { BackofficeInlineLink as y } from "./components/backoffice/links/BackofficeInlineLink.js";
18
+ import { buildDataTableColumns as b } from "./components/backoffice/columns/buildDataTableColumns.js";
19
+ import { BackofficeDetailField as x } from "./components/backoffice/detail/BackofficeDetailField.js";
20
+ import { BackofficeDetailSection as S } from "./components/backoffice/detail/BackofficeDetailSection.js";
21
+ import { BackofficeReferenceValue as C } from "./components/backoffice/detail/BackofficeReferenceValue.js";
22
+ import { BackofficeAuditMetadataPanel as w } from "./components/backoffice/detail/BackofficeAuditMetadataPanel.js";
23
+ import { BackofficeCopyButton as T } from "./components/backoffice/detail/BackofficeCopyButton.js";
24
+ import { BackofficeDetailActionBar as E } from "./components/backoffice/detail/BackofficeDetailActionBar.js";
25
+ import { BackofficeDetailBadgeRow as D } from "./components/backoffice/detail/BackofficeDetailBadgeRow.js";
26
+ import { BackofficeDetailBlock as O } from "./components/backoffice/detail/BackofficeDetailBlock.js";
27
+ import { formatJsonPayload as k, formatListAsMarkdown as A } from "./components/backoffice/detail/detailPayloadUtils.js";
28
+ import { BackofficeDetailHeader as j } from "./components/backoffice/detail/BackofficeDetailHeader.js";
29
+ import { BackofficeDetailPage as M } from "./components/backoffice/detail/BackofficeDetailPage.js";
30
+ import { BackofficeDetailPayload as N } from "./components/backoffice/detail/BackofficeDetailPayload.js";
31
+ import { EntityFilterValue as P, EntityFilterValueText as F } from "./components/backoffice/filters/EntityFilterValue.js";
32
+ import { BackofficeListToolbar as I } from "./components/backoffice/lists/BackofficeListToolbar.js";
33
+ import { BackofficeDetailTable as L } from "./components/backoffice/detail/BackofficeDetailTable.js";
34
+ import { BackofficeEmptyValue as R } from "./components/backoffice/detail/BackofficeEmptyValue.js";
35
+ import { BackofficeFilterAction as z } from "./components/backoffice/filters/BackofficeFilterAction.js";
36
+ import { BackofficeFilterableCell as B } from "./components/backoffice/shared/BackofficeFilterableCell.js";
37
+ import { BackofficeEntityLink as V } from "./components/backoffice/refs/BackofficeEntityLink.js";
38
+ import { BackofficeEntityRefLink as H } from "./components/backoffice/detail/BackofficeEntityRefLink.js";
39
+ import { BackofficeStatusMetaBadge as U } from "./components/backoffice/detail/BackofficeStatusMetaBadge.js";
40
+ import { BackofficeEntitySummaryHeader as W } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
41
+ import { BackofficeEnumLabel as G } from "./components/backoffice/detail/BackofficeEnumLabel.js";
42
+ import { BackofficeKpiStrip as K } from "./components/backoffice/detail/BackofficeKpiStrip.js";
43
+ import { BackofficeLifecycleTimelineSection as q } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
44
+ import { BackofficePayloadInspectorSection as J } from "./components/backoffice/detail/BackofficePayloadInspectorSection.js";
45
+ import { BackofficeRelationsSummaryGrid as Y } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
46
+ import { BackofficeScopeStack as X } from "./components/backoffice/detail/BackofficeScopeStack.js";
47
+ import { BackofficeStatusGroup as Z } from "./components/backoffice/detail/BackofficeStatusGroup.js";
48
+ import "./components/backoffice/detail/BackofficeTechnicalFacts.js";
49
+ import { BackofficeTokenUsageBreakdown as Q } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
50
+ import { BackofficeUsageCostBreakdown as ne } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
51
+ import { createBackofficeEntityLinkProps as re } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
52
+ import { BackofficeHubTemplate as ie } from "./components/backoffice/hub/BackofficeHubTemplate.js";
53
+ import { BackofficeLink as ae } from "./components/backoffice/links/BackofficeLink.js";
54
+ import { BackofficeLinkLabel as $ } from "./components/backoffice/links/BackofficeLinkLabel.js";
55
+ import { BackofficeRightPageLayout as oe } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
56
+ import { BackofficeOverviewLayout as se } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
57
+ import { BackofficeRelatedCountLink as ce } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
58
+ import { BackofficeTabbedDetailShell as le } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
59
+ import { BackofficeFormattedCurrency as ue } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
60
+ import { BackofficeFormattedNumber as de } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
61
+ import { BackofficeInlineFilterRow as fe } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
62
+ import { BackofficeToolsDocPanel as pe } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
63
+ import { BackofficeToolsErrorFallback as me } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
64
+ import { BackofficeToolsJsonForm as he } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
65
+ import { BackofficeToolsQueryBoundary as ge } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
66
+ import { parseToolJson as _e } from "./components/backoffice/tools/parseToolJson.js";
67
+ import { configureRelayEnvironment as ve, getEnvironment as ye, getNetwork as be, getRelayTransportSnapshot as xe, reconnectRelayWebSocket as Se, resetRelayStore as Ce, subscribeRelayTransport as we } from "./relay/environment.js";
68
+ import { base64UrlToBuffer as Te, bufferToBase64Url as Ee, mapWebAuthnRegistrationError as De, parseSignCount as Oe } from "./modules/webauthn.js";
69
+ import { createUseAuth as ke } from "./hooks/useAuth.js";
70
+ import { useBackofficeListUrlState as Ae } from "./hooks/useBackofficeListUrlState.js";
71
+ import { useConditionalSubscription as je } from "./hooks/useConditionalSubscription.js";
72
+ import Me from "./hooks/useCopyToClipboard.js";
73
+ import Ne from "./hooks/useInfiniteConnection.js";
74
+ import { useRefetchNeededReload as Pe } from "./hooks/useRefetchNeededReload.js";
75
+ import { createI18nInstance as Fe } from "./i18n/createI18nInstance.js";
76
+ import { backofficeReactI18nResources as Ie, withBackofficeReactI18nResources as Le } from "./i18n/resources.js";
77
+ import { useReviewStatusLabel as Re } from "./i18n/useReviewStatusLabel.js";
78
+ import { RelayProvider as ze } from "./relay/RelayProvider.js";
79
+ import { BackofficeProvider as Be } from "./provider/BackofficeProvider.js";
80
+ import { createBackofficeLazyValue as Ve } from "./provider/lazyValue.js";
81
+ import { decodeBase64ToUtf8 as He, encodeUtf8ToBase64 as Ue } from "./modules/base64.js";
82
+ import { formatFileSize as We } from "./modules/formatFileSize.js";
83
+ import { resolveVisibleDetailPages as Ge } from "./pages/detail/pageResolution.js";
84
+ import { createInlineDataReader as Ke } from "./relay/createInlineReader.js";
85
+ import { appendNodeToConnections as qe } from "./relay/connectionUtils.js";
86
+ import { identityView as Je } from "./relay/identityView.js";
87
+ import { useCursorResumableSubscription as Ye } from "./subscriptions/useCursorResumableSubscription.js";
88
+ export { i as AcceptInvitationScreen, ee as AuthRefreshNotice, w as BackofficeAuditMetadataPanel, w as BackofficeAuditTrail, X as BackofficeContextPanel, T as BackofficeCopyButton, E as BackofficeDetailActionBar, D as BackofficeDetailBadgeRow, O as BackofficeDetailBlock, x as BackofficeDetailField, j as BackofficeDetailHeader, M as BackofficeDetailPage, N as BackofficeDetailPayload, S as BackofficeDetailSection, L as BackofficeDetailTable, R as BackofficeEmptyValue, V as BackofficeEntityLink, H as BackofficeEntityRefLink, W as BackofficeEntitySummaryHeader, G as BackofficeEnumLabel, m as BackofficeErrorBoundary, S as BackofficeFieldSet, z as BackofficeFilterAction, B as BackofficeFilterableCell, ue as BackofficeFormattedCurrency, de as BackofficeFormattedNumber, ie as BackofficeHubTemplate, fe as BackofficeInlineFilterRow, y as BackofficeInlineLink, K as BackofficeKpiStrip, q as BackofficeLifecycleTimelineSection, ae as BackofficeLink, $ as BackofficeLinkLabel, I as BackofficeListToolbar, K as BackofficeMetricGrid, se as BackofficeOverviewLayout, J as BackofficePayloadInspectorSection, N as BackofficePayloadViewer, Be as BackofficeProvider, C as BackofficeReferenceValue, ce as BackofficeRelatedCountLink, Y as BackofficeRelationGrid, Y as BackofficeRelationsSummaryGrid, oe as BackofficeRightPageLayout, X as BackofficeScopeStack, Z as BackofficeStatusGroup, U as BackofficeStatusMetaBadge, le as BackofficeTabbedDetailShell, S as BackofficeTechnicalFacts, q as BackofficeTimeline, Q as BackofficeTokenUsageBreakdown, pe as BackofficeToolsDocPanel, me as BackofficeToolsErrorFallback, he as BackofficeToolsJsonForm, ge as BackofficeToolsQueryBoundary, ne as BackofficeUsageCostBreakdown, P as EntityFilterValue, F as EntityFilterValueText, p as EntityIdFilterField, h as EntityIdPickerDialog, n as LoginFlow, a as PasswordResetCompleteScreen, o as PasswordResetRequestScreen, ze as RelayProvider, e as TotpQrCode, s as VerifyEmailScreen, qe as appendNodeToConnections, Ie as backofficeReactI18nResources, Te as base64UrlToBuffer, Ee as bufferToBase64Url, b as buildDataTableColumns, t as buildTotpOtpAuthUri, ve as configureRelayEnvironment, re as createBackofficeEntityLinkProps, Ve as createBackofficeLazyValue, Fe as createI18nInstance, Ke as createInlineDataReader, ke as createUseAuth, He as decodeBase64ToUtf8, Ue as encodeUtf8ToBase64, We as formatFileSize, k as formatJsonPayload, A as formatListAsMarkdown, ye as getEnvironment, be as getNetwork, xe as getRelayTransportSnapshot, Je as identityView, De as mapWebAuthnRegistrationError, Oe as parseSignCount, _e as parseToolJson, Se as reconnectRelayWebSocket, c as requireField, l as requireLinkedRecordId, Ce as resetRelayStore, u as resolveAgentStartOutcome, _ as resolveBackofficeLink, g as resolveBackofficeTargetIcon, d as resolveMutationOutcome, Ge as resolveVisibleDetailPages, we as subscribeRelayTransport, r as synchronizeAuthStatusQuery, te as useAuthRefreshStateSnapshot, f as useBackofficeConfig, v as useBackofficeLink, Ae as useBackofficeListUrlState, je as useConditionalSubscription, Me as useCopyToClipboard, Ye as useCursorResumableSubscription, Ne as useInfiniteConnection, Pe as useRefetchNeededReload, Re as useReviewStatusLabel, Le as withBackofficeReactI18nResources };
@@ -73,11 +73,7 @@ var { useLazyLoadQuery: O } = D, k = () => {
73
73
  });
74
74
  let t = r(e.columns, {
75
75
  tApp: a,
76
- t: o,
77
- resolveEntityHref: (e, t) => {
78
- let n = s[e];
79
- return n == null ? null : n.routes.detail(t);
80
- }
76
+ t: o
81
77
  });
82
78
  return /* @__PURE__ */ w(d, {
83
79
  title: l(n.title, a),
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n BackofficeEmptyState,\n DataTable,\n DashboardGrid,\n DashboardGridItem,\n DetailPageTemplate,\n Spinner,\n} from '@plumile/ui';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n hasWidgetQuery,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\nimport { DashboardMetricGroup } from './dashboard/DashboardMetricGroup.js';\nimport { DashboardPanel } from './dashboard/DashboardPanel.js';\nimport { DashboardQuickActions } from './dashboard/DashboardQuickActions.js';\nimport { DashboardStatusList } from './dashboard/DashboardStatusList.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n },\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={resolved.map((metric) => {\n return {\n id: metric.id,\n href: metric.href,\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n emptyState={<DashboardUnavailableState />}\n actions={widget.actions.map((action) => {\n return {\n id: action.id,\n href: action.href,\n label: resolveLabel(action.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={resolved.map((item) => {\n return {\n id: item.id,\n href: item.href,\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActions\n emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entityManifest.id,\n href: entityManifest.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport const BackofficeDashboardPage = (): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const dashboard = useBackofficeDashboardConfig();\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n BackofficeEmptyState,\n DataTable,\n DashboardGrid,\n DashboardGridItem,\n DetailPageTemplate,\n Spinner,\n} from '@plumile/ui';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n hasWidgetQuery,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\nimport { DashboardMetricGroup } from './dashboard/DashboardMetricGroup.js';\nimport { DashboardPanel } from './dashboard/DashboardPanel.js';\nimport { DashboardQuickActions } from './dashboard/DashboardQuickActions.js';\nimport { DashboardStatusList } from './dashboard/DashboardStatusList.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={resolved.map((metric) => {\n return {\n id: metric.id,\n href: metric.href,\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n emptyState={<DashboardUnavailableState />}\n actions={widget.actions.map((action) => {\n return {\n id: action.id,\n href: action.href,\n label: resolveLabel(action.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={resolved.map((item) => {\n return {\n id: item.id,\n href: item.href,\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActions\n emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entityManifest.id,\n href: entityManifest.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport const BackofficeDashboardPage = (): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const dashboard = useBackofficeDashboardConfig();\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}