@plumile/backoffice-react 0.2.3 → 0.2.6
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.
- package/README.md +14 -3
- package/lib/esm/auth/AuthRefreshNotice.js +21 -18
- package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
- package/lib/esm/auth/TotpQrCode.js +20 -12
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/authRefreshNotice.css.js +2 -1
- package/lib/esm/auth/authRefreshNotice.css.js.map +1 -1
- package/lib/esm/auth/login/AuthPanel.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js +26 -28
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/LoginFlow.js +11 -11
- package/lib/esm/auth/login/LoginFlow.js.map +1 -1
- package/lib/esm/auth/login/MethodChooser.js +18 -16
- package/lib/esm/auth/login/MethodChooser.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js +47 -52
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/OidcButtons.js +3 -2
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js +13 -15
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/login/PasswordLoginPanel.js +8 -8
- package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
- package/lib/esm/auth/login/loginPage.css.js +1 -1
- package/lib/esm/auth/login/loginPage.css.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js +80 -75
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +31 -31
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js +33 -29
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/auth/pages/VerifyEmailScreen.js +42 -40
- package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +202 -210
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
- package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js.map +1 -1
- package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +36 -30
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
- package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
- package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +36 -33
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +24 -20
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js +7 -8
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +49 -45
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js.map +1 -1
- package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js +1 -1
- package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
- package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +15 -15
- package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +53 -65
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
- package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +2 -2
- package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +6 -6
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -1
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +3 -3
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js +152 -172
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
- package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js +2 -5
- package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
- package/lib/esm/components/backoffice/layout/sidebarUtils.js +1 -1
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
- package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.css.js.map +1 -1
- package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js +1 -1
- package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +93 -82
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
- package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
- package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
- package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentError.js +6 -3
- package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +7 -7
- package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js.map +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentError.css.js.map +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +3 -2
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +314 -309
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +2 -2
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
- package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
- package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +12 -12
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +3 -2
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +15 -19
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +1 -1
- package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js +17 -9
- package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
- package/lib/esm/hooks/useCopyToClipboard.js +1 -1
- package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +21 -2
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +21 -2
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.js +42 -41
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js +291 -255
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +47 -49
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +111 -105
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +213 -213
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +101 -83
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js +10 -4
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +55 -54
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js +1 -1
- package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +64 -56
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
- package/lib/esm/pages/backofficeDashboardPage.css.js.map +1 -1
- package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -1
- package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js +11 -11
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
- package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +41 -39
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +23 -23
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/backofficeDashboardPageStory.css.js +6 -0
- package/lib/esm/storybook/backofficeDashboardPageStory.css.js.map +1 -0
- package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
- package/lib/esm/storybook/relay/RelayStory.css.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/AuthRefreshNotice.d.ts +5 -1
- package/lib/types/auth/AuthRefreshNotice.d.ts.map +1 -1
- package/lib/types/auth/TotpQrCode.d.ts +2 -1
- package/lib/types/auth/TotpQrCode.d.ts.map +1 -1
- package/lib/types/auth/authRefreshNotice.css.d.ts.map +1 -1
- package/lib/types/auth/login/AuthPanel.d.ts.map +1 -1
- package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
- package/lib/types/auth/login/LoginFlow.d.ts.map +1 -1
- package/lib/types/auth/login/MethodChooser.d.ts.map +1 -1
- package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
- package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
- package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
- package/lib/types/auth/login/PasswordLoginPanel.d.ts +1 -1
- package/lib/types/auth/login/PasswordLoginPanel.d.ts.map +1 -1
- package/lib/types/auth/login/loginPage.css.d.ts.map +1 -1
- package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/VerifyEmailScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts +3 -3
- package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/toastViewAction.d.ts +1 -1
- package/lib/types/components/backoffice/actions/toastViewAction.d.ts.map +1 -1
- package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts +2 -1
- package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts.map +1 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +2 -2
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailBadgeRow.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +1 -1
- package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeTokenUsageBreakdown.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +1 -1
- package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -1
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts +1 -1
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/backofficeFilterAction.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +0 -1
- package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/backofficeSidebarActions.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -2
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
- package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
- package/lib/types/components/backoffice/list/RowFlagsCell.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +3 -3
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +2 -2
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
- package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts +1 -2
- package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +44 -2
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardWidgetContent.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +9 -9
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +2 -2
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
- package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/backofficeEntityListPage.css.d.ts.map +1 -1
- package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts +1 -1
- package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts.map +1 -1
- package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
- package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +2 -0
- package/lib/types/provider/types.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts +0 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts +2 -0
- package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts.map +1 -0
- package/package.json +17 -17
- package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js +0 -2
- package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts +0 -2
- package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DashboardMetricGroup } from '@plumile/ui/components/dashboard/dashboard_metric_group/DashboardMetricGroup.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport { DashboardStatusList } from '@plumile/ui/components/dashboard/dashboard_status_list/DashboardStatusList.js';\nimport { DashboardBreakdownList } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardBreakdownList.js';\nimport { DashboardEntitySpotlight } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardEntitySpotlight.js';\nimport { DashboardHealthMatrix } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardHealthMatrix.js';\nimport { DashboardRiskQueue } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardRiskQueue.js';\nimport { DashboardSlaGauge } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardSlaGauge.js';\nimport { DashboardTimelineChart } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTimelineChart.js';\nimport { DashboardTrendMetric } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTrendMetric.js';\nimport { DashboardWindowControl } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardWindowControl.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport type { RouterDestination } from '@plumile/router/types.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\nimport { resolveDashboardTargetDestination } from './resolveDashboardTargetDestination.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst useDashboardTargetDestinationResolver = (): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => RouterDestination | undefined) => {\n const { entities } = useBackofficeConfig();\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): RouterDestination | undefined => {\n return resolveDashboardTargetDestination(target, entities, fallbackHref);\n };\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n destination: resolveDestination(metric.target, 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\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n destination: resolveDestination(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={actions.map((action) => {\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return {\n id: action.id,\n destination: resolveDestination(action.target, action.href) ?? {\n pathname: '#',\n },\n label,\n };\n })}\n />\n );\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n destination={resolveDestination(metric.target, metric.href)}\n tone={metric.tone}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n sparkline={metric.sparkline}\n sparklineLabel={resolveLabel(metric.label, tApp)}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n max={gauge.max}\n threshold={gauge.threshold}\n unit={gauge.unit}\n tone={gauge.tone}\n destination={resolveDestination(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n destination: resolveDestination(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n tone: item.tone,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null ? resolveLabel(result.emptyLabel, tApp) : ''\n }\n series={result.series.map((serie) => {\n return {\n ...serie,\n label: resolveLabel(serie.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n destination: resolveDestination(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n destination={resolveDestination(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n tone={item.tone}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n destination: resolveDestination(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n tone: cell.tone,\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): 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 = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\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 destination: { pathname: 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 destination: { pathname: 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() as {\n columns: readonly BackofficeColumnSpec[];\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, {\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() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\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 <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | 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 <DashboardStatusSummaryContent items={resolved} />\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() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | 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 <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardMetricTone,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardSparklinePoint,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendDirection,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport {\n DashboardMetricGroup,\n DashboardPanel,\n DashboardQuickActions,\n DashboardStatusList,\n DashboardBreakdownList,\n DashboardEntitySpotlight,\n DashboardHealthMatrix,\n DashboardRiskQueue,\n DashboardSlaGauge,\n DashboardTimelineChart,\n DashboardTrendMetric,\n DashboardWindowControl,\n DataTable,\n type DashboardStatusItem,\n} from '@plumile/ui';\nimport type { RouterDestination } from '@plumile/router/types.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\nimport { resolveDashboardTargetDestination } from './resolveDashboardTargetDestination.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype BackofficeTranslation = ReturnType<\n typeof useBackofficeReactTranslation\n>['t'];\n\nconst resolveDashboardToneLabel = (\n tone: BackofficeDashboardMetricTone,\n t: BackofficeTranslation,\n): string => {\n switch (tone) {\n case 'neutral':\n return t('dashboard.tones.neutral');\n case 'info':\n return t('dashboard.tones.info');\n case 'success':\n return t('dashboard.tones.success');\n case 'warning':\n return t('dashboard.tones.warning');\n case 'danger':\n return t('dashboard.tones.danger');\n default: {\n const exhaustiveTone: never = tone;\n return exhaustiveTone;\n }\n }\n};\n\ntype DashboardToneProps =\n | { tone: BackofficeDashboardMetricTone; toneLabel: string }\n | { tone?: never; toneLabel?: never };\n\nconst resolveDashboardToneProps = (\n tone: BackofficeDashboardMetricTone | undefined,\n t: BackofficeTranslation,\n): DashboardToneProps => {\n if (tone == null) return {};\n return { tone, toneLabel: resolveDashboardToneLabel(tone, t) };\n};\n\ntype DashboardThresholdProps =\n | { threshold: number; thresholdLabel: string }\n | { threshold?: never; thresholdLabel?: never };\n\nconst resolveDashboardThresholdProps = (\n threshold: number | undefined,\n t: BackofficeTranslation,\n): DashboardThresholdProps => {\n if (threshold == null) return {};\n return { threshold, thresholdLabel: t('dashboard.threshold') };\n};\n\ntype DashboardTrendSparklineProps =\n | {\n sparkline: readonly BackofficeDashboardSparklinePoint[];\n sparklineLabel: string;\n sparklineDescription: string;\n sparklineEmptyMessage: string;\n locale: string;\n }\n | {\n sparkline?: never;\n sparklineLabel?: never;\n sparklineDescription?: never;\n sparklineEmptyMessage?: never;\n locale?: never;\n };\n\nconst resolveDashboardTrendSparklineProps = (\n sparkline: readonly BackofficeDashboardSparklinePoint[] | undefined,\n label: string,\n locale: string,\n t: BackofficeTranslation,\n): DashboardTrendSparklineProps => {\n if (sparkline == null) return {};\n return {\n sparkline,\n sparklineLabel: label,\n sparklineDescription: t('dashboard.chart.description', { label }),\n sparklineEmptyMessage: t('dashboard.chart.empty'),\n locale,\n };\n};\n\nconst resolveDashboardTrendDirectionLabel = (\n direction: BackofficeDashboardTrendDirection,\n t: BackofficeTranslation,\n): string => {\n switch (direction) {\n case 'up':\n return t('dashboard.trendDirections.up');\n case 'down':\n return t('dashboard.trendDirections.down');\n case 'flat':\n return t('dashboard.trendDirections.flat');\n default: {\n const exhaustiveDirection: never = direction;\n return exhaustiveDirection;\n }\n }\n};\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst useDashboardTargetDestinationResolver = (): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => RouterDestination | undefined) => {\n const { entities } = useBackofficeConfig();\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): RouterDestination | undefined => {\n return resolveDashboardTargetDestination(target, entities, fallbackHref);\n };\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n destination: resolveDestination(metric.target, 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\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item): DashboardStatusItem => {\n const destination = resolveDestination(item.target, item.href);\n const baseItem = {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n if (destination == null) {\n return baseItem;\n }\n return { ...baseItem, destination };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n const resolvedActions = actions.flatMap((action) => {\n const destination = resolveDestination(action.target, action.href);\n if (destination == null) return [];\n\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return [{ id: action.id, destination, label }];\n });\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={resolvedActions}\n />\n );\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { i18n, t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n destination={resolveDestination(metric.target, metric.href)}\n {...resolveDashboardToneProps(metric.tone, t)}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n directionLabel: resolveDashboardTrendDirectionLabel(\n metric.delta.direction,\n t,\n ),\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n {...resolveDashboardTrendSparklineProps(\n metric.sparkline,\n resolveLabel(metric.label, tApp),\n i18n.language,\n t,\n )}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n valueText={`${gauge.value}${gauge.unit ?? ''}`}\n max={gauge.max}\n {...resolveDashboardThresholdProps(gauge.threshold, t)}\n unit={gauge.unit}\n tone={gauge.tone}\n destination={resolveDestination(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n destination: resolveDestination(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n ...resolveDashboardToneProps(item.tone, t),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { i18n, t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n ariaDescription={t('dashboard.chart.description', {\n label: resolveLabel(ariaLabel, tApp),\n })}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null\n ? resolveLabel(result.emptyLabel, tApp)\n : t('dashboard.chart.empty')\n }\n locale={i18n.language}\n series={result.series.map((seriesItem) => {\n return {\n ...seriesItem,\n label: resolveLabel(seriesItem.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n destination: resolveDestination(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n severityLabel: resolveDashboardToneLabel(item.severity, t),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n destination={resolveDestination(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n {...resolveDashboardToneProps(item.tone, t)}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveDestination = useDashboardTargetDestinationResolver();\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n destination: resolveDestination(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n ...resolveDashboardToneProps(cell.tone, t),\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): JSX.Element | null => {\n const { i18n, 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 = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\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 emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entity.id,\n destination: { pathname: 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 emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entity.id,\n destination: { pathname: 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() as {\n columns: readonly BackofficeColumnSpec[];\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, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n aria-label={title}\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() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n locale={i18n.language}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\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 <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n label={t('dashboard.windowLabel')}\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | 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 <DashboardStatusSummaryContent items={resolved} />\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() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | 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 <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":"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"}
|
|
@@ -14,46 +14,44 @@ import { BackofficeEntityDetailLayoutContextProvider as _ } from "./detail/Backo
|
|
|
14
14
|
import { buildTabsItems as v } from "./detail/buildTabsItems.js";
|
|
15
15
|
import { BackofficeRedirect as y } from "./BackofficeRedirect.js";
|
|
16
16
|
import { Suspense as b } from "react";
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import { BACKOFFICE_DATE_TIME_OPTIONS as
|
|
23
|
-
import
|
|
24
|
-
import { Tag as
|
|
25
|
-
import { setWhereValue as
|
|
26
|
-
import
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import { DetailPageTemplate as A } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
30
|
-
import { BackofficeKeyValueList as j } from "@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js";
|
|
17
|
+
import { FormattedDate as x, PageHeader as S, PropertyList as C } from "@plumile/ui";
|
|
18
|
+
import { jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
19
|
+
import { useTranslation as E } from "react-i18next";
|
|
20
|
+
import * as D from "react-relay";
|
|
21
|
+
import { Spinner as O } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
|
|
22
|
+
import { BACKOFFICE_DATE_TIME_OPTIONS as k } from "@plumile/backoffice-core/constants.js";
|
|
23
|
+
import ee from "@plumile/router/routing/Link.js";
|
|
24
|
+
import { Tag as te } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
|
|
25
|
+
import { setWhereValue as ne } from "@plumile/backoffice-core/filters/where.js";
|
|
26
|
+
import re from "@plumile/router/routing/useLocation.js";
|
|
27
|
+
import { NavigationTabs as A } from "@plumile/ui/tabs";
|
|
28
|
+
import { DetailPageTemplate as j } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
31
29
|
import { BackofficeRelationsMenu as M } from "@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js";
|
|
32
30
|
//#region src/pages/BackofficeEntityDetailLayoutPage.tsx
|
|
33
|
-
var { usePreloadedQuery: N } =
|
|
31
|
+
var { usePreloadedQuery: N } = D, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""), F = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", I = () => /* @__PURE__ */ w("span", {
|
|
34
32
|
className: p,
|
|
35
|
-
children: /* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ w(O, { size: 12 })
|
|
36
34
|
}), L = () => {
|
|
37
35
|
let { t } = e();
|
|
38
|
-
return /* @__PURE__ */
|
|
36
|
+
return /* @__PURE__ */ w("div", {
|
|
39
37
|
role: "status",
|
|
40
38
|
"aria-live": "polite",
|
|
41
39
|
"aria-busy": "true",
|
|
42
|
-
children: /* @__PURE__ */
|
|
40
|
+
children: /* @__PURE__ */ w(O, {
|
|
43
41
|
size: 20,
|
|
44
42
|
ariaLabel: t("common.loading")
|
|
45
43
|
})
|
|
46
44
|
});
|
|
47
|
-
}, R = ({ config: s, prepared: p, layoutNodeRef:
|
|
48
|
-
let { t: N } =
|
|
45
|
+
}, R = ({ config: s, prepared: p, layoutNodeRef: D, children: O }) => {
|
|
46
|
+
let { t: N } = E(), { t: R } = e(), { entities: z } = t(), { pathname: B } = re(), V = n(s.layoutPage.fragment, D), H = s.layoutPage.toView(V), U = F(B, p.id, s), W = c({
|
|
49
47
|
mainPage: s.pages.mainPage,
|
|
50
48
|
subPages: s.pages.subPages,
|
|
51
49
|
activePagePath: U,
|
|
52
50
|
node: H
|
|
53
51
|
});
|
|
54
|
-
if (!W.hasVisiblePages || W.activePage == null) return /* @__PURE__ */
|
|
52
|
+
if (!W.hasVisiblePages || W.activePage == null) return /* @__PURE__ */ w(y, { to: s.routes.list });
|
|
55
53
|
let { activePage: G } = W;
|
|
56
|
-
if (U !== "" && P(G.path) !== P(U)) return /* @__PURE__ */
|
|
54
|
+
if (U !== "" && P(G.path) !== P(U)) return /* @__PURE__ */ w(y, { to: s.routes.detailPage(p.id, G.id) });
|
|
57
55
|
let K = v({
|
|
58
56
|
pages: W.pages,
|
|
59
57
|
id: p.id,
|
|
@@ -66,35 +64,35 @@ var { usePreloadedQuery: N } = w, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
66
64
|
let n = z[e];
|
|
67
65
|
return n == null ? null : n.routes.detail(t);
|
|
68
66
|
},
|
|
69
|
-
renderLink: (e, t) => /* @__PURE__ */
|
|
67
|
+
renderLink: (e, t) => /* @__PURE__ */ w(ee, {
|
|
70
68
|
to: e,
|
|
71
69
|
preloadOnHover: "code-and-data",
|
|
72
70
|
children: t
|
|
73
71
|
}),
|
|
74
|
-
renderDate: (e, t) => /* @__PURE__ */ x
|
|
72
|
+
renderDate: (e, t) => /* @__PURE__ */ w(x, {
|
|
75
73
|
value: e,
|
|
76
|
-
options:
|
|
74
|
+
options: k,
|
|
77
75
|
fallback: t
|
|
78
76
|
}),
|
|
79
|
-
renderTag: (e, t) => /* @__PURE__ */
|
|
77
|
+
renderTag: (e, t) => /* @__PURE__ */ w(te, {
|
|
80
78
|
tone: e,
|
|
81
79
|
children: t
|
|
82
80
|
}),
|
|
83
|
-
renderBadgeRow: (e) => /* @__PURE__ */
|
|
81
|
+
renderBadgeRow: (e) => /* @__PURE__ */ w(r, { items: e })
|
|
84
82
|
}), J = (s.relations ?? []).flatMap((e) => {
|
|
85
83
|
let { path: t, target: n, whereKey: r } = e, i = h(e.value(H));
|
|
86
84
|
if (i == null) return [];
|
|
87
85
|
let a = z[n];
|
|
88
86
|
if (a?.hasList !== !0) return [];
|
|
89
|
-
let s =
|
|
87
|
+
let s = ne(null, r, i, t);
|
|
90
88
|
if (s == null) return [];
|
|
91
89
|
let c = a.listNavigation.encode({ where: s });
|
|
92
90
|
return [{
|
|
93
91
|
id: e.id,
|
|
94
92
|
label: m(e.label, N),
|
|
95
|
-
count: /* @__PURE__ */
|
|
93
|
+
count: /* @__PURE__ */ w(o, {
|
|
96
94
|
entity: n,
|
|
97
|
-
loadingFallback: /* @__PURE__ */
|
|
95
|
+
loadingFallback: /* @__PURE__ */ w(I, {}),
|
|
98
96
|
where: s
|
|
99
97
|
}),
|
|
100
98
|
destination: {
|
|
@@ -111,37 +109,37 @@ var { usePreloadedQuery: N } = w, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
111
109
|
pageLabel: G.label(N),
|
|
112
110
|
pageId: G.id
|
|
113
111
|
}), X;
|
|
114
|
-
(q.status != null || q.badges != null) && (X = /* @__PURE__ */
|
|
112
|
+
(q.status != null || q.badges != null) && (X = /* @__PURE__ */ T("div", {
|
|
115
113
|
className: u,
|
|
116
114
|
children: [q.status, q.badges]
|
|
117
115
|
}));
|
|
118
116
|
let Z = null;
|
|
119
|
-
q.items != null && q.items.length > 0 && (Z = /* @__PURE__ */
|
|
117
|
+
q.items != null && q.items.length > 0 && (Z = /* @__PURE__ */ w("div", {
|
|
120
118
|
className: d,
|
|
121
|
-
children: /* @__PURE__ */
|
|
119
|
+
children: /* @__PURE__ */ w(C, { items: q.items })
|
|
122
120
|
}));
|
|
123
121
|
let Q;
|
|
124
|
-
J.length > 0 && (Q = /* @__PURE__ */
|
|
122
|
+
J.length > 0 && (Q = /* @__PURE__ */ w("div", {
|
|
125
123
|
className: f,
|
|
126
|
-
children: /* @__PURE__ */
|
|
124
|
+
children: /* @__PURE__ */ w(M, {
|
|
127
125
|
label: R("relations.menu.label"),
|
|
128
126
|
items: J
|
|
129
127
|
})
|
|
130
128
|
}));
|
|
131
|
-
let ie = /* @__PURE__ */
|
|
129
|
+
let ie = /* @__PURE__ */ T("div", {
|
|
132
130
|
className: l,
|
|
133
|
-
children: [/* @__PURE__ */
|
|
131
|
+
children: [/* @__PURE__ */ w(S, {
|
|
134
132
|
title: q.title,
|
|
135
|
-
|
|
133
|
+
description: q.subtitle,
|
|
136
134
|
meta: X,
|
|
137
135
|
actions: Q
|
|
138
136
|
}), Z]
|
|
139
137
|
}), $ = null;
|
|
140
|
-
return W.pages.length > 1 && ($ = /* @__PURE__ */
|
|
138
|
+
return W.pages.length > 1 && ($ = /* @__PURE__ */ w(A, {
|
|
141
139
|
items: K,
|
|
142
140
|
activeId: G.id,
|
|
143
141
|
variant: "underline"
|
|
144
|
-
})), /* @__PURE__ */
|
|
142
|
+
})), /* @__PURE__ */ w(_, {
|
|
145
143
|
value: {
|
|
146
144
|
activePage: G,
|
|
147
145
|
config: s,
|
|
@@ -150,22 +148,22 @@ var { usePreloadedQuery: N } = w, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
150
148
|
tabsItems: K,
|
|
151
149
|
visiblePages: W.pages
|
|
152
150
|
},
|
|
153
|
-
children: /* @__PURE__ */
|
|
151
|
+
children: /* @__PURE__ */ w(i, {
|
|
154
152
|
breadcrumb: Y,
|
|
155
|
-
children: /* @__PURE__ */
|
|
153
|
+
children: /* @__PURE__ */ w(j, {
|
|
156
154
|
headerNode: ie,
|
|
157
155
|
tabsNode: $,
|
|
158
156
|
headerDensity: "compact",
|
|
159
|
-
children: /* @__PURE__ */
|
|
160
|
-
fallback: /* @__PURE__ */
|
|
161
|
-
children:
|
|
157
|
+
children: /* @__PURE__ */ w(b, {
|
|
158
|
+
fallback: /* @__PURE__ */ w(L, {}),
|
|
159
|
+
children: O
|
|
162
160
|
})
|
|
163
161
|
})
|
|
164
162
|
})
|
|
165
163
|
});
|
|
166
164
|
}, z = ({ config: t, prepared: n, children: r }) => {
|
|
167
|
-
let { t: a } =
|
|
168
|
-
return l == null ? /* @__PURE__ */
|
|
165
|
+
let { t: a } = E(), { t: o } = e(), c = N(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
|
|
166
|
+
return l == null ? /* @__PURE__ */ w(i, {
|
|
169
167
|
breadcrumb: [{
|
|
170
168
|
kind: "link",
|
|
171
169
|
target: {
|
|
@@ -182,8 +180,8 @@ var { usePreloadedQuery: N } = w, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
182
180
|
},
|
|
183
181
|
label: o("detail.notFound")
|
|
184
182
|
}],
|
|
185
|
-
children: /* @__PURE__ */
|
|
186
|
-
}) : /* @__PURE__ */
|
|
183
|
+
children: /* @__PURE__ */ w(s, { listHref: t.routes.list })
|
|
184
|
+
}) : /* @__PURE__ */ w(R, {
|
|
187
185
|
config: t,
|
|
188
186
|
prepared: n,
|
|
189
187
|
layoutNodeRef: l,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutDataRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { NavigationTabs } from '@plumile/ui/atomic/molecules/tabs/NavigationTabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeRuntimeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nconst DetailPageContentLoading = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} ariaLabel={t('common.loading')} />\n </div>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const { pathname } = useLocation();\n const layoutNode = useBackofficeRuntimeFragment(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnHover=\"code-and-data\">\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const encoded = entityManifest.listNavigation.encode({ where });\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n destination: {\n pathname: entityManifest.routes.list,\n filters: encoded.filters,\n query: encoded.query,\n },\n },\n ];\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <NavigationTabs\n items={tabsItems}\n activeId={activePage.id}\n variant=\"underline\"\n />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <Suspense fallback={<DetailPageContentLoading />}>\n {children}\n </Suspense>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutDataRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate, PageHeader, PropertyList } from '@plumile/ui';\nimport { NavigationTabs } from '@plumile/ui/tabs';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeRuntimeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nconst DetailPageContentLoading = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} ariaLabel={t('common.loading')} />\n </div>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const { pathname } = useLocation();\n const layoutNode = useBackofficeRuntimeFragment(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnHover=\"code-and-data\">\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const encoded = entityManifest.listNavigation.encode({ where });\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n destination: {\n pathname: entityManifest.routes.list,\n filters: encoded.filters,\n query: encoded.query,\n },\n },\n ];\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <PropertyList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <PageHeader\n title={header.title}\n description={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <NavigationTabs\n items={tabsItems}\n activeId={activePage.id}\n variant=\"underline\"\n />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <Suspense fallback={<DetailPageContentLoading />}>\n {children}\n </Suspense>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|