@plumile/backoffice-react 0.2.10 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/lib/esm/auth/authRefreshNotice.css.js +1 -1
- package/lib/esm/auth/login/OidcButtons.js +16 -15
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/loginPage.css.js +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js +7 -9
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +7 -9
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -1
- package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
- package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +71 -68
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +21 -18
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
- package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
- package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
- package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
- package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +2 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
- package/lib/esm/hooks/useBackofficeSidebarPins.js +1 -1
- package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
- package/lib/esm/hooks/useSidebarGroupCollapse.js +1 -1
- package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.js +54 -52
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +67 -64
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +10 -9
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +2 -2
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
- package/lib/esm/storybook/backofficeDashboardPageStory.css.js +1 -1
- package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
- package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +8 -4
- package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +4 -3
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBackofficeSidebarPins.js","names":[],"sources":["../../../src/hooks/useBackofficeSidebarPins.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'backoffice.sidebar.pins.v1';\n\ntype PinsPayload = unknown;\n\nconst readPinsFromStorage = (storageKey: string): string[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as PinsPayload;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n } catch {\n return [];\n }\n};\n\nconst normalizePins = (\n pins: readonly string[],\n validIds: Set<string>,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n pins.forEach((entry) => {\n if (!validIds.has(entry)) {\n return;\n }\n if (seen.has(entry)) {\n return;\n }\n seen.add(entry);\n output.push(entry);\n });\n return output;\n};\n\nconst reorderPins = (\n pins: readonly string[],\n fromId: string,\n toId: string,\n): readonly string[] => {\n if (fromId === toId) {\n return pins;\n }\n const fromIndex = pins.indexOf(fromId);\n const toIndex = pins.indexOf(toId);\n if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) {\n return pins;\n }\n const next = [...pins];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, fromId);\n return next;\n};\n\nexport type SidebarPinsState = {\n pins: readonly string[];\n isPinned: (id: string) => boolean;\n pin: (id: string) => void;\n unpin: (id: string) => void;\n toggle: (id: string) => void;\n reorder: (fromId: string, toId: string) => void;\n};\n\nexport type UseBackofficeSidebarPinsInput = {\n enabled?: boolean;\n storageKey?: string;\n visibleEntityIds: readonly string[];\n};\n\nexport const useBackofficeSidebarPins = (\n input: UseBackofficeSidebarPinsInput,\n): SidebarPinsState => {\n const {\n enabled = true,\n storageKey = DEFAULT_STORAGE_KEY,\n visibleEntityIds,\n } = input;\n const validIds = useMemo(() => {\n return new Set(visibleEntityIds);\n }, [visibleEntityIds]);\n\n const [pins, setPins] = useState<string[]>(() => {\n if (!enabled) {\n return [];\n }\n const stored = readPinsFromStorage(storageKey);\n return normalizePins(stored, validIds);\n });\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n setPins((prev) => {\n const normalized = normalizePins(prev, validIds);\n if (normalized.length === prev.length) {\n let unchanged = true;\n for (let index = 0; index < normalized.length; index += 1) {\n if (normalized[index] !== prev[index]) {\n unchanged = false;\n break;\n }\n }\n if (unchanged) {\n return prev;\n }\n }\n return normalized;\n });\n }, [enabled, validIds]);\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n const stored = readPinsFromStorage(storageKey);\n setPins(normalizePins(stored, validIds));\n }, [enabled, storageKey, validIds]);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(pins));\n } catch {\n // Ignore storage errors in non-browser or restricted environments.\n }\n }, [enabled, pins, storageKey]);\n\n const pinsSet = useMemo(() => {\n return new Set(pins);\n }, [pins]);\n\n const pin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n if (!validIds.has(id)) {\n return;\n }\n setPins((prev) => {\n if (prev.includes(id)) {\n return prev;\n }\n return [...prev, id];\n });\n },\n [enabled, validIds],\n );\n\n const unpin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return prev.filter((entry) => {\n return entry !== id;\n });\n });\n },\n [enabled],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (pinsSet.has(id)) {\n unpin(id);\n } else {\n pin(id);\n }\n },\n [pin, pinsSet, unpin],\n );\n\n const reorder = useCallback(\n (fromId: string, toId: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return reorderPins(prev, fromId, toId) as string[];\n });\n },\n [enabled],\n );\n\n const isPinned = useCallback(\n (id: string) => {\n return pinsSet.has(id);\n },\n [pinsSet],\n );\n\n return {\n pins,\n isPinned,\n pin,\n unpin,\n toggle,\n reorder,\n };\n};\n\nexport const __test = {\n normalizePins,\n readPinsFromStorage,\n reorderPins,\n};\n\nexport default useBackofficeSidebarPins;\n"],"mappings":";;AAEA,IAAM,IAAsB,8BAItB,KAAuB,MAAiC;CAC5D,IAAI,OAAO,SAAW,KACpB,OAAO,CAAC;CAEV,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO,CAAC;EAEV,IAAM,IAAS,KAAK,MAAM,CAAG;EAI7B,OAHK,MAAM,QAAQ,CAAM,IAGlB,EAAO,QAAQ,MACb,OAAO,KAAU,QACzB,IAJQ,CAAC;CAKZ,QAAQ;EACN,OAAO,CAAC;CACV;AACF,GAEM,KACJ,GACA,MACa;CACb,IAAM,IAAmB,CAAC,GACpB,oBAAO,IAAI,IAAY;CAW7B,OAVA,EAAK,SAAS,MAAU;EACjB,EAAS,IAAI,CAAK,MAGnB,EAAK,IAAI,CAAK,MAGlB,EAAK,IAAI,CAAK,GACd,EAAO,KAAK,CAAK;CACnB,CAAC,GACM;AACT,GAEM,KACJ,GACA,GACA,MACsB;CACtB,IAAI,MAAW,GACb,OAAO;CAET,IAAM,IAAY,EAAK,QAAQ,CAAM,GAC/B,IAAU,EAAK,QAAQ,CAAI;CACjC,IAAI,MAAc,MAAM,MAAY,MAAM,MAAc,GACtD,OAAO;CAET,IAAM,IAAO,CAAC,GAAG,CAAI;CAGrB,OAFA,EAAK,OAAO,GAAW,CAAC,GACxB,EAAK,OAAO,GAAS,GAAG,CAAM,GACvB;AACT,GAiBa,KACX,MACqB;CACrB,IAAM,EACJ,aAAU,IACV,gBAAa,GACb,wBACE,GACE,IAAW,QACR,IAAI,IAAI,CAAgB,GAC9B,CAAC,CAAgB,CAAC,GAEf,CAAC,GAAM,KAAW,QACjB,IAIE,EADQ,EAAoB,CACd,GAAQ,CAAQ,IAH5B,CAAC,CAIX;CAkCD,AAhCA,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,CAAC,CAAC;GACV;EACF;EACA,GAAS,MAAS;GAChB,IAAM,IAAa,EAAc,GAAM,CAAQ;GAC/C,IAAI,EAAW,WAAW,EAAK,QAAQ;IACrC,IAAI,IAAY;IAChB,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAW,QAAQ,KAAS,GACtD,IAAI,EAAW,OAAW,EAAK,IAAQ;KACrC,IAAY;KACZ;IACF;IAEF,IAAI,GACF,OAAO;GAEX;GACA,OAAO;EACT,CAAC;CACH,GAAG,CAAC,GAAS,CAAQ,CAAC,GAEtB,QAAgB;EACd,IAAI,CAAC,GAAS;GACZ,EAAQ,CAAC,CAAC;GACV;EACF;EACA,IAAM,IAAS,EAAoB,CAAU;EAC7C,EAAQ,EAAc,GAAQ,CAAQ,CAAC;CACzC,GAAG;EAAC;EAAS;EAAY;CAAQ,CAAC,GAElC,QAAgB;EACV,
|
|
1
|
+
{"version":3,"file":"useBackofficeSidebarPins.js","names":[],"sources":["../../../src/hooks/useBackofficeSidebarPins.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'backoffice.sidebar.pins.v1';\n\ntype PinsPayload = unknown;\n\nconst readPinsFromStorage = (storageKey: string): string[] => {\n if (typeof window === 'undefined') {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return [];\n }\n const parsed = JSON.parse(raw) as PinsPayload;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n } catch {\n return [];\n }\n};\n\nconst normalizePins = (\n pins: readonly string[],\n validIds: Set<string>,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n pins.forEach((entry) => {\n if (!validIds.has(entry)) {\n return;\n }\n if (seen.has(entry)) {\n return;\n }\n seen.add(entry);\n output.push(entry);\n });\n return output;\n};\n\nconst reorderPins = (\n pins: readonly string[],\n fromId: string,\n toId: string,\n): readonly string[] => {\n if (fromId === toId) {\n return pins;\n }\n const fromIndex = pins.indexOf(fromId);\n const toIndex = pins.indexOf(toId);\n if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) {\n return pins;\n }\n const next = [...pins];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, fromId);\n return next;\n};\n\nexport type SidebarPinsState = {\n pins: readonly string[];\n isPinned: (id: string) => boolean;\n pin: (id: string) => void;\n unpin: (id: string) => void;\n toggle: (id: string) => void;\n reorder: (fromId: string, toId: string) => void;\n};\n\nexport type UseBackofficeSidebarPinsInput = {\n enabled?: boolean;\n storageKey?: string;\n visibleEntityIds: readonly string[];\n};\n\nexport const useBackofficeSidebarPins = (\n input: UseBackofficeSidebarPinsInput,\n): SidebarPinsState => {\n const {\n enabled = true,\n storageKey = DEFAULT_STORAGE_KEY,\n visibleEntityIds,\n } = input;\n const validIds = useMemo(() => {\n return new Set(visibleEntityIds);\n }, [visibleEntityIds]);\n\n const [pins, setPins] = useState<string[]>(() => {\n if (!enabled) {\n return [];\n }\n const stored = readPinsFromStorage(storageKey);\n return normalizePins(stored, validIds);\n });\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n setPins((prev) => {\n const normalized = normalizePins(prev, validIds);\n if (normalized.length === prev.length) {\n let unchanged = true;\n for (let index = 0; index < normalized.length; index += 1) {\n if (normalized[index] !== prev[index]) {\n unchanged = false;\n break;\n }\n }\n if (unchanged) {\n return prev;\n }\n }\n return normalized;\n });\n }, [enabled, validIds]);\n\n useEffect(() => {\n if (!enabled) {\n setPins([]);\n return;\n }\n const stored = readPinsFromStorage(storageKey);\n setPins(normalizePins(stored, validIds));\n }, [enabled, storageKey, validIds]);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(pins));\n } catch {\n // Ignore storage errors in non-browser or restricted environments.\n }\n }, [enabled, pins, storageKey]);\n\n const pinsSet = useMemo(() => {\n return new Set(pins);\n }, [pins]);\n\n const pin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n if (!validIds.has(id)) {\n return;\n }\n setPins((prev) => {\n if (prev.includes(id)) {\n return prev;\n }\n return [...prev, id];\n });\n },\n [enabled, validIds],\n );\n\n const unpin = useCallback(\n (id: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return prev.filter((entry) => {\n return entry !== id;\n });\n });\n },\n [enabled],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (pinsSet.has(id)) {\n unpin(id);\n } else {\n pin(id);\n }\n },\n [pin, pinsSet, unpin],\n );\n\n const reorder = useCallback(\n (fromId: string, toId: string) => {\n if (!enabled) {\n return;\n }\n setPins((prev) => {\n return reorderPins(prev, fromId, toId) as string[];\n });\n },\n [enabled],\n );\n\n const isPinned = useCallback(\n (id: string) => {\n return pinsSet.has(id);\n },\n [pinsSet],\n );\n\n return {\n pins,\n isPinned,\n pin,\n unpin,\n toggle,\n reorder,\n };\n};\n\nexport const __test = {\n normalizePins,\n readPinsFromStorage,\n reorderPins,\n};\n\nexport default useBackofficeSidebarPins;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSidebarGroupCollapse.js","names":[],"sources":["../../../src/hooks/useSidebarGroupCollapse.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type SidebarGroupCollapseState = Record<string, boolean | undefined>;\n\nexport type UseSidebarGroupCollapseInput = {\n groupIds: readonly string[];\n activeGroupId?: string | null;\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>;\n storageKey?: string;\n persist?: boolean;\n};\n\nconst readStoredState = (\n storageKey: string | undefined,\n): SidebarGroupCollapseState | null => {\n if (storageKey == null || typeof window === 'undefined') {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n const output: SidebarGroupCollapseState = {};\n Object.entries(parsed as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (typeof value === 'boolean') {\n output[key] = value;\n }\n },\n );\n return output;\n } catch {\n return null;\n }\n};\n\nconst buildInitialState = (\n groupIds: readonly string[],\n activeGroupId?: string | null,\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>,\n): SidebarGroupCollapseState => {\n const state: SidebarGroupCollapseState = {};\n groupIds.forEach((groupId) => {\n state[groupId] = defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n if (activeGroupId != null && groupIds.includes(activeGroupId)) {\n state[activeGroupId] = false;\n }\n return state;\n};\n\nexport const useSidebarGroupCollapse = (\n input: UseSidebarGroupCollapseInput,\n): {\n collapsedByGroupId: SidebarGroupCollapseState;\n setCollapsed: (groupId: string, collapsed: boolean) => void;\n} => {\n const {\n activeGroupId,\n defaultCollapsedByGroupId,\n groupIds,\n persist = false,\n storageKey,\n } = input;\n\n const groupIdList = useMemo(() => {\n return [...groupIds];\n }, [groupIds]);\n\n const [collapsedByGroupId, setCollapsedByGroupId] =\n useState<SidebarGroupCollapseState>(() => {\n if (persist) {\n const stored = readStoredState(storageKey);\n if (stored != null) {\n return {\n ...buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n ),\n ...stored,\n };\n }\n }\n return buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n );\n });\n\n useEffect(() => {\n setCollapsedByGroupId((prev) => {\n const next: SidebarGroupCollapseState = {};\n\n groupIdList.forEach((groupId) => {\n const existing = prev[groupId];\n next[groupId] =\n existing ?? defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n\n if (activeGroupId != null && groupIdList.includes(activeGroupId)) {\n next[activeGroupId] = false;\n }\n\n return next;\n });\n }, [activeGroupId, defaultCollapsedByGroupId, groupIdList]);\n\n useEffect(() => {\n if (!persist || storageKey == null || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify(collapsedByGroupId),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [collapsedByGroupId, persist, storageKey]);\n\n useEffect(() => {\n if (activeGroupId == null) {\n return;\n }\n setCollapsedByGroupId((prev) => {\n if (prev[activeGroupId] === false) {\n return prev;\n }\n return {\n ...prev,\n [activeGroupId]: false,\n };\n });\n }, [activeGroupId]);\n\n const setCollapsed = useCallback((groupId: string, collapsed: boolean) => {\n setCollapsedByGroupId((prev) => {\n if (prev[groupId] === collapsed) {\n return prev;\n }\n return {\n ...prev,\n [groupId]: collapsed,\n };\n });\n }, []);\n\n return {\n collapsedByGroupId,\n setCollapsed,\n };\n};\n\nexport default useSidebarGroupCollapse;\n"],"mappings":";;AAYA,IAAM,KACJ,MACqC;CACrC,IAAI,KAAc,QAAQ,OAAO,SAAW,KAC1C,OAAO;CAET,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO;EAET,IAAM,IAAS,KAAK,MAAM,CAAG;EAC7B,IAAsB,OAAO,KAAW,aAApC,GACF,OAAO;EAET,IAAM,IAAoC,CAAC;EAQ3C,OAPA,OAAO,QAAQ,CAAiC,CAAC,CAAC,SAC/C,CAAC,GAAK,OAAW;GAChB,AAAI,OAAO,KAAU,cACnB,EAAO,KAAO;EAElB,CACF,GACO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAEM,KACJ,GACA,GACA,MAC8B;CAC9B,IAAM,IAAmC,CAAC;CAO1C,OANA,EAAS,SAAS,MAAY;EAC5B,EAAM,KAAW,IAA4B,MAAY;CAC3D,CAAC,GACG,KAAiB,QAAQ,EAAS,SAAS,CAAa,MAC1D,EAAM,KAAiB,KAElB;AACT,GAEa,KACX,MAIG;CACH,IAAM,EACJ,kBACA,8BACA,aACA,aAAU,IACV,kBACE,GAEE,IAAc,QACX,CAAC,GAAG,CAAQ,GAClB,CAAC,CAAQ,CAAC,GAEP,CAAC,GAAoB,KACzB,QAA0C;EACxC,IAAI,GAAS;GACX,IAAM,IAAS,EAAgB,CAAU;GACzC,IAAI,KAAU,MACZ,OAAO;IACL,GAAG,EACD,GACA,GACA,CACF;IACA,GAAG;GACL;EAEJ;EACA,OAAO,EACL,GACA,GACA,CACF;CACF,CAAC;CA6DH,OA3DA,QAAgB;EACd,GAAuB,MAAS;GAC9B,IAAM,IAAkC,CAAC;GAYzC,OAVA,EAAY,SAAS,MAAY;IAC/B,IAAM,IAAW,EAAK;IACtB,EAAK,KACH,KAAY,IAA4B,MAAY;GACxD,CAAC,GAEG,KAAiB,QAAQ,EAAY,SAAS,CAAa,MAC7D,EAAK,KAAiB,KAGjB;EACT,CAAC;CACH,GAAG;EAAC;EAAe;EAA2B;CAAW,CAAC,GAE1D,QAAgB;EACV,
|
|
1
|
+
{"version":3,"file":"useSidebarGroupCollapse.js","names":[],"sources":["../../../src/hooks/useSidebarGroupCollapse.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type SidebarGroupCollapseState = Record<string, boolean | undefined>;\n\nexport type UseSidebarGroupCollapseInput = {\n groupIds: readonly string[];\n activeGroupId?: string | null;\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>;\n storageKey?: string;\n persist?: boolean;\n};\n\nconst readStoredState = (\n storageKey: string | undefined,\n): SidebarGroupCollapseState | null => {\n if (storageKey == null || typeof window === 'undefined') {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw == null) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n const output: SidebarGroupCollapseState = {};\n Object.entries(parsed as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (typeof value === 'boolean') {\n output[key] = value;\n }\n },\n );\n return output;\n } catch {\n return null;\n }\n};\n\nconst buildInitialState = (\n groupIds: readonly string[],\n activeGroupId?: string | null,\n defaultCollapsedByGroupId?: Record<string, boolean | undefined>,\n): SidebarGroupCollapseState => {\n const state: SidebarGroupCollapseState = {};\n groupIds.forEach((groupId) => {\n state[groupId] = defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n if (activeGroupId != null && groupIds.includes(activeGroupId)) {\n state[activeGroupId] = false;\n }\n return state;\n};\n\nexport const useSidebarGroupCollapse = (\n input: UseSidebarGroupCollapseInput,\n): {\n collapsedByGroupId: SidebarGroupCollapseState;\n setCollapsed: (groupId: string, collapsed: boolean) => void;\n} => {\n const {\n activeGroupId,\n defaultCollapsedByGroupId,\n groupIds,\n persist = false,\n storageKey,\n } = input;\n\n const groupIdList = useMemo(() => {\n return [...groupIds];\n }, [groupIds]);\n\n const [collapsedByGroupId, setCollapsedByGroupId] =\n useState<SidebarGroupCollapseState>(() => {\n if (persist) {\n const stored = readStoredState(storageKey);\n if (stored != null) {\n return {\n ...buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n ),\n ...stored,\n };\n }\n }\n return buildInitialState(\n groupIdList,\n activeGroupId,\n defaultCollapsedByGroupId,\n );\n });\n\n useEffect(() => {\n setCollapsedByGroupId((prev) => {\n const next: SidebarGroupCollapseState = {};\n\n groupIdList.forEach((groupId) => {\n const existing = prev[groupId];\n next[groupId] =\n existing ?? defaultCollapsedByGroupId?.[groupId] ?? true;\n });\n\n if (activeGroupId != null && groupIdList.includes(activeGroupId)) {\n next[activeGroupId] = false;\n }\n\n return next;\n });\n }, [activeGroupId, defaultCollapsedByGroupId, groupIdList]);\n\n useEffect(() => {\n if (!persist || storageKey == null || typeof window === 'undefined') {\n return;\n }\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify(collapsedByGroupId),\n );\n } catch {\n // Ignore storage quota / privacy mode failures.\n }\n }, [collapsedByGroupId, persist, storageKey]);\n\n useEffect(() => {\n if (activeGroupId == null) {\n return;\n }\n setCollapsedByGroupId((prev) => {\n if (prev[activeGroupId] === false) {\n return prev;\n }\n return {\n ...prev,\n [activeGroupId]: false,\n };\n });\n }, [activeGroupId]);\n\n const setCollapsed = useCallback((groupId: string, collapsed: boolean) => {\n setCollapsedByGroupId((prev) => {\n if (prev[groupId] === collapsed) {\n return prev;\n }\n return {\n ...prev,\n [groupId]: collapsed,\n };\n });\n }, []);\n\n return {\n collapsedByGroupId,\n setCollapsed,\n };\n};\n\nexport default useSidebarGroupCollapse;\n"],"mappings":";;AAYA,IAAM,KACJ,MACqC;CACrC,IAAI,KAAc,QAAQ,OAAO,SAAW,KAC1C,OAAO;CAET,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAU;EAClD,IAAI,KAAO,MACT,OAAO;EAET,IAAM,IAAS,KAAK,MAAM,CAAG;EAC7B,IAAsB,OAAO,KAAW,aAApC,GACF,OAAO;EAET,IAAM,IAAoC,CAAC;EAQ3C,OAPA,OAAO,QAAQ,CAAiC,CAAC,CAAC,SAC/C,CAAC,GAAK,OAAW;GAChB,AAAI,OAAO,KAAU,cACnB,EAAO,KAAO;EAElB,CACF,GACO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAEM,KACJ,GACA,GACA,MAC8B;CAC9B,IAAM,IAAmC,CAAC;CAO1C,OANA,EAAS,SAAS,MAAY;EAC5B,EAAM,KAAW,IAA4B,MAAY;CAC3D,CAAC,GACG,KAAiB,QAAQ,EAAS,SAAS,CAAa,MAC1D,EAAM,KAAiB,KAElB;AACT,GAEa,KACX,MAIG;CACH,IAAM,EACJ,kBACA,8BACA,aACA,aAAU,IACV,kBACE,GAEE,IAAc,QACX,CAAC,GAAG,CAAQ,GAClB,CAAC,CAAQ,CAAC,GAEP,CAAC,GAAoB,KACzB,QAA0C;EACxC,IAAI,GAAS;GACX,IAAM,IAAS,EAAgB,CAAU;GACzC,IAAI,KAAU,MACZ,OAAO;IACL,GAAG,EACD,GACA,GACA,CACF;IACA,GAAG;GACL;EAEJ;EACA,OAAO,EACL,GACA,GACA,CACF;CACF,CAAC;CA6DH,OA3DA,QAAgB;EACd,GAAuB,MAAS;GAC9B,IAAM,IAAkC,CAAC;GAYzC,OAVA,EAAY,SAAS,MAAY;IAC/B,IAAM,IAAW,EAAK;IACtB,EAAK,KACH,KAAY,IAA4B,MAAY;GACxD,CAAC,GAEG,KAAiB,QAAQ,EAAY,SAAS,CAAa,MAC7D,EAAK,KAAiB,KAGjB;EACT,CAAC;CACH,GAAG;EAAC;EAAe;EAA2B;CAAW,CAAC,GAE1D,QAAgB;EACV,IAAC,KAAW,KAAc,QAAQ,OAAO,SAAW,KAGxD,IAAI;GACF,OAAO,aAAa,QAClB,GACA,KAAK,UAAU,CAAkB,CACnC;EACF,QAAQ,CAER;CACF,GAAG;EAAC;EAAoB;EAAS;CAAU,CAAC,GAE5C,QAAgB;EACV,KAAiB,QAGrB,GAAuB,MACjB,EAAK,OAAmB,KACnB,IAEF;GACL,GAAG;IACF,IAAgB;EACnB,CACD;CACH,GAAG,CAAC,CAAa,CAAC,GAcX;EACL;EACA,cAdmB,GAAa,GAAiB,MAAuB;GACxE,GAAuB,MACjB,EAAK,OAAa,IACb,IAEF;IACL,GAAG;KACF,IAAU;GACb,CACD;EACH,GAAG,CAAC,CAIF;CACF;AACF"}
|
|
@@ -7,24 +7,24 @@ import { useBackofficeDashboardConfig as a } from "../provider/useBackofficeLazy
|
|
|
7
7
|
import { getWidgetLabel as o, resolveLabel as s } from "./BackofficeDashboardPage.helpers.js";
|
|
8
8
|
import { loadingBody as c, tileBody as l, tileCount as u } from "./backofficeDashboardPage.css.js";
|
|
9
9
|
import { Suspense as d, lazy as f, useMemo as p, useState as m } from "react";
|
|
10
|
-
import { DashboardGrid as h,
|
|
11
|
-
import { jsx as
|
|
12
|
-
import { useTranslation as
|
|
13
|
-
import { Spinner as
|
|
14
|
-
import { BackofficeEmptyState as
|
|
15
|
-
import { DetailPageTemplate as
|
|
10
|
+
import { DashboardGrid as h, DashboardPanel as g, DashboardQuickActions as _ } from "@plumile/ui";
|
|
11
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
12
|
+
import { useTranslation as b } from "react-i18next";
|
|
13
|
+
import { Spinner as x } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
|
|
14
|
+
import { BackofficeEmptyState as S } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
|
|
15
|
+
import { DetailPageTemplate as C } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
16
16
|
//#region src/pages/BackofficeDashboardPage.tsx
|
|
17
|
-
var
|
|
17
|
+
var w = f(async () => ({ default: (await import("./BackofficeDashboardWidgetContent.js")).BackofficeDashboardWidgetContent })), T = {
|
|
18
18
|
id: "24h",
|
|
19
19
|
label: (e) => e("common.time.lastDay", "24 h"),
|
|
20
20
|
durationMs: 864e5
|
|
21
|
-
},
|
|
21
|
+
}, E = [
|
|
22
22
|
{
|
|
23
23
|
id: "1h",
|
|
24
24
|
label: (e) => e("common.time.lastHour", "1 h"),
|
|
25
25
|
durationMs: 36e5
|
|
26
26
|
},
|
|
27
|
-
|
|
27
|
+
T,
|
|
28
28
|
{
|
|
29
29
|
id: "7d",
|
|
30
30
|
label: (e) => e("common.time.lastSevenDays", "7 j"),
|
|
@@ -35,20 +35,20 @@ var T = f(async () => ({ default: (await import("./BackofficeDashboardWidgetCont
|
|
|
35
35
|
label: (e) => e("common.time.lastThirtyDays", "30 j"),
|
|
36
36
|
durationMs: 2592e6
|
|
37
37
|
}
|
|
38
|
-
],
|
|
38
|
+
], D = () => {
|
|
39
39
|
let { t } = e();
|
|
40
|
-
return /* @__PURE__ */
|
|
41
|
-
},
|
|
40
|
+
return /* @__PURE__ */ v(S, { title: t("common.notAvailable") });
|
|
41
|
+
}, O = () => {
|
|
42
42
|
let { t } = e();
|
|
43
|
-
return /* @__PURE__ */
|
|
43
|
+
return /* @__PURE__ */ y("div", {
|
|
44
44
|
className: c,
|
|
45
|
-
children: [/* @__PURE__ */
|
|
45
|
+
children: [/* @__PURE__ */ v(x, { ariaLabel: t("common.loading") }), /* @__PURE__ */ v("span", { children: t("common.loading") })]
|
|
46
46
|
});
|
|
47
|
-
},
|
|
47
|
+
}, k = (e) => e ?? "m", A = (e) => {
|
|
48
48
|
if (e.layout?.span != null) return e.layout.span;
|
|
49
|
-
let t =
|
|
49
|
+
let t = k(e.size);
|
|
50
50
|
return t === "s" ? 3 : t === "m" ? 4 : t === "l" ? 6 : t === "xl" ? 8 : 12;
|
|
51
|
-
},
|
|
51
|
+
}, j = (e) => e.layout?.tabletSpan, M = (e) => e.windowPresets != null && e.windowPresets.length > 0 ? e.windowPresets : E, N = (e, t) => e.defaultWindowPresetId != null && t.some((t) => t.id === e.defaultWindowPresetId) ? e.defaultWindowPresetId : t[1]?.id ?? t[0]?.id ?? "24h", P = (e, t) => {
|
|
52
52
|
let n = new Date(t), r = new Date(t - e.durationMs);
|
|
53
53
|
return {
|
|
54
54
|
id: e.id,
|
|
@@ -56,73 +56,75 @@ var T = f(async () => ({ default: (await import("./BackofficeDashboardWidgetCont
|
|
|
56
56
|
from: r.toISOString(),
|
|
57
57
|
to: n.toISOString()
|
|
58
58
|
};
|
|
59
|
-
},
|
|
60
|
-
let { t: r } =
|
|
59
|
+
}, F = ({ config: t }) => {
|
|
60
|
+
let { t: r } = b(), { t: i } = e(), a = p(() => M(t), [t]), [c, l] = m(() => N(t, a)), [u, f] = m(() => Date.now()), _ = s(t.title, r), y = t.subtitle == null ? void 0 : s(t.subtitle, r), x = { window: P(a.find((e) => e.id === c) ?? a[0] ?? T, u) }, S = (e) => {
|
|
61
61
|
l(e), f(Date.now());
|
|
62
62
|
};
|
|
63
|
-
return /* @__PURE__ */
|
|
63
|
+
return /* @__PURE__ */ v(C, {
|
|
64
64
|
header: {
|
|
65
|
-
title:
|
|
66
|
-
subtitle:
|
|
65
|
+
title: _,
|
|
66
|
+
subtitle: y ?? i("dashboard.subtitle")
|
|
67
67
|
},
|
|
68
|
-
children: /* @__PURE__ */
|
|
68
|
+
children: /* @__PURE__ */ v(h, {
|
|
69
69
|
columns: 12,
|
|
70
|
-
|
|
70
|
+
items: t.widgets.map((e) => {
|
|
71
71
|
let i = s(o(e, t), r);
|
|
72
|
-
return
|
|
72
|
+
return {
|
|
73
|
+
key: e.id,
|
|
73
74
|
minHeight: e.minHeight ?? "auto",
|
|
74
|
-
span:
|
|
75
|
-
tabletSpan:
|
|
76
|
-
|
|
77
|
-
fallback: () => /* @__PURE__ */
|
|
75
|
+
span: A(e),
|
|
76
|
+
tabletSpan: j(e),
|
|
77
|
+
content: /* @__PURE__ */ v(n, {
|
|
78
|
+
fallback: () => /* @__PURE__ */ v(g, {
|
|
78
79
|
title: i,
|
|
79
|
-
children: /* @__PURE__ */
|
|
80
|
+
children: /* @__PURE__ */ v(D, {})
|
|
80
81
|
}),
|
|
81
|
-
children: /* @__PURE__ */
|
|
82
|
-
fallback: /* @__PURE__ */
|
|
82
|
+
children: /* @__PURE__ */ v(d, {
|
|
83
|
+
fallback: /* @__PURE__ */ v(g, {
|
|
83
84
|
title: i,
|
|
84
|
-
children: /* @__PURE__ */
|
|
85
|
+
children: /* @__PURE__ */ v(O, {})
|
|
85
86
|
}),
|
|
86
|
-
children: /* @__PURE__ */
|
|
87
|
+
children: /* @__PURE__ */ v(w, {
|
|
87
88
|
widget: e,
|
|
88
|
-
context:
|
|
89
|
+
context: x,
|
|
89
90
|
windowPresets: a,
|
|
90
91
|
activeWindowPresetId: c,
|
|
91
|
-
onWindowPresetChange:
|
|
92
|
+
onWindowPresetChange: S
|
|
92
93
|
})
|
|
93
94
|
})
|
|
94
95
|
})
|
|
95
|
-
}
|
|
96
|
+
};
|
|
96
97
|
})
|
|
97
98
|
})
|
|
98
99
|
});
|
|
99
|
-
},
|
|
100
|
-
let { t: o } =
|
|
100
|
+
}, I = ({ prepared: n }) => {
|
|
101
|
+
let { t: o } = b(), { t: c } = e(), { entities: d } = t(), f = a(), p = n?.config ?? f, m = i(c);
|
|
101
102
|
if (p == null) {
|
|
102
103
|
let e = Object.values(d).filter((e) => e.kind === "list-detail" && e.hasList).map((e) => ({
|
|
103
104
|
config: e,
|
|
104
105
|
label: s(e.label, o)
|
|
105
106
|
})).sort((e, t) => e.label.localeCompare(t.label));
|
|
106
|
-
return /* @__PURE__ */
|
|
107
|
+
return /* @__PURE__ */ v(r, {
|
|
107
108
|
breadcrumb: m,
|
|
108
|
-
children: /* @__PURE__ */
|
|
109
|
+
children: /* @__PURE__ */ v(C, {
|
|
109
110
|
header: {
|
|
110
111
|
title: c("dashboard.title"),
|
|
111
112
|
subtitle: c("dashboard.subtitle")
|
|
112
113
|
},
|
|
113
|
-
children: /* @__PURE__ */
|
|
114
|
+
children: /* @__PURE__ */ v(h, {
|
|
114
115
|
columns: 12,
|
|
115
|
-
|
|
116
|
+
items: e.map(({ config: e, label: t }) => ({
|
|
117
|
+
key: e.id,
|
|
116
118
|
span: 4,
|
|
117
|
-
|
|
119
|
+
content: /* @__PURE__ */ v(g, {
|
|
118
120
|
title: t,
|
|
119
|
-
children: /* @__PURE__ */
|
|
121
|
+
children: /* @__PURE__ */ y("div", {
|
|
120
122
|
className: l,
|
|
121
|
-
children: [/* @__PURE__ */
|
|
123
|
+
children: [/* @__PURE__ */ v("div", {
|
|
122
124
|
className: u,
|
|
123
125
|
children: c("common.notAvailable")
|
|
124
|
-
}), /* @__PURE__ */
|
|
125
|
-
emptyState: /* @__PURE__ */
|
|
126
|
+
}), /* @__PURE__ */ v(_, {
|
|
127
|
+
emptyState: /* @__PURE__ */ v(D, {}),
|
|
126
128
|
actions: [{
|
|
127
129
|
id: e.id,
|
|
128
130
|
href: e.routes.list,
|
|
@@ -131,17 +133,17 @@ var T = f(async () => ({ default: (await import("./BackofficeDashboardWidgetCont
|
|
|
131
133
|
})]
|
|
132
134
|
})
|
|
133
135
|
})
|
|
134
|
-
}
|
|
136
|
+
}))
|
|
135
137
|
})
|
|
136
138
|
})
|
|
137
139
|
});
|
|
138
140
|
}
|
|
139
|
-
return /* @__PURE__ */
|
|
141
|
+
return /* @__PURE__ */ v(r, {
|
|
140
142
|
breadcrumb: m,
|
|
141
|
-
children: /* @__PURE__ */
|
|
143
|
+
children: /* @__PURE__ */ v(F, { config: p })
|
|
142
144
|
});
|
|
143
145
|
};
|
|
144
146
|
//#endregion
|
|
145
|
-
export {
|
|
147
|
+
export { I as BackofficeDashboardPage, I as default };
|
|
146
148
|
|
|
147
149
|
//# sourceMappingURL=BackofficeDashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["import { 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 {\n DashboardPanel,\n DashboardQuickActions,\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui';\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 emptyState={<DashboardUnavailableState />}\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":["import { 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 {\n DashboardPanel,\n DashboardQuickActions,\n DashboardGrid,\n} from '@plumile/ui';\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\n columns={12}\n items={config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n return {\n key: widget.id,\n minHeight: widget.minHeight ?? 'auto',\n span: resolveWidgetSpan(widget),\n tabletSpan: resolveWidgetTabletSpan(widget),\n content: (\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 ),\n };\n })}\n />\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\n columns={12}\n items={items.map(({ config, label }) => {\n return {\n key: config.id,\n span: 4,\n content: (\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n emptyState={<DashboardUnavailableState />}\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 ),\n };\n })}\n />\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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"}
|
|
@@ -7,92 +7,92 @@ import { buildEntityDetailBreadcrumb as a } from "../components/backoffice/layou
|
|
|
7
7
|
import { BackofficeLazyEntityCount as o } from "../components/backoffice/refs/BackofficeLazyEntityCount.js";
|
|
8
8
|
import { BackofficeEntityDetailNotFound as s } from "../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js";
|
|
9
9
|
import { resolveVisibleDetailPages as c } from "./detail/pageResolution.js";
|
|
10
|
-
import { headerBlock as l,
|
|
11
|
-
import { resolveLabel as
|
|
12
|
-
import { resolveHeaderItems as
|
|
13
|
-
import { BackofficeEntityDetailLayoutContextProvider as
|
|
14
|
-
import { buildTabsItems as
|
|
15
|
-
import { BackofficeRedirect as
|
|
16
|
-
import { Suspense as
|
|
17
|
-
import { FormattedDate as
|
|
18
|
-
import { jsx as
|
|
19
|
-
import { useTranslation as
|
|
20
|
-
import * as
|
|
21
|
-
import { Spinner as
|
|
22
|
-
import { BACKOFFICE_DATE_TIME_OPTIONS as
|
|
23
|
-
import
|
|
24
|
-
import { Tag as
|
|
25
|
-
import { setWhereValue as
|
|
26
|
-
import
|
|
27
|
-
import { NavigationTabs as
|
|
10
|
+
import { headerBlock as l, headerMetaList as u, headerRelationGroup as d, relationCountLoading as f } from "./backofficeEntityDetailPage.css.js";
|
|
11
|
+
import { resolveLabel as p, resolveRelationValue as m } from "./BackofficeEntityDetailPage.helpers.js";
|
|
12
|
+
import { resolveHeaderItems as h } from "./BackofficeEntityDetailPage.view-helpers.js";
|
|
13
|
+
import { BackofficeEntityDetailLayoutContextProvider as g } from "./detail/BackofficeEntityDetailLayoutContext.js";
|
|
14
|
+
import { buildTabsItems as _ } from "./detail/buildTabsItems.js";
|
|
15
|
+
import { BackofficeRedirect as v } from "./BackofficeRedirect.js";
|
|
16
|
+
import { Suspense as y } from "react";
|
|
17
|
+
import { FormattedDate as b, PageHeader as x, PropertyList as S } from "@plumile/ui";
|
|
18
|
+
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
19
|
+
import { useTranslation as T } from "react-i18next";
|
|
20
|
+
import * as E from "react-relay";
|
|
21
|
+
import { Spinner as D } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
|
|
22
|
+
import { BACKOFFICE_DATE_TIME_OPTIONS as O } from "@plumile/backoffice-core/constants.js";
|
|
23
|
+
import k from "@plumile/router/routing/Link.js";
|
|
24
|
+
import { Tag as A } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
|
|
25
|
+
import { setWhereValue as ee } from "@plumile/backoffice-core/filters/where.js";
|
|
26
|
+
import te from "@plumile/router/routing/useLocation.js";
|
|
27
|
+
import { NavigationTabs as ne } from "@plumile/ui/tabs";
|
|
28
28
|
import { DetailPageTemplate as j } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
29
29
|
import { BackofficeRelationsMenu as M } from "@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js";
|
|
30
30
|
//#region src/pages/BackofficeEntityDetailLayoutPage.tsx
|
|
31
|
-
var { usePreloadedQuery: N } =
|
|
32
|
-
className:
|
|
33
|
-
children: /* @__PURE__ */
|
|
31
|
+
var { usePreloadedQuery: N } = E, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""), F = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", I = () => /* @__PURE__ */ C("span", {
|
|
32
|
+
className: f,
|
|
33
|
+
children: /* @__PURE__ */ C(D, { size: 12 })
|
|
34
34
|
}), L = () => {
|
|
35
35
|
let { t } = e();
|
|
36
|
-
return /* @__PURE__ */
|
|
36
|
+
return /* @__PURE__ */ C("div", {
|
|
37
37
|
role: "status",
|
|
38
38
|
"aria-live": "polite",
|
|
39
39
|
"aria-busy": "true",
|
|
40
|
-
children: /* @__PURE__ */
|
|
40
|
+
children: /* @__PURE__ */ C(D, {
|
|
41
41
|
size: 20,
|
|
42
42
|
ariaLabel: t("common.loading")
|
|
43
43
|
})
|
|
44
44
|
});
|
|
45
|
-
}, R = ({ config: s, prepared:
|
|
46
|
-
let { t: N } =
|
|
45
|
+
}, R = ({ config: s, prepared: f, layoutNodeRef: E, children: D }) => {
|
|
46
|
+
let { t: N } = T(), { t: R } = e(), { entities: z } = t(), { pathname: B } = te(), V = n(s.layoutPage.fragment, E), H = s.layoutPage.toView(V), U = F(B, f.id, s), W = c({
|
|
47
47
|
mainPage: s.pages.mainPage,
|
|
48
48
|
subPages: s.pages.subPages,
|
|
49
49
|
activePagePath: U,
|
|
50
50
|
node: H
|
|
51
51
|
});
|
|
52
|
-
if (!W.hasVisiblePages || W.activePage == null) return /* @__PURE__ */
|
|
52
|
+
if (!W.hasVisiblePages || W.activePage == null) return /* @__PURE__ */ C(v, { to: s.routes.list });
|
|
53
53
|
let { activePage: G } = W;
|
|
54
|
-
if (U !== "" && P(G.path) !== P(U)) return /* @__PURE__ */
|
|
55
|
-
let K =
|
|
54
|
+
if (U !== "" && P(G.path) !== P(U)) return /* @__PURE__ */ C(v, { to: s.routes.detailPage(f.id, G.id) });
|
|
55
|
+
let K = _({
|
|
56
56
|
pages: W.pages,
|
|
57
|
-
id:
|
|
57
|
+
id: f.id,
|
|
58
58
|
tApp: N,
|
|
59
59
|
detailPageHref: s.routes.detailPage
|
|
60
|
-
}), q =
|
|
60
|
+
}), q = h(s.header, H, {
|
|
61
61
|
tApp: N,
|
|
62
62
|
t: R,
|
|
63
63
|
resolveEntityHref: (e, t) => {
|
|
64
64
|
let n = z[e];
|
|
65
65
|
return n == null ? null : n.routes.detail(t);
|
|
66
66
|
},
|
|
67
|
-
renderLink: (e, t) => /* @__PURE__ */
|
|
67
|
+
renderLink: (e, t) => /* @__PURE__ */ C(k, {
|
|
68
68
|
to: e,
|
|
69
69
|
preloadOnHover: "code-and-data",
|
|
70
70
|
children: t
|
|
71
71
|
}),
|
|
72
|
-
renderDate: (e, t) => /* @__PURE__ */
|
|
72
|
+
renderDate: (e, t) => /* @__PURE__ */ C(b, {
|
|
73
73
|
value: e,
|
|
74
|
-
options:
|
|
74
|
+
options: O,
|
|
75
75
|
fallback: t
|
|
76
76
|
}),
|
|
77
|
-
renderTag: (e, t) => /* @__PURE__ */
|
|
77
|
+
renderTag: (e, t) => /* @__PURE__ */ C(A, {
|
|
78
78
|
tone: e,
|
|
79
79
|
children: t
|
|
80
80
|
}),
|
|
81
|
-
renderBadgeRow: (e) => /* @__PURE__ */
|
|
81
|
+
renderBadgeRow: (e) => /* @__PURE__ */ C(r, { items: e })
|
|
82
82
|
}), J = (s.relations ?? []).flatMap((e) => {
|
|
83
|
-
let { path: t, target: n, whereKey: r } = e, i =
|
|
83
|
+
let { path: t, target: n, whereKey: r } = e, i = m(e.value(H));
|
|
84
84
|
if (i == null) return [];
|
|
85
85
|
let a = z[n];
|
|
86
86
|
if (a?.hasList !== !0) return [];
|
|
87
|
-
let s =
|
|
87
|
+
let s = ee(null, r, i, t);
|
|
88
88
|
if (s == null) return [];
|
|
89
89
|
let c = a.listNavigation.encode({ where: s });
|
|
90
90
|
return [{
|
|
91
91
|
id: e.id,
|
|
92
|
-
label:
|
|
93
|
-
count: /* @__PURE__ */
|
|
92
|
+
label: p(e.label, N),
|
|
93
|
+
count: /* @__PURE__ */ C(o, {
|
|
94
94
|
entity: n,
|
|
95
|
-
loadingFallback: /* @__PURE__ */
|
|
95
|
+
loadingFallback: /* @__PURE__ */ C(I, {}),
|
|
96
96
|
where: s
|
|
97
97
|
}),
|
|
98
98
|
destination: {
|
|
@@ -104,66 +104,69 @@ var { usePreloadedQuery: N } = D, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
104
104
|
}), Y = a({
|
|
105
105
|
config: s,
|
|
106
106
|
tApp: N,
|
|
107
|
-
entityId:
|
|
107
|
+
entityId: f.id,
|
|
108
108
|
layoutView: H,
|
|
109
109
|
pageLabel: G.label(N),
|
|
110
110
|
pageId: G.id
|
|
111
111
|
}), X;
|
|
112
|
-
(q.status != null || q.badges != null) && (X = /* @__PURE__ */
|
|
112
|
+
(q.subtitleItems != null || q.status != null || q.badges != null) && (X = /* @__PURE__ */ w("div", {
|
|
113
113
|
className: u,
|
|
114
|
-
children: [q.
|
|
114
|
+
children: [q.subtitleItems, (q.status != null || q.badges != null) && /* @__PURE__ */ w("div", {
|
|
115
|
+
className: "txvbqb5m2 txvbqb2ny txvbqb6sa txvbqb1d5",
|
|
116
|
+
children: [q.status, q.badges]
|
|
117
|
+
})]
|
|
115
118
|
}));
|
|
116
119
|
let Z = null;
|
|
117
|
-
q.items != null && q.items.length > 0 && (Z = /* @__PURE__ */
|
|
118
|
-
className:
|
|
119
|
-
children: /* @__PURE__ */
|
|
120
|
+
q.items != null && q.items.length > 0 && (Z = /* @__PURE__ */ C("div", {
|
|
121
|
+
className: u,
|
|
122
|
+
children: /* @__PURE__ */ C(S, { items: q.items })
|
|
120
123
|
}));
|
|
121
124
|
let Q;
|
|
122
|
-
J.length > 0 && (Q = /* @__PURE__ */
|
|
123
|
-
className:
|
|
124
|
-
children: /* @__PURE__ */
|
|
125
|
+
J.length > 0 && (Q = /* @__PURE__ */ C("div", {
|
|
126
|
+
className: d,
|
|
127
|
+
children: /* @__PURE__ */ C(M, {
|
|
125
128
|
label: R("relations.menu.label"),
|
|
126
129
|
items: J
|
|
127
130
|
})
|
|
128
131
|
}));
|
|
129
|
-
let
|
|
132
|
+
let re = /* @__PURE__ */ w("div", {
|
|
130
133
|
className: l,
|
|
131
|
-
children: [/* @__PURE__ */
|
|
134
|
+
children: [/* @__PURE__ */ C(x, {
|
|
132
135
|
title: q.title,
|
|
133
136
|
description: q.subtitle,
|
|
134
137
|
meta: X,
|
|
135
138
|
actions: Q
|
|
136
139
|
}), Z]
|
|
137
140
|
}), $ = null;
|
|
138
|
-
return W.pages.length > 1 && ($ = /* @__PURE__ */
|
|
141
|
+
return W.pages.length > 1 && ($ = /* @__PURE__ */ C(ne, {
|
|
139
142
|
items: K,
|
|
140
143
|
activeId: G.id,
|
|
141
144
|
variant: "underline"
|
|
142
|
-
})), /* @__PURE__ */
|
|
145
|
+
})), /* @__PURE__ */ C(g, {
|
|
143
146
|
value: {
|
|
144
147
|
activePage: G,
|
|
145
148
|
config: s,
|
|
146
|
-
entityId:
|
|
149
|
+
entityId: f.id,
|
|
147
150
|
layoutView: H,
|
|
148
151
|
tabsItems: K,
|
|
149
152
|
visiblePages: W.pages
|
|
150
153
|
},
|
|
151
|
-
children: /* @__PURE__ */
|
|
154
|
+
children: /* @__PURE__ */ C(i, {
|
|
152
155
|
breadcrumb: Y,
|
|
153
|
-
children: /* @__PURE__ */
|
|
154
|
-
headerNode:
|
|
156
|
+
children: /* @__PURE__ */ C(j, {
|
|
157
|
+
headerNode: re,
|
|
155
158
|
tabsNode: $,
|
|
156
159
|
headerDensity: "compact",
|
|
157
|
-
children: /* @__PURE__ */
|
|
158
|
-
fallback: /* @__PURE__ */
|
|
159
|
-
children:
|
|
160
|
+
children: /* @__PURE__ */ C(y, {
|
|
161
|
+
fallback: /* @__PURE__ */ C(L, {}),
|
|
162
|
+
children: D
|
|
160
163
|
})
|
|
161
164
|
})
|
|
162
165
|
})
|
|
163
166
|
});
|
|
164
167
|
}, z = ({ config: t, prepared: n, children: r }) => {
|
|
165
|
-
let { t: a } =
|
|
166
|
-
return l == null ? /* @__PURE__ */
|
|
168
|
+
let { t: a } = T(), { t: o } = e(), c = N(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
|
|
169
|
+
return l == null ? /* @__PURE__ */ C(i, {
|
|
167
170
|
breadcrumb: [{
|
|
168
171
|
kind: "link",
|
|
169
172
|
target: {
|
|
@@ -180,8 +183,8 @@ var { usePreloadedQuery: N } = D, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
180
183
|
},
|
|
181
184
|
label: o("detail.notFound")
|
|
182
185
|
}],
|
|
183
|
-
children: /* @__PURE__ */
|
|
184
|
-
}) : /* @__PURE__ */
|
|
186
|
+
children: /* @__PURE__ */ C(s, { listHref: t.routes.list })
|
|
187
|
+
}) : /* @__PURE__ */ C(R, {
|
|
185
188
|
config: t,
|
|
186
189
|
prepared: n,
|
|
187
190
|
layoutNodeRef: l,
|