@plumile/backoffice-react 0.2.3 → 0.2.5
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":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport type { FilterChip } from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { BackofficeListFilterToolbar } from '@plumile/ui/backoffice/organisms/backoffice_list_filter_toolbar/BackofficeListFilterToolbar.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { VirtualizedConnectionTable } from '@plumile/ui/components/data-table/VirtualizedConnectionTable.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '@plumile/relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n incrementalError?: Error | null;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRetryLoadMore?: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n incrementalError = null,\n isRefreshing = false,\n onLoadMore,\n onRetryLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n const { listDefaults } = config;\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const items: { id: string; searchText: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n items.push({\n id: filter.id,\n searchText: resolvedLabel,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, renderFilterControl, t, tApp]);\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled:\n !shouldVirtualizeTable &&\n runtimeConfig.infiniteScroll.enabled &&\n incrementalError == null,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={incrementalError == null ? onLoadMore : () => {}}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <BackofficeListFilterToolbar\n stateKey={`backoffice:entity:${config.id}`}\n sections={drawerSections}\n activeFilters={chips}\n onResetFilters={handleClearAll}\n search={searchNode}\n primaryFilters={quickFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n density=\"compact\"\n />\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeListFooter\n state={\n incrementalError != null && onRetryLoadMore != null\n ? {\n kind: 'error',\n message: incrementalError.message,\n onRetry: onRetryLoadMore,\n }\n : isLoadingMore\n ? { kind: 'loading' }\n : hasNextPage\n ? { kind: 'idle' }\n : { kind: 'end' }\n }\n loadedCount={rows.length}\n totalCount={totalCount}\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n retry: t('list.actions.retry'),\n }}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["import {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/button';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport {\n denseTableClass,\n InlineBanner,\n PageHeader,\n ResponsiveRecordList,\n VirtualizedConnectionTable,\n type GetRowId,\n type ResponsiveRecordListColumn,\n} from '@plumile/ui';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport type { FilterChip } from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { BackofficeListFilterToolbar } from '@plumile/ui/backoffice/organisms/backoffice_list_filter_toolbar/BackofficeListFilterToolbar.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport { Select, type SelectOption } from '@plumile/ui/select';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '@plumile/relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst ALL_FILTER_SELECT_VALUE = 'all' as const;\nconst ENUM_FILTER_SELECT_VALUE_PREFIX = 'value:' as const;\n\ntype EnumFilterSelectValue =\n | typeof ALL_FILTER_SELECT_VALUE\n | `${typeof ENUM_FILTER_SELECT_VALUE_PREFIX}${string}`;\ntype BooleanFilterSelectValue =\n typeof ALL_FILTER_SELECT_VALUE | 'true' | 'false';\n\nconst encodeEnumFilterSelectValue = (value: string): EnumFilterSelectValue => {\n return `${ENUM_FILTER_SELECT_VALUE_PREFIX}${value}`;\n};\n\nconst decodeEnumFilterSelectValue = (\n value: EnumFilterSelectValue,\n): string | null => {\n if (value === ALL_FILTER_SELECT_VALUE) {\n return null;\n }\n return value.slice(ENUM_FILTER_SELECT_VALUE_PREFIX.length);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly ResponsiveRecordListColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n incrementalError?: Error | null;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRetryLoadMore?: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n incrementalError = null,\n isRefreshing = false,\n onLoadMore,\n onRetryLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n const { listDefaults } = config;\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options: readonly SelectOption<EnumFilterSelectValue>[] = [\n {\n value: ALL_FILTER_SELECT_VALUE,\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n value: encodeEnumFilterSelectValue(option.value),\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n const selectValue =\n typeof candidate === 'string' && candidate.trim() !== ''\n ? encodeEnumFilterSelectValue(candidate)\n : ALL_FILTER_SELECT_VALUE;\n\n return (\n <Select\n options={options}\n value={selectValue}\n size=\"small\"\n aria-label={filterLabelText}\n onValueChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n decodeEnumFilterSelectValue(next),\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue: BooleanFilterSelectValue = ALL_FILTER_SELECT_VALUE;\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options: readonly SelectOption<BooleanFilterSelectValue>[] = [\n {\n value: ALL_FILTER_SELECT_VALUE,\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n value: 'true',\n label: trueLabel,\n },\n {\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <Select\n options={options}\n value={selectValue}\n size=\"small\"\n aria-label={filterLabelText}\n onValueChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <Select\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n aria-label={t('list.sort.label')}\n onValueChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const items: { id: string; searchText: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n items.push({\n id: filter.id,\n searchText: resolvedLabel,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, renderFilterControl, t, tApp]);\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={handleClearAll}\n tone=\"neutral\"\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled:\n !shouldVirtualizeTable &&\n runtimeConfig.infiniteScroll.enabled &&\n incrementalError == null,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n const tableFooterNode = shouldRenderTableFooter ? (\n <BackofficeListFooter\n state={\n incrementalError != null && onRetryLoadMore != null\n ? {\n kind: 'error',\n message: incrementalError.message,\n onRetry: onRetryLoadMore,\n }\n : isLoadingMore\n ? { kind: 'loading' }\n : hasNextPage\n ? { kind: 'idle', onLoadMore }\n : { kind: 'end' }\n }\n loadedCount={rows.length}\n totalCount={totalCount}\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n retry: t('list.actions.retry'),\n loadMore: t('list.loadMore.action'),\n }}\n />\n ) : null;\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n aria-label={headerTitle}\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={{\n enabled: true,\n rowHeightPx: runtimeConfig.virtualization.rowHeightPx,\n overscan: runtimeConfig.virtualization.overscan,\n }}\n infiniteScroll={\n runtimeConfig.infiniteScroll.enabled\n ? {\n enabled: true,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }\n : { enabled: false }\n }\n hasNextPage={hasNextPage}\n totalRowCount={typeof totalCount === 'number' ? totalCount : undefined}\n isLoadingMore={isLoadingMore}\n onLoadMore={incrementalError == null ? onLoadMore : () => {}}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={tableFooterNode}\n />\n ) : (\n <ResponsiveRecordList\n aria-label={headerTitle}\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={tableFooterNode}\n infiniteScrollSentinelNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n aria-live=\"assertive\"\n role=\"alert\"\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={retry}\n tone=\"neutral\"\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <BackofficeListFilterToolbar\n stateKey={`backoffice:entity:${config.id}`}\n sections={drawerSections}\n activeFilters={chips}\n onResetFilters={handleClearAll}\n search={searchNode}\n primaryFilters={quickFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n loading={isRefreshing}\n loadingText={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n tone=\"neutral\"\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n density=\"compact\"\n />\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n open={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onOpenChange={(open) => {\n if (!open) setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <PageHeader\n title={headerTitle}\n description={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { tabBody as e, tabs as t } from "./backofficeTabbedDetailShell.css.js";
|
|
2
2
|
import { jsx as n } from "react/jsx-runtime";
|
|
3
|
-
import { NavigationTabs as r } from "@plumile/ui/
|
|
3
|
+
import { NavigationTabs as r } from "@plumile/ui/tabs";
|
|
4
4
|
import { DetailPageTemplate as i } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
5
5
|
//#region src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx
|
|
6
6
|
var a = ({ headerNode: a, tabs: o, activeId: s, children: c }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { NavigationTabs, type NavigationTabItem } from '@plumile/ui/tabs';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport * as styles from './backofficeTabbedDetailShell.css.js';\n\nexport type BackofficeTabbedDetailShellProps = {\n headerNode: ReactNode;\n tabs?: readonly NavigationTabItem[];\n activeId?: string;\n children: ReactNode;\n};\n\nexport const BackofficeTabbedDetailShell = ({\n headerNode,\n tabs,\n activeId,\n children,\n}: BackofficeTabbedDetailShellProps): JSX.Element => {\n let tabsNode: JSX.Element | null = null;\n if (tabs != null && tabs.length > 1 && activeId != null) {\n tabsNode = (\n <NavigationTabs\n items={tabs}\n activeId={activeId}\n className={styles.tabs}\n />\n );\n }\n\n return (\n <DetailPageTemplate headerNode={headerNode} tabsNode={tabsNode}>\n <div className={styles.tabBody}>{children}</div>\n </DetailPageTemplate>\n );\n};\n\nexport default BackofficeTabbedDetailShell;\n"],"mappings":";;;;;AAcA,IAAa,KAA+B,EAC1C,eACA,MAAA,GACA,aACA,kBACmD;CACnD,IAAI,IAA+B;CAWnC,OAVI,KAAQ,QAAQ,EAAK,SAAS,KAAK,KAAY,SACjD,IACE,kBAAC,GAAD;EACE,OAAO;EACG;EACV,WAAW;CACZ,CAAA,IAKH,kBAAC,GAAD;EAAgC;EAAsB;EACpD,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAiB;EAAc,CAAA;CAC7B,CAAA;AAExB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5lr txvbqb1cu txvbqb2nn txvbqb6rp", t = "txvbqbl9n txvbqbl6d txvbqbd73", n = "txvbqb5lr txvbqb6m5 txvbqb6rp txvbqbl9n", r = "txvbqb5lr txvbqb1cu txvbqb2nn txvbqb6rf txvbqbe1d", i = "txvbqb5lr txvbqb6m5 txvbqb6rz", a = "txvbqb5lr txvbqb6m5 txvbqb84b txvbqbd9v", o = "txvbqb5lr txvbqb2nn txvbqb6rp txvbqbgg txvbqbiqj txvbqbjg3 txvbqb8q9 txvbqblh txvbqbmx txvbqbiz txvbqbn1 txvbqba9 txvbqbe7 txvbqb6nj txvbqb1rl", s = "txvbqb6nt txvbqb1d5 txvbqbe6";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as controlsRow, i as embeddedContainer, s as embeddedHeader, n as entityIdListFilter, r as entityIdListTags, t as filterInput, o as refreshingIndicator, a as tableHost };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeEntityListScaffold.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme
|
|
1
|
+
{"version":3,"file":"backofficeEntityListScaffold.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: {\n base: 'full',\n md: 72,\n },\n maxWidth: 'full',\n});\n\nexport const entityIdListFilter = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const entityIdListTags = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const tableHost = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n height: 'full',\n minHeight: 0,\n});\n\nexport const refreshingIndicator = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n alignSelf: 'flex-start',\n paddingX: 2,\n paddingY: 1,\n marginBottom: 2,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n backgroundColor: 'surface',\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'tight',\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeTabbedDetailShell.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme
|
|
1
|
+
{"version":3,"file":"backofficeTabbedDetailShell.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const tabs = sprinkles({\n display: 'flex',\n});\n\nexport const tabBody = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n"],"mappings":""}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BackofficeInlineLink as e } from "../links/BackofficeInlineLink.js";
|
|
2
2
|
import { actionSlot as t, container as n, contentSlot as r, detailIcon as i, detailLink as a, text as o } from "./backofficeFilterableCell.css.js";
|
|
3
|
-
import { cx as s } from "@plumile/ui/theme
|
|
3
|
+
import { cx as s } from "@plumile/ui/theme";
|
|
4
4
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
5
|
-
import { MarkdownExternalLinkSvg as u } from "@plumile/ui/icons/
|
|
5
|
+
import { MarkdownExternalLinkSvg as u } from "@plumile/ui/icons/MarkdownExternalLinkSvg";
|
|
6
6
|
//#region src/components/backoffice/shared/BackofficeFilterableCell.tsx
|
|
7
7
|
var d = ({ filterAction: d, children: f, target: p, title: m, openInNewTab: h = !1, wrap: g = !1, className: _, icon: v = "auto" }) => {
|
|
8
8
|
let y = /* @__PURE__ */ c("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/
|
|
1
|
+
{"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/MarkdownExternalLinkSvg';\nimport { cx } from '@plumile/ui/theme';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport * as styles from './backofficeFilterableCell.css.js';\n\nexport type BackofficeFilterableCellProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n filterAction?: ReactNode;\n children: ReactNode;\n target?: BackofficeLinkTarget<TManifest>;\n title?: string;\n openInNewTab?: boolean;\n wrap?: boolean;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeFilterableCell = ({\n filterAction,\n children,\n target,\n title,\n openInNewTab = false,\n wrap = false,\n className,\n icon = 'auto',\n}: BackofficeFilterableCellProps): JSX.Element => {\n const textNode = <span className={styles.text({ wrap })}>{children}</span>;\n\n let contentNode: JSX.Element = (\n <span className={styles.contentSlot}>{textNode}</span>\n );\n if (target != null) {\n contentNode = (\n <BackofficeInlineLink\n target={target}\n className={styles.detailLink}\n title={title}\n openInNewTab={openInNewTab}\n icon={icon}\n endAdornment={(() => {\n if (!openInNewTab) {\n return null;\n }\n return (\n <ExternalLinkSvg className={styles.detailIcon} aria-hidden=\"true\" />\n );\n })()}\n >\n {textNode}\n </BackofficeInlineLink>\n );\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{filterAction}</span>\n {contentNode}\n </span>\n );\n};\n\nexport default BackofficeFilterableCell;\n"],"mappings":";;;;;;AAsBA,IAAa,KAA4B,EACvC,iBACA,aACA,WACA,UACA,kBAAe,IACf,UAAO,IACP,cACA,UAAO,aACyC;CAChD,IAAM,IAAW,kBAAC,QAAD;EAAM,WAAW,EAAY,EAAE,QAAK,CAAC;EAAI;CAAe,CAAA,GAErE,IACF,kBAAC,QAAD;EAAM,WAAW;EAAqB,UAAA;CAAe,CAAA;CAwBvD,OAtBI,KAAU,SACZ,IACE,kBAAC,GAAD;EACU;EACR,WAAW;EACJ;EACO;EACR;EACN,cACO,IAIH,kBAAC,GAAD;GAAiB,WAAW;GAAmB,eAAY;EAAQ,CAAA,IAH5D;EAOV,UAAA;CACmB,CAAA,IAKxB,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAmB,CAAA,GACvD,CACG;;AAEV"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actionSlot as e, container as t, valueSlot as n } from "./backofficeInlineFilterRow.css.js";
|
|
2
2
|
import { Children as r } from "react";
|
|
3
|
-
import { cx as i } from "@plumile/ui/theme
|
|
3
|
+
import { cx as i } from "@plumile/ui/theme";
|
|
4
4
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
5
|
//#region src/components/backoffice/shared/BackofficeInlineFilterRow.tsx
|
|
6
6
|
var s = ({ children: s, className: c }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme
|
|
1
|
+
{"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme';\n\nimport * as styles from './backofficeInlineFilterRow.css.js';\n\nexport type BackofficeInlineFilterRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInlineFilterRow = ({\n children,\n className,\n}: BackofficeInlineFilterRowProps): JSX.Element => {\n const childNodes = Children.toArray(children);\n let actionNode: ReactNode = null;\n let valueNodes = childNodes;\n if (childNodes.length > 1) {\n const [firstNode, ...remainingNodes] = childNodes;\n actionNode = firstNode;\n valueNodes = remainingNodes;\n }\n let valueNode: ReactNode = null;\n if (valueNodes.length === 1) {\n const [singleValueNode] = valueNodes;\n valueNode = singleValueNode;\n } else if (valueNodes.length > 1) {\n valueNode = valueNodes;\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{actionNode}</span>\n <span className={styles.valueSlot}>{valueNode}</span>\n </span>\n );\n};\n\nexport default BackofficeInlineFilterRow;\n"],"mappings":";;;;;AAWA,IAAa,KAA6B,EACxC,aACA,mBACiD;CACjD,IAAM,IAAa,EAAS,QAAQ,CAAQ,GACxC,IAAwB,MACxB,IAAa;CACjB,IAAI,EAAW,SAAS,GAAG;EACzB,IAAM,CAAC,GAAW,GAAG,KAAkB;EAEvC,AADA,IAAa,GACb,IAAa;CACf;CACA,IAAI,IAAuB;CAC3B,IAAI,EAAW,WAAW,GAAG;EAC3B,IAAM,CAAC,KAAmB;EAC1B,IAAY;CACd,OAAO,AAAI,EAAW,SAAS,MAC7B,IAAY;CAGd,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAiB,CAAA,GACtD,kBAAC,QAAD;GAAM,WAAW;GAAmB,UAAA;EAAgB,CAAA,CAChD;;AAEV"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/* empty css */
|
|
2
2
|
import { c as e } from "../../../node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js";
|
|
3
3
|
//#region src/components/backoffice/shared/backofficeFilterableCell.css.ts
|
|
4
|
-
var t = "_1q232kj0
|
|
5
|
-
defaultClassName: "_1q232kj1
|
|
4
|
+
var t = "_1q232kj0 txvbqb2nn txvbqb19v txvbqbd73 txvbqbe1d txvbqb84", n = "txvbqb5ml txvbqb2nn txvbqb8o1", r = "txvbqb5ml txvbqb2nn txvbqb6rf txvbqbe1d txvbqbd73", i = e({
|
|
5
|
+
defaultClassName: "_1q232kj1 txvbqbe1d txvbqbd73",
|
|
6
6
|
variantClassNames: { wrap: {
|
|
7
|
-
false: "_1q232kj2
|
|
8
|
-
true: "_1q232kj3
|
|
7
|
+
false: "_1q232kj2 txvbqbf3z txvbqb2lw txvbqb2mf",
|
|
8
|
+
true: "_1q232kj3 txvbqb2mg txvbqb2m1"
|
|
9
9
|
} },
|
|
10
10
|
defaultVariants: { wrap: !1 },
|
|
11
11
|
compoundVariants: []
|
|
12
|
-
}), a = "_1q232kj4
|
|
12
|
+
}), a = "_1q232kj4 qbwcue10 qbwcuey txvbqb5ml txvbqb2nn txvbqb6rf txvbqbe6 txvbqb3f txvbqb7n txvbqb76 txvbqb7y qbwcuez txvbqbpw9 qbwcue5 qbwcue4 txvbqboz8 txvbqbptg qbwcue3 txvbqbe1d txvbqbd73 txvbqbet txvbqb1d5 txvbqbo81", o = "txvbqb1cr txvbqbe7 txvbqblmz txvbqb8hn";
|
|
13
13
|
//#endregion
|
|
14
14
|
export { n as actionSlot, t as container, r as contentSlot, o as detailIcon, a as detailLink, i as text };
|
|
15
15
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeFilterableCell.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeFilterableCell.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport {
|
|
1
|
+
{"version":3,"file":"backofficeFilterableCell.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeFilterableCell.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport {\n sprinkles,\n stateSprinkles,\n entityReferenceLink,\n} from '@plumile/ui/theme';\n\nexport const container = style([\n sprinkles({\n alignItems: 'center',\n columnGap: 2,\n maxWidth: 'full',\n minWidth: 0,\n verticalAlign: 'middle',\n }),\n {\n display: 'inline-grid',\n gridTemplateColumns: 'auto minmax(0, 1fr)',\n },\n]);\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const contentSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n maxWidth: 'full',\n});\n\nexport const text = recipe({\n base: sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n }),\n variants: {\n wrap: {\n false: sprinkles({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n true: sprinkles({\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n }),\n },\n },\n defaultVariants: {\n wrap: false,\n },\n});\n\nexport const detailLink = style([\n entityReferenceLink,\n sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n color: 'tonePrimaryText',\n fontWeight: 'semibold',\n }),\n stateSprinkles({\n color: { hover: 'text' },\n }),\n]);\n\nexport const detailIcon = sprinkles({\n flexShrink: 0,\n color: 'textSecondary',\n width: 3.5,\n height: 3.5,\n});\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/backoffice/shared/backofficeInlineFilterRow.css.ts
|
|
2
|
-
var e = "
|
|
2
|
+
var e = "txvbqb5ml txvbqb2nn txvbqb6rf txvbqb1ct txvbqbd73 txvbqbe1d txvbqbf3z", t = "txvbqb5ml txvbqb2nn txvbqb8o1 txvbqb1cr", n = "txvbqbe1d txvbqbd73 txvbqbf3z txvbqb2lw txvbqb2mf";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { t as actionSlot, e as container, n as valueSlot };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeInlineFilterRow.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeInlineFilterRow.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme
|
|
1
|
+
{"version":3,"file":"backofficeInlineFilterRow.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeInlineFilterRow.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'nowrap',\n maxWidth: 'full',\n minWidth: 0,\n overflow: 'hidden',\n});\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n});\n\nexport const valueSlot = sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { panel as e, trigger as t, triggerIcon as n, triggerIconOpen as r, triggerTitle as i } from "./backofficeToolsDocPanel.css.js";
|
|
2
2
|
import { useId as a, useState as o } from "react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { ChevronDownSvg as d } from "@plumile/ui/icons/ChevronDownSvg
|
|
3
|
+
import { LazyMarkdownCodeBlock as s } from "@plumile/ui";
|
|
4
|
+
import { cx as c } from "@plumile/ui/theme";
|
|
5
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
|
+
import { ChevronDownSvg as d } from "@plumile/ui/icons/ChevronDownSvg";
|
|
7
7
|
//#region src/components/backoffice/tools/BackofficeToolsDocPanel.tsx
|
|
8
8
|
var f = ({ title: f, content: p, language: m, badgeLabel: h, defaultOpen: g = !1 }) => {
|
|
9
9
|
let _ = p.trim(), [v, y] = o(g), b = a();
|
|
10
|
-
return _ === "" ? null : /* @__PURE__ */
|
|
10
|
+
return _ === "" ? null : /* @__PURE__ */ u("div", {
|
|
11
11
|
className: e,
|
|
12
|
-
children: [/* @__PURE__ */
|
|
12
|
+
children: [/* @__PURE__ */ u("button", {
|
|
13
13
|
type: "button",
|
|
14
14
|
className: t,
|
|
15
15
|
onClick: () => {
|
|
@@ -17,19 +17,19 @@ var f = ({ title: f, content: p, language: m, badgeLabel: h, defaultOpen: g = !1
|
|
|
17
17
|
},
|
|
18
18
|
"aria-expanded": v,
|
|
19
19
|
"aria-controls": b,
|
|
20
|
-
children: [/* @__PURE__ */
|
|
20
|
+
children: [/* @__PURE__ */ l("span", {
|
|
21
21
|
className: i,
|
|
22
22
|
children: f
|
|
23
|
-
}), /* @__PURE__ */
|
|
23
|
+
}), /* @__PURE__ */ l(d, {
|
|
24
24
|
width: 16,
|
|
25
25
|
height: 16,
|
|
26
26
|
"aria-hidden": "true",
|
|
27
|
-
className:
|
|
27
|
+
className: c(n, { [r]: v })
|
|
28
28
|
})]
|
|
29
|
-
}), v && /* @__PURE__ */
|
|
30
|
-
className: "
|
|
29
|
+
}), v && /* @__PURE__ */ l("div", {
|
|
30
|
+
className: "txvbqb571 txvbqbmx txvbqbps txvbqbaa txvbqbe1d txvbqb20c txvbqbf5n",
|
|
31
31
|
id: b,
|
|
32
|
-
children: /* @__PURE__ */
|
|
32
|
+
children: /* @__PURE__ */ l(s, {
|
|
33
33
|
code: _,
|
|
34
34
|
language: m,
|
|
35
35
|
badgeLabel: h
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui
|
|
1
|
+
{"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui';\nimport { ChevronDownSvg } from '@plumile/ui/icons/ChevronDownSvg';\nimport { cx } from '@plumile/ui/theme';\n\nimport * as styles from './backofficeToolsDocPanel.css.js';\n\nexport type BackofficeToolsDocPanelProps = {\n title: string;\n content: string;\n language?: string | null;\n badgeLabel?: string | null;\n defaultOpen?: boolean;\n};\n\nexport const BackofficeToolsDocPanel = ({\n title,\n content,\n language,\n badgeLabel,\n defaultOpen = false,\n}: BackofficeToolsDocPanelProps): JSX.Element | null => {\n const trimmedContent = content.trim();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const contentId = useId();\n\n if (trimmedContent === '') {\n return null;\n }\n\n return (\n <div className={styles.panel}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={contentId}\n >\n <span className={styles.triggerTitle}>{title}</span>\n <ChevronDownSvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </button>\n {isOpen && (\n <div className={styles.content} id={contentId}>\n <LazyMarkdownCodeBlock\n code={trimmedContent}\n language={language}\n badgeLabel={badgeLabel}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeToolsDocPanel;\n"],"mappings":";;;;;;;AAgBA,IAAa,KAA2B,EACtC,UACA,SAAA,GACA,aACA,eACA,iBAAc,SACwC;CACtD,IAAM,IAAiB,EAAQ,KAAK,GAC9B,CAAC,GAAQ,KAAa,EAAS,CAAW,GAC1C,IAAY,EAAM;CAMxB,OAJI,MAAmB,KACd,OAIP,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,GAAW,MACF,CAAC,CACT;GACH;GACA,iBAAe;GACf,iBAAe;GATjB,UAAA,CAWE,kBAAC,QAAD;IAAM,WAAW;IAAsB,UAAA;GAAY,CAAA,GACnD,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,WAAW,EAAG,GAAoB,GAC/B,IAAyB,EAC5B,CAAC;GACF,CAAA,CACK;EACP,CAAA,GAAA,KACC,kBAAC,OAAD;GAAK,WAAW;GAAgB,IAAI;GAClC,UAAA,kBAAC,GAAD;IACE,MAAM;IACI;IACE;GACb,CAAA;EACE,CAAA,CAEJ;;AAET"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
2
|
import { useTranslation as r } from "react-i18next";
|
|
3
|
-
import { Button as i } from "@plumile/ui/
|
|
3
|
+
import { Button as i } from "@plumile/ui/button";
|
|
4
4
|
import { BackofficeDetailSection as a } from "@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js";
|
|
5
5
|
import { BackofficePayloadViewer as o } from "@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js";
|
|
6
6
|
//#region src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx
|
|
@@ -31,9 +31,10 @@ var s = (e) => {
|
|
|
31
31
|
}],
|
|
32
32
|
children: /* @__PURE__ */ t(i, {
|
|
33
33
|
type: "button",
|
|
34
|
-
variant: "
|
|
34
|
+
variant: "soft",
|
|
35
35
|
size: "small",
|
|
36
36
|
onClick: l,
|
|
37
|
+
tone: "neutral",
|
|
37
38
|
children: u("common.actions.retry")
|
|
38
39
|
})
|
|
39
40
|
}), p != null && /* @__PURE__ */ t(a, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/
|
|
1
|
+
{"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/button';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={onRetry}\n tone=\"neutral\"\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;AAYA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;EAEA,UAAA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;GACT,MAAK;GAEJ,UAAA,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;EACtD,UAAA,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAE3B,EAAA,CAAA;AAEN"}
|