@plumile/backoffice-react 0.1.193 → 0.1.195
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/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
- package/lib/esm/auth/TotpQrCode.js +8 -5
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/login/AuthPanel.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js +4 -4
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/LoginFlow.js.map +1 -1
- package/lib/esm/auth/login/MethodChooser.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js +4 -4
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js +4 -4
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +0 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +16 -11
- 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.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +2 -2
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
- package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js +4 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
- package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +9 -9
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +4 -4
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +8 -5
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +306 -297
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +11 -11
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
- package/lib/esm/pages/BackofficeAcceptInvitationPage.js +8 -8
- package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.js +4 -4
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js +62 -43
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +4 -4
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +95 -89
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +2 -2
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPageConfigPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +13 -11
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +80 -76
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +56 -53
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLoginPage.js +26 -26
- package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetCompletePage.js +36 -36
- package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetRequestPage.js +3 -3
- package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
- package/lib/esm/pages/BackofficeToolShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeVerifyEmailPage.js +36 -36
- package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +3 -2
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/relay/envHelpers.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +2 -2
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.js +4 -1
- package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
- package/lib/esm/subscriptions/useCursorResumableSubscription.js +4 -4
- package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
- package/package.json +20 -20
|
@@ -7,15 +7,15 @@ import { jsx as o } from "react/jsx-runtime";
|
|
|
7
7
|
import s from "@plumile/router/routing/RoutingContext.js";
|
|
8
8
|
//#region src/pages/BackofficeAcceptInvitationPage.tsx
|
|
9
9
|
var c = () => {
|
|
10
|
-
let c = a(s), { basePath: l } = t()
|
|
10
|
+
let c = a(s), { basePath: l } = t(), u = n(), d = i(() => {
|
|
11
|
+
c?.history.push({ pathname: l });
|
|
12
|
+
}, [l, c?.history]), f = i(() => {
|
|
13
|
+
c?.history.push({ pathname: r(l) });
|
|
14
|
+
}, [l, c?.history]);
|
|
11
15
|
return /* @__PURE__ */ o(e, {
|
|
12
|
-
auth:
|
|
13
|
-
onSuccessRedirect:
|
|
14
|
-
|
|
15
|
-
}, [l, c?.history]),
|
|
16
|
-
onBackToLogin: i(() => {
|
|
17
|
-
c?.history.push({ pathname: r(l) });
|
|
18
|
-
}, [l, c?.history])
|
|
16
|
+
auth: u,
|
|
17
|
+
onSuccessRedirect: d,
|
|
18
|
+
onBackToLogin: f
|
|
19
19
|
});
|
|
20
20
|
};
|
|
21
21
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeAcceptInvitationPage.js","names":[],"sources":["../../../src/pages/BackofficeAcceptInvitationPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { AcceptInvitationScreen } from '../auth/pages/AcceptInvitationScreen.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nexport const BackofficeAcceptInvitationPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuth();\n\n const handleSuccessRedirect = useCallback(() => {\n routerContext?.history.push({ pathname: basePath });\n }, [basePath, routerContext?.history]);\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n return (\n <AcceptInvitationScreen\n auth={auth}\n onSuccessRedirect={handleSuccessRedirect}\n onBackToLogin={handleBackToLogin}\n />\n );\n};\n\nexport default BackofficeAcceptInvitationPage;\n"],"mappings":";;;;;;;;AAQA,IAAa,UAAoD;CAC/D,IAAM,IAAgB,EAAW,CAAc,GACzC,EAAE,gBAAa,EAAoB
|
|
1
|
+
{"version":3,"file":"BackofficeAcceptInvitationPage.js","names":[],"sources":["../../../src/pages/BackofficeAcceptInvitationPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { AcceptInvitationScreen } from '../auth/pages/AcceptInvitationScreen.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nexport const BackofficeAcceptInvitationPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuth();\n\n const handleSuccessRedirect = useCallback(() => {\n routerContext?.history.push({ pathname: basePath });\n }, [basePath, routerContext?.history]);\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n return (\n <AcceptInvitationScreen\n auth={auth}\n onSuccessRedirect={handleSuccessRedirect}\n onBackToLogin={handleBackToLogin}\n />\n );\n};\n\nexport default BackofficeAcceptInvitationPage;\n"],"mappings":";;;;;;;;AAQA,IAAa,UAAoD;CAC/D,IAAM,IAAgB,EAAW,CAAc,GACzC,EAAE,gBAAa,EAAoB,GACnC,IAAO,EAAkB,GAEzB,IAAwB,QAAkB;EAC9C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAS,CAAC;CACpD,GAAG,CAAC,GAAU,GAAe,OAAO,CAAC,GAE/B,IAAoB,QAAkB;EAC1C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,CAAQ,EAAE,CAAC;CAC5E,GAAG,CAAC,GAAU,GAAe,OAAO,CAAC;CAErC,OACE,kBAAC,GAAD;EACQ;EACN,mBAAmB;EACnB,eAAe;CAChB,CAAA;AAEL"}
|
|
@@ -19,23 +19,23 @@ import { DashboardGrid as C, DashboardGridItem as w } from "@plumile/ui/componen
|
|
|
19
19
|
var T = f(async () => ({ default: (await import("./BackofficeDashboardWidgetContent.js")).BackofficeDashboardWidgetContent })), E = {
|
|
20
20
|
id: "24h",
|
|
21
21
|
label: (e) => e("common.time.lastDay", "24 h"),
|
|
22
|
-
durationMs:
|
|
22
|
+
durationMs: 864e5
|
|
23
23
|
}, D = [
|
|
24
24
|
{
|
|
25
25
|
id: "1h",
|
|
26
26
|
label: (e) => e("common.time.lastHour", "1 h"),
|
|
27
|
-
durationMs:
|
|
27
|
+
durationMs: 36e5
|
|
28
28
|
},
|
|
29
29
|
E,
|
|
30
30
|
{
|
|
31
31
|
id: "7d",
|
|
32
32
|
label: (e) => e("common.time.lastSevenDays", "7 j"),
|
|
33
|
-
durationMs:
|
|
33
|
+
durationMs: 6048e5
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
id: "30d",
|
|
37
37
|
label: (e) => e("common.time.lastThirtyDays", "30 j"),
|
|
38
|
-
durationMs:
|
|
38
|
+
durationMs: 2592e6
|
|
39
39
|
}
|
|
40
40
|
], O = () => {
|
|
41
41
|
let { t } = e();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { lazy, type JSX, Suspense, useMemo, useState } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardContext,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n} from '@plumile/backoffice-core/types.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { useTranslation } from 'react-i18next';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport type { BackofficePreparedDashboardRoute } from '../router/createBackofficeRoutes.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst LazyBackofficeDashboardWidgetContent = lazy(async () => {\n const module = await import('./BackofficeDashboardWidgetContent.js');\n return {\n default: module.BackofficeDashboardWidgetContent,\n };\n});\n\nconst fallbackDashboardWindowPreset: BackofficeDashboardWindowPreset = {\n id: '24h',\n label: (t) => {\n return t('common.time.lastDay', '24 h');\n },\n durationMs: 24 * 60 * 60 * 1000,\n};\n\nconst defaultDashboardWindowPresets: readonly BackofficeDashboardWindowPreset[] =\n [\n {\n id: '1h',\n label: (t) => {\n return t('common.time.lastHour', '1 h');\n },\n durationMs: 60 * 60 * 1000,\n },\n fallbackDashboardWindowPreset,\n {\n id: '7d',\n label: (t) => {\n return t('common.time.lastSevenDays', '7 j');\n },\n durationMs: 7 * 24 * 60 * 60 * 1000,\n },\n {\n id: '30d',\n label: (t) => {\n return t('common.time.lastThirtyDays', '30 j');\n },\n durationMs: 30 * 24 * 60 * 60 * 1000,\n },\n ];\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst resolveDashboardWindowPresets = (\n config: BackofficeDashboardConfig,\n): readonly BackofficeDashboardWindowPreset[] => {\n if (config.windowPresets != null && config.windowPresets.length > 0) {\n return config.windowPresets;\n }\n return defaultDashboardWindowPresets;\n};\n\nconst resolveDefaultDashboardWindowPresetId = (\n config: BackofficeDashboardConfig,\n presets: readonly BackofficeDashboardWindowPreset[],\n): string => {\n if (\n config.defaultWindowPresetId != null &&\n presets.some((preset) => {\n return preset.id === config.defaultWindowPresetId;\n })\n ) {\n return config.defaultWindowPresetId;\n }\n return presets[1]?.id ?? presets[0]?.id ?? '24h';\n};\n\nconst buildDashboardWindowState = (\n preset: BackofficeDashboardWindowPreset,\n nowMs: number,\n): BackofficeDashboardWindowState => {\n const to = new Date(nowMs);\n const from = new Date(nowMs - preset.durationMs);\n return {\n id: preset.id,\n label: preset.label,\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\nconst DashboardContent = ({ config }: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const presets = useMemo(() => {\n return resolveDashboardWindowPresets(config);\n }, [config]);\n const [activeWindowPresetId, setActiveWindowPresetId] = useState(() => {\n return resolveDefaultDashboardWindowPresetId(config, presets);\n });\n const [windowNowMs, setWindowNowMs] = useState(() => {\n return Date.now();\n });\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n const activePreset =\n presets.find((preset) => {\n return preset.id === activeWindowPresetId;\n }) ??\n presets[0] ??\n fallbackDashboardWindowPreset;\n const dashboardContext: BackofficeDashboardContext = {\n window: buildDashboardWindowState(activePreset, windowNowMs),\n };\n const handleWindowPresetChange = (presetId: string): void => {\n setActiveWindowPresetId(presetId);\n setWindowNowMs(Date.now());\n };\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n <LazyBackofficeDashboardWidgetContent\n widget={widget}\n context={dashboardContext}\n windowPresets={presets}\n activeWindowPresetId={activeWindowPresetId}\n onWindowPresetChange={handleWindowPresetChange}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\nexport type BackofficeDashboardPageProps = {\n prepared?: BackofficePreparedDashboardRoute | null;\n};\n\nexport const BackofficeDashboardPage = ({\n prepared,\n}: BackofficeDashboardPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const rootDashboard = useBackofficeDashboardConfig();\n const dashboard = prepared?.config ?? rootDashboard;\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { lazy, type JSX, Suspense, useMemo, useState } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardContext,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n} from '@plumile/backoffice-core/types.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { useTranslation } from 'react-i18next';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport type { BackofficePreparedDashboardRoute } from '../router/createBackofficeRoutes.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst LazyBackofficeDashboardWidgetContent = lazy(async () => {\n const module = await import('./BackofficeDashboardWidgetContent.js');\n return {\n default: module.BackofficeDashboardWidgetContent,\n };\n});\n\nconst fallbackDashboardWindowPreset: BackofficeDashboardWindowPreset = {\n id: '24h',\n label: (t) => {\n return t('common.time.lastDay', '24 h');\n },\n durationMs: 24 * 60 * 60 * 1000,\n};\n\nconst defaultDashboardWindowPresets: readonly BackofficeDashboardWindowPreset[] =\n [\n {\n id: '1h',\n label: (t) => {\n return t('common.time.lastHour', '1 h');\n },\n durationMs: 60 * 60 * 1000,\n },\n fallbackDashboardWindowPreset,\n {\n id: '7d',\n label: (t) => {\n return t('common.time.lastSevenDays', '7 j');\n },\n durationMs: 7 * 24 * 60 * 60 * 1000,\n },\n {\n id: '30d',\n label: (t) => {\n return t('common.time.lastThirtyDays', '30 j');\n },\n durationMs: 30 * 24 * 60 * 60 * 1000,\n },\n ];\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst resolveDashboardWindowPresets = (\n config: BackofficeDashboardConfig,\n): readonly BackofficeDashboardWindowPreset[] => {\n if (config.windowPresets != null && config.windowPresets.length > 0) {\n return config.windowPresets;\n }\n return defaultDashboardWindowPresets;\n};\n\nconst resolveDefaultDashboardWindowPresetId = (\n config: BackofficeDashboardConfig,\n presets: readonly BackofficeDashboardWindowPreset[],\n): string => {\n if (\n config.defaultWindowPresetId != null &&\n presets.some((preset) => {\n return preset.id === config.defaultWindowPresetId;\n })\n ) {\n return config.defaultWindowPresetId;\n }\n return presets[1]?.id ?? presets[0]?.id ?? '24h';\n};\n\nconst buildDashboardWindowState = (\n preset: BackofficeDashboardWindowPreset,\n nowMs: number,\n): BackofficeDashboardWindowState => {\n const to = new Date(nowMs);\n const from = new Date(nowMs - preset.durationMs);\n return {\n id: preset.id,\n label: preset.label,\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\nconst DashboardContent = ({ config }: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const presets = useMemo(() => {\n return resolveDashboardWindowPresets(config);\n }, [config]);\n const [activeWindowPresetId, setActiveWindowPresetId] = useState(() => {\n return resolveDefaultDashboardWindowPresetId(config, presets);\n });\n const [windowNowMs, setWindowNowMs] = useState(() => {\n return Date.now();\n });\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n const activePreset =\n presets.find((preset) => {\n return preset.id === activeWindowPresetId;\n }) ??\n presets[0] ??\n fallbackDashboardWindowPreset;\n const dashboardContext: BackofficeDashboardContext = {\n window: buildDashboardWindowState(activePreset, windowNowMs),\n };\n const handleWindowPresetChange = (presetId: string): void => {\n setActiveWindowPresetId(presetId);\n setWindowNowMs(Date.now());\n };\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n <LazyBackofficeDashboardWidgetContent\n widget={widget}\n context={dashboardContext}\n windowPresets={presets}\n activeWindowPresetId={activeWindowPresetId}\n onWindowPresetChange={handleWindowPresetChange}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\nexport type BackofficeDashboardPageProps = {\n prepared?: BackofficePreparedDashboardRoute | null;\n};\n\nexport const BackofficeDashboardPage = ({\n prepared,\n}: BackofficeDashboardPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const rootDashboard = useBackofficeDashboardConfig();\n const dashboard = prepared?.config ?? rootDashboard;\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardShellPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardShellPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { BackofficeStaticRouteFallback } from '../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficePreparedDashboardShellRoute } from '../router/createBackofficeRoutes.js';\n\nexport type BackofficeDashboardShellPageProps = {\n children?: ReactNode;\n prepared?: BackofficePreparedDashboardShellRoute | null;\n};\n\nconst BackofficeDashboardShellFallback = ({\n prepared,\n}: {\n prepared?: BackofficePreparedDashboardShellRoute | null;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const title = prepared?.label?.(tApp) ?? t('dashboard.title');\n\n return (\n <BackofficeRightPageLayout breadcrumb={buildDashboardBreadcrumb(t)}>\n <DetailPageTemplate\n header={{\n title,\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <BackofficeStaticRouteFallback label={t('common.loading')} />\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeDashboardShellPage = ({\n children,\n prepared,\n}: BackofficeDashboardShellPageProps): JSX.Element => {\n return (\n <Suspense\n fallback={<BackofficeDashboardShellFallback prepared={prepared} />}\n >\n {children}\n </Suspense>\n );\n};\n\nexport default BackofficeDashboardShellPage;\n"],"mappings":";;;;;;;;;AAgBA,IAAM,KAAoC,EACxC,kBAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAQ,GAAU,QAAQ,CAAI,KAAK,EAAE,iBAAiB;CAE5D,OACE,kBAAC,GAAD;EAA2B,YAAY,EAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"BackofficeDashboardShellPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardShellPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { BackofficeStaticRouteFallback } from '../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficePreparedDashboardShellRoute } from '../router/createBackofficeRoutes.js';\n\nexport type BackofficeDashboardShellPageProps = {\n children?: ReactNode;\n prepared?: BackofficePreparedDashboardShellRoute | null;\n};\n\nconst BackofficeDashboardShellFallback = ({\n prepared,\n}: {\n prepared?: BackofficePreparedDashboardShellRoute | null;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const title = prepared?.label?.(tApp) ?? t('dashboard.title');\n\n return (\n <BackofficeRightPageLayout breadcrumb={buildDashboardBreadcrumb(t)}>\n <DetailPageTemplate\n header={{\n title,\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <BackofficeStaticRouteFallback label={t('common.loading')} />\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeDashboardShellPage = ({\n children,\n prepared,\n}: BackofficeDashboardShellPageProps): JSX.Element => {\n return (\n <Suspense\n fallback={<BackofficeDashboardShellFallback prepared={prepared} />}\n >\n {children}\n </Suspense>\n );\n};\n\nexport default BackofficeDashboardShellPage;\n"],"mappings":";;;;;;;;;AAgBA,IAAM,KAAoC,EACxC,kBAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAQ,GAAU,QAAQ,CAAI,KAAK,EAAE,iBAAiB;CAE5D,OACE,kBAAC,GAAD;EAA2B,YAAY,EAAyB,CAAC;EAC/D,UAAA,kBAAC,GAAD;GACE,QAAQ;IACN;IACA,UAAU,EAAE,oBAAoB;GAClC;GAEA,UAAA,kBAAC,GAAD,EAA+B,OAAO,EAAE,gBAAgB,EAAI,CAAA;EAC1C,CAAA;CACK,CAAA;AAE/B,GAEa,KAAgC,EAC3C,aACA,kBAGE,kBAAC,GAAD;CACE,UAAU,kBAAC,GAAD,EAA4C,YAAW,CAAA;CAEhE;AACO,CAAA"}
|
|
@@ -33,7 +33,7 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
33
33
|
let { t } = e();
|
|
34
34
|
return /* @__PURE__ */ u(m, { title: t("common.notAvailable") });
|
|
35
35
|
}, P = (e) => e == null ? "" : e.kind === "href" ? `href:${e.href}` : `entity-list:${e.entityId}:${JSON.stringify(e.state ?? null)}`, F = (e) => {
|
|
36
|
-
let { entities: n, entityRegistry: r } = t(), [, i] = l(0);
|
|
36
|
+
let { entities: n, entityRegistry: r } = t(), [, i] = l(0), a = e.map(P).join("|");
|
|
37
37
|
return s(() => {
|
|
38
38
|
let t = /* @__PURE__ */ new Set();
|
|
39
39
|
for (let i of e) i?.kind === "entity-list" && n[i.entityId] != null && r.getLoadedListEntity(i.entityId) == null && t.add(i.entityId);
|
|
@@ -54,7 +54,7 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
54
54
|
}, [
|
|
55
55
|
n,
|
|
56
56
|
r,
|
|
57
|
-
|
|
57
|
+
a,
|
|
58
58
|
e
|
|
59
59
|
]), c(() => (e, t) => {
|
|
60
60
|
if (e == null) return t;
|
|
@@ -198,14 +198,17 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
198
198
|
});
|
|
199
199
|
}, q = ({ activeWindowPresetId: s, context: c = j, widget: l, data: p, onWindowPresetChange: m, windowPresets: h = [] }) => {
|
|
200
200
|
let { t: g } = f(), { t: y } = e(), { entities: b } = t(), x = l.description == null ? void 0 : i(l.description, g), S = () => l.dataSource === "query" && p != null ? l.resolve(p, c) : null;
|
|
201
|
-
if (l.kind === "textBlock")
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
children:
|
|
207
|
-
|
|
208
|
-
|
|
201
|
+
if (l.kind === "textBlock") {
|
|
202
|
+
let e = i(l.title, g), t = i(l.body, g);
|
|
203
|
+
return /* @__PURE__ */ u(_, {
|
|
204
|
+
title: e,
|
|
205
|
+
subtitle: x,
|
|
206
|
+
children: /* @__PURE__ */ u("div", {
|
|
207
|
+
className: a,
|
|
208
|
+
children: t
|
|
209
|
+
})
|
|
210
|
+
});
|
|
211
|
+
}
|
|
209
212
|
if (l.kind === "shortcut") {
|
|
210
213
|
let e = b[l.entityId], t = i(l.label, g);
|
|
211
214
|
return e == null ? /* @__PURE__ */ u(_, {
|
|
@@ -240,9 +243,9 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
240
243
|
let t = r(e.columns, {
|
|
241
244
|
tApp: g,
|
|
242
245
|
t: y
|
|
243
|
-
});
|
|
246
|
+
}), n = i(l.title, g);
|
|
244
247
|
return /* @__PURE__ */ u(_, {
|
|
245
|
-
title:
|
|
248
|
+
title: n,
|
|
246
249
|
subtitle: x,
|
|
247
250
|
children: /* @__PURE__ */ u(k, {
|
|
248
251
|
columns: t,
|
|
@@ -326,9 +329,9 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
326
329
|
});
|
|
327
330
|
}
|
|
328
331
|
if (l.kind === "entitySpotlight") {
|
|
329
|
-
let e = S();
|
|
332
|
+
let e = S(), t = l.title == null ? void 0 : i(l.title, g);
|
|
330
333
|
return /* @__PURE__ */ u(_, {
|
|
331
|
-
title:
|
|
334
|
+
title: t,
|
|
332
335
|
subtitle: x,
|
|
333
336
|
children: /* @__PURE__ */ u(G, { item: e })
|
|
334
337
|
});
|
|
@@ -371,14 +374,17 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
371
374
|
})
|
|
372
375
|
});
|
|
373
376
|
}
|
|
374
|
-
if (l.kind === "quickActions")
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
377
|
+
if (l.kind === "quickActions") {
|
|
378
|
+
let e = l.title == null ? y("dashboard.actions.openTool") : i(l.title, g);
|
|
379
|
+
return /* @__PURE__ */ u(_, {
|
|
380
|
+
title: e,
|
|
381
|
+
subtitle: x,
|
|
382
|
+
children: /* @__PURE__ */ u(R, {
|
|
383
|
+
layout: l.layout?.zone === "aside" ? "stack" : "grid",
|
|
384
|
+
actions: l.actions
|
|
385
|
+
})
|
|
386
|
+
});
|
|
387
|
+
}
|
|
382
388
|
if (l.kind === "windowControl") return /* @__PURE__ */ u(_, {
|
|
383
389
|
title: i(l.title, g),
|
|
384
390
|
subtitle: x,
|
|
@@ -395,21 +401,29 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
395
401
|
});
|
|
396
402
|
if (l.kind === "statusSummary") {
|
|
397
403
|
let e = S();
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
+
if (e == null) {
|
|
405
|
+
let e = l.title == null ? void 0 : i(l.title, g);
|
|
406
|
+
return /* @__PURE__ */ u(_, {
|
|
407
|
+
title: e,
|
|
408
|
+
subtitle: x,
|
|
409
|
+
children: /* @__PURE__ */ u(N, {})
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
let t = l.title == null ? void 0 : i(l.title, g);
|
|
413
|
+
return /* @__PURE__ */ u(_, {
|
|
414
|
+
title: t,
|
|
404
415
|
subtitle: x,
|
|
405
416
|
children: /* @__PURE__ */ u(L, { items: e })
|
|
406
417
|
});
|
|
407
418
|
}
|
|
408
|
-
if (l.kind === "recentItems")
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
419
|
+
if (l.kind === "recentItems") {
|
|
420
|
+
let e = l.title == null ? y("dashboard.title") : i(l.title, g);
|
|
421
|
+
return /* @__PURE__ */ u(_, {
|
|
422
|
+
title: e,
|
|
423
|
+
subtitle: x,
|
|
424
|
+
children: /* @__PURE__ */ u(N, {})
|
|
425
|
+
});
|
|
426
|
+
}
|
|
413
427
|
let C = b[l.entityId];
|
|
414
428
|
if (C?.kind !== "list-detail") return /* @__PURE__ */ u(_, {
|
|
415
429
|
title: i(l.label, g),
|
|
@@ -417,8 +431,10 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
417
431
|
children: /* @__PURE__ */ u(N, {})
|
|
418
432
|
});
|
|
419
433
|
let w = S(), T = y("common.notAvailable");
|
|
420
|
-
|
|
421
|
-
|
|
434
|
+
typeof w?.count == "number" && (T = w.count);
|
|
435
|
+
let E = i(l.label, g);
|
|
436
|
+
return /* @__PURE__ */ u(_, {
|
|
437
|
+
title: E,
|
|
422
438
|
subtitle: x,
|
|
423
439
|
children: /* @__PURE__ */ d("div", {
|
|
424
440
|
className: a,
|
|
@@ -433,14 +449,17 @@ var { useLazyLoadQuery: A } = p, j = { window: {
|
|
|
433
449
|
}] })]
|
|
434
450
|
})
|
|
435
451
|
});
|
|
436
|
-
}, J = ({ activeWindowPresetId: e, context: t = j, onWindowPresetChange: n, widget: r, windowPresets: i }) =>
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
452
|
+
}, J = ({ activeWindowPresetId: e, context: t = j, onWindowPresetChange: n, widget: r, windowPresets: i }) => {
|
|
453
|
+
let a = A(r.query, M(r, t), { fetchPolicy: "store-or-network" });
|
|
454
|
+
return /* @__PURE__ */ u(q, {
|
|
455
|
+
activeWindowPresetId: e,
|
|
456
|
+
context: t,
|
|
457
|
+
data: a,
|
|
458
|
+
onWindowPresetChange: n,
|
|
459
|
+
widget: r,
|
|
460
|
+
windowPresets: i
|
|
461
|
+
});
|
|
462
|
+
}, Y = (e) => {
|
|
444
463
|
let { widget: t } = e;
|
|
445
464
|
return t.dataSource === "query" ? /* @__PURE__ */ u(J, {
|
|
446
465
|
...e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useEffect, useMemo, useState, type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DashboardMetricGroup } from '@plumile/ui/components/dashboard/dashboard_metric_group/DashboardMetricGroup.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport { DashboardStatusList } from '@plumile/ui/components/dashboard/dashboard_status_list/DashboardStatusList.js';\nimport { DashboardBreakdownList } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardBreakdownList.js';\nimport { DashboardEntitySpotlight } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardEntitySpotlight.js';\nimport { DashboardHealthMatrix } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardHealthMatrix.js';\nimport { DashboardRiskQueue } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardRiskQueue.js';\nimport { DashboardSlaGauge } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardSlaGauge.js';\nimport { DashboardTimelineChart } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTimelineChart.js';\nimport { DashboardTrendMetric } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTrendMetric.js';\nimport { DashboardWindowControl } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardWindowControl.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst serializeDashboardTarget = (\n target: BackofficeDashboardLinkTarget | undefined,\n): string => {\n if (target == null) {\n return '';\n }\n if (target.kind === 'href') {\n return `href:${target.href}`;\n }\n return `entity-list:${target.entityId}:${JSON.stringify(\n target.state ?? null,\n )}`;\n};\n\nconst useDashboardTargetHrefResolver = (\n targets: readonly (BackofficeDashboardLinkTarget | undefined)[],\n): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => string | undefined) => {\n const { entities, entityRegistry } = useBackofficeConfig();\n const [, setVersion] = useState(0);\n const targetKey = targets.map(serializeDashboardTarget).join('|');\n\n useEffect(() => {\n const entityIds = new Set<string>();\n for (const target of targets) {\n if (\n target?.kind === 'entity-list' &&\n entities[target.entityId] != null &&\n entityRegistry.getLoadedListEntity(target.entityId) == null\n ) {\n entityIds.add(target.entityId);\n }\n }\n\n if (entityIds.size === 0) {\n return undefined;\n }\n\n let cancelled = false;\n Promise.all(\n Array.from(entityIds).map(async (entityId) => {\n try {\n await entityRegistry.loadListEntity(entityId);\n } catch {\n return null;\n }\n return entityId;\n }),\n ).then(\n () => {\n if (cancelled) {\n return;\n }\n setVersion((current) => {\n return current + 1;\n });\n },\n () => {\n return undefined;\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [entities, entityRegistry, targetKey, targets]);\n\n return useMemo(() => {\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): string | undefined => {\n if (target == null) {\n return fallbackHref;\n }\n if (target.kind === 'href') {\n return target.href;\n }\n\n const entity = entities[target.entityId];\n if (entity == null) {\n return fallbackHref;\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target.entityId);\n if (loadedEntity != null) {\n return buildBackofficeListHref(loadedEntity.config, {\n where: target.state?.where,\n sort: target.state?.sort,\n });\n }\n\n return buildBackofficeFallbackListHref(\n entity.routes.list,\n target.state?.where ?? null,\n target.state?.filters,\n );\n };\n }, [entities, entityRegistry]);\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n metrics.map((metric) => {\n return metric.target;\n }),\n );\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n href: resolveHref(metric.target, metric.href),\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n};\n\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n items.map((item) => {\n return item.target;\n }),\n );\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n actions.map((action) => {\n return action.target;\n }),\n );\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={actions.map((action) => {\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return {\n id: action.id,\n href: resolveHref(action.target, action.href) ?? '#',\n label,\n };\n })}\n />\n );\n};\n\nconst collectTargets = (\n values: readonly {\n target?: BackofficeDashboardLinkTarget;\n }[],\n): readonly (BackofficeDashboardLinkTarget | undefined)[] => {\n return values.map((value) => {\n return value.target;\n });\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([metric.target]);\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n href={resolveHref(metric.target, metric.href)}\n tone={metric.tone}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n sparkline={metric.sparkline}\n sparklineLabel={resolveLabel(metric.label, tApp)}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([gauge.target]);\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n max={gauge.max}\n threshold={gauge.threshold}\n unit={gauge.unit}\n tone={gauge.tone}\n href={resolveHref(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n tone: item.tone,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null ? resolveLabel(result.emptyLabel, tApp) : ''\n }\n series={result.series.map((serie) => {\n return {\n ...serie,\n label: resolveLabel(serie.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver([item?.target]);\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n href={resolveHref(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n tone={item.tone}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n rows.flatMap((row) => {\n return row.cells.map((cell) => {\n return cell.target;\n });\n }),\n );\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n href: resolveHref(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n tone: cell.tone,\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData() as {\n columns: readonly BackofficeColumnSpec[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusSummaryContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useEffect, useMemo, useState, type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DashboardMetricGroup } from '@plumile/ui/components/dashboard/dashboard_metric_group/DashboardMetricGroup.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport { DashboardStatusList } from '@plumile/ui/components/dashboard/dashboard_status_list/DashboardStatusList.js';\nimport { DashboardBreakdownList } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardBreakdownList.js';\nimport { DashboardEntitySpotlight } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardEntitySpotlight.js';\nimport { DashboardHealthMatrix } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardHealthMatrix.js';\nimport { DashboardRiskQueue } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardRiskQueue.js';\nimport { DashboardSlaGauge } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardSlaGauge.js';\nimport { DashboardTimelineChart } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTimelineChart.js';\nimport { DashboardTrendMetric } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTrendMetric.js';\nimport { DashboardWindowControl } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardWindowControl.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst serializeDashboardTarget = (\n target: BackofficeDashboardLinkTarget | undefined,\n): string => {\n if (target == null) {\n return '';\n }\n if (target.kind === 'href') {\n return `href:${target.href}`;\n }\n return `entity-list:${target.entityId}:${JSON.stringify(\n target.state ?? null,\n )}`;\n};\n\nconst useDashboardTargetHrefResolver = (\n targets: readonly (BackofficeDashboardLinkTarget | undefined)[],\n): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => string | undefined) => {\n const { entities, entityRegistry } = useBackofficeConfig();\n const [, setVersion] = useState(0);\n const targetKey = targets.map(serializeDashboardTarget).join('|');\n\n useEffect(() => {\n const entityIds = new Set<string>();\n for (const target of targets) {\n if (\n target?.kind === 'entity-list' &&\n entities[target.entityId] != null &&\n entityRegistry.getLoadedListEntity(target.entityId) == null\n ) {\n entityIds.add(target.entityId);\n }\n }\n\n if (entityIds.size === 0) {\n return undefined;\n }\n\n let cancelled = false;\n Promise.all(\n Array.from(entityIds).map(async (entityId) => {\n try {\n await entityRegistry.loadListEntity(entityId);\n } catch {\n return null;\n }\n return entityId;\n }),\n ).then(\n () => {\n if (cancelled) {\n return;\n }\n setVersion((current) => {\n return current + 1;\n });\n },\n () => {\n return undefined;\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [entities, entityRegistry, targetKey, targets]);\n\n return useMemo(() => {\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): string | undefined => {\n if (target == null) {\n return fallbackHref;\n }\n if (target.kind === 'href') {\n return target.href;\n }\n\n const entity = entities[target.entityId];\n if (entity == null) {\n return fallbackHref;\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target.entityId);\n if (loadedEntity != null) {\n return buildBackofficeListHref(loadedEntity.config, {\n where: target.state?.where,\n sort: target.state?.sort,\n });\n }\n\n return buildBackofficeFallbackListHref(\n entity.routes.list,\n target.state?.where ?? null,\n target.state?.filters,\n );\n };\n }, [entities, entityRegistry]);\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n metrics.map((metric) => {\n return metric.target;\n }),\n );\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n href: resolveHref(metric.target, metric.href),\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n};\n\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n items.map((item) => {\n return item.target;\n }),\n );\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n actions.map((action) => {\n return action.target;\n }),\n );\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={actions.map((action) => {\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return {\n id: action.id,\n href: resolveHref(action.target, action.href) ?? '#',\n label,\n };\n })}\n />\n );\n};\n\nconst collectTargets = (\n values: readonly {\n target?: BackofficeDashboardLinkTarget;\n }[],\n): readonly (BackofficeDashboardLinkTarget | undefined)[] => {\n return values.map((value) => {\n return value.target;\n });\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([metric.target]);\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n href={resolveHref(metric.target, metric.href)}\n tone={metric.tone}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n sparkline={metric.sparkline}\n sparklineLabel={resolveLabel(metric.label, tApp)}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([gauge.target]);\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n max={gauge.max}\n threshold={gauge.threshold}\n unit={gauge.unit}\n tone={gauge.tone}\n href={resolveHref(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n tone: item.tone,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null ? resolveLabel(result.emptyLabel, tApp) : ''\n }\n series={result.series.map((serie) => {\n return {\n ...serie,\n label: resolveLabel(serie.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver([item?.target]);\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n href={resolveHref(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n tone={item.tone}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n rows.flatMap((row) => {\n return row.cells.map((cell) => {\n return cell.target;\n });\n }),\n );\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n href: resolveHref(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n tone: cell.tone,\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData() as {\n columns: readonly BackofficeColumnSpec[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusSummaryContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAM,EAAE,kBAAA,MAAqB,GA8BvB,IAAuD,EAC3D,QAAQ;CAPR,IAAI;CACJ,QANsC,MAC/B,EAAE,uBAAuB,MAAM;CAMtC,uBAAM,IAAI,KAAK,CAAC,EAAA,CAAE,YAAY;CAC9B,qBAAI,IAAI,KAAK,CAAC,EAAA,CAAE,YAAY;AAIpB,EACV,GAEM,KACJ,GACA,MAEI,OAAO,EAAO,aAAc,aACvB,EAAO,UAAU,CAAO,IAG1B,EAAO,WAGV,UAA+C;CACnD,IAAM,EAAE,MAAM,EAA8B;CAE5C,OAAO,kBAAC,GAAD,EAAsB,OAAO,EAAE,qBAAqB,EAAI,CAAA;AACjE,GAEM,KACJ,MAEI,KAAU,OACL,KAEL,EAAO,SAAS,SACX,QAAQ,EAAO,SAEjB,eAAe,EAAO,SAAS,GAAG,KAAK,UAC5C,EAAO,SAAS,IAClB,KAGI,KACJ,MAI0B;CAC1B,IAAM,EAAE,aAAU,sBAAmB,EAAoB,GACnD,GAAG,KAAc,EAAS,CAAC,GAC3B,IAAY,EAAQ,IAAI,CAAwB,CAAC,CAAC,KAAK,GAAG;CA+ChE,OA7CA,QAAgB;EACd,IAAM,oBAAY,IAAI,IAAY;EAClC,KAAK,IAAM,KAAU,GACnB,AACE,GAAQ,SAAS,iBACjB,EAAS,EAAO,aAAa,QAC7B,EAAe,oBAAoB,EAAO,QAAQ,KAAK,QAEvD,EAAU,IAAI,EAAO,QAAQ;EAIjC,IAAI,EAAU,SAAS,GACrB;EAGF,IAAI,IAAY;EAwBhB,OAvBA,QAAQ,IACN,MAAM,KAAK,CAAS,CAAC,CAAC,IAAI,OAAO,MAAa;GAC5C,IAAI;IACF,MAAM,EAAe,eAAe,CAAQ;GAC9C,QAAQ;IACN,OAAO;GACT;GACA,OAAO;EACT,CAAC,CACH,CAAC,CAAC,WACM;GACA,KAGJ,GAAY,MACH,IAAU,CAClB;EACH,SACM,CAEN,CACF,SAEa;GACX,IAAY;EACd;CACF,GAAG;EAAC;EAAU;EAAgB;EAAW;CAAO,CAAC,GAE1C,SAEH,GACA,MACuB;EACvB,IAAI,KAAU,MACZ,OAAO;EAET,IAAI,EAAO,SAAS,QAClB,OAAO,EAAO;EAGhB,IAAM,IAAS,EAAS,EAAO;EAC/B,IAAI,KAAU,MACZ,OAAO;EAGT,IAAM,IAAe,EAAe,oBAAoB,EAAO,QAAQ;EAQvE,OAPI,KAAgB,OAOb,EACL,EAAO,OAAO,MACd,EAAO,OAAO,SAAS,MACvB,EAAO,OAAO,OAChB,IAVS,EAAwB,EAAa,QAAQ;GAClD,OAAO,EAAO,OAAO;GACrB,MAAM,EAAO,OAAO;EACtB,CAAC;CAQL,GACC,CAAC,GAAU,CAAc,CAAC;AAC/B,GAWM,KAA+B,EACnC,iBAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAClB,EAAQ,KAAK,MACJ,EAAO,MACf,CACH;CAEA,OACE,kBAAC,GAAD;EACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,SAAS,EAAQ,KAAK,OACb;GACL,IAAI,EAAO;GACX,MAAM,EAAY,EAAO,QAAQ,EAAO,IAAI;GAC5C,OAAO,EAAa,EAAO,OAAO,CAAI;GACtC,OAAO,EAAO,SAAS,EAAE,qBAAqB;GAC9C,MACE,EAAO,QAAQ,OAAyC,KAAA,IAAlC,EAAa,EAAO,MAAM,CAAI;EACxD,EACD;CACF,CAAA;AAEL,GAUM,KAAiC,EACrC,eAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAClB,EAAM,KAAK,MACF,EAAK,MACb,CACH;CAEA,OACE,kBAAC,GAAD;EACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,OAAO,EAAM,KAAK,OACT;GACL,IAAI,EAAK;GACT,MAAM,EAAY,EAAK,QAAQ,EAAK,IAAI;GACxC,OAAO,EAAa,EAAK,OAAO,CAAI;GACpC,OAAO,EAAK,SAAS,EAAE,qBAAqB;EAC9C,EACD;CACF,CAAA;AAEL,GASM,KAAgC,EACpC,YACA,gBAIiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,IAAc,EAClB,EAAQ,KAAK,MACJ,EAAO,MACf,CACH;CAEA,OACE,kBAAC,GAAD;EACU;EACR,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,SAAS,EAAQ,KAAK,MAAW;GAC/B,IAAI;GAOJ,OANA,AAGE,IAHE,OAAO,EAAO,SAAU,WAClB,EAAO,QAEP,EAAa,EAAO,OAAO,CAAI,GAGlC;IACL,IAAI,EAAO;IACX,MAAM,EAAY,EAAO,QAAQ,EAAO,IAAI,KAAK;IACjD;GACF;EACF,CAAC;CACF,CAAA;AAEL,GAEM,KACJ,MAIO,EAAO,KAAK,MACV,EAAM,MACd,GAGG,KAA+B,EACnC,gBAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAA+B,CAAC,EAAO,MAAM,CAAC;CAElE,OACE,kBAAC,GAAD;EACE,OAAO,EAAa,EAAO,OAAO,CAAI;EACtC,OAAO,EAAO,SAAS,EAAE,qBAAqB;EAC9C,MAAM,EAAO;EACb,MAAM,EAAY,EAAO,QAAQ,EAAO,IAAI;EAC5C,MAAM,EAAO;EACb,OACE,EAAO,SAAS,OAQZ,KAAA,IAPA;GACE,GAAG,EAAO;GACV,OACE,EAAO,MAAM,SAAS,OAElB,KAAA,IADA,EAAa,EAAO,MAAM,OAAO,CAAI;EAE7C;EAGN,WAAW,EAAO;EAClB,gBAAgB,EAAa,EAAO,OAAO,CAAI;CAChD,CAAA;AAEL,GAEM,KAA4B,EAChC,eAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAA+B,CAAC,EAAM,MAAM,CAAC;CAMjE,OAJI,EAAM,SAAS,OACV,kBAAC,GAAD,EAAsB,OAAO,EAAE,qBAAqB,EAAI,CAAA,IAI/D,kBAAC,GAAD;EACE,OAAO,EAAa,EAAM,OAAO,CAAI;EACrC,OAAO,EAAM;EACb,KAAK,EAAM;EACX,WAAW,EAAM;EACjB,MAAM,EAAM;EACZ,MAAM,EAAM;EACZ,MAAM,EAAY,EAAM,QAAQ,EAAM,IAAI;CAC3C,CAAA;AAEL,GAEM,KAAiC,EACrC,eAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAA+B,EAAe,CAAK,CAAC;CAExE,OACE,kBAAC,GAAD;EACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,OAAO,EAAM,KAAK,OACT;GACL,IAAI,EAAK;GACT,MAAM,EAAY,EAAK,QAAQ,EAAK,IAAI;GACxC,OAAO,EAAa,EAAK,OAAO,CAAI;GACpC,MAAM,EAAK,QAAQ,OAAuC,KAAA,IAAhC,EAAa,EAAK,MAAM,CAAI;GACtD,MAAM,EAAK;GACX,OAAO,EAAK,SAAS,EAAE,qBAAqB;EAC9C,EACD;CACF,CAAA;AAEL,GAEM,KAAiC,EACrC,cACA,UACA,gBAKiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe;CAEnC,OACE,kBAAC,GAAD;EACE,WAAW,EAAa,GAAW,CAAI;EAChC;EACP,cACE,EAAO,cAAc,OAA+C,KAAxC,EAAa,EAAO,YAAY,CAAI;EAElE,QAAQ,EAAO,OAAO,KAAK,OAClB;GACL,GAAG;GACH,OAAO,EAAa,EAAM,OAAO,CAAI;EACvC,EACD;CACF,CAAA;AAEL,GAEM,KAA6B,EACjC,eAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAA+B,EAAe,CAAK,CAAC;CAExE,OACE,kBAAC,GAAD;EACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,OAAO,EAAM,KAAK,OACT;GACL,IAAI,EAAK;GACT,MAAM,EAAY,EAAK,QAAQ,EAAK,IAAI;GACxC,OAAO,EAAa,EAAK,OAAO,CAAI;GACpC,MAAM,EAAK,QAAQ,OAAuC,KAAA,IAAhC,EAAa,EAAK,MAAM,CAAI;GACtD,UAAU,EAAK;GACf,OAAO,EAAK,SAAS,EAAE,qBAAqB;EAC9C,EACD;CACF,CAAA;AAEL,GAEM,KAAmC,EACvC,cAGiB;CACjB,IAAM,EAAK,MAAS,EAAe,GAC7B,IAAc,EAA+B,CAAC,GAAM,MAAM,CAAC;CAMjE,OAJI,KAAQ,OACH,kBAAC,GAAD,CAA4B,CAAA,IAInC,kBAAC,GAAD;EACE,MAAM,EAAY,EAAK,QAAQ,EAAK,IAAI;EACxC,OAAO,EAAa,EAAK,OAAO,CAAI;EACpC,OAAO,EAAa,EAAK,OAAO,CAAI;EACpC,MAAM,EAAK;EACX,MAAM,EAAK,MAAM,KAAK,OACb;GACL,IAAI,EAAK;GACT,OAAO,EAAa,EAAK,OAAO,CAAI;GACpC,OAAO,EAAK;EACd,EACD;CACF,CAAA;AAEL,GAEM,KAAgC,EACpC,cAGiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAc,EAClB,EAAK,SAAS,MACL,EAAI,MAAM,KAAK,MACb,EAAK,MACb,CACF,CACH;CAEA,OACE,kBAAC,GAAD;EACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;EACxC,MAAM,EAAK,KAAK,OACP;GACL,IAAI,EAAI;GACR,OAAO,EAAa,EAAI,OAAO,CAAI;GACnC,OAAO,EAAI,MAAM,KAAK,OACb;IACL,IAAI,EAAK;IACT,MAAM,EAAY,EAAK,QAAQ,EAAK,IAAI;IACxC,OAAO,EAAa,EAAK,OAAO,CAAI;IACpC,MAAM,EAAK;IACX,OAAO,EAAK,SAAS,EAAE,qBAAqB;GAC9C,EACD;EACH,EACD;CACF,CAAA;AAEL,GAEM,KAAqB,EACzB,yBACA,aAAU,GACV,WACA,SACA,yBACA,mBAAgB,CAAC,QAC+B;CAChD,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,gBAAa,EAAoB,GACnC,IACJ,EAAO,eAAe,OAElB,KAAA,IADA,EAAa,EAAO,aAAa,CAAI,GAGrC,UACA,EAAO,eAAe,WAAW,KAAQ,OACpC,EAAO,QAAQ,GAAM,CAAO,IAE9B;CAGT,IAAI,EAAO,SAAS,aAAa;EAC/B,IAAM,IAAQ,EAAa,EAAO,OAAO,CAAI,GACvC,IAAO,EAAa,EAAO,MAAM,CAAI;EAC3C,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,OAAD;IAAK,WAAW;IAAkB,UAAA;GAAU,CAAA;EAC9B,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,YAAY;EAC9B,IAAM,IAAS,EAAS,EAAO,WACzB,IAAQ,EAAa,EAAO,OAAO,CAAI;EAuB7C,OAtBI,KAAU,OAEV,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAGhB,EAAO,SAAS,SAEhB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EACE,SAAS,CACP;IACE,IAAI,EAAO;IACX,MAAM,EAAO,OAAO;IACpB,OAAO,EAAE,4BAA4B;GACvC,CACF,EACD,CAAA;EACa,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EACE,SAAS,CACP;IACE,IAAI,EAAO;IACX,MAAM,EAAO,OAAO;IACpB,OAAO,EAAE,4BAA4B;GACvC,CACF,EACD,CAAA;EACa,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,gBAAgB;EAClC,IAAM,IAAW,EAAY;EAI7B,IAAI,KAAY,MACd,OACE,kBAAC,GAAD;GACE,OAAO,EAAa,EAAO,OAAO,CAAI;GACtC,UAAU;GAEV,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA;EAGpB,IAAM,IAAU,EAAsB,EAAS,SAAS;GACtD;GACA;EACF,CAAC,GACK,IAAQ,EAAa,EAAO,OAAO,CAAI;EAC7C,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD;IACW;IACT,MAAM,EAAS;IACf,WAAW,GAAK,MAAU;KACxB,IAAmB,OAAO,KAAQ,YAA9B,GAAwC;MAE1C,IAAM,EAAE,UAAO;MACf,IAAI,OAAO,KAAO,YAAY,EAAG,KAAK,MAAM,IAC1C,OAAO;KAEX;KACA,OAAO,OAAO,CAAK;IACrB;GACD,CAAA;EACa,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,eAAe;EACjC,IAAM,IAAW,EAAY;EAI7B,OAHI,KAAY,OACP,kBAAC,GAAD,CAA4B,CAAA,IAE9B,kBAAC,GAAD,EAA6B,SAAS,EAAW,CAAA;CAC1D;CAEA,IAAI,EAAO,SAAS,eAAe;EACjC,IAAM,IACJ,EAAY,GACR,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA6B,QAAQ,EAAW,CAAA;EAClC,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,YAAY;EAC9B,IAAM,IAAW,EAAY,GACvB,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA0B,OAAO,EAAW,CAAA;EAC9B,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,iBAAiB;EACnC,IAAM,IACJ,EAAY,GACR,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA+B,OAAO,EAAW,CAAA;EACnC,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,iBAAiB;EACnC,IAAM,IACJ,EAAY,GACR,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,OAAO,EAAO;IACd,QAAQ;GACT,CAAA;EACa,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,aAAa;EAC/B,IAAM,IAAW,EAAY,GACvB,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA2B,OAAO,EAAW,CAAA;EAC/B,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,mBAAmB;EACrC,IAAM,IACJ,EAAY,GACR,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EACxD,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAAiC,MAAM,EAAW,CAAA;EACpC,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,gBAAgB;EAClC,IAAM,IACJ,EAAY,GACR,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EAQxD,OAPI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAIlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA8B,MAAM,EAAW,CAAA;EACjC,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,qBAAqB;EACvC,IAAM,IAAW,EAAY,GAWvB,IAAQ,EAAa,EAAO,OAAO,CAAI;EAS7C,OARI,KAAY,OAEZ,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA,IAKlB,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD;IACE,WAAW,EAAa,EAAO,WAAW,CAAI;IAC9C,SAAS,EAAS;IAClB,YAAY,EAAO,WAAW,KAAK,OAC1B;KACL,IAAI,EAAS;KACb,OAAO,EAAa,EAAS,OAAO,CAAI;KACxC,OAAO,EAAS;IAClB,EACD;IACD,UAAU,EAAS;IACnB,YAAY,EAAa,EAAO,YAAY,CAAI;IAChD,MAAM,EAAS;IACf,aAAa,EAAa,EAAO,aAAa,CAAI;IAClD,IAAI,EAAS;IACb,aAAa,EAAS;GACvB,CAAA;EACa,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,gBAAgB;EAClC,IAAM,IACJ,EAAO,SAAS,OAEZ,EAAE,4BAA4B,IAD9B,EAAa,EAAO,OAAO,CAAI;EAErC,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD;IACE,QAAQ,EAAO,QAAQ,SAAS,UAAU,UAAU;IACpD,SAAS,EAAO;GACjB,CAAA;EACa,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,iBAClB,OACE,kBAAC,GAAD;EACE,OAAO,EAAa,EAAO,OAAO,CAAI;EACtC,UAAU;EAEV,UAAA,kBAAC,GAAD;GACE,gBAAgB,KAAwB,EAAQ,OAAO;GACvD,WAAW,MAAa;IACtB,IAAuB,CAAQ;GACjC;GACA,SAAS,EAAc,KAAK,OACnB;IACL,IAAI,EAAO;IACX,OAAO,EAAa,EAAO,OAAO,CAAI;GACxC,EACD;EACF,CAAA;CACa,CAAA;CAIpB,IAAI,EAAO,SAAS,iBAAiB;EACnC,IAAM,IAAW,EAAY;EAC7B,IAAI,KAAY,MAAM;GACpB,IAAM,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;GACxD,OACE,kBAAC,GAAD;IAAuB;IAAO,UAAU;IACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;GACd,CAAA;EAEpB;EACA,IAAM,IACJ,EAAO,SAAS,OAA0C,KAAA,IAAnC,EAAa,EAAO,OAAO,CAAI;EACxD,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,EAA+B,OAAO,EAAW,CAAA;EACnC,CAAA;CAEpB;CAEA,IAAI,EAAO,SAAS,eAAe;EACjC,IAAM,IACJ,EAAO,SAAS,OAEZ,EAAE,iBAAiB,IADnB,EAAa,EAAO,OAAO,CAAI;EAErC,OACE,kBAAC,GAAD;GAAuB;GAAO,UAAU;GACtC,UAAA,kBAAC,GAAD,CAA4B,CAAA;EACd,CAAA;CAEpB;CAEA,IAAM,IAAiB,EAAS,EAAO;CACvC,IAAI,GAAgB,SAAS,eAC3B,OACE,kBAAC,GAAD;EACE,OAAO,EAAa,EAAO,OAAO,CAAI;EACtC,UAAU;EAEV,UAAA,kBAAC,GAAD,CAA4B,CAAA;CACd,CAAA;CAGpB,IAAM,IAAW,EAAY,GAKzB,IAA8B,EAAE,qBAAqB;CACzD,AAAI,OAAO,GAAU,SAAU,aAC7B,IAAa,EAAS;CAExB,IAAM,IAAQ,EAAa,EAAO,OAAO,CAAI;CAC7C,OACE,kBAAC,GAAD;EAAuB;EAAO,UAAU;EACtC,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW;IAAmB,UAAA;GAAgB,CAAA,GACnD,kBAAC,GAAD,EACE,SAAS,CACP;IACE,IAAI,EAAe;IACnB,MAAM,GAAU,QAAQ,EAAe,OAAO;IAC9C,QAAQ,GAAU;IAClB,OAAO,EAAE,4BAA4B;GACvC,CACF,EACD,CAAA,CACE;;CACS,CAAA;AAEpB,GAEM,KAAmB,EACvB,yBACA,aAAU,GACV,yBACA,WACA,uBAGiB;CACjB,IAAM,IAAO,EACX,EAAO,OACP,EAAuB,GAAQ,CAAO,GACtC,EACE,aAAa,mBACf,CACF;CAEA,OACE,kBAAC,GAAD;EACwB;EACb;EACH;EACgB;EACd;EACO;CAChB,CAAA;AAEL,GAEa,KACX,MACuB;CACvB,IAAM,EAAE,cAAW;CAKnB,OAJI,EAAO,eAAe,UACjB,kBAAC,GAAD;EAAiB,GAAI;EAAe;CAAS,CAAA,IAG/C,kBAAC,GAAD,EAAmB,GAAI,EAAQ,CAAA;AACxC"}
|
|
@@ -108,10 +108,10 @@ var { usePreloadedQuery: M } = x, N = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
108
108
|
onClick: async (e) => {
|
|
109
109
|
if (V == null || e.defaultPrevented || e.button !== 0 || e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;
|
|
110
110
|
e.preventDefault();
|
|
111
|
-
let t =
|
|
112
|
-
|
|
113
|
-
pathname:
|
|
114
|
-
search:
|
|
111
|
+
let t = await z.loadListEntity(r), n = ce(t.config, { where: c }), i = "";
|
|
112
|
+
n.search !== "" && (i = `?${n.search}`), V.history.push({
|
|
113
|
+
pathname: n.pathname,
|
|
114
|
+
search: i,
|
|
115
115
|
hash: ""
|
|
116
116
|
});
|
|
117
117
|
}
|