@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.
Files changed (88) hide show
  1. package/README.md +7 -0
  2. package/lib/esm/auth/authRefreshNotice.css.js +1 -1
  3. package/lib/esm/auth/login/OidcButtons.js +16 -15
  4. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  5. package/lib/esm/auth/login/loginPage.css.js +1 -1
  6. package/lib/esm/auth/pages/AcceptInvitationScreen.js +7 -9
  7. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  8. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +7 -9
  9. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  10. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +1 -1
  11. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  12. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -1
  13. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  14. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
  15. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  16. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +71 -68
  17. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  18. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
  19. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  20. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +21 -18
  21. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  22. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  23. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  24. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  25. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  26. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  27. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  28. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  29. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
  30. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  31. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  32. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
  33. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  34. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
  35. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  36. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  37. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
  38. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  39. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  40. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  41. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  42. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  43. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  44. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  45. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  46. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  47. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  48. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  49. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  50. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  51. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  52. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
  53. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +2 -1
  54. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  55. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  56. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  57. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  58. package/lib/esm/hooks/useBackofficeSidebarPins.js +1 -1
  59. package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
  60. package/lib/esm/hooks/useSidebarGroupCollapse.js +1 -1
  61. package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
  62. package/lib/esm/pages/BackofficeDashboardPage.js +54 -52
  63. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  64. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +67 -64
  65. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  66. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +10 -9
  67. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  68. package/lib/esm/pages/BackofficeLayoutPage.js +2 -2
  69. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  70. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  71. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  72. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  73. package/lib/esm/storybook/backofficeDashboardPageStory.css.js +1 -1
  74. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  75. package/lib/esm/style.css +1 -1
  76. package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
  77. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  78. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  79. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  80. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +8 -4
  81. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -1
  82. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
  83. package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
  84. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  85. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  86. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +4 -3
  87. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  88. 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":"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"}
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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"}
@@ -43,7 +43,7 @@ var i = (e) => {
43
43
  c,
44
44
  f
45
45
  ]), t(() => {
46
- if (!(!u || d == null || typeof window > "u")) try {
46
+ if (u && d != null && typeof window < "u") try {
47
47
  window.localStorage.setItem(d, JSON.stringify(p));
48
48
  } catch {}
49
49
  }, [
@@ -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,OAAC,KAAW,KAAc,QAAQ,OAAO,SAAW,MAGxD,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"}
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, DashboardGridItem as g, DashboardPanel as _, DashboardQuickActions as v } from "@plumile/ui";
11
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
12
- import { useTranslation as x } from "react-i18next";
13
- import { Spinner as S } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
14
- import { BackofficeEmptyState as C } from "@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js";
15
- import { DetailPageTemplate as w } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
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 T = f(async () => ({ default: (await import("./BackofficeDashboardWidgetContent.js")).BackofficeDashboardWidgetContent })), E = {
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
- }, D = [
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
- E,
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
- ], O = () => {
38
+ ], D = () => {
39
39
  let { t } = e();
40
- return /* @__PURE__ */ y(C, { title: t("common.notAvailable") });
41
- }, k = () => {
40
+ return /* @__PURE__ */ v(S, { title: t("common.notAvailable") });
41
+ }, O = () => {
42
42
  let { t } = e();
43
- return /* @__PURE__ */ b("div", {
43
+ return /* @__PURE__ */ y("div", {
44
44
  className: c,
45
- children: [/* @__PURE__ */ y(S, { ariaLabel: t("common.loading") }), /* @__PURE__ */ y("span", { children: t("common.loading") })]
45
+ children: [/* @__PURE__ */ v(x, { ariaLabel: t("common.loading") }), /* @__PURE__ */ v("span", { children: t("common.loading") })]
46
46
  });
47
- }, A = (e) => e ?? "m", j = (e) => {
47
+ }, k = (e) => e ?? "m", A = (e) => {
48
48
  if (e.layout?.span != null) return e.layout.span;
49
- let t = A(e.size);
49
+ let t = k(e.size);
50
50
  return t === "s" ? 3 : t === "m" ? 4 : t === "l" ? 6 : t === "xl" ? 8 : 12;
51
- }, M = (e) => e.layout?.tabletSpan, N = (e) => e.windowPresets != null && e.windowPresets.length > 0 ? e.windowPresets : D, P = (e, t) => e.defaultWindowPresetId != null && t.some((t) => t.id === e.defaultWindowPresetId) ? e.defaultWindowPresetId : t[1]?.id ?? t[0]?.id ?? "24h", F = (e, t) => {
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
- }, I = ({ config: t }) => {
60
- let { t: r } = x(), { t: i } = e(), a = p(() => N(t), [t]), [c, l] = m(() => P(t, a)), [u, f] = m(() => Date.now()), v = s(t.title, r), b = t.subtitle == null ? void 0 : s(t.subtitle, r), S = { window: F(a.find((e) => e.id === c) ?? a[0] ?? E, u) }, C = (e) => {
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__ */ y(w, {
63
+ return /* @__PURE__ */ v(C, {
64
64
  header: {
65
- title: v,
66
- subtitle: b ?? i("dashboard.subtitle")
65
+ title: _,
66
+ subtitle: y ?? i("dashboard.subtitle")
67
67
  },
68
- children: /* @__PURE__ */ y(h, {
68
+ children: /* @__PURE__ */ v(h, {
69
69
  columns: 12,
70
- children: t.widgets.map((e) => {
70
+ items: t.widgets.map((e) => {
71
71
  let i = s(o(e, t), r);
72
- return /* @__PURE__ */ y(g, {
72
+ return {
73
+ key: e.id,
73
74
  minHeight: e.minHeight ?? "auto",
74
- span: j(e),
75
- tabletSpan: M(e),
76
- children: /* @__PURE__ */ y(n, {
77
- fallback: () => /* @__PURE__ */ y(_, {
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__ */ y(O, {})
80
+ children: /* @__PURE__ */ v(D, {})
80
81
  }),
81
- children: /* @__PURE__ */ y(d, {
82
- fallback: /* @__PURE__ */ y(_, {
82
+ children: /* @__PURE__ */ v(d, {
83
+ fallback: /* @__PURE__ */ v(g, {
83
84
  title: i,
84
- children: /* @__PURE__ */ y(k, {})
85
+ children: /* @__PURE__ */ v(O, {})
85
86
  }),
86
- children: /* @__PURE__ */ y(T, {
87
+ children: /* @__PURE__ */ v(w, {
87
88
  widget: e,
88
- context: S,
89
+ context: x,
89
90
  windowPresets: a,
90
91
  activeWindowPresetId: c,
91
- onWindowPresetChange: C
92
+ onWindowPresetChange: S
92
93
  })
93
94
  })
94
95
  })
95
- }, e.id);
96
+ };
96
97
  })
97
98
  })
98
99
  });
99
- }, L = ({ prepared: n }) => {
100
- let { t: o } = x(), { t: c } = e(), { entities: d } = t(), f = a(), p = n?.config ?? f, m = i(c);
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__ */ y(r, {
107
+ return /* @__PURE__ */ v(r, {
107
108
  breadcrumb: m,
108
- children: /* @__PURE__ */ y(w, {
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__ */ y(h, {
114
+ children: /* @__PURE__ */ v(h, {
114
115
  columns: 12,
115
- children: e.map(({ config: e, label: t }) => /* @__PURE__ */ y(g, {
116
+ items: e.map(({ config: e, label: t }) => ({
117
+ key: e.id,
116
118
  span: 4,
117
- children: /* @__PURE__ */ y(_, {
119
+ content: /* @__PURE__ */ v(g, {
118
120
  title: t,
119
- children: /* @__PURE__ */ b("div", {
121
+ children: /* @__PURE__ */ y("div", {
120
122
  className: l,
121
- children: [/* @__PURE__ */ y("div", {
123
+ children: [/* @__PURE__ */ v("div", {
122
124
  className: u,
123
125
  children: c("common.notAvailable")
124
- }), /* @__PURE__ */ y(v, {
125
- emptyState: /* @__PURE__ */ y(O, {}),
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
- }, e.id))
136
+ }))
135
137
  })
136
138
  })
137
139
  });
138
140
  }
139
- return /* @__PURE__ */ y(r, {
141
+ return /* @__PURE__ */ v(r, {
140
142
  breadcrumb: m,
141
- children: /* @__PURE__ */ y(I, { config: p })
143
+ children: /* @__PURE__ */ v(F, { config: p })
142
144
  });
143
145
  };
144
146
  //#endregion
145
- export { L as BackofficeDashboardPage, L as default };
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":";;;;;;;;;;;;;;;;AAmCA,IAAM,IAAuC,EAAK,aAEzC,EACL,UAAS,MAFU,OAAO,yCAAA,CAEV,iCAClB,EACD,GAEK,IAAiE;CACrE,IAAI;CACJ,QAAQ,MACC,EAAE,uBAAuB,MAAM;CAExC,YAAY;AACd,GAEM,IACJ;CACE;EACE,IAAI;EACJ,QAAQ,MACC,EAAE,wBAAwB,KAAK;EAExC,YAAY;CACd;CACA;CACA;EACE,IAAI;EACJ,QAAQ,MACC,EAAE,6BAA6B,KAAK;EAE7C,YAAY;CACd;CACA;EACE,IAAI;EACJ,QAAQ,MACC,EAAE,8BAA8B,MAAM;EAE/C,YAAY;CACd;AACF,GAEI,UAA+C;CACnD,IAAM,EAAE,MAAM,EAA8B;CAE5C,OAAO,kBAAC,GAAD,EAAsB,OAAO,EAAE,qBAAqB,EAAI,CAAA;AACjE,GAEM,UAA2C;CAC/C,IAAM,EAAE,MAAM,EAA8B;CAE5C,OACE,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,kBAAC,GAAD,EAAS,WAAW,EAAE,gBAAgB,EAAI,CAAA,GAC1C,kBAAC,QAAD,EAAA,UAAO,EAAE,gBAAgB,EAAQ,CAAA,CAC9B;;AAET,GAEM,KACJ,MAEO,KAAQ,KAGX,KACJ,MACkC;CAClC,IAAI,EAAO,QAAQ,QAAQ,MACzB,OAAO,EAAO,OAAO;CAGvB,IAAM,IAAO,EAAkB,EAAO,IAAI;CAa1C,OAZI,MAAS,MACJ,IAEL,MAAS,MACJ,IAEL,MAAS,MACJ,IAEL,MAAS,OACJ,IAEF;AACT,GAEM,KACJ,MAEO,EAAO,QAAQ,YAOlB,KACJ,MAEI,EAAO,iBAAiB,QAAQ,EAAO,cAAc,SAAS,IACzD,EAAO,gBAET,GAGH,KACJ,GACA,MAGE,EAAO,yBAAyB,QAChC,EAAQ,MAAM,MACL,EAAO,OAAO,EAAO,qBAC7B,IAEM,EAAO,wBAET,EAAQ,EAAE,EAAE,MAAM,EAAQ,EAAE,EAAE,MAAM,OAGvC,KACJ,GACA,MACmC;CACnC,IAAM,IAAK,IAAI,KAAK,CAAK,GACnB,IAAO,IAAI,KAAK,IAAQ,EAAO,UAAU;CAC/C,OAAO;EACL,IAAI,EAAO;EACX,OAAO,EAAO;EACd,MAAM,EAAK,YAAY;EACvB,IAAI,EAAG,YAAY;CACrB;AACF,GAEM,KAAoB,EAAE,gBAAiD;CAC3E,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAU,QACP,EAA8B,CAAM,GAC1C,CAAC,CAAM,CAAC,GACL,CAAC,GAAsB,KAA2B,QAC/C,EAAsC,GAAQ,CAAO,CAC7D,GACK,CAAC,GAAa,KAAkB,QAC7B,KAAK,IAAI,CACjB,GAEK,IAAQ,EAAa,EAAO,OAAO,CAAI,GACvC,IACJ,EAAO,YAAY,OAA6C,KAAA,IAAtC,EAAa,EAAO,UAAU,CAAI,GAOxD,IAA+C,EACnD,QAAQ,EANR,EAAQ,MAAM,MACL,EAAO,OAAO,CACtB,KACD,EAAQ,MACR,GAEgD,CAAW,EAC7D,GACM,KAA4B,MAA2B;EAE3D,AADA,EAAwB,CAAQ,GAChC,EAAe,KAAK,IAAI,CAAC;CAC3B;CAEA,OACE,kBAAC,GAAD;EACE,QAAQ;GACN;GACA,UAAU,KAAY,EAAE,oBAAoB;EAC9C;EAEA,UAAA,kBAAC,GAAD;GACE,SAAS;GACT,OAAO,EAAO,QAAQ,KAAK,MAAW;IACpC,IAAM,IAAc,EAClB,EAAe,GAAQ,CAAM,GAC7B,CACF;IACA,OAAO;KACL,KAAK,EAAO;KACZ,WAAW,EAAO,aAAa;KAC/B,MAAM,EAAkB,CAAM;KAC9B,YAAY,EAAwB,CAAM;KAC1C,SACE,kBAAC,GAAD;MACE,gBAEI,kBAAC,GAAD;OAAgB,OAAO;OACrB,UAAA,kBAAC,GAAD,CAA4B,CAAA;MACd,CAAA;MAIpB,UAAA,kBAAC,GAAD;OACE,UACE,kBAAC,GAAD;QAAgB,OAAO;QACrB,UAAA,kBAAC,GAAD,CAAwB,CAAA;OACV,CAAA;OAGlB,UAAA,kBAAC,GAAD;QACU;QACR,SAAS;QACT,eAAe;QACO;QACtB,sBAAsB;OACvB,CAAA;MACO,CAAA;KACa,CAAA;IAE7B;GACF,CAAC;EACF,CAAA;CACiB,CAAA;AAExB,GAMa,KAA2B,EACtC,kBAC+C;CAC/C,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,gBAAa,EAAoB,GACnC,IAAgB,EAA6B,GAC7C,IAAY,GAAU,UAAU,GAChC,IAAa,EAAyB,CAAC;CAE7C,IAAI,KAAa,MAAM;EACrB,IAAM,IAAQ,OAAO,OAAO,CAAQ,CAAC,CAClC,QAAQ,MACA,EAAO,SAAS,iBAAiB,EAAO,OAChD,CAAC,CACD,KAAK,OACG;GACL;GACA,OAAO,EAAa,EAAO,OAAO,CAAI;EACxC,EACD,CAAC,CACD,MAAM,GAAM,MACJ,EAAK,MAAM,cAAc,EAAM,KAAK,CAC5C;EAEH,OACE,kBAAC,GAAD;GAAuC;GACrC,UAAA,kBAAC,GAAD;IACE,QAAQ;KACN,OAAO,EAAE,iBAAiB;KAC1B,UAAU,EAAE,oBAAoB;IAClC;IAEA,UAAA,kBAAC,GAAD;KACE,SAAS;KACT,OAAO,EAAM,KAAK,EAAE,WAAQ,gBACnB;MACL,KAAK,EAAO;MACZ,MAAM;MACN,SACE,kBAAC,GAAD;OAAgB,OAAO;OACrB,UAAA,kBAAC,OAAD;QAAK,WAAW;QAAhB,UAAA,CACE,kBAAC,OAAD;SAAK,WAAW;SACb,UAAA,EAAE,qBAAqB;QACrB,CAAA,GACL,kBAAC,GAAD;SACE,YAAY,kBAAC,GAAD,CAA4B,CAAA;SACxC,SAAS,CACP;UACE,IAAI,EAAO;UACX,MAAM,EAAO,OAAO;UACpB,OAAO,EAAE,4BAA4B;SACvC,CACF;QACD,CAAA,CACE;;MACS,CAAA;KAEpB,EACD;IACF,CAAA;GACiB,CAAA;EACK,CAAA;CAE/B;CAEA,OACE,kBAAC,GAAD;EAAuC;EACrC,UAAA,kBAAC,GAAD,EAAkB,QAAQ,EAAY,CAAA;CACb,CAAA;AAE/B"}
@@ -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, headerMeta as u, headerMetaList as d, headerRelationGroup as f, relationCountLoading as p } from "./backofficeEntityDetailPage.css.js";
11
- import { resolveLabel as m, resolveRelationValue as h } from "./BackofficeEntityDetailPage.helpers.js";
12
- import { resolveHeaderItems as g } from "./BackofficeEntityDetailPage.view-helpers.js";
13
- import { BackofficeEntityDetailLayoutContextProvider as _ } from "./detail/BackofficeEntityDetailLayoutContext.js";
14
- import { buildTabsItems as v } from "./detail/buildTabsItems.js";
15
- import { BackofficeRedirect as y } from "./BackofficeRedirect.js";
16
- import { Suspense as b } from "react";
17
- import { FormattedDate as x, PageHeader as S, PropertyList as C } from "@plumile/ui";
18
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
19
- import { useTranslation as E } from "react-i18next";
20
- import * as D from "react-relay";
21
- import { Spinner as O } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
22
- import { BACKOFFICE_DATE_TIME_OPTIONS as k } from "@plumile/backoffice-core/constants.js";
23
- import ee from "@plumile/router/routing/Link.js";
24
- import { Tag as te } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
25
- import { setWhereValue as ne } from "@plumile/backoffice-core/filters/where.js";
26
- import re from "@plumile/router/routing/useLocation.js";
27
- import { NavigationTabs as A } from "@plumile/ui/tabs";
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 } = D, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""), F = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", I = () => /* @__PURE__ */ w("span", {
32
- className: p,
33
- children: /* @__PURE__ */ w(O, { size: 12 })
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__ */ w("div", {
36
+ return /* @__PURE__ */ C("div", {
37
37
  role: "status",
38
38
  "aria-live": "polite",
39
39
  "aria-busy": "true",
40
- children: /* @__PURE__ */ w(O, {
40
+ children: /* @__PURE__ */ C(D, {
41
41
  size: 20,
42
42
  ariaLabel: t("common.loading")
43
43
  })
44
44
  });
45
- }, R = ({ config: s, prepared: p, layoutNodeRef: D, children: O }) => {
46
- let { t: N } = E(), { t: R } = e(), { entities: z } = t(), { pathname: B } = re(), V = n(s.layoutPage.fragment, D), H = s.layoutPage.toView(V), U = F(B, p.id, s), W = c({
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__ */ w(y, { to: s.routes.list });
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__ */ w(y, { to: s.routes.detailPage(p.id, G.id) });
55
- let K = v({
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: p.id,
57
+ id: f.id,
58
58
  tApp: N,
59
59
  detailPageHref: s.routes.detailPage
60
- }), q = g(s.header, H, {
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__ */ w(ee, {
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__ */ w(x, {
72
+ renderDate: (e, t) => /* @__PURE__ */ C(b, {
73
73
  value: e,
74
- options: k,
74
+ options: O,
75
75
  fallback: t
76
76
  }),
77
- renderTag: (e, t) => /* @__PURE__ */ w(te, {
77
+ renderTag: (e, t) => /* @__PURE__ */ C(A, {
78
78
  tone: e,
79
79
  children: t
80
80
  }),
81
- renderBadgeRow: (e) => /* @__PURE__ */ w(r, { items: e })
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 = h(e.value(H));
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 = ne(null, r, i, t);
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: m(e.label, N),
93
- count: /* @__PURE__ */ w(o, {
92
+ label: p(e.label, N),
93
+ count: /* @__PURE__ */ C(o, {
94
94
  entity: n,
95
- loadingFallback: /* @__PURE__ */ w(I, {}),
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: p.id,
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__ */ T("div", {
112
+ (q.subtitleItems != null || q.status != null || q.badges != null) && (X = /* @__PURE__ */ w("div", {
113
113
  className: u,
114
- children: [q.status, q.badges]
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__ */ w("div", {
118
- className: d,
119
- children: /* @__PURE__ */ w(C, { items: q.items })
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__ */ w("div", {
123
- className: f,
124
- children: /* @__PURE__ */ w(M, {
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 ie = /* @__PURE__ */ T("div", {
132
+ let re = /* @__PURE__ */ w("div", {
130
133
  className: l,
131
- children: [/* @__PURE__ */ w(S, {
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__ */ w(A, {
141
+ return W.pages.length > 1 && ($ = /* @__PURE__ */ C(ne, {
139
142
  items: K,
140
143
  activeId: G.id,
141
144
  variant: "underline"
142
- })), /* @__PURE__ */ w(_, {
145
+ })), /* @__PURE__ */ C(g, {
143
146
  value: {
144
147
  activePage: G,
145
148
  config: s,
146
- entityId: p.id,
149
+ entityId: f.id,
147
150
  layoutView: H,
148
151
  tabsItems: K,
149
152
  visiblePages: W.pages
150
153
  },
151
- children: /* @__PURE__ */ w(i, {
154
+ children: /* @__PURE__ */ C(i, {
152
155
  breadcrumb: Y,
153
- children: /* @__PURE__ */ w(j, {
154
- headerNode: ie,
156
+ children: /* @__PURE__ */ C(j, {
157
+ headerNode: re,
155
158
  tabsNode: $,
156
159
  headerDensity: "compact",
157
- children: /* @__PURE__ */ w(b, {
158
- fallback: /* @__PURE__ */ w(L, {}),
159
- children: O
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 } = E(), { t: o } = e(), c = N(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
166
- return l == null ? /* @__PURE__ */ w(i, {
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__ */ w(s, { listHref: t.routes.list })
184
- }) : /* @__PURE__ */ w(R, {
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,