From 1b17cbec01b5ea78e27bcbf9502e76f3560c83f4 Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Wed, 16 Sep 2026 19:37:15 -0300 Subject: [PATCH 1/7] feat(dashboard): build dashboard experience (SH-336) --- src/api/api-paths.ts | 5 + src/app/(protected)/dashboard.tsx | 240 ---------------- .../_components/dashboard-bar-list.tsx | 86 ++++++ .../dashboard/_components/dashboard-card.tsx | 44 +++ .../_components/dashboard-kpi-card.tsx | 68 +++++ .../_components/dashboard-range-toggle.tsx | 42 +++ .../_components/dashboard-trend-card.tsx | 119 ++++++++ .../dispatcher-performance-card.tsx | 97 +++++++ .../_components/dispatcher-workload-card.tsx | 91 ++++++ .../_components/vendor-insights-card.tsx | 63 ++++ .../_components/work-order-breakdown-card.tsx | 47 +++ .../work-orders-by-region-card.tsx | 36 +++ src/app/(protected)/dashboard/index.tsx | 123 ++++++++ src/app/(protected)/index.tsx | 241 +--------------- .../_hooks/use-dashboard-drilldown-filters.ts | 30 ++ src/app/(protected)/workorders/index.tsx | 11 +- src/domain/dashboard/api/dashboard-api.ts | 271 +++++++++++++++++- .../dashboard/types/dashboard-performance.ts | 6 + src/domain/dashboard/types/dashboard-range.ts | 10 + .../dashboard/types/dashboard-regions.ts | 6 + src/domain/dashboard/types/dashboard-stats.ts | 14 + src/domain/dashboard/types/dashboard-trend.ts | 25 ++ .../types/dashboard-vendor-insights.ts | 8 + .../dashboard/types/dashboard-workload.ts | 6 + .../use-cases/use-dashboard-performance.ts | 16 ++ .../use-cases/use-dashboard-regions.ts | 16 ++ .../use-cases/use-dashboard-stats.ts | 8 +- .../use-cases/use-dashboard-trend.ts | 17 ++ .../use-dashboard-vendor-insights.ts | 12 + .../use-cases/use-dashboard-workload.ts | 16 ++ .../dashboard/utils/dashboard-range-utils.ts | 73 +++++ .../utils/work-order-drilldown-links.ts | 82 ++++++ .../utils/dashboard-drilldown-params.ts | 109 +++++++ src/infra/query-key/query-key.ts | 12 +- .../dashboard/dashboard-page.test.tsx | 153 ++++++++++ .../domain/dashboard/dashboard-api.test.ts | 182 ++++++++++++ .../dashboard/dashboard-range-utils.test.ts | 68 +++++ .../work-order-drilldown-links.test.ts | 48 ++++ .../dashboard-drilldown-params.test.ts | 60 ++++ 39 files changed, 2068 insertions(+), 493 deletions(-) delete mode 100644 src/app/(protected)/dashboard.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-bar-list.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-kpi-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-range-toggle.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-trend-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/vendor-insights-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/work-order-breakdown-card.tsx create mode 100644 src/app/(protected)/dashboard/_components/work-orders-by-region-card.tsx create mode 100644 src/app/(protected)/dashboard/index.tsx create mode 100644 src/app/(protected)/workorders/_hooks/use-dashboard-drilldown-filters.ts create mode 100644 src/domain/dashboard/types/dashboard-performance.ts create mode 100644 src/domain/dashboard/types/dashboard-range.ts create mode 100644 src/domain/dashboard/types/dashboard-regions.ts create mode 100644 src/domain/dashboard/types/dashboard-trend.ts create mode 100644 src/domain/dashboard/types/dashboard-vendor-insights.ts create mode 100644 src/domain/dashboard/types/dashboard-workload.ts create mode 100644 src/domain/dashboard/use-cases/use-dashboard-performance.ts create mode 100644 src/domain/dashboard/use-cases/use-dashboard-regions.ts create mode 100644 src/domain/dashboard/use-cases/use-dashboard-trend.ts create mode 100644 src/domain/dashboard/use-cases/use-dashboard-vendor-insights.ts create mode 100644 src/domain/dashboard/use-cases/use-dashboard-workload.ts create mode 100644 src/domain/dashboard/utils/dashboard-range-utils.ts create mode 100644 src/domain/dashboard/utils/work-order-drilldown-links.ts create mode 100644 src/domain/work-orders/utils/dashboard-drilldown-params.ts create mode 100644 src/test/app/(protected)/dashboard/dashboard-page.test.tsx create mode 100644 src/test/domain/dashboard/dashboard-api.test.ts create mode 100644 src/test/domain/dashboard/dashboard-range-utils.test.ts create mode 100644 src/test/domain/dashboard/work-order-drilldown-links.test.ts create mode 100644 src/test/domain/work-orders/dashboard-drilldown-params.test.ts diff --git a/src/api/api-paths.ts b/src/api/api-paths.ts index 33db519b..b1e90023 100644 --- a/src/api/api-paths.ts +++ b/src/api/api-paths.ts @@ -148,6 +148,11 @@ export const API_PATHS = { }, dashboard: { stats: "Dashboard/Stats", + workload: "Dashboard/Workload", + performance: "Dashboard/Performance", + regions: "Dashboard/Regions", + vendorInsights: "Dashboard/VendorInsights", + trend: "Dashboard/Trend", }, dropdownOptions: { byCategory: "DropdownOptions/ByCategory", diff --git a/src/app/(protected)/dashboard.tsx b/src/app/(protected)/dashboard.tsx deleted file mode 100644 index e1af6bf9..00000000 --- a/src/app/(protected)/dashboard.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import type { ReactNode } from "react"; -import { useNavigate } from "react-router"; -import AddIcon from "@mui/icons-material/Add"; -import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutlined"; -import FolderOpenOutlinedIcon from "@mui/icons-material/FolderOpenOutlined"; -import ScheduleOutlinedIcon from "@mui/icons-material/ScheduleOutlined"; -import { - Alert, - Box, - CircularProgress, - Paper, - Stack, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Typography, -} from "@mui/material"; -import { useDashboardStats } from "@/domain/dashboard/use-cases/use-dashboard-stats"; - -const INVOICE_STATUSES = ["Draft", "Challenged", "Pending Approval", "Approved", "Paid"] as const; - -const PRIORITY_LEVELS = [5, 4, 3, 2, 1] as const; - -interface KpiCardProps { - title: string; - description?: string; - value?: string | number; - icon: ReactNode; - color: "success" | "primary" | "info" | "warning"; - onClick: () => void; - loading?: boolean; -} - -function KpiCard({ title, description, value, icon, color, onClick, loading }: KpiCardProps) { - const colorMap = { - success: "success.main", - primary: "primary.main", - info: "info.main", - warning: "warning.main", - } as const; - - return ( - - - - {icon} - - - - - {title} - - {value !== undefined && ( - - {loading ? "..." : typeof value === "number" ? value.toLocaleString() : value} - - )} - {Boolean(description) && ( - - {description} - - )} - - - - ); -} - -export default function DashboardPage() { - const navigate = useNavigate(); - const { data: stats, isLoading, isFetching, error } = useDashboardStats(); - - const formatStat = (value: number | undefined) => (isLoading ? undefined : (value ?? 0)); - - return ( - - - - Dashboard - - {isFetching && !isLoading && } - - {Boolean(error) && ( - - {error instanceof Error ? error.message : "Failed to load dashboard stats"} - - )} - - } - color="success" - onClick={() => navigate("/workorders/new")} - /> - } - color="primary" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - } - color="info" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - } - color="warning" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - - - - - Priority Analysis - - - Age of open Work Orders by Priority - - - - - - - - Priority - - Total - - - 0-14 Days - - - 15-29 Days - - - 30-59 Days - - - 60+ Days - - - - - {PRIORITY_LEVELS.map((priority) => ( - - {priority} - — - — - — - — - — - - ))} - -
-
-
- - - - Invoice Analysis - - - - - - - - Status - - Count - - - Amount - - - - - {INVOICE_STATUSES.map((status) => ( - - {status} - 0 - $0.00 - - ))} - -
-
-
-
- ); -} diff --git a/src/app/(protected)/dashboard/_components/dashboard-bar-list.tsx b/src/app/(protected)/dashboard/_components/dashboard-bar-list.tsx new file mode 100644 index 00000000..f449a957 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-bar-list.tsx @@ -0,0 +1,86 @@ +import { Box, ButtonBase } from "@mui/material"; +import { Text } from "@/components/ui/text"; + +export interface DashboardBarListRow { + id: string; + label: string; + count: number; +} + +interface DashboardBarListProps { + rows: DashboardBarListRow[]; + onSelectRow?: (row: DashboardBarListRow) => void; + isSelectable?: (row: DashboardBarListRow) => boolean; + ariaLabel: string; +} + +function percentOf(count: number, max: number): number { + if (max <= 0 || count <= 0) { + return 0; + } + + return Math.round((count / max) * 100); +} + +function BarListRow({ row, width }: { row: DashboardBarListRow; width: number }) { + return ( + + + + {row.label} + + + {row.count.toLocaleString()} + + + + {width > 0 && ( + + )} + + + ); +} + +export function DashboardBarList({ + rows, + onSelectRow, + isSelectable, + ariaLabel, +}: DashboardBarListProps) { + const max = Math.max(...rows.map((row) => row.count), 0); + + return ( + + {rows.map((row) => { + const width = percentOf(row.count, max); + const selectable = Boolean(onSelectRow) && row.count > 0 && (isSelectable?.(row) ?? true); + + return selectable ? ( + onSelectRow?.(row)} + sx={{ + width: "100%", + textAlign: "left", + borderRadius: 1, + px: 1, + mx: -1, + cursor: "pointer", + }} + > + + + ) : ( + + + + ); + })} + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dashboard-card.tsx b/src/app/(protected)/dashboard/_components/dashboard-card.tsx new file mode 100644 index 00000000..71f40dfd --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-card.tsx @@ -0,0 +1,44 @@ +import type { ReactNode } from "react"; +import { Box, CircularProgress, Paper } from "@mui/material"; +import { QueryErrorPanel } from "@/components/ui/query-error-panel"; +import { Text } from "@/components/ui/text"; + +interface DashboardCardProps { + title: string; + isLoading?: boolean; + error?: unknown; + isEmpty: boolean; + emptyMessage: string; + children: ReactNode; +} + +export function DashboardCard({ + title, + isLoading = false, + error, + isEmpty, + emptyMessage, + children, +}: DashboardCardProps) { + return ( + + + {title} + + {isLoading && ( + + + + )} + {!isLoading && Boolean(error) && } + {!isLoading && !error && isEmpty && ( + + + {emptyMessage} + + + )} + {!isLoading && !error && !isEmpty && {children}} + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dashboard-kpi-card.tsx b/src/app/(protected)/dashboard/_components/dashboard-kpi-card.tsx new file mode 100644 index 00000000..69d29c58 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-kpi-card.tsx @@ -0,0 +1,68 @@ +import type { ReactNode } from "react"; +import { Box, ButtonBase, Paper } from "@mui/material"; +import { Text } from "@/components/ui/text"; + +type KpiTone = "success" | "primary" | "info" | "warning"; + +const toneColor: Record = { + success: "success.main", + primary: "primary.main", + info: "info.main", + warning: "warning.main", +}; + +interface DashboardKpiCardProps { + title: string; + value?: number; + icon: ReactNode; + tone: KpiTone; + loading?: boolean; + active?: boolean; + onSelect?: () => void; +} + +export function DashboardKpiCard({ + title, + value, + icon, + tone, + loading = false, + active = false, + onSelect, +}: DashboardKpiCardProps) { + const color = toneColor[tone]; + const content = ( + + + {icon} + + + + {title} + + + {loading ? "…" : (value ?? 0).toLocaleString()} + + + + ); + + return ( + + {active && Boolean(onSelect) ? ( + + {content} + + ) : ( + content + )} + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dashboard-range-toggle.tsx b/src/app/(protected)/dashboard/_components/dashboard-range-toggle.tsx new file mode 100644 index 00000000..b97cb672 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-range-toggle.tsx @@ -0,0 +1,42 @@ +import { ToggleButton, ToggleButtonGroup } from "@mui/material"; +import { DASHBOARD_RANGES, type DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; + +const RANGE_LABELS: Record = { + "this-week": "This week", + "last-3-months": "Last 3 months", + today: "Today", + "all-time": "All time", +}; + +interface DashboardRangeToggleProps { + value: DashboardRangeKey; + onChange: (value: DashboardRangeKey) => void; + disabled?: boolean; +} + +export function DashboardRangeToggle({ + value, + onChange, + disabled = false, +}: DashboardRangeToggleProps) { + return ( + { + if (next) { + onChange(next); + } + }} + > + {DASHBOARD_RANGES.map((range) => ( + + {RANGE_LABELS[range]} + + ))} + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dashboard-trend-card.tsx b/src/app/(protected)/dashboard/_components/dashboard-trend-card.tsx new file mode 100644 index 00000000..6b273323 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-trend-card.tsx @@ -0,0 +1,119 @@ +import { useMemo, useState } from "react"; +import { Box, IconButton } from "@mui/material"; +import ArrowBackOutlinedIcon from "@mui/icons-material/ArrowBackOutlined"; +import ArrowForwardOutlinedIcon from "@mui/icons-material/ArrowForwardOutlined"; +import { Text } from "@/components/ui/text"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DashboardTrendPoint } from "@/domain/dashboard/types/dashboard-trend"; +import { useDashboardTrend } from "@/domain/dashboard/use-cases/use-dashboard-trend"; +import { + businessTodayIso, + dashboardRangeParams, +} from "@/domain/dashboard/utils/dashboard-range-utils"; +import { DashboardCard } from "./dashboard-card"; + +interface DashboardTrendCardProps { + range: DashboardRangeKey; +} + +function trendParams(range: DashboardRangeKey, year: number) { + if (range === "all-time") return { year }; + const params = dashboardRangeParams(range); + return { + ...params, + ...(range === "last-3-months" ? { range: "3m" as const } : {}), + }; +} + +function barHeight(point: DashboardTrendPoint, max: number): number { + if (point.total <= 0 || max <= 0) return 0; + return Math.max(6, Math.round((point.total / max) * 100)); +} + +function TrendBar({ point, max }: { point: DashboardTrendPoint; max: number }) { + const height = barHeight(point, max); + return ( + + + {point.total.toLocaleString()} + + + {height > 0 && ( + + )} + + + {point.label} + + {point.isCurrent && Today} + + ); +} + +export function DashboardTrendCard({ range }: DashboardTrendCardProps) { + const currentYear = Number(businessTodayIso().slice(0, 4)); + const [year, setYear] = useState(currentYear); + const params = useMemo(() => trendParams(range, year), [range, year]); + const trend = useDashboardTrend(params); + const points = trend.data?.points ?? []; + const max = Math.max(...points.map((point) => point.total), 0); + + return ( + + + + + {trend.data?.granularity ? `${trend.data.granularity} buckets` : "Trend"} + + {range === "all-time" && ( + + setYear((value) => value - 1)} + > + + + {year} + setYear((value) => value + 1)} + > + + + + )} + + + {points.map((point) => ( + + ))} + + + The dashed marker and “Today” label identify the current business date. + + + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx new file mode 100644 index 00000000..72130baa --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx @@ -0,0 +1,97 @@ +import { useNavigate } from "react-router"; +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; +import { Text } from "@/components/ui/text"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; +import { + workOrderDispatcherDrilldownSearch, + workOrderDrilldownUrl, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No dispatchers are set up yet."; + +interface DispatcherPerformanceCardProps { + rows: DispatcherPerformanceRow[]; + range: DashboardRangeKey; + isLoading?: boolean; + error?: unknown; +} + +function formatDays(value: number): string { + return (Math.round(value * 10) / 10).toLocaleString(); +} + +function DispatcherNameCell({ + row, + range, +}: { + row: DispatcherPerformanceRow; + range: DashboardRangeKey; +}) { + const navigate = useNavigate(); + const drillable = Boolean(row.dispatcherId) && row.completionRate > 0; + + if (!drillable) { + return {row.dispatcherName}; + } + + return ( + + navigate(workOrderDrilldownUrl(workOrderDispatcherDrilldownSearch(row.dispatcherId, range))) + } + > + {row.dispatcherName} + + ); +} + +export function DispatcherPerformanceCard({ + rows, + range, + isLoading = false, + error, +}: DispatcherPerformanceCardProps) { + return ( + + + + + + Dispatcher + + Completion % + + + Avg days + + + + + {rows.map((row) => ( + + + + + {`${row.completionRate.toLocaleString()}%`} + + {row.averageResolutionDays == null ? "—" : formatDays(row.averageResolutionDays)} + + + ))} + +
+
+
+ ); +} diff --git a/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx new file mode 100644 index 00000000..e0f0c73e --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx @@ -0,0 +1,91 @@ +import { useNavigate } from "react-router"; +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; +import { Text } from "@/components/ui/text"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DispatcherWorkloadRow } from "@/domain/dashboard/types/dashboard-workload"; +import { + workOrderDispatcherDrilldownSearch, + workOrderDrilldownUrl, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No dispatchers are set up yet."; + +interface DispatcherWorkloadCardProps { + rows: DispatcherWorkloadRow[]; + range: DashboardRangeKey; + isLoading?: boolean; + error?: unknown; +} + +function DispatcherNameCell({ + row, + range, +}: { + row: DispatcherWorkloadRow; + range: DashboardRangeKey; +}) { + const navigate = useNavigate(); + const drillable = Boolean(row.dispatcherId) && row.totalWorkOrders > 0; + + if (!drillable) { + return {row.dispatcherName}; + } + + return ( + + navigate(workOrderDrilldownUrl(workOrderDispatcherDrilldownSearch(row.dispatcherId, range))) + } + > + {row.dispatcherName} + + ); +} + +export function DispatcherWorkloadCard({ + rows, + range, + isLoading = false, + error, +}: DispatcherWorkloadCardProps) { + return ( + + + + + + Dispatcher + + Open + + + Total + + + + + {rows.map((row) => ( + + + + + {row.openWorkOrders.toLocaleString()} + {row.totalWorkOrders.toLocaleString()} + + ))} + +
+
+
+ ); +} diff --git a/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx b/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx new file mode 100644 index 00000000..0e98910f --- /dev/null +++ b/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx @@ -0,0 +1,63 @@ +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; +import { Text } from "@/components/ui/text"; +import type { VendorInsightRow } from "@/domain/dashboard/types/dashboard-vendor-insights"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No active vendor has any work orders yet."; + +interface VendorInsightsCardProps { + rows: VendorInsightRow[]; + isLoading?: boolean; + error?: unknown; +} + +export function VendorInsightsCard({ rows, isLoading = false, error }: VendorInsightsCardProps) { + return ( + + + + + + Vendor + + Completion % + + + Reschedule % + + + Avg days + + + Jobs + + + + + {rows.map((row) => ( + + + {row.vendorName} + + {`${row.completionRate.toLocaleString()}%`} + {`${row.rescheduleRate.toLocaleString()}%`} + + {row.averageResolutionDays == null + ? "—" + : row.averageResolutionDays.toLocaleString()} + + {row.totalJobs.toLocaleString()} + + ))} + +
+
+
+ ); +} diff --git a/src/app/(protected)/dashboard/_components/work-order-breakdown-card.tsx b/src/app/(protected)/dashboard/_components/work-order-breakdown-card.tsx new file mode 100644 index 00000000..84f32923 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/work-order-breakdown-card.tsx @@ -0,0 +1,47 @@ +import { useNavigate } from "react-router"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DashboardBreakdownRow } from "@/domain/dashboard/types/dashboard-stats"; +import { + workOrderDrilldownUrl, + workOrderTypeDrilldownSearch, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; +import { DashboardBarList } from "./dashboard-bar-list"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No work orders match the current filters."; + +interface WorkOrderBreakdownCardProps { + breakdown: DashboardBreakdownRow[]; + range: DashboardRangeKey; + isLoading?: boolean; + error?: unknown; +} + +export function WorkOrderBreakdownCard({ + breakdown, + range, + isLoading = false, + error, +}: WorkOrderBreakdownCardProps) { + const navigate = useNavigate(); + + return ( + + ({ id: row.status, label: row.status, count: row.count }))} + isSelectable={(row) => workOrderTypeDrilldownSearch(row.id, range) !== null} + onSelectRow={(row) => { + const search = workOrderTypeDrilldownSearch(row.id, range); + if (search) navigate(workOrderDrilldownUrl(search)); + }} + /> + + ); +} diff --git a/src/app/(protected)/dashboard/_components/work-orders-by-region-card.tsx b/src/app/(protected)/dashboard/_components/work-orders-by-region-card.tsx new file mode 100644 index 00000000..3a156152 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/work-orders-by-region-card.tsx @@ -0,0 +1,36 @@ +import type { RegionWorkOrdersRow } from "@/domain/dashboard/types/dashboard-regions"; +import { DashboardBarList } from "./dashboard-bar-list"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No work orders match the current filters."; + +interface WorkOrdersByRegionCardProps { + rows: RegionWorkOrdersRow[]; + isLoading?: boolean; + error?: unknown; +} + +export function WorkOrdersByRegionCard({ + rows, + isLoading = false, + error, +}: WorkOrdersByRegionCardProps) { + return ( + + ({ + id: row.region, + label: row.region, + count: row.workOrderCount, + }))} + /> + + ); +} diff --git a/src/app/(protected)/dashboard/index.tsx b/src/app/(protected)/dashboard/index.tsx new file mode 100644 index 00000000..92f385bc --- /dev/null +++ b/src/app/(protected)/dashboard/index.tsx @@ -0,0 +1,123 @@ +import { useState } from "react"; +import { useNavigate } from "react-router"; +import EventOutlinedIcon from "@mui/icons-material/EventOutlined"; +import PendingActionsIcon from "@mui/icons-material/PendingActions"; +import ShieldOutlinedIcon from "@mui/icons-material/ShieldOutlined"; +import { Box, Button, CircularProgress } from "@mui/material"; +import { PageHeader } from "@/components/ui/page-header"; +import { DashboardKpiCard } from "@/app/(protected)/dashboard/_components/dashboard-kpi-card"; +import { DashboardRangeToggle } from "@/app/(protected)/dashboard/_components/dashboard-range-toggle"; +import { DashboardTrendCard } from "@/app/(protected)/dashboard/_components/dashboard-trend-card"; +import { DispatcherPerformanceCard } from "@/app/(protected)/dashboard/_components/dispatcher-performance-card"; +import { DispatcherWorkloadCard } from "@/app/(protected)/dashboard/_components/dispatcher-workload-card"; +import { VendorInsightsCard } from "@/app/(protected)/dashboard/_components/vendor-insights-card"; +import { WorkOrderBreakdownCard } from "@/app/(protected)/dashboard/_components/work-order-breakdown-card"; +import { WorkOrdersByRegionCard } from "@/app/(protected)/dashboard/_components/work-orders-by-region-card"; +import { + DEFAULT_DASHBOARD_RANGE, + type DashboardRangeKey, +} from "@/domain/dashboard/types/dashboard-range"; +import { useDashboardPerformance } from "@/domain/dashboard/use-cases/use-dashboard-performance"; +import { useDashboardRegions } from "@/domain/dashboard/use-cases/use-dashboard-regions"; +import { useDashboardStats } from "@/domain/dashboard/use-cases/use-dashboard-stats"; +import { useDashboardVendorInsights } from "@/domain/dashboard/use-cases/use-dashboard-vendor-insights"; +import { useDashboardWorkload } from "@/domain/dashboard/use-cases/use-dashboard-workload"; +import { + avetaPendingDrilldownSearch, + scheduledTomorrowDrilldownSearch, + UPLIFTS_ROUTE, + workOrderDrilldownUrl, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; + +export default function DashboardPage() { + const navigate = useNavigate(); + const [range, setRange] = useState(DEFAULT_DASHBOARD_RANGE); + const stats = useDashboardStats(range); + const workload = useDashboardWorkload(range); + const performance = useDashboardPerformance(range); + const regions = useDashboardRegions(range); + const vendors = useDashboardVendorInsights(); + + const isRefreshing = + [stats, workload, performance, regions, vendors].some((query) => query.isFetching) && + !stats.isLoading; + + return ( + + + {isRefreshing && } + {range !== DEFAULT_DASHBOARD_RANGE && ( + + )} + + + } + /> + + } + tone="primary" + value={stats.data?.scheduledTomorrow} + loading={stats.isLoading} + active={(stats.data?.scheduledTomorrow ?? 0) > 0} + onSelect={() => navigate(workOrderDrilldownUrl(scheduledTomorrowDrilldownSearch()))} + /> + } + tone="info" + value={stats.data?.pendingUplifts} + loading={stats.isLoading} + active={(stats.data?.pendingUplifts ?? 0) > 0} + onSelect={() => navigate(UPLIFTS_ROUTE)} + /> + } + tone="warning" + value={stats.data?.avetaPending} + loading={stats.isLoading} + active={(stats.data?.avetaPending ?? 0) > 0} + onSelect={() => navigate(workOrderDrilldownUrl(avetaPendingDrilldownSearch()))} + /> + + + + + + + + + +
+ ); +} diff --git a/src/app/(protected)/index.tsx b/src/app/(protected)/index.tsx index e1af6bf9..b32a2d05 100644 --- a/src/app/(protected)/index.tsx +++ b/src/app/(protected)/index.tsx @@ -1,240 +1,5 @@ -import type { ReactNode } from "react"; -import { useNavigate } from "react-router"; -import AddIcon from "@mui/icons-material/Add"; -import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutlined"; -import FolderOpenOutlinedIcon from "@mui/icons-material/FolderOpenOutlined"; -import ScheduleOutlinedIcon from "@mui/icons-material/ScheduleOutlined"; -import { - Alert, - Box, - CircularProgress, - Paper, - Stack, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Typography, -} from "@mui/material"; -import { useDashboardStats } from "@/domain/dashboard/use-cases/use-dashboard-stats"; +import DashboardPage from "@/app/(protected)/dashboard"; -const INVOICE_STATUSES = ["Draft", "Challenged", "Pending Approval", "Approved", "Paid"] as const; - -const PRIORITY_LEVELS = [5, 4, 3, 2, 1] as const; - -interface KpiCardProps { - title: string; - description?: string; - value?: string | number; - icon: ReactNode; - color: "success" | "primary" | "info" | "warning"; - onClick: () => void; - loading?: boolean; -} - -function KpiCard({ title, description, value, icon, color, onClick, loading }: KpiCardProps) { - const colorMap = { - success: "success.main", - primary: "primary.main", - info: "info.main", - warning: "warning.main", - } as const; - - return ( - - - - {icon} - - - - - {title} - - {value !== undefined && ( - - {loading ? "..." : typeof value === "number" ? value.toLocaleString() : value} - - )} - {Boolean(description) && ( - - {description} - - )} - - - - ); -} - -export default function DashboardPage() { - const navigate = useNavigate(); - const { data: stats, isLoading, isFetching, error } = useDashboardStats(); - - const formatStat = (value: number | undefined) => (isLoading ? undefined : (value ?? 0)); - - return ( - - - - Dashboard - - {isFetching && !isLoading && } - - {Boolean(error) && ( - - {error instanceof Error ? error.message : "Failed to load dashboard stats"} - - )} - - } - color="success" - onClick={() => navigate("/workorders/new")} - /> - } - color="primary" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - } - color="info" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - } - color="warning" - loading={isLoading} - onClick={() => navigate("/workorders")} - /> - - - - - Priority Analysis - - - Age of open Work Orders by Priority - - - - - - - - Priority - - Total - - - 0-14 Days - - - 15-29 Days - - - 30-59 Days - - - 60+ Days - - - - - {PRIORITY_LEVELS.map((priority) => ( - - {priority} - — - — - — - — - — - - ))} - -
-
-
- - - - Invoice Analysis - - - - - - - - Status - - Count - - - Amount - - - - - {INVOICE_STATUSES.map((status) => ( - - {status} - 0 - $0.00 - - ))} - -
-
-
-
- ); +export default function HomePage() { + return ; } diff --git a/src/app/(protected)/workorders/_hooks/use-dashboard-drilldown-filters.ts b/src/app/(protected)/workorders/_hooks/use-dashboard-drilldown-filters.ts new file mode 100644 index 00000000..e3e8dd0a --- /dev/null +++ b/src/app/(protected)/workorders/_hooks/use-dashboard-drilldown-filters.ts @@ -0,0 +1,30 @@ +import { useEffect, useRef, useState } from "react"; +import { useSearchParams } from "react-router"; +import type { WorkOrderAdvancedFilters } from "@/domain/work-orders/types/work-order-advanced-filters"; +import { parseDashboardDrilldownParams } from "@/domain/work-orders/utils/dashboard-drilldown-params"; + +export function useDashboardDrilldownFilters( + onApply: (filters: WorkOrderAdvancedFilters) => void, +): boolean { + const [searchParams, setSearchParams] = useSearchParams(); + const appliedRef = useRef(false); + const [fromDashboard, setFromDashboard] = useState(false); + + useEffect(() => { + if (appliedRef.current) { + return; + } + + const drilldown = parseDashboardDrilldownParams(searchParams); + if (!drilldown) { + return; + } + + appliedRef.current = true; + setFromDashboard(true); + onApply(drilldown); + setSearchParams({}, { replace: true }); + }, [searchParams, setSearchParams, onApply]); + + return fromDashboard; +} diff --git a/src/app/(protected)/workorders/index.tsx b/src/app/(protected)/workorders/index.tsx index 571251cb..ec09e8c6 100644 --- a/src/app/(protected)/workorders/index.tsx +++ b/src/app/(protected)/workorders/index.tsx @@ -1,4 +1,5 @@ -import { Box } from "@mui/material"; +import { Box, Link as MuiLink } from "@mui/material"; +import { Link as RouterLink } from "react-router"; import { PageHeader } from "@/components/ui/page-header"; import { QueryErrorPanel } from "@/components/ui/query-error-panel"; import { WorkOrdersAdvancedFiltersBanner } from "@/app/(protected)/workorders/_components/list/work-orders-advanced-filters-banner"; @@ -8,6 +9,7 @@ import { WorkOrdersListHeader } from "@/app/(protected)/workorders/_components/l import { WorkOrdersListPagePanels } from "@/app/(protected)/workorders/_components/list/work-orders-list-page-panels"; import { WoTable } from "@/app/(protected)/workorders/_components/list/table/wo-table"; import { useWorkOrdersListPage } from "@/app/(protected)/workorders/_hooks/use-work-orders-list-page"; +import { useDashboardDrilldownFilters } from "@/app/(protected)/workorders/_hooks/use-dashboard-drilldown-filters"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; import { hasCompletionDocService } from "@/domain/work-orders/utils/completion-doc-service-gate"; import { useAuthContext } from "@/providers/auth-context"; @@ -24,6 +26,7 @@ export default function WorkOrdersListPage() { const { user } = useAuthContext(); const page = useWorkOrdersListPage(); const { filters, tableData } = page; + const fromDashboard = useDashboardDrilldownFilters(filters.applyAdvancedFilters); return ( @@ -52,6 +55,12 @@ export default function WorkOrdersListPage() { } /> + {fromDashboard && ( + + Back to Dashboard + + )} + ; +function asString(value: unknown): string { + if (typeof value === "string") { + return value.trim(); + } + if (typeof value === "number" && Number.isFinite(value)) { + return String(value); + } + + return ""; +} + +function asRecords(value: unknown): Record[] { + if (!Array.isArray(value)) { + return []; + } + + return value.filter( + (item): item is Record => + typeof item === "object" && item !== null && !Array.isArray(item), + ); +} + +function readField(data: Record, key: string): unknown { + const capitalized = key.charAt(0).toUpperCase() + key.slice(1); + const value = data[key] ?? data[capitalized]; + return value === null ? undefined : value; +} + +function toRecord(value: unknown): Record { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? (value as Record) + : {}; +} + +function readCollection(value: unknown, key: string): Record[] { + const data = toRecord(value); + const collection = key ? (readField(data, key) ?? value) : value; + return asRecords(collection); +} + +function rangeSearchParams(range?: DashboardRangeParams): Options | undefined { + if (!range?.dateFrom || !range?.dateTo) { + return undefined; + } + + return { searchParams: { dateFrom: range.dateFrom, dateTo: range.dateTo } }; +} + +function trendSearchParams(params?: DashboardTrendParams): Options | undefined { + if ( + !params || + (!params.dateFrom && !params.dateTo && !params.granularity && !params.range && !params.year) + ) { + return undefined; + } + + const searchParams: Record = {}; + if (params.dateFrom) searchParams.dateFrom = params.dateFrom; + if (params.dateTo) searchParams.dateTo = params.dateTo; + if (params.granularity) searchParams.granularity = params.granularity; + if (params.range) searchParams.range = params.range; + if (params.year) searchParams.year = params.year; + + return { searchParams }; +} + +function mapBreakdownRow(raw: Record): DashboardBreakdownRow { return { - open: toNumber(data.open ?? data.Open), - notDispatched: toNumber(data.notDispatched ?? data.NotDispatched), - completed: toNumber(data.completed ?? data.Completed), + status: + asString(readField(raw, "status") ?? readField(raw, "name") ?? readField(raw, "label")) || + UNMAPPED_REGION_LABEL, + count: toNumber(readField(raw, "count") ?? readField(raw, "value")), }; } +function mapBreakdown(value: unknown): DashboardBreakdownRow[] { + if (Array.isArray(value)) { + return asRecords(value).map(mapBreakdownRow); + } + + if (typeof value === "object" && value !== null) { + return Object.entries(value as Record) + .map(([status, count]) => ({ status, count: toNumber(count) })) + .filter((row) => row.status !== ""); + } + + return []; +} + +function mapDispatcherIdentity(raw: Record): { + dispatcherId: string; + dispatcherName: string; +} { + return { + dispatcherId: asString( + readField(raw, "dispatcherId") ?? readField(raw, "id") ?? readField(raw, "userId"), + ), + dispatcherName: asString(readField(raw, "dispatcherName") ?? readField(raw, "name")), + }; +} + +function mapDashboardStats(raw: unknown): DashboardStats { + const data = toRecord(raw); + const average = readField(data, "averageResolutionDays"); + + return { + total: toNumber(readField(data, "total")), + open: toNumber(readField(data, "open")), + notDispatched: toNumber(readField(data, "notDispatched")), + completed: toNumber(readField(data, "completed")), + dueCount: toNumber(readField(data, "dueCount")), + completedDueCount: toNumber(readField(data, "completedDueCount")), + completionRate: toNumber(readField(data, "completionRate")), + averageResolutionDays: average == null ? null : toNumber(average), + scheduledTomorrow: toNumber(readField(data, "scheduledTomorrow")), + pendingUplifts: toNumber(readField(data, "pendingUplifts")), + avetaPending: toNumber(readField(data, "avetaPending")), + breakdown: mapBreakdown(readField(data, "breakdown") ?? readField(data, "workOrderBreakdown")), + }; +} + +function mapDispatcherWorkload(raw: unknown): DispatcherWorkloadRow[] { + return readCollection(raw, "items").map((rawRow) => { + const identity = mapDispatcherIdentity(rawRow); + return { + ...identity, + openWorkOrders: toNumber( + readField(rawRow, "openWorkOrders") ?? + readField(rawRow, "openCount") ?? + readField(rawRow, "open"), + ), + totalWorkOrders: toNumber( + readField(rawRow, "totalWorkOrders") ?? + readField(rawRow, "totalCount") ?? + readField(rawRow, "scheduledWorkOrders") ?? + readField(rawRow, "scheduled"), + ), + }; + }); +} + +function mapDispatcherPerformance(raw: unknown): DispatcherPerformanceRow[] { + return readCollection(raw, "items").map((rawRow) => { + const identity = mapDispatcherIdentity(rawRow); + return { + ...identity, + completionRate: toNumber( + readField(rawRow, "completionRate") ?? readField(rawRow, "onTimeRate"), + ), + averageResolutionDays: + readField(rawRow, "averageResolutionDays") == null + ? null + : toNumber(readField(rawRow, "averageResolutionDays")), + }; + }); +} + +function mapRegions(raw: unknown): RegionWorkOrdersRow[] { + return readCollection(raw, "items").map((rawRow) => { + const region = + asString(readField(rawRow, "region") ?? readField(rawRow, "name")) || UNMAPPED_REGION_LABEL; + return { + region, + workOrderCount: toNumber( + readField(rawRow, "workOrderCount") ?? + readField(rawRow, "count") ?? + readField(rawRow, "total"), + ), + }; + }); +} + +function mapVendorInsights(raw: unknown): VendorInsightRow[] { + return readCollection(raw, "items").map((rawRow) => ({ + vendorId: asString( + readField(rawRow, "vendorId") ?? + readField(rawRow, "vendorCompanyId") ?? + readField(rawRow, "id"), + ), + vendorName: asString( + readField(rawRow, "vendorName") ?? + readField(rawRow, "vendorCompanyName") ?? + readField(rawRow, "companyName") ?? + readField(rawRow, "name"), + ), + completionRate: toNumber(readField(rawRow, "completionRate")), + rescheduleRate: toNumber(readField(rawRow, "rescheduleRate")), + averageResolutionDays: + readField(rawRow, "averageResolutionDays") == null + ? null + : toNumber(readField(rawRow, "averageResolutionDays")), + totalJobs: toNumber(readField(rawRow, "totalJobs")), + })); +} + +function mapTrendGranularity(value: unknown): DashboardTrendGranularity | null { + const granularity = asString(value).toLowerCase(); + return granularity === "day" || granularity === "week" || granularity === "month" + ? granularity + : null; +} + +function mapDashboardTrend(raw: unknown): DashboardTrend { + const data = toRecord(raw); + const buckets = readCollection(data, "buckets"); + const legacyPoints = readCollection(data, "points"); + const points = (buckets.length > 0 ? buckets : legacyPoints).map((rawPoint) => ({ + date: asString(readField(rawPoint, "date")), + label: asString( + readField(rawPoint, "label") ?? readField(rawPoint, "period") ?? readField(rawPoint, "date"), + ), + total: toNumber( + readField(rawPoint, "total") ?? readField(rawPoint, "count") ?? readField(rawPoint, "value"), + ), + open: toNumber(readField(rawPoint, "open")), + completed: toNumber(readField(rawPoint, "completed")), + canceled: toNumber(readField(rawPoint, "canceled")), + overdue: toNumber(readField(rawPoint, "overdue")), + isCurrent: readField(rawPoint, "isCurrent") === true, + })); + + return { granularity: mapTrendGranularity(readField(data, "granularity")), points }; +} + export const dashboardApi = { - getStats: async (): Promise => { - const data = await apiGet(API_PATHS.dashboard.stats); - const response = handleApiResponse(data); - return mapDashboardStats(response); + getStats: async (range?: DashboardRangeParams): Promise => { + const data = await apiGet(API_PATHS.dashboard.stats, rangeSearchParams(range)); + return mapDashboardStats(handleApiResponse(data)); + }, + getWorkload: async (range?: DashboardRangeParams): Promise => { + const data = await apiGet(API_PATHS.dashboard.workload, rangeSearchParams(range)); + return mapDispatcherWorkload(handleApiResponse(data)); + }, + getPerformance: async (range?: DashboardRangeParams): Promise => { + const data = await apiGet(API_PATHS.dashboard.performance, rangeSearchParams(range)); + return mapDispatcherPerformance(handleApiResponse(data)); + }, + getRegions: async (range?: DashboardRangeParams): Promise => { + const data = await apiGet(API_PATHS.dashboard.regions, rangeSearchParams(range)); + return mapRegions(handleApiResponse(data)); + }, + getVendorInsights: async (): Promise => { + const data = await apiGet(API_PATHS.dashboard.vendorInsights); + return mapVendorInsights(handleApiResponse(data)); + }, + getTrend: async (params?: DashboardTrendParams): Promise => { + const data = await apiGet(API_PATHS.dashboard.trend, trendSearchParams(params)); + return mapDashboardTrend(handleApiResponse(data)); }, }; diff --git a/src/domain/dashboard/types/dashboard-performance.ts b/src/domain/dashboard/types/dashboard-performance.ts new file mode 100644 index 00000000..dca8f1a4 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-performance.ts @@ -0,0 +1,6 @@ +export interface DispatcherPerformanceRow { + dispatcherId: string; + dispatcherName: string; + completionRate: number; + averageResolutionDays: number | null; +} diff --git a/src/domain/dashboard/types/dashboard-range.ts b/src/domain/dashboard/types/dashboard-range.ts new file mode 100644 index 00000000..15cfd155 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-range.ts @@ -0,0 +1,10 @@ +export const DASHBOARD_RANGES = ["this-week", "last-3-months", "today", "all-time"] as const; + +export type DashboardRangeKey = (typeof DASHBOARD_RANGES)[number]; + +export const DEFAULT_DASHBOARD_RANGE: DashboardRangeKey = "this-week"; + +export interface DashboardRangeParams { + dateFrom?: string; + dateTo?: string; +} diff --git a/src/domain/dashboard/types/dashboard-regions.ts b/src/domain/dashboard/types/dashboard-regions.ts new file mode 100644 index 00000000..c5b1cab9 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-regions.ts @@ -0,0 +1,6 @@ +export const UNMAPPED_REGION_LABEL = "Unmapped/Other"; + +export interface RegionWorkOrdersRow { + region: string; + workOrderCount: number; +} diff --git a/src/domain/dashboard/types/dashboard-stats.ts b/src/domain/dashboard/types/dashboard-stats.ts index 7b7aee4b..82442c01 100644 --- a/src/domain/dashboard/types/dashboard-stats.ts +++ b/src/domain/dashboard/types/dashboard-stats.ts @@ -1,5 +1,19 @@ +export interface DashboardBreakdownRow { + status: string; + count: number; +} + export interface DashboardStats { + total: number; open: number; notDispatched: number; completed: number; + dueCount: number; + completedDueCount: number; + completionRate: number; + averageResolutionDays: number | null; + scheduledTomorrow: number; + pendingUplifts: number; + avetaPending: number; + breakdown: DashboardBreakdownRow[]; } diff --git a/src/domain/dashboard/types/dashboard-trend.ts b/src/domain/dashboard/types/dashboard-trend.ts new file mode 100644 index 00000000..d9c8eff5 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-trend.ts @@ -0,0 +1,25 @@ +export type DashboardTrendGranularity = "day" | "week" | "month"; + +export interface DashboardTrendParams { + dateFrom?: string; + dateTo?: string; + granularity?: DashboardTrendGranularity; + range?: "3m"; + year?: number; +} + +export interface DashboardTrendPoint { + date: string; + label: string; + total: number; + open: number; + completed: number; + canceled: number; + overdue: number; + isCurrent: boolean; +} + +export interface DashboardTrend { + granularity: DashboardTrendGranularity | null; + points: DashboardTrendPoint[]; +} diff --git a/src/domain/dashboard/types/dashboard-vendor-insights.ts b/src/domain/dashboard/types/dashboard-vendor-insights.ts new file mode 100644 index 00000000..b8f1c859 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-vendor-insights.ts @@ -0,0 +1,8 @@ +export interface VendorInsightRow { + vendorId: string; + vendorName: string; + completionRate: number; + rescheduleRate: number; + averageResolutionDays: number | null; + totalJobs: number; +} diff --git a/src/domain/dashboard/types/dashboard-workload.ts b/src/domain/dashboard/types/dashboard-workload.ts new file mode 100644 index 00000000..a7a8f806 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-workload.ts @@ -0,0 +1,6 @@ +export interface DispatcherWorkloadRow { + dispatcherId: string; + dispatcherName: string; + openWorkOrders: number; + totalWorkOrders: number; +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-performance.ts b/src/domain/dashboard/use-cases/use-dashboard-performance.ts new file mode 100644 index 00000000..9fd6c168 --- /dev/null +++ b/src/domain/dashboard/use-cases/use-dashboard-performance.ts @@ -0,0 +1,16 @@ +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; +import { queryKeys } from "@/infra/query-key/query-key"; + +export function useDashboardPerformance( + range: DashboardRangeKey, +): UseQueryResult { + return useQuery({ + queryKey: queryKeys.dashboard.performance(range), + queryFn: () => dashboardApi.getPerformance(dashboardRangeParams(range)), + staleTime: 60 * 1000, + }); +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-regions.ts b/src/domain/dashboard/use-cases/use-dashboard-regions.ts new file mode 100644 index 00000000..996fc212 --- /dev/null +++ b/src/domain/dashboard/use-cases/use-dashboard-regions.ts @@ -0,0 +1,16 @@ +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { RegionWorkOrdersRow } from "@/domain/dashboard/types/dashboard-regions"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; +import { queryKeys } from "@/infra/query-key/query-key"; + +export function useDashboardRegions( + range: DashboardRangeKey, +): UseQueryResult { + return useQuery({ + queryKey: queryKeys.dashboard.regions(range), + queryFn: () => dashboardApi.getRegions(dashboardRangeParams(range)), + staleTime: 60 * 1000, + }); +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-stats.ts b/src/domain/dashboard/use-cases/use-dashboard-stats.ts index eb1b9a5f..d9e93ee2 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-stats.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-stats.ts @@ -1,12 +1,14 @@ import { useQuery, type UseQueryResult } from "@tanstack/react-query"; import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; import type { DashboardStats } from "@/domain/dashboard/types/dashboard-stats"; +import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; import { queryKeys } from "@/infra/query-key/query-key"; -export function useDashboardStats(): UseQueryResult { +export function useDashboardStats(range: DashboardRangeKey): UseQueryResult { return useQuery({ - queryKey: queryKeys.dashboard.stats(), - queryFn: () => dashboardApi.getStats(), + queryKey: queryKeys.dashboard.stats(range), + queryFn: () => dashboardApi.getStats(dashboardRangeParams(range)), staleTime: 60 * 1000, }); } diff --git a/src/domain/dashboard/use-cases/use-dashboard-trend.ts b/src/domain/dashboard/use-cases/use-dashboard-trend.ts new file mode 100644 index 00000000..ca780bb6 --- /dev/null +++ b/src/domain/dashboard/use-cases/use-dashboard-trend.ts @@ -0,0 +1,17 @@ +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { + DashboardTrend, + DashboardTrendParams, +} from "@/domain/dashboard/types/dashboard-trend"; +import { queryKeys } from "@/infra/query-key/query-key"; + +export function useDashboardTrend( + params?: DashboardTrendParams, +): UseQueryResult { + return useQuery({ + queryKey: queryKeys.dashboard.trend(params), + queryFn: () => dashboardApi.getTrend(params), + staleTime: 60 * 1000, + }); +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-vendor-insights.ts b/src/domain/dashboard/use-cases/use-dashboard-vendor-insights.ts new file mode 100644 index 00000000..1544dd52 --- /dev/null +++ b/src/domain/dashboard/use-cases/use-dashboard-vendor-insights.ts @@ -0,0 +1,12 @@ +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { VendorInsightRow } from "@/domain/dashboard/types/dashboard-vendor-insights"; +import { queryKeys } from "@/infra/query-key/query-key"; + +export function useDashboardVendorInsights(): UseQueryResult { + return useQuery({ + queryKey: queryKeys.dashboard.vendorInsights(), + queryFn: () => dashboardApi.getVendorInsights(), + staleTime: 60 * 1000, + }); +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-workload.ts b/src/domain/dashboard/use-cases/use-dashboard-workload.ts new file mode 100644 index 00000000..600fd3c3 --- /dev/null +++ b/src/domain/dashboard/use-cases/use-dashboard-workload.ts @@ -0,0 +1,16 @@ +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { DispatcherWorkloadRow } from "@/domain/dashboard/types/dashboard-workload"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; +import { queryKeys } from "@/infra/query-key/query-key"; + +export function useDashboardWorkload( + range: DashboardRangeKey, +): UseQueryResult { + return useQuery({ + queryKey: queryKeys.dashboard.workload(range), + queryFn: () => dashboardApi.getWorkload(dashboardRangeParams(range)), + staleTime: 60 * 1000, + }); +} diff --git a/src/domain/dashboard/utils/dashboard-range-utils.ts b/src/domain/dashboard/utils/dashboard-range-utils.ts new file mode 100644 index 00000000..3efc2ca4 --- /dev/null +++ b/src/domain/dashboard/utils/dashboard-range-utils.ts @@ -0,0 +1,73 @@ +import { DEFAULT_DASHBOARD_RANGE } from "@/domain/dashboard/types/dashboard-range"; +import type { + DashboardRangeKey, + DashboardRangeParams, +} from "@/domain/dashboard/types/dashboard-range"; + +export const BUSINESS_TIME_ZONE = "America/New_York"; + +const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/; + +export function businessTodayIso(now: Date = new Date()): string { + return new Intl.DateTimeFormat("en-CA", { + timeZone: BUSINESS_TIME_ZONE, + year: "numeric", + month: "2-digit", + day: "2-digit", + }).format(now); +} + +export function isIsoDate(value: string): boolean { + return ISO_DATE_PATTERN.test(value); +} + +export function addDaysIso(isoDate: string, days: number): string { + const [year, month, day] = isoDate.split("-").map(Number); + const shifted = new Date(Date.UTC(year, month - 1, day + days)); + return shifted.toISOString().slice(0, 10); +} + +export function mondayOf(isoDate: string): string { + const [year, month, day] = isoDate.split("-").map(Number); + const weekday = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); + return addDaysIso(isoDate, -((weekday + 6) % 7)); +} + +export function monthStartIso(isoDate: string): string { + return `${isoDate.slice(0, 7)}-01`; +} + +export function monthEndIso(isoDate: string): string { + const year = Number(isoDate.slice(0, 4)); + const month = Number(isoDate.slice(5, 7)); + const lastDay = new Date(Date.UTC(year, month, 0)).getUTCDate(); + return `${isoDate.slice(0, 7)}-${String(lastDay).padStart(2, "0")}`; +} + +function shiftMonthsIso(isoDate: string, months: number): string { + const year = Number(isoDate.slice(0, 4)); + const month = Number(isoDate.slice(5, 7)); + const shifted = new Date(Date.UTC(year, month - 1 + months, 1)); + return `${shifted.getUTCFullYear()}-${String(shifted.getUTCMonth() + 1).padStart(2, "0")}-01`; +} + +export function dashboardRangeParams( + range: DashboardRangeKey = DEFAULT_DASHBOARD_RANGE, + today: string = businessTodayIso(), +): DashboardRangeParams { + switch (range) { + case "today": + return { dateFrom: today, dateTo: today }; + case "this-week": { + const monday = mondayOf(today); + return { dateFrom: monday, dateTo: addDaysIso(monday, 4) }; + } + case "last-3-months": + return { + dateFrom: monthStartIso(shiftMonthsIso(today, -2)), + dateTo: monthEndIso(today), + }; + case "all-time": + return {}; + } +} diff --git a/src/domain/dashboard/utils/work-order-drilldown-links.ts b/src/domain/dashboard/utils/work-order-drilldown-links.ts new file mode 100644 index 00000000..a1f89f99 --- /dev/null +++ b/src/domain/dashboard/utils/work-order-drilldown-links.ts @@ -0,0 +1,82 @@ +import { ALL_WIZARD_STATUSES } from "@/domain/work-orders/types/work-order-wizard"; +import { WO_TYPES, type WOType } from "@/domain/work-orders/types/work-order-wizard"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { + addDaysIso, + businessTodayIso, + dashboardRangeParams, +} from "@/domain/dashboard/utils/dashboard-range-utils"; + +export const WORK_ORDERS_ROUTE = "/workorders"; +export const UPLIFTS_ROUTE = "/uplifts"; + +export const OPEN_WIZARD_STATUSES: readonly string[] = ALL_WIZARD_STATUSES.filter( + (status) => status !== "Completed", +); + +export function workOrderDrilldownUrl(search: URLSearchParams): string { + const query = search.toString(); + return query ? `${WORK_ORDERS_ROUTE}?${query}` : WORK_ORDERS_ROUTE; +} + +function setDateRange(search: URLSearchParams, range: DashboardRangeKey): void { + const params = dashboardRangeParams(range); + if (params.dateFrom && params.dateTo) { + search.set("dateFrom", params.dateFrom); + search.set("dateTo", params.dateTo); + } +} + +export function workOrderRangeDrilldownSearch(range: DashboardRangeKey): URLSearchParams { + const search = new URLSearchParams(); + setDateRange(search, range); + return search; +} + +export function workOrderStatusDrilldownSearch( + status: string, + range: DashboardRangeKey, +): URLSearchParams { + const search = workOrderRangeDrilldownSearch(range); + search.set("statuses", status); + return search; +} + +export function workOrderTypeDrilldownSearch( + type: string, + range: DashboardRangeKey, +): URLSearchParams | null { + if (!WO_TYPES.includes(type as WOType)) return null; + const search = workOrderRangeDrilldownSearch(range); + search.set("types", type); + return search; +} + +export function workOrderDispatcherDrilldownSearch( + dispatcherId: string, + range: DashboardRangeKey, +): URLSearchParams { + const search = workOrderRangeDrilldownSearch(range); + search.set("dispatchers", dispatcherId); + return search; +} + +export function scheduledTomorrowDrilldownSearch( + today: string = businessTodayIso(), +): URLSearchParams { + const tomorrow = addDaysIso(today, 1); + const search = new URLSearchParams(); + search.set("dateFrom", tomorrow); + search.set("dateTo", tomorrow); + return search; +} + +export function avetaPendingDrilldownSearch(today: string = businessTodayIso()): URLSearchParams { + const search = new URLSearchParams(); + search.set("dateFrom", today); + search.set("dateTo", addDaysIso(today, 1)); + search.set("aveta", "1"); + search.set("docs", "No"); + search.set("statuses", OPEN_WIZARD_STATUSES.join(",")); + return search; +} diff --git a/src/domain/work-orders/utils/dashboard-drilldown-params.ts b/src/domain/work-orders/utils/dashboard-drilldown-params.ts new file mode 100644 index 00000000..0d030c6c --- /dev/null +++ b/src/domain/work-orders/utils/dashboard-drilldown-params.ts @@ -0,0 +1,109 @@ +import type { CompletionDocFilter } from "@/domain/work-orders/types/work-order-advanced-filters"; +import type { WorkOrderAdvancedFilters } from "@/domain/work-orders/types/work-order-advanced-filters"; +import { EMPTY_ADVANCED_FILTERS } from "@/domain/work-orders/types/work-order-advanced-filters"; +import { ALL_WIZARD_STATUSES, WO_TYPES } from "@/domain/work-orders/types/work-order-wizard"; +import type { WizardWOStatus, WOType } from "@/domain/work-orders/types/work-order-wizard"; +import type { UpliftFilterStatus } from "@/domain/work-orders/types/work-order-uplift-filter"; +import { cloneAdvancedFilters } from "@/domain/work-orders/utils/advanced-filters-utils"; + +const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/; + +const COMPLETION_DOC_FILTERS: CompletionDocFilter[] = ["No", "Yes", "NN"]; + +const UPLIFT_FILTER_VALUES: UpliftFilterStatus[] = [ + "pending", + "approved", + "auto_approved", + "rejected", +]; + +function parseList(raw: string | null): string[] { + if (!raw) { + return []; + } + + return raw + .split(",") + .map((item) => item.trim()) + .filter((item) => item !== ""); +} + +function parseStatuses(raw: string | null): WizardWOStatus[] { + const valid = new Set(ALL_WIZARD_STATUSES); + return [...new Set(parseList(raw))].filter((status): status is WizardWOStatus => + valid.has(status), + ); +} + +function parseTypes(raw: string | null): WOType[] { + const valid = new Set(WO_TYPES); + return [...new Set(parseList(raw))].filter((type): type is WOType => valid.has(type)); +} + +function parseCompletionDocs(raw: string | null): CompletionDocFilter[] { + const valid = new Set(COMPLETION_DOC_FILTERS); + return [...new Set(parseList(raw))].filter((doc): doc is CompletionDocFilter => valid.has(doc)); +} + +function parseUpliftStatuses(raw: string | null): UpliftFilterStatus[] { + const valid = new Set(UPLIFT_FILTER_VALUES); + return [...new Set(parseList(raw))].filter((value): value is UpliftFilterStatus => + valid.has(value), + ); +} + +export function parseDashboardDrilldownParams( + params: URLSearchParams, +): WorkOrderAdvancedFilters | null { + const dateFrom = (params.get("dateFrom") ?? "").trim(); + const dateTo = (params.get("dateTo") ?? "").trim(); + const hasDateRange = ISO_DATE_PATTERN.test(dateFrom) && ISO_DATE_PATTERN.test(dateTo); + const avetaOnly = params.get("aveta") === "1"; + const docs = parseCompletionDocs(params.get("docs")); + const statuses = parseStatuses(params.get("statuses")); + const types = parseTypes(params.get("types")); + const dispatchers = parseList(params.get("dispatchers")); + const upliftStatuses = parseUpliftStatuses(params.get("upliftStatuses")); + const hasUplift = params.get("hasUplift") === "1"; + + const hasAny = + hasDateRange || + avetaOnly || + docs.length > 0 || + statuses.length > 0 || + types.length > 0 || + dispatchers.length > 0 || + upliftStatuses.length > 0 || + hasUplift; + + if (!hasAny) { + return null; + } + + const filters = cloneAdvancedFilters(EMPTY_ADVANCED_FILTERS); + + if (hasDateRange) { + filters.dateRange = "custom"; + filters.customFrom = dateFrom; + filters.customTo = dateTo; + } + filters.avetaOnly = avetaOnly; + filters.hasUplift = hasUplift || upliftStatuses.length > 0; + if (docs.length > 0) { + filters.docs = new Set(docs); + } + if (statuses.length > 0) { + filters.statuses = new Set(statuses); + } + if (types.length > 0) { + filters.types = new Set(types); + } + if (dispatchers.length > 0) { + filters.dispatchers = new Set(dispatchers); + } + if (upliftStatuses.length > 0) { + filters.upliftStatuses = new Set(upliftStatuses); + } + + return filters; +} diff --git a/src/infra/query-key/query-key.ts b/src/infra/query-key/query-key.ts index c4a9e284..4a408375 100644 --- a/src/infra/query-key/query-key.ts +++ b/src/infra/query-key/query-key.ts @@ -1,3 +1,5 @@ +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DashboardTrendParams } from "@/domain/dashboard/types/dashboard-trend"; import type { WorkOrdersListParams } from "@/domain/work-orders/types/work-order-list"; import type { WorkOrderBoardQueryParams, @@ -49,7 +51,15 @@ export const queryKeys = { }, dashboard: { all: ["dashboard"] as const, - stats: () => [...queryKeys.dashboard.all, "stats"] as const, + stats: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "stats", range] as const, + workload: (range: DashboardRangeKey) => + [...queryKeys.dashboard.all, "workload", range] as const, + performance: (range: DashboardRangeKey) => + [...queryKeys.dashboard.all, "performance", range] as const, + regions: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "regions", range] as const, + vendorInsights: () => [...queryKeys.dashboard.all, "vendorInsights"] as const, + trend: (params?: DashboardTrendParams) => + [...queryKeys.dashboard.all, "trend", params ?? {}] as const, }, dropdownOptions: { all: ["dropdownOptions"] as const, diff --git a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx new file mode 100644 index 00000000..1fcdcc7a --- /dev/null +++ b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx @@ -0,0 +1,153 @@ +import { fireEvent, screen } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { renderWithProviders } from "@/test/test-utils"; + +const navigate = vi.fn(); +const statsRange = vi.fn<(range: DashboardRangeKey) => void>(); + +vi.mock("react-router", async (importOriginal) => ({ + ...(await importOriginal()), + useNavigate: () => navigate, +})); + +vi.mock("@/domain/dashboard/use-cases/use-dashboard-workload", () => ({ + useDashboardWorkload: () => ({ data: [], isLoading: false, isFetching: false, error: null }), +})); + +vi.mock("@/domain/dashboard/use-cases/use-dashboard-performance", () => ({ + useDashboardPerformance: () => ({ data: [], isLoading: false, isFetching: false, error: null }), +})); + +vi.mock("@/domain/dashboard/use-cases/use-dashboard-regions", () => ({ + useDashboardRegions: () => ({ data: [], isLoading: false, isFetching: false, error: null }), +})); + +vi.mock("@/domain/dashboard/use-cases/use-dashboard-vendor-insights", () => ({ + useDashboardVendorInsights: () => ({ + data: [], + isLoading: false, + isFetching: false, + error: null, + }), +})); + +const statsData = { + scheduledTomorrow: 3, + pendingUplifts: 5, + avetaPending: 0, + breakdown: [ + { status: "PM", count: 7 }, + { status: "Completed", count: 0 }, + ], +}; + +vi.mock("@/domain/dashboard/use-cases/use-dashboard-stats", () => ({ + useDashboardStats: (range: DashboardRangeKey) => { + statsRange(range); + return { data: statsData, isLoading: false, isFetching: false, error: null }; + }, +})); + +import DashboardPage from "@/app/(protected)/dashboard"; +import { + avetaPendingDrilldownSearch, + scheduledTomorrowDrilldownSearch, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; +import { addDaysIso, businessTodayIso } from "@/domain/dashboard/utils/dashboard-range-utils"; + +function renderDashboard() { + return renderWithProviders(); +} + +describe("DashboardPage", () => { + beforeEach(() => { + navigate.mockReset(); + statsRange.mockReset(); + }); + + it("renders the prototype title, range options, and card titles", () => { + renderDashboard(); + + expect(screen.getByRole("heading", { name: "Dashboard" })).toBeInTheDocument(); + for (const label of ["This week", "Last 3 months", "Today", "All time"]) { + expect(screen.getByRole("button", { name: label })).toBeInTheDocument(); + } + for (const title of [ + "Scheduled Tomorrow", + "Pending Uplifts", + "Aveta Pending", + "Work Order Breakdown", + "Dispatcher Workload", + "Dispatcher Performance", + "Work Orders by Region", + "Vendor Insights", + ]) { + expect(screen.getByText(title)).toBeInTheDocument(); + } + expect(statsRange).toHaveBeenCalledWith("this-week"); + }); + + it("exposes positive KPI cards as keyboard-accessible drill-downs", () => { + renderDashboard(); + + const tomorrowCard = screen.getByRole("button", { name: /Scheduled Tomorrow/ }); + expect(tomorrowCard).toBeInTheDocument(); + fireEvent.click(tomorrowCard); + + const today = businessTodayIso(); + expect(navigate).toHaveBeenCalledWith( + `/workorders?${scheduledTomorrowDrilldownSearch(today).toString()}`, + ); + + fireEvent.click(screen.getByRole("button", { name: /Pending Uplifts/ })); + expect(navigate).toHaveBeenCalledWith("/uplifts"); + }); + + it("keeps zero counts inert", () => { + renderDashboard(); + + expect(screen.queryByRole("button", { name: /Aveta Pending/ })).toBeNull(); + + fireEvent.click(screen.getByText("Aveta Pending")); + expect(navigate).not.toHaveBeenCalled(); + + const inertRow = screen.getByText("Completed"); + fireEvent.click(inertRow); + expect(navigate).not.toHaveBeenCalled(); + }); + + it("drills the breakdown status into filtered work orders", () => { + renderDashboard(); + + fireEvent.click(screen.getByText("PM")); + + const calls = navigate.mock.calls; + const [url] = calls[calls.length - 1] ?? []; + expect(String(url)).toContain("/workorders?"); + expect(String(url)).toContain("types=PM"); + }); + + it("switches the stats range from the toggle", () => { + renderDashboard(); + + fireEvent.click(screen.getByRole("button", { name: "Today" })); + + expect(statsRange).toHaveBeenCalledWith("today"); + }); + + it("shows the documented empty states when datasets are empty", () => { + renderDashboard(); + + expect(screen.getByText("No work orders match the current filters.")).toBeInTheDocument(); + expect(screen.getAllByText("No dispatchers are set up yet.")).toHaveLength(2); + expect(screen.getByText("No active vendor has any work orders yet.")).toBeInTheDocument(); + }); + + it("keeps drilldown dates deterministic on the business clock", () => { + const today = businessTodayIso(); + + expect(scheduledTomorrowDrilldownSearch(today).get("dateFrom")).toBe(addDaysIso(today, 1)); + expect(avetaPendingDrilldownSearch(today).get("aveta")).toBe("1"); + }); +}); diff --git a/src/test/domain/dashboard/dashboard-api.test.ts b/src/test/domain/dashboard/dashboard-api.test.ts new file mode 100644 index 00000000..7ac5c918 --- /dev/null +++ b/src/test/domain/dashboard/dashboard-api.test.ts @@ -0,0 +1,182 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const apiGet = vi.fn(); + +vi.mock("@/api/api", () => ({ + apiGet: (...args: unknown[]) => apiGet(...args), +})); + +import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; + +describe("dashboardApi", () => { + beforeEach(() => { + apiGet.mockReset(); + }); + + it("maps stats tolerantly and sends the range params", async () => { + apiGet.mockResolvedValue({ + Data: { + Total: 12, + Open: 8, + NotDispatched: 2, + Completed: 4, + DueCount: 5, + CompletedDueCount: 3, + CompletionRate: 60, + AverageResolutionDays: 4.5, + ScheduledTomorrow: "3", + PendingUplifts: 2, + AvetaPending: "1", + Breakdown: [ + { Status: "Scheduled", Count: "7" }, + { Status: "Completed", Count: 4 }, + ], + }, + }); + + const stats = await dashboardApi.getStats({ dateFrom: "2026-09-14", dateTo: "2026-09-18" }); + + expect(stats).toEqual({ + total: 12, + open: 8, + notDispatched: 2, + completed: 4, + dueCount: 5, + completedDueCount: 3, + completionRate: 60, + averageResolutionDays: 4.5, + scheduledTomorrow: 3, + pendingUplifts: 2, + avetaPending: 1, + breakdown: [ + { status: "Scheduled", count: 7 }, + { status: "Completed", count: 4 }, + ], + }); + expect(apiGet).toHaveBeenCalledWith("Dashboard/Stats", { + searchParams: { dateFrom: "2026-09-14", dateTo: "2026-09-18" }, + }); + }); + + it("omits search params for the all-time range", async () => { + apiGet.mockResolvedValue({ scheduledTomorrow: 0, pendingUplifts: 0, avetaPending: 0 }); + + await dashboardApi.getStats({}); + + expect(apiGet).toHaveBeenCalledWith("Dashboard/Stats", undefined); + }); + + it("maps workload rows", async () => { + apiGet.mockResolvedValue({ + Items: [{ DispatcherId: 12, DispatcherName: "Dana Reyes", OpenCount: "4", TotalCount: 6 }], + }); + + await expect(dashboardApi.getWorkload()).resolves.toEqual([ + { + dispatcherId: "12", + dispatcherName: "Dana Reyes", + openWorkOrders: 4, + totalWorkOrders: 6, + }, + ]); + expect(apiGet).toHaveBeenCalledWith("Dashboard/Workload", undefined); + }); + + it("maps performance rows", async () => { + apiGet.mockResolvedValue({ + Items: [ + { + DispatcherId: 12, + DispatcherName: "Dana Reyes", + CompletionRate: 96.5, + AverageResolutionDays: 3.25, + }, + ], + }); + + await expect(dashboardApi.getPerformance()).resolves.toEqual([ + { + dispatcherId: "12", + dispatcherName: "Dana Reyes", + completionRate: 96.5, + averageResolutionDays: 3.25, + }, + ]); + }); + + it("maps unknown regions to Unmapped", async () => { + apiGet.mockResolvedValue({ + Items: [{ Region: "North", Count: 5 }, { Name: " ", WorkOrderCount: 2 }, {}], + }); + + await expect(dashboardApi.getRegions()).resolves.toEqual([ + { region: "North", workOrderCount: 5 }, + { region: "Unmapped/Other", workOrderCount: 2 }, + { region: "Unmapped/Other", workOrderCount: 0 }, + ]); + }); + + it("maps vendor insights with company-name fallback", async () => { + apiGet.mockResolvedValue({ + Items: [ + { + VendorCompanyId: 3, + VendorCompanyName: "Gateway Plumbing", + CompletionRate: 82, + RescheduleRate: 4, + AverageResolutionDays: 3, + TotalJobs: 11, + }, + ], + }); + + await expect(dashboardApi.getVendorInsights()).resolves.toEqual([ + { + vendorId: "3", + vendorName: "Gateway Plumbing", + completionRate: 82, + rescheduleRate: 4, + averageResolutionDays: 3, + totalJobs: 11, + }, + ]); + }); + + it("maps the trend contract and sends date, granularity, and year params", async () => { + apiGet.mockResolvedValue({ + Granularity: "Week", + Buckets: [{ Date: "2026-09-07", Label: "2026-W37", Total: "9", IsCurrent: true }], + }); + + await expect( + dashboardApi.getTrend({ + dateFrom: "2026-09-01", + dateTo: "2026-09-30", + granularity: "month", + year: 2026, + }), + ).resolves.toEqual({ + granularity: "week", + points: [ + { + date: "2026-09-07", + label: "2026-W37", + total: 9, + open: 0, + completed: 0, + canceled: 0, + overdue: 0, + isCurrent: true, + }, + ], + }); + expect(apiGet).toHaveBeenCalledWith("Dashboard/Trend", { + searchParams: { + dateFrom: "2026-09-01", + dateTo: "2026-09-30", + granularity: "month", + year: 2026, + }, + }); + }); +}); diff --git a/src/test/domain/dashboard/dashboard-range-utils.test.ts b/src/test/domain/dashboard/dashboard-range-utils.test.ts new file mode 100644 index 00000000..61317746 --- /dev/null +++ b/src/test/domain/dashboard/dashboard-range-utils.test.ts @@ -0,0 +1,68 @@ +import { describe, expect, it } from "vitest"; +import { + addDaysIso, + businessTodayIso, + dashboardRangeParams, + mondayOf, + monthEndIso, + monthStartIso, +} from "@/domain/dashboard/utils/dashboard-range-utils"; + +describe("businessTodayIso", () => { + it("formats the America/New_York calendar date regardless of UTC time", () => { + expect(businessTodayIso(new Date("2026-09-16T23:30:00Z"))).toBe("2026-09-16"); + expect(businessTodayIso(new Date("2026-09-17T02:30:00Z"))).toBe("2026-09-16"); + expect(businessTodayIso(new Date("2026-01-01T04:30:00Z"))).toBe("2025-12-31"); + }); +}); + +describe("addDaysIso", () => { + it("rolls over month and year boundaries", () => { + expect(addDaysIso("2026-01-31", 1)).toBe("2026-02-01"); + expect(addDaysIso("2026-12-31", 1)).toBe("2027-01-01"); + expect(addDaysIso("2026-09-14", -7)).toBe("2026-09-07"); + }); +}); + +describe("mondayOf", () => { + it("returns the Monday of the ISO week", () => { + expect(mondayOf("2026-09-16")).toBe("2026-09-14"); + expect(mondayOf("2026-09-14")).toBe("2026-09-14"); + expect(mondayOf("2026-09-13")).toBe("2026-09-07"); + }); +}); + +describe("monthStartIso / monthEndIso", () => { + it("returns month bounds", () => { + expect(monthStartIso("2026-09-16")).toBe("2026-09-01"); + expect(monthEndIso("2026-09-16")).toBe("2026-09-30"); + expect(monthEndIso("2026-02-16")).toBe("2026-02-28"); + }); +}); + +describe("dashboardRangeParams", () => { + it("maps today to the business date", () => { + expect(dashboardRangeParams("today", "2026-09-16")).toEqual({ + dateFrom: "2026-09-16", + dateTo: "2026-09-16", + }); + }); + + it("maps this week to the Monday-Friday business week", () => { + expect(dashboardRangeParams("this-week", "2026-09-16")).toEqual({ + dateFrom: "2026-09-14", + dateTo: "2026-09-18", + }); + }); + + it("maps last 3 months to the trailing month span", () => { + expect(dashboardRangeParams("last-3-months", "2026-09-16")).toEqual({ + dateFrom: "2026-07-01", + dateTo: "2026-09-30", + }); + }); + + it("maps all time to unbounded params", () => { + expect(dashboardRangeParams("all-time", "2026-09-16")).toEqual({}); + }); +}); diff --git a/src/test/domain/dashboard/work-order-drilldown-links.test.ts b/src/test/domain/dashboard/work-order-drilldown-links.test.ts new file mode 100644 index 00000000..90e629f4 --- /dev/null +++ b/src/test/domain/dashboard/work-order-drilldown-links.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from "vitest"; +import { + avetaPendingDrilldownSearch, + scheduledTomorrowDrilldownSearch, + workOrderDrilldownUrl, + workOrderRangeDrilldownSearch, + workOrderStatusDrilldownSearch, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; + +describe("work-order drilldown links", () => { + it("schedules the tomorrow drilldown on the business clock", () => { + const search = scheduledTomorrowDrilldownSearch("2026-09-16"); + + expect(search.get("dateFrom")).toBe("2026-09-17"); + expect(search.get("dateTo")).toBe("2026-09-17"); + }); + + it("builds the Aveta Pending drilldown per SH-294", () => { + const search = avetaPendingDrilldownSearch("2026-09-16"); + const statuses = (search.get("statuses") ?? "").split(","); + + expect(search.get("dateFrom")).toBe("2026-09-16"); + expect(search.get("dateTo")).toBe("2026-09-17"); + expect(search.get("aveta")).toBe("1"); + expect(search.get("docs")).toBe("No"); + expect(statuses).toContain("Scheduled"); + expect(statuses).not.toContain("Completed"); + }); + + it("carries the range into status drilldowns", () => { + const search = workOrderStatusDrilldownSearch("Scheduled", "today"); + + expect(search.get("dateFrom")).toBe("2026-09-16"); + expect(search.get("dateTo")).toBe("2026-09-16"); + expect(search.get("statuses")).toBe("Scheduled"); + }); + + it("omits dates for the all-time range", () => { + expect(workOrderRangeDrilldownSearch("all-time").toString()).toBe(""); + }); + + it("renders plain or query-bearing work order URLs", () => { + expect(workOrderDrilldownUrl(new URLSearchParams())).toBe("/workorders"); + expect(workOrderDrilldownUrl(new URLSearchParams({ statuses: "Scheduled" }))).toBe( + "/workorders?statuses=Scheduled", + ); + }); +}); diff --git a/src/test/domain/work-orders/dashboard-drilldown-params.test.ts b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts new file mode 100644 index 00000000..8c2f58fd --- /dev/null +++ b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts @@ -0,0 +1,60 @@ +import { describe, expect, it } from "vitest"; +import { parseDashboardDrilldownParams } from "@/domain/work-orders/utils/dashboard-drilldown-params"; +import { avetaPendingDrilldownSearch } from "@/domain/dashboard/utils/work-order-drilldown-links"; + +describe("parseDashboardDrilldownParams", () => { + it("returns null when no recognized param is present", () => { + expect(parseDashboardDrilldownParams(new URLSearchParams())).toBeNull(); + expect( + parseDashboardDrilldownParams(new URLSearchParams({ dateFrom: "2026-09-16" })), + ).toBeNull(); + expect(parseDashboardDrilldownParams(new URLSearchParams({ aveta: "0" }))).toBeNull(); + }); + + it("maps dates to a custom advanced-filter range", () => { + const filters = parseDashboardDrilldownParams( + new URLSearchParams({ dateFrom: "2026-09-14", dateTo: "2026-09-18" }), + ); + + expect(filters).not.toBeNull(); + expect(filters?.dateRange).toBe("custom"); + expect(filters?.customFrom).toBe("2026-09-14"); + expect(filters?.customTo).toBe("2026-09-18"); + }); + + it("parses the Aveta Pending drilldown and drops unknown statuses", () => { + const params = avetaPendingDrilldownSearch("2026-09-16"); + params.append("statuses", "NotAStatus"); + const filters = parseDashboardDrilldownParams(params); + + expect(filters).not.toBeNull(); + expect(filters?.avetaOnly).toBe(true); + expect(filters?.docs).toEqual(new Set(["No"])); + expect(filters?.statuses).not.toBeNull(); + expect([...(filters?.statuses ?? [])]).not.toContain("Completed"); + expect([...(filters?.statuses ?? [])]).not.toContain("NotAStatus"); + expect(filters?.statuses.has("Scheduled")).toBe(true); + expect(filters?.statuses.has("Pending Quote")).toBe(true); + }); + + it("parses dispatcher and uplift params", () => { + const filters = parseDashboardDrilldownParams( + new URLSearchParams({ + dispatchers: " 12 , 13", + upliftStatuses: "pending,bogus", + }), + ); + + expect(filters?.dispatchers).toEqual(new Set(["12", "13"])); + expect(filters?.hasUplift).toBe(true); + expect(filters?.upliftStatuses).toEqual(new Set(["pending"])); + }); + + it("rejects partial or malformed date ranges", () => { + expect( + parseDashboardDrilldownParams( + new URLSearchParams({ dateFrom: "2026-9-16", dateTo: "2026-09-18" }), + ), + ).toBeNull(); + }); +}); From c7388ba2d9a148a91c424b56d0339db8daebefdf Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Wed, 16 Sep 2026 20:40:33 -0300 Subject: [PATCH 2/7] fix(dashboard): map breakdown type keys and open performance drill-downs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Work Order Breakdown object from the backend serializes its keys without JsonPropertyName, so they arrive lowercase (pm/emergency/reactive/ overdue/other). The mapper copied them straight into `status`, which the card uses as both label and the `types` drill-down id, and `workOrderTypeDrilldownSearch` only accepts canonical WOType values — so every breakdown row rendered lowercase and was inert (SH-354). Route both mapping branches through a normalizer that maps type keys back to their canonical labels case-insensitively; `other` is not a WOType, so it stays a labelled, non-drillable "Other" row, and unknown values (legacy array-shape lifecycle labels) pass through unchanged. Dispatcher Performance gated its drill-down on `completionRate > 0`, so a dispatcher with assigned work but no completions yet was inert here while drillable from Workload. The drill-down filters by dispatcher + range and never uses the rate, so gate on identity instead. Also mock useDashboardTrend in the dashboard page test so it no longer issues a real request that failed quietly in jsdom. --- .../dispatcher-performance-card.tsx | 8 ++++- src/domain/dashboard/api/dashboard-api.ts | 35 ++++++++++++++++--- .../dashboard/dashboard-page.test.tsx | 12 ++++++- .../domain/dashboard/dashboard-api.test.ts | 18 ++++++++++ 4 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx index 72130baa..9803a5df 100644 --- a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx +++ b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx @@ -30,7 +30,13 @@ function DispatcherNameCell({ range: DashboardRangeKey; }) { const navigate = useNavigate(); - const drillable = Boolean(row.dispatcherId) && row.completionRate > 0; + // A listed dispatcher is one with work in range; the drill-down filters Work + // Orders by dispatcher + range and never uses the completion rate, so gate on + // identity rather than the rate. (A dispatcher with assigned work but a 0% + // rate was previously inert here while drillable from Workload.) When SH-347's + // Assigned/Completed counts land on DispatcherPerformanceRow this should + // become `assigned > 0`, matching Workload's `totalWorkOrders > 0`. + const drillable = Boolean(row.dispatcherId); if (!drillable) { return {row.dispatcherName}; diff --git a/src/domain/dashboard/api/dashboard-api.ts b/src/domain/dashboard/api/dashboard-api.ts index f6655af7..274167b6 100644 --- a/src/domain/dashboard/api/dashboard-api.ts +++ b/src/domain/dashboard/api/dashboard-api.ts @@ -19,6 +19,7 @@ import { } from "@/domain/dashboard/types/dashboard-regions"; import type { DispatcherWorkloadRow } from "@/domain/dashboard/types/dashboard-workload"; import type { VendorInsightRow } from "@/domain/dashboard/types/dashboard-vendor-insights"; +import { WO_TYPES } from "@/domain/work-orders/types/work-order-wizard"; function toNumber(value: unknown): number { if (typeof value === "number" && Number.isFinite(value)) { @@ -100,11 +101,34 @@ function trendSearchParams(params?: DashboardTrendParams): Options | undefined { return { searchParams }; } +const BREAKDOWN_TYPE_BY_LOWER = new Map( + WO_TYPES.map((type) => [type.toLowerCase(), type]), +); + +/** + * The backend breakdown object (backend#138) serializes its keys with no + * JsonPropertyName, so `PM`/`Emergency`/`Reactive`/`Overdue`/`Other` arrive + * lowercase. The card uses the row label as both display text and the + * `types` drill-down id, and `workOrderTypeDrilldownSearch` only accepts + * canonical `WOType` values — so map lowercase type keys back to their + * canonical labels. `other` is not a WOType: keep it as a labelled, + * non-drillable "Other" row. Unknown values (e.g. lifecycle labels from the + * legacy array shape) pass through unchanged. + */ +function normalizeBreakdownStatus(raw: string): string { + const trimmed = raw.trim(); + const canonical = BREAKDOWN_TYPE_BY_LOWER.get(trimmed.toLowerCase()); + if (canonical) return canonical; + if (trimmed.toLowerCase() === "other") return "Other"; + return trimmed; +} + function mapBreakdownRow(raw: Record): DashboardBreakdownRow { + const status = asString( + readField(raw, "status") ?? readField(raw, "name") ?? readField(raw, "label"), + ); return { - status: - asString(readField(raw, "status") ?? readField(raw, "name") ?? readField(raw, "label")) || - UNMAPPED_REGION_LABEL, + status: status ? normalizeBreakdownStatus(status) : UNMAPPED_REGION_LABEL, count: toNumber(readField(raw, "count") ?? readField(raw, "value")), }; } @@ -116,7 +140,10 @@ function mapBreakdown(value: unknown): DashboardBreakdownRow[] { if (typeof value === "object" && value !== null) { return Object.entries(value as Record) - .map(([status, count]) => ({ status, count: toNumber(count) })) + .map(([status, count]) => ({ + status: normalizeBreakdownStatus(status), + count: toNumber(count), + })) .filter((row) => row.status !== ""); } diff --git a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx index 1fcdcc7a..6c73211c 100644 --- a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx +++ b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx @@ -32,6 +32,15 @@ vi.mock("@/domain/dashboard/use-cases/use-dashboard-vendor-insights", () => ({ }), })); +vi.mock("@/domain/dashboard/use-cases/use-dashboard-trend", () => ({ + useDashboardTrend: () => ({ + data: { granularity: null, points: [] }, + isLoading: false, + isFetching: false, + error: null, + }), +})); + const statsData = { scheduledTomorrow: 3, pendingUplifts: 5, @@ -139,7 +148,8 @@ describe("DashboardPage", () => { it("shows the documented empty states when datasets are empty", () => { renderDashboard(); - expect(screen.getByText("No work orders match the current filters.")).toBeInTheDocument(); + // Breakdown and Trend share this empty copy, so both cards surface it. + expect(screen.getAllByText("No work orders match the current filters.")).toHaveLength(2); expect(screen.getAllByText("No dispatchers are set up yet.")).toHaveLength(2); expect(screen.getByText("No active vendor has any work orders yet.")).toBeInTheDocument(); }); diff --git a/src/test/domain/dashboard/dashboard-api.test.ts b/src/test/domain/dashboard/dashboard-api.test.ts index 7ac5c918..e24e30e5 100644 --- a/src/test/domain/dashboard/dashboard-api.test.ts +++ b/src/test/domain/dashboard/dashboard-api.test.ts @@ -58,6 +58,24 @@ describe("dashboardApi", () => { }); }); + it("maps the object breakdown shape to canonical WOType labels", async () => { + apiGet.mockResolvedValue({ + Data: { + Breakdown: { pm: 3, emergency: 1, reactive: "2", overdue: 4, other: 5 }, + }, + }); + + const stats = await dashboardApi.getStats(); + + expect(stats.breakdown).toEqual([ + { status: "PM", count: 3 }, + { status: "Emergency", count: 1 }, + { status: "Reactive", count: 2 }, + { status: "Overdue", count: 4 }, + { status: "Other", count: 5 }, + ]); + }); + it("omits search params for the all-time range", async () => { apiGet.mockResolvedValue({ scheduledTomorrow: 0, pendingUplifts: 0, avetaPending: 0 }); From 0279cfac64647acb898eb4bc6d95b28c7492f392 Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Thu, 17 Sep 2026 00:36:55 -0300 Subject: [PATCH 3/7] feat(dashboard): paginate dispatcher tables and fix Aveta drilldown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Workload and Performance page server-side at 10 rows and now return Page, PageSize, and TotalDispatchers on dev (backend#126/#127), so wire the pager that SH-346 and SH-347 require: getWorkload/getPerformance send a 1-based `page` and parse the paging envelope, the hooks and query keys carry the page, and each dispatcher table renders a 10-row pager. Page state is per-table and resets on a range change so switching range never lands on an out-of-range empty page that reads as a false "no dispatchers" state. Drop `docs=No` from the Aveta Pending drilldown. `docs` filters on completion-document status, not the Aveta clearance document the tile counts (SH-294 / backend#138), so it narrowed to the wrong rows. The board has no missing-Aveta-document filter, so the drilldown is now the Aveta-required work in the two-day open window — a deliberate superset of the count. --- .../dispatcher-performance-card.tsx | 16 +++++ .../_components/dispatcher-table-pager.tsx | 40 +++++++++++ .../_components/dispatcher-workload-card.tsx | 16 +++++ src/app/(protected)/dashboard/index.tsx | 34 +++++++-- src/domain/dashboard/api/dashboard-api.ts | 70 ++++++++++++++++-- .../types/dashboard-dispatcher-page.ts | 10 +++ .../use-cases/use-dashboard-performance.ts | 8 ++- .../use-cases/use-dashboard-workload.ts | 8 ++- .../utils/work-order-drilldown-links.ts | 7 +- src/infra/query-key/query-key.ts | 8 +-- .../dashboard/dashboard-page.test.tsx | 71 +++++++++++++++++- .../dashboard/dispatcher-table-pager.test.tsx | 39 ++++++++++ .../domain/dashboard/dashboard-api.test.ts | 72 ++++++++++++++----- .../work-order-drilldown-links.test.ts | 4 +- .../dashboard-drilldown-params.test.ts | 4 +- 15 files changed, 362 insertions(+), 45 deletions(-) create mode 100644 src/app/(protected)/dashboard/_components/dispatcher-table-pager.tsx create mode 100644 src/domain/dashboard/types/dashboard-dispatcher-page.ts create mode 100644 src/test/app/(protected)/dashboard/dispatcher-table-pager.test.tsx diff --git a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx index 9803a5df..94231dbd 100644 --- a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx +++ b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx @@ -8,12 +8,17 @@ import { workOrderDrilldownUrl, } from "@/domain/dashboard/utils/work-order-drilldown-links"; import { DashboardCard } from "./dashboard-card"; +import { DispatcherTablePager } from "./dispatcher-table-pager"; const EMPTY_MESSAGE = "No dispatchers are set up yet."; interface DispatcherPerformanceCardProps { rows: DispatcherPerformanceRow[]; range: DashboardRangeKey; + page: number; + pageSize: number; + totalDispatchers: number; + onPageChange: (page: number) => void; isLoading?: boolean; error?: unknown; } @@ -59,6 +64,10 @@ function DispatcherNameCell({ export function DispatcherPerformanceCard({ rows, range, + page, + pageSize, + totalDispatchers, + onPageChange, isLoading = false, error, }: DispatcherPerformanceCardProps) { @@ -98,6 +107,13 @@ export function DispatcherPerformanceCard({ + ); } diff --git a/src/app/(protected)/dashboard/_components/dispatcher-table-pager.tsx b/src/app/(protected)/dashboard/_components/dispatcher-table-pager.tsx new file mode 100644 index 00000000..b0837efb --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dispatcher-table-pager.tsx @@ -0,0 +1,40 @@ +import { Box, Pagination } from "@mui/material"; + +interface DispatcherTablePagerProps { + page: number; + pageSize: number; + totalDispatchers: number; + onPageChange: (page: number) => void; + label: string; +} + +/** + * 10-row pager for the dispatcher tables (SH-346/SH-347). Renders nothing until + * there is more than one page, so single-page tables are unchanged. + */ +export function DispatcherTablePager({ + page, + pageSize, + totalDispatchers, + onPageChange, + label, +}: DispatcherTablePagerProps) { + const pageCount = pageSize > 0 ? Math.ceil(totalDispatchers / pageSize) : 1; + + if (pageCount <= 1) { + return null; + } + + return ( + + onPageChange(value)} + aria-label={label} + /> + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx index e0f0c73e..99980df2 100644 --- a/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx +++ b/src/app/(protected)/dashboard/_components/dispatcher-workload-card.tsx @@ -8,12 +8,17 @@ import { workOrderDrilldownUrl, } from "@/domain/dashboard/utils/work-order-drilldown-links"; import { DashboardCard } from "./dashboard-card"; +import { DispatcherTablePager } from "./dispatcher-table-pager"; const EMPTY_MESSAGE = "No dispatchers are set up yet."; interface DispatcherWorkloadCardProps { rows: DispatcherWorkloadRow[]; range: DashboardRangeKey; + page: number; + pageSize: number; + totalDispatchers: number; + onPageChange: (page: number) => void; isLoading?: boolean; error?: unknown; } @@ -49,6 +54,10 @@ function DispatcherNameCell({ export function DispatcherWorkloadCard({ rows, range, + page, + pageSize, + totalDispatchers, + onPageChange, isLoading = false, error, }: DispatcherWorkloadCardProps) { @@ -86,6 +95,13 @@ export function DispatcherWorkloadCard({ + ); } diff --git a/src/app/(protected)/dashboard/index.tsx b/src/app/(protected)/dashboard/index.tsx index 92f385bc..988dd493 100644 --- a/src/app/(protected)/dashboard/index.tsx +++ b/src/app/(protected)/dashboard/index.tsx @@ -13,6 +13,7 @@ import { DispatcherWorkloadCard } from "@/app/(protected)/dashboard/_components/ import { VendorInsightsCard } from "@/app/(protected)/dashboard/_components/vendor-insights-card"; import { WorkOrderBreakdownCard } from "@/app/(protected)/dashboard/_components/work-order-breakdown-card"; import { WorkOrdersByRegionCard } from "@/app/(protected)/dashboard/_components/work-orders-by-region-card"; +import { DISPATCHER_PAGE_SIZE } from "@/domain/dashboard/types/dashboard-dispatcher-page"; import { DEFAULT_DASHBOARD_RANGE, type DashboardRangeKey, @@ -32,12 +33,25 @@ import { export default function DashboardPage() { const navigate = useNavigate(); const [range, setRange] = useState(DEFAULT_DASHBOARD_RANGE); + const [workloadPage, setWorkloadPage] = useState(1); + const [performancePage, setPerformancePage] = useState(1); const stats = useDashboardStats(range); - const workload = useDashboardWorkload(range); - const performance = useDashboardPerformance(range); + const workload = useDashboardWorkload(range, workloadPage); + const performance = useDashboardPerformance(range, performancePage); const regions = useDashboardRegions(range); const vendors = useDashboardVendorInsights(); + // A range change re-scopes both dispatcher tables, so their page must reset — + // otherwise a switch while on page 3 lands on an out-of-range empty page that + // reads as a false "no dispatchers" state. + const changeRange = (next: DashboardRangeKey) => { + setRange(next); + setWorkloadPage(1); + setPerformancePage(1); + }; + + const resetFilters = () => changeRange(DEFAULT_DASHBOARD_RANGE); + const isRefreshing = [stats, workload, performance, regions, vendors].some((query) => query.isFetching) && !stats.isLoading; @@ -50,11 +64,11 @@ export default function DashboardPage() { {isRefreshing && } {range !== DEFAULT_DASHBOARD_RANGE && ( - )} - + } /> @@ -100,14 +114,22 @@ export default function DashboardPage() { error={regions.error} /> diff --git a/src/domain/dashboard/api/dashboard-api.ts b/src/domain/dashboard/api/dashboard-api.ts index 274167b6..7d3a76f9 100644 --- a/src/domain/dashboard/api/dashboard-api.ts +++ b/src/domain/dashboard/api/dashboard-api.ts @@ -8,6 +8,10 @@ import type { DashboardStats, } from "@/domain/dashboard/types/dashboard-stats"; import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; +import { + DISPATCHER_PAGE_SIZE, + type DispatcherPage, +} from "@/domain/dashboard/types/dashboard-dispatcher-page"; import type { DashboardTrendParams } from "@/domain/dashboard/types/dashboard-trend"; import type { DashboardTrend, @@ -83,6 +87,44 @@ function rangeSearchParams(range?: DashboardRangeParams): Options | undefined { return { searchParams: { dateFrom: range.dateFrom, dateTo: range.dateTo } }; } +/** + * Workload and Performance are paged server-side (backend#126/#127): `page` is + * 1-based and always sent, and the range dates ride along when present. + */ +function dispatcherPageSearchParams( + range: DashboardRangeParams | undefined, + page: number, +): Options { + const searchParams: Record = { page }; + if (range?.dateFrom && range?.dateTo) { + searchParams.dateFrom = range.dateFrom; + searchParams.dateTo = range.dateTo; + } + return { searchParams }; +} + +/** + * Reads the paging envelope the dispatcher endpoints return (`Page`, `PageSize`, + * `TotalDispatchers`). Falls back to the requested page, the default page size, + * and the item count for the legacy bare-array shape so older responses still + * render (with the pager hidden). + */ +function readDispatcherPageMeta( + raw: unknown, + requestedPage: number, + itemCount: number, +): { page: number; pageSize: number; totalDispatchers: number } { + const data = toRecord(raw); + const pageValue = readField(data, "page"); + const pageSizeValue = readField(data, "pageSize"); + const totalValue = readField(data, "totalDispatchers"); + return { + page: pageValue == null ? requestedPage : toNumber(pageValue), + pageSize: pageSizeValue == null ? DISPATCHER_PAGE_SIZE : toNumber(pageSizeValue), + totalDispatchers: totalValue == null ? itemCount : toNumber(totalValue), + }; +} + function trendSearchParams(params?: DashboardTrendParams): Options | undefined { if ( !params || @@ -290,13 +332,29 @@ export const dashboardApi = { const data = await apiGet(API_PATHS.dashboard.stats, rangeSearchParams(range)); return mapDashboardStats(handleApiResponse(data)); }, - getWorkload: async (range?: DashboardRangeParams): Promise => { - const data = await apiGet(API_PATHS.dashboard.workload, rangeSearchParams(range)); - return mapDispatcherWorkload(handleApiResponse(data)); + getWorkload: async ( + range?: DashboardRangeParams, + page = 1, + ): Promise> => { + const data = await apiGet( + API_PATHS.dashboard.workload, + dispatcherPageSearchParams(range, page), + ); + const response = handleApiResponse(data); + const items = mapDispatcherWorkload(response); + return { items, ...readDispatcherPageMeta(response, page, items.length) }; }, - getPerformance: async (range?: DashboardRangeParams): Promise => { - const data = await apiGet(API_PATHS.dashboard.performance, rangeSearchParams(range)); - return mapDispatcherPerformance(handleApiResponse(data)); + getPerformance: async ( + range?: DashboardRangeParams, + page = 1, + ): Promise> => { + const data = await apiGet( + API_PATHS.dashboard.performance, + dispatcherPageSearchParams(range, page), + ); + const response = handleApiResponse(data); + const items = mapDispatcherPerformance(response); + return { items, ...readDispatcherPageMeta(response, page, items.length) }; }, getRegions: async (range?: DashboardRangeParams): Promise => { const data = await apiGet(API_PATHS.dashboard.regions, rangeSearchParams(range)); diff --git a/src/domain/dashboard/types/dashboard-dispatcher-page.ts b/src/domain/dashboard/types/dashboard-dispatcher-page.ts new file mode 100644 index 00000000..686b4f63 --- /dev/null +++ b/src/domain/dashboard/types/dashboard-dispatcher-page.ts @@ -0,0 +1,10 @@ +/** Backend pages both dispatcher tables at 10 rows (backend#126/#127). */ +export const DISPATCHER_PAGE_SIZE = 10; + +/** A single page of dispatcher rows plus the paging metadata the tables need. */ +export interface DispatcherPage { + items: TRow[]; + page: number; + pageSize: number; + totalDispatchers: number; +} diff --git a/src/domain/dashboard/use-cases/use-dashboard-performance.ts b/src/domain/dashboard/use-cases/use-dashboard-performance.ts index 9fd6c168..06491072 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-performance.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-performance.ts @@ -1,5 +1,6 @@ import { useQuery, type UseQueryResult } from "@tanstack/react-query"; import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { DispatcherPage } from "@/domain/dashboard/types/dashboard-dispatcher-page"; import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; @@ -7,10 +8,11 @@ import { queryKeys } from "@/infra/query-key/query-key"; export function useDashboardPerformance( range: DashboardRangeKey, -): UseQueryResult { + page = 1, +): UseQueryResult, Error> { return useQuery({ - queryKey: queryKeys.dashboard.performance(range), - queryFn: () => dashboardApi.getPerformance(dashboardRangeParams(range)), + queryKey: queryKeys.dashboard.performance(range, page), + queryFn: () => dashboardApi.getPerformance(dashboardRangeParams(range), page), staleTime: 60 * 1000, }); } diff --git a/src/domain/dashboard/use-cases/use-dashboard-workload.ts b/src/domain/dashboard/use-cases/use-dashboard-workload.ts index 600fd3c3..e2276768 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-workload.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-workload.ts @@ -1,5 +1,6 @@ import { useQuery, type UseQueryResult } from "@tanstack/react-query"; import { dashboardApi } from "@/domain/dashboard/api/dashboard-api"; +import type { DispatcherPage } from "@/domain/dashboard/types/dashboard-dispatcher-page"; import type { DispatcherWorkloadRow } from "@/domain/dashboard/types/dashboard-workload"; import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; @@ -7,10 +8,11 @@ import { queryKeys } from "@/infra/query-key/query-key"; export function useDashboardWorkload( range: DashboardRangeKey, -): UseQueryResult { + page = 1, +): UseQueryResult, Error> { return useQuery({ - queryKey: queryKeys.dashboard.workload(range), - queryFn: () => dashboardApi.getWorkload(dashboardRangeParams(range)), + queryKey: queryKeys.dashboard.workload(range, page), + queryFn: () => dashboardApi.getWorkload(dashboardRangeParams(range), page), staleTime: 60 * 1000, }); } diff --git a/src/domain/dashboard/utils/work-order-drilldown-links.ts b/src/domain/dashboard/utils/work-order-drilldown-links.ts index a1f89f99..837fd104 100644 --- a/src/domain/dashboard/utils/work-order-drilldown-links.ts +++ b/src/domain/dashboard/utils/work-order-drilldown-links.ts @@ -72,11 +72,16 @@ export function scheduledTomorrowDrilldownSearch( } export function avetaPendingDrilldownSearch(today: string = businessTodayIso()): URLSearchParams { + // The Aveta Pending count (backend#138 / SH-294) is: AvetaRequired, scheduled + // today or tomorrow, open, and missing its Aveta-category document. The board + // has no missing-Aveta-document filter, so the closest reachable set is the + // Aveta-required work in the two-day open window. `docs=No` is deliberately + // NOT sent: it filters on completion-document status, a different document + // from the Aveta clearance one, so it would narrow to the wrong rows. const search = new URLSearchParams(); search.set("dateFrom", today); search.set("dateTo", addDaysIso(today, 1)); search.set("aveta", "1"); - search.set("docs", "No"); search.set("statuses", OPEN_WIZARD_STATUSES.join(",")); return search; } diff --git a/src/infra/query-key/query-key.ts b/src/infra/query-key/query-key.ts index 4a408375..6760619e 100644 --- a/src/infra/query-key/query-key.ts +++ b/src/infra/query-key/query-key.ts @@ -52,10 +52,10 @@ export const queryKeys = { dashboard: { all: ["dashboard"] as const, stats: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "stats", range] as const, - workload: (range: DashboardRangeKey) => - [...queryKeys.dashboard.all, "workload", range] as const, - performance: (range: DashboardRangeKey) => - [...queryKeys.dashboard.all, "performance", range] as const, + workload: (range: DashboardRangeKey, page = 1) => + [...queryKeys.dashboard.all, "workload", range, page] as const, + performance: (range: DashboardRangeKey, page = 1) => + [...queryKeys.dashboard.all, "performance", range, page] as const, regions: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "regions", range] as const, vendorInsights: () => [...queryKeys.dashboard.all, "vendorInsights"] as const, trend: (params?: DashboardTrendParams) => diff --git a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx index 6c73211c..e74ab664 100644 --- a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx +++ b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx @@ -5,6 +5,12 @@ import { renderWithProviders } from "@/test/test-utils"; const navigate = vi.fn(); const statsRange = vi.fn<(range: DashboardRangeKey) => void>(); +const { workloadMock, performanceMock } = vi.hoisted(() => ({ + workloadMock: vi.fn(), + performanceMock: vi.fn(), +})); + +const EMPTY_DISPATCHER_PAGE = { items: [], page: 1, pageSize: 10, totalDispatchers: 0 }; vi.mock("react-router", async (importOriginal) => ({ ...(await importOriginal()), @@ -12,11 +18,11 @@ vi.mock("react-router", async (importOriginal) => ({ })); vi.mock("@/domain/dashboard/use-cases/use-dashboard-workload", () => ({ - useDashboardWorkload: () => ({ data: [], isLoading: false, isFetching: false, error: null }), + useDashboardWorkload: workloadMock, })); vi.mock("@/domain/dashboard/use-cases/use-dashboard-performance", () => ({ - useDashboardPerformance: () => ({ data: [], isLoading: false, isFetching: false, error: null }), + useDashboardPerformance: performanceMock, })); vi.mock("@/domain/dashboard/use-cases/use-dashboard-regions", () => ({ @@ -73,6 +79,20 @@ describe("DashboardPage", () => { beforeEach(() => { navigate.mockReset(); statsRange.mockReset(); + workloadMock.mockReset(); + performanceMock.mockReset(); + workloadMock.mockReturnValue({ + data: EMPTY_DISPATCHER_PAGE, + isLoading: false, + isFetching: false, + error: null, + }); + performanceMock.mockReturnValue({ + data: EMPTY_DISPATCHER_PAGE, + isLoading: false, + isFetching: false, + error: null, + }); }); it("renders the prototype title, range options, and card titles", () => { @@ -154,6 +174,53 @@ describe("DashboardPage", () => { expect(screen.getByText("No active vendor has any work orders yet.")).toBeInTheDocument(); }); + it("pages the dispatcher tables at 10 rows and re-queries on page change", () => { + const rows = Array.from({ length: 10 }, (_, index) => ({ + dispatcherId: String(index + 1), + dispatcherName: `Dispatcher ${index + 1}`, + openWorkOrders: 1, + totalWorkOrders: 2, + })); + workloadMock.mockReturnValue({ + data: { items: rows, page: 1, pageSize: 10, totalDispatchers: 23 }, + isLoading: false, + isFetching: false, + error: null, + }); + + renderDashboard(); + + // 23 dispatchers at 10/page = 3 pages; selecting page 2 re-queries with page 2. + fireEvent.click(screen.getByRole("button", { name: "Go to page 2" })); + + const requestedPages = workloadMock.mock.calls.map((call) => call[1]); + expect(requestedPages).toContain(2); + }); + + it("resets the dispatcher page when the range changes", () => { + const rows = Array.from({ length: 10 }, (_, index) => ({ + dispatcherId: String(index + 1), + dispatcherName: `Dispatcher ${index + 1}`, + openWorkOrders: 1, + totalWorkOrders: 2, + })); + workloadMock.mockReturnValue({ + data: { items: rows, page: 2, pageSize: 10, totalDispatchers: 23 }, + isLoading: false, + isFetching: false, + error: null, + }); + + renderDashboard(); + + fireEvent.click(screen.getByRole("button", { name: "Go to page 2" })); + fireEvent.click(screen.getByRole("button", { name: "Today" })); + + const calls = workloadMock.mock.calls; + const lastRequestedPage = calls[calls.length - 1]?.[1]; + expect(lastRequestedPage).toBe(1); + }); + it("keeps drilldown dates deterministic on the business clock", () => { const today = businessTodayIso(); diff --git a/src/test/app/(protected)/dashboard/dispatcher-table-pager.test.tsx b/src/test/app/(protected)/dashboard/dispatcher-table-pager.test.tsx new file mode 100644 index 00000000..4e011bd6 --- /dev/null +++ b/src/test/app/(protected)/dashboard/dispatcher-table-pager.test.tsx @@ -0,0 +1,39 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import { DispatcherTablePager } from "@/app/(protected)/dashboard/_components/dispatcher-table-pager"; + +describe("DispatcherTablePager", () => { + it("renders nothing when everything fits on one page", () => { + const { container } = render( + , + ); + + expect(container).toBeEmptyDOMElement(); + }); + + it("renders a page per 10 rows and reports the selected page", () => { + const onPageChange = vi.fn(); + render( + , + ); + + // 23 rows at 10/page = 3 pages. + expect(screen.getByRole("button", { name: "Go to page 3" })).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Go to page 4" })).toBeNull(); + + fireEvent.click(screen.getByRole("button", { name: "Go to page 2" })); + expect(onPageChange).toHaveBeenCalledWith(2); + }); +}); diff --git a/src/test/domain/dashboard/dashboard-api.test.ts b/src/test/domain/dashboard/dashboard-api.test.ts index e24e30e5..9a73b50a 100644 --- a/src/test/domain/dashboard/dashboard-api.test.ts +++ b/src/test/domain/dashboard/dashboard-api.test.ts @@ -84,23 +84,31 @@ describe("dashboardApi", () => { expect(apiGet).toHaveBeenCalledWith("Dashboard/Stats", undefined); }); - it("maps workload rows", async () => { + it("maps workload rows and returns the paging envelope", async () => { apiGet.mockResolvedValue({ Items: [{ DispatcherId: 12, DispatcherName: "Dana Reyes", OpenCount: "4", TotalCount: 6 }], + Page: 1, + PageSize: 10, + TotalDispatchers: 23, }); - await expect(dashboardApi.getWorkload()).resolves.toEqual([ - { - dispatcherId: "12", - dispatcherName: "Dana Reyes", - openWorkOrders: 4, - totalWorkOrders: 6, - }, - ]); - expect(apiGet).toHaveBeenCalledWith("Dashboard/Workload", undefined); + await expect(dashboardApi.getWorkload()).resolves.toEqual({ + items: [ + { + dispatcherId: "12", + dispatcherName: "Dana Reyes", + openWorkOrders: 4, + totalWorkOrders: 6, + }, + ], + page: 1, + pageSize: 10, + totalDispatchers: 23, + }); + expect(apiGet).toHaveBeenCalledWith("Dashboard/Workload", { searchParams: { page: 1 } }); }); - it("maps performance rows", async () => { + it("sends the requested page and range and maps performance rows", async () => { apiGet.mockResolvedValue({ Items: [ { @@ -110,16 +118,44 @@ describe("dashboardApi", () => { AverageResolutionDays: 3.25, }, ], + Page: 2, + PageSize: 10, + TotalDispatchers: 14, }); - await expect(dashboardApi.getPerformance()).resolves.toEqual([ - { - dispatcherId: "12", - dispatcherName: "Dana Reyes", - completionRate: 96.5, - averageResolutionDays: 3.25, - }, + await expect( + dashboardApi.getPerformance({ dateFrom: "2026-09-14", dateTo: "2026-09-18" }, 2), + ).resolves.toEqual({ + items: [ + { + dispatcherId: "12", + dispatcherName: "Dana Reyes", + completionRate: 96.5, + averageResolutionDays: 3.25, + }, + ], + page: 2, + pageSize: 10, + totalDispatchers: 14, + }); + expect(apiGet).toHaveBeenCalledWith("Dashboard/Performance", { + searchParams: { dateFrom: "2026-09-14", dateTo: "2026-09-18", page: 2 }, + }); + }); + + it("falls back to the requested page for the legacy bare-array shape", async () => { + apiGet.mockResolvedValue([ + { DispatcherId: 7, DispatcherName: "Lee Ash", OpenCount: 1, TotalCount: 2 }, ]); + + await expect(dashboardApi.getWorkload({}, 1)).resolves.toEqual({ + items: [ + { dispatcherId: "7", dispatcherName: "Lee Ash", openWorkOrders: 1, totalWorkOrders: 2 }, + ], + page: 1, + pageSize: 10, + totalDispatchers: 1, + }); }); it("maps unknown regions to Unmapped", async () => { diff --git a/src/test/domain/dashboard/work-order-drilldown-links.test.ts b/src/test/domain/dashboard/work-order-drilldown-links.test.ts index 90e629f4..2c28e20c 100644 --- a/src/test/domain/dashboard/work-order-drilldown-links.test.ts +++ b/src/test/domain/dashboard/work-order-drilldown-links.test.ts @@ -22,7 +22,9 @@ describe("work-order drilldown links", () => { expect(search.get("dateFrom")).toBe("2026-09-16"); expect(search.get("dateTo")).toBe("2026-09-17"); expect(search.get("aveta")).toBe("1"); - expect(search.get("docs")).toBe("No"); + // `docs=No` is the completion-document status, not the Aveta document, so it + // must not be part of the Aveta Pending drilldown (SH-294 / backend#138). + expect(search.get("docs")).toBeNull(); expect(statuses).toContain("Scheduled"); expect(statuses).not.toContain("Completed"); }); diff --git a/src/test/domain/work-orders/dashboard-drilldown-params.test.ts b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts index 8c2f58fd..97518591 100644 --- a/src/test/domain/work-orders/dashboard-drilldown-params.test.ts +++ b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts @@ -29,7 +29,9 @@ describe("parseDashboardDrilldownParams", () => { expect(filters).not.toBeNull(); expect(filters?.avetaOnly).toBe(true); - expect(filters?.docs).toEqual(new Set(["No"])); + // The Aveta drilldown no longer sends `docs=No` (completion-doc status), so + // no completion-document filter is applied. + expect(filters?.docs.size).toBe(0); expect(filters?.statuses).not.toBeNull(); expect([...(filters?.statuses ?? [])]).not.toContain("Completed"); expect([...(filters?.statuses ?? [])]).not.toContain("NotAStatus"); From 7679c28682f071f422fc4f882c359c2c47f5786d Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Thu, 17 Sep 2026 00:46:39 -0300 Subject: [PATCH 4/7] refactor(dashboard): extract dispatcher tables into a section component Move the two paged dispatcher cards and their paging view-model derivation out of DashboardPage into DispatcherTablesSection (a fragment, so both cards remain direct children of the dashboard grid). This keeps DashboardPage under the project complexity threshold after the pager additions, with no change to the rendered layout or behaviour. --- .../_components/dispatcher-tables-section.tsx | 60 +++++++++++++++++++ src/app/(protected)/dashboard/index.tsx | 29 +++------ 2 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 src/app/(protected)/dashboard/_components/dispatcher-tables-section.tsx diff --git a/src/app/(protected)/dashboard/_components/dispatcher-tables-section.tsx b/src/app/(protected)/dashboard/_components/dispatcher-tables-section.tsx new file mode 100644 index 00000000..05e1f301 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dispatcher-tables-section.tsx @@ -0,0 +1,60 @@ +import type { UseQueryResult } from "@tanstack/react-query"; +import { + DISPATCHER_PAGE_SIZE, + type DispatcherPage, +} from "@/domain/dashboard/types/dashboard-dispatcher-page"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; +import type { DispatcherWorkloadRow } from "@/domain/dashboard/types/dashboard-workload"; +import { DispatcherPerformanceCard } from "./dispatcher-performance-card"; +import { DispatcherWorkloadCard } from "./dispatcher-workload-card"; + +interface DispatcherTablesSectionProps { + range: DashboardRangeKey; + workload: UseQueryResult, Error>; + performance: UseQueryResult, Error>; + workloadPage: number; + performancePage: number; + onWorkloadPageChange: (page: number) => void; + onPerformancePageChange: (page: number) => void; +} + +/** + * The two paged dispatcher tables. Kept as a fragment so both cards stay direct + * children of the dashboard grid, and so the paging view-model derivation lives + * here rather than inflating the page component. + */ +export function DispatcherTablesSection({ + range, + workload, + performance, + workloadPage, + performancePage, + onWorkloadPageChange, + onPerformancePageChange, +}: DispatcherTablesSectionProps) { + return ( + <> + + + + ); +} diff --git a/src/app/(protected)/dashboard/index.tsx b/src/app/(protected)/dashboard/index.tsx index 988dd493..cb20c9b4 100644 --- a/src/app/(protected)/dashboard/index.tsx +++ b/src/app/(protected)/dashboard/index.tsx @@ -8,12 +8,10 @@ import { PageHeader } from "@/components/ui/page-header"; import { DashboardKpiCard } from "@/app/(protected)/dashboard/_components/dashboard-kpi-card"; import { DashboardRangeToggle } from "@/app/(protected)/dashboard/_components/dashboard-range-toggle"; import { DashboardTrendCard } from "@/app/(protected)/dashboard/_components/dashboard-trend-card"; -import { DispatcherPerformanceCard } from "@/app/(protected)/dashboard/_components/dispatcher-performance-card"; -import { DispatcherWorkloadCard } from "@/app/(protected)/dashboard/_components/dispatcher-workload-card"; +import { DispatcherTablesSection } from "@/app/(protected)/dashboard/_components/dispatcher-tables-section"; import { VendorInsightsCard } from "@/app/(protected)/dashboard/_components/vendor-insights-card"; import { WorkOrderBreakdownCard } from "@/app/(protected)/dashboard/_components/work-order-breakdown-card"; import { WorkOrdersByRegionCard } from "@/app/(protected)/dashboard/_components/work-orders-by-region-card"; -import { DISPATCHER_PAGE_SIZE } from "@/domain/dashboard/types/dashboard-dispatcher-page"; import { DEFAULT_DASHBOARD_RANGE, type DashboardRangeKey, @@ -113,25 +111,14 @@ export default function DashboardPage() { isLoading={regions.isLoading} error={regions.error} /> - - From 1271d3c11e30ebd5b415d69cea681a6ff55c7689 Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Thu, 17 Sep 2026 02:56:31 -0300 Subject: [PATCH 5/7] feat(dashboard): dispatcher scope picker, status distribution, region drilldown, perf counts - SH-336: add the dispatcher-scope picker (All / My WOs / individual) for Scheduler/Admin via a new viewAllDispatchersOnDashboard role gate, a static 'My WOs' label for Dispatcher, and hide the dispatcher tables (and skip their queries) when the viewer cannot see all dispatchers. Scope drives dispatcherId on stats, workload, performance, and regions (SH-347 contract). - SH-352: add the Status Distribution module with its empty state and status drill-down. - SH-347: show Assigned/Completed counts and colour the completion rate (green >=90, amber 70-89, red <70) on Dispatcher Performance. - SH-348: drill a region bar into the board region filter; hold the unconfirmed 'Unmapped/Other' bucket off the chart. - SH-349: label Vendor Insights as all-time, company-wide. - Make the drilldown-filters effect fire only on URL change; add a deterministic clock to the status-drilldown test; add the dashboard visual regression spec and baselines. --- .../dashboard-admin.png | Bin 0 -> 140554 bytes .../dashboard-dispatcher.png | Bin 0 -> 119831 bytes e2e/dashboard/dashboard.visual.spec.ts | 256 ++++++++++++++++++ .../dashboard/_components/dashboard-card.tsx | 10 +- .../_components/dashboard-scope-picker.tsx | 118 ++++++++ .../dashboard/_components/dashboard-scope.ts | 21 ++ .../dispatcher-performance-card.tsx | 28 +- .../_components/status-distribution-card.tsx | 55 ++++ .../_components/vendor-insights-card.tsx | 1 + .../work-orders-by-region-card.tsx | 27 +- src/app/(protected)/dashboard/index.tsx | 107 ++++++-- .../_hooks/use-dashboard-drilldown-filters.ts | 11 +- src/domain/dashboard/api/dashboard-api.ts | 74 ++++- .../dashboard/types/dashboard-performance.ts | 2 + src/domain/dashboard/types/dashboard-stats.ts | 6 + .../use-cases/use-dashboard-performance.ts | 8 +- .../use-cases/use-dashboard-regions.ts | 5 +- .../use-cases/use-dashboard-stats.ts | 9 +- .../use-cases/use-dashboard-workload.ts | 8 +- .../utils/work-order-drilldown-links.ts | 9 + .../types/work-order-advanced-filters.ts | 3 + .../work-orders/types/work-order-board.ts | 2 + .../utils/advanced-filter-chip-builders.ts | 9 + .../utils/advanced-filters-utils.ts | 2 + .../work-orders/utils/board-query-params.ts | 1 + .../utils/dashboard-drilldown-params.ts | 13 + src/infra/query-key/query-key.ts | 14 +- src/lib/auth/user-utils.ts | 15 + .../dashboard/dashboard-page.test.tsx | 41 ++- .../domain/dashboard/dashboard-api.test.ts | 12 + .../work-order-drilldown-links.test.ts | 11 +- .../dashboard-drilldown-params.test.ts | 8 + src/test/lib/auth/user-utils.test.ts | 16 +- 33 files changed, 843 insertions(+), 59 deletions(-) create mode 100644 e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-admin.png create mode 100644 e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-dispatcher.png create mode 100644 e2e/dashboard/dashboard.visual.spec.ts create mode 100644 src/app/(protected)/dashboard/_components/dashboard-scope-picker.tsx create mode 100644 src/app/(protected)/dashboard/_components/dashboard-scope.ts create mode 100644 src/app/(protected)/dashboard/_components/status-distribution-card.tsx diff --git a/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-admin.png b/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-admin.png new file mode 100644 index 0000000000000000000000000000000000000000..215400e78318821d05b3be02784bd32995c8b143 GIT binary patch literal 140554 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

H+ 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-dispatcher.png b/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-dispatcher.png new file mode 100644 index 0000000000000000000000000000000000000000..569425613d801da6c3bd7a2f61b5fa0478fbf84e GIT binary patch literal 119831 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 z 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 Pe6ob7%=28~H}C!*jnFJK literal 0 HcmV?d00001 diff --git a/e2e/dashboard/dashboard.visual.spec.ts b/e2e/dashboard/dashboard.visual.spec.ts new file mode 100644 index 00000000..ab51543b --- /dev/null +++ b/e2e/dashboard/dashboard.visual.spec.ts @@ -0,0 +1,256 @@ +import { expect, test, type Page, type Route } from "@playwright/test"; + +const FROZEN_NOW = "2026-08-19T15:00:00.000Z"; + +function testUser(userRoles: string) { + return { + token: "dashboard-visual-token", + expiration: "2030-01-01T00:00:00.000Z", + email: "admin@seahavenind.com", + userRoles, + phoneNumber: "5551234567", + fullname: "Dashboard Visual User", + id: "1", + }; +} + +const DISPATCHERS = [ + { id: "1", name: "Pat Dispatcher" }, + { id: "2", name: "Riley Chen" }, + { id: "3", name: "Sam Okafor" }, +]; + +const STATS = { + total: 128, + open: 52, + notDispatched: 8, + completed: 64, + dueCount: 40, + completedDueCount: 30, + completionRate: 82, + averageResolutionDays: 3.4, + scheduledTomorrow: 6, + pendingUplifts: 4, + avetaPending: 3, + breakdown: [ + { status: "PM", count: 24 }, + { status: "Emergency", count: 6 }, + { status: "Reactive", count: 12 }, + { status: "Overdue", count: 9 }, + ], + statusDistribution: [ + { status: "Scheduled", count: 30 }, + { status: "In Progress", count: 18 }, + { status: "Completed", count: 64 }, + { status: "Pending", count: 16 }, + ], +}; + +const WORKLOAD = { + items: [ + { + dispatcherId: "1", + dispatcherName: "Pat Dispatcher", + openWorkOrders: 12, + totalWorkOrders: 20, + }, + { dispatcherId: "2", dispatcherName: "Riley Chen", openWorkOrders: 7, totalWorkOrders: 15 }, + ], + page: 1, + pageSize: 10, + totalDispatchers: 2, +}; + +const PERFORMANCE = { + items: [ + { + dispatcherId: "1", + dispatcherName: "Pat Dispatcher", + completionRate: 94, + averageResolutionDays: 2.5, + assignedCount: 20, + completedCount: 18, + }, + { + dispatcherId: "2", + dispatcherName: "Riley Chen", + completionRate: 78, + averageResolutionDays: 3.1, + assignedCount: 15, + completedCount: 11, + }, + { + dispatcherId: "3", + dispatcherName: "Sam Okafor", + completionRate: 61, + averageResolutionDays: 4.4, + assignedCount: 9, + completedCount: 5, + }, + ], + page: 1, + pageSize: 10, + totalDispatchers: 3, +}; + +const REGIONS = { + items: [ + { region: "East", workOrderCount: 44 }, + { region: "Central", workOrderCount: 31 }, + { region: "West", workOrderCount: 22 }, + { region: "California", workOrderCount: 18 }, + { region: "Unmapped/Other", workOrderCount: 5 }, + ], +}; + +const VENDOR_INSIGHTS = { + items: [ + { + vendorId: "101", + vendorName: "Gateway Plumbing", + completionRate: 88, + rescheduleRate: 12, + averageResolutionDays: 2.9, + totalJobs: 40, + }, + { + vendorId: "102", + vendorName: "Summit HVAC", + completionRate: 76, + rescheduleRate: 20, + averageResolutionDays: 3.6, + totalJobs: 28, + }, + ], +}; + +const TREND = { + granularity: "week", + buckets: [ + { + date: "2026-07-27", + label: "Jul 27", + total: 18, + open: 4, + completed: 12, + canceled: 1, + overdue: 1, + isCurrent: false, + }, + { + date: "2026-08-03", + label: "Aug 3", + total: 22, + open: 6, + completed: 13, + canceled: 1, + overdue: 2, + isCurrent: false, + }, + { + date: "2026-08-10", + label: "Aug 10", + total: 26, + open: 8, + completed: 15, + canceled: 0, + overdue: 3, + isCurrent: false, + }, + { + date: "2026-08-17", + label: "Aug 17", + total: 20, + open: 9, + completed: 9, + canceled: 1, + overdue: 1, + isCurrent: true, + }, + ], +}; + +async function fulfillJson(route: Route, body: unknown, status = 200) { + await route.fulfill({ status, contentType: "application/json", body: JSON.stringify(body) }); +} + +async function mockDashboardApi(page: Page, userRoles: string) { + await page.clock.setFixedTime(new Date(FROZEN_NOW)); + await page.addInitScript( + (user) => localStorage.setItem("auth", JSON.stringify(user)), + testUser(userRoles), + ); + + await page.route("**/api/**", async (route) => { + const pathname = new URL(route.request().url()).pathname; + + // Only stub real backend calls; let Vite dev module requests (e.g. + // /src/domain/auth/api/*.ts) through untouched. + if (!pathname.startsWith("/api/")) { + await route.continue(); + return; + } + + if (pathname.includes("/Dashboard/Stats")) return fulfillJson(route, { data: STATS }); + if (pathname.includes("/Dashboard/Workload")) return fulfillJson(route, { data: WORKLOAD }); + if (pathname.includes("/Dashboard/Performance")) + return fulfillJson(route, { data: PERFORMANCE }); + if (pathname.includes("/Dashboard/Regions")) return fulfillJson(route, { data: REGIONS }); + if (pathname.includes("/Dashboard/VendorInsights")) { + return fulfillJson(route, { data: VENDOR_INSIGHTS }); + } + if (pathname.includes("/Dashboard/Trend")) return fulfillJson(route, { data: TREND }); + if (pathname.includes("/workorders/lookups/dispatchers")) { + return fulfillJson(route, { data: DISPATCHERS }); + } + + return fulfillJson(route, { data: [] }); + }); +} + +async function openDashboard(page: Page, userRoles: string) { + await mockDashboardApi(page, userRoles); + await page.goto("/"); + await page.evaluate(() => document.fonts.ready); + await page.addStyleTag({ + content: ` + *, *::before, *::after { transition: none !important; animation: none !important; } + .MuiDrawer-paper { transform: none !important; } + .Toastify__toast-container { display: none !important; } + .tsqd-parent-container { display: none !important; } + `, + }); +} + +async function expectStableScreenshot(page: Page, name: string) { + await page.waitForTimeout(250); + await page.evaluate( + () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(() => resolve())), + ), + ); + await expect(page).toHaveScreenshot(name, { fullPage: true }); +} + +test.describe("Dashboard deterministic pixel regression", () => { + test("admin dashboard", async ({ page }) => { + await openDashboard(page, "Admin"); + await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); + await expect(page.getByText("Status Distribution")).toBeVisible(); + await expect(page.getByText("Dispatcher Performance")).toBeVisible(); + // The scope picker is available to Admin/Scheduler (SH-336). + await expect(page.getByRole("button", { name: /All dispatchers/ })).toBeVisible(); + await expectStableScreenshot(page, "dashboard-admin.png"); + }); + + test("dispatcher scoped dashboard", async ({ page }) => { + await openDashboard(page, "Dispatcher"); + await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible(); + // A Dispatcher gets the static "My WOs" label and no dispatcher tables (SH-336). + await expect(page.getByText("My WOs")).toBeVisible(); + await expect(page.getByText("Dispatcher Performance")).toHaveCount(0); + await expect(page.getByText("Status Distribution")).toBeVisible(); + await expectStableScreenshot(page, "dashboard-dispatcher.png"); + }); +}); diff --git a/src/app/(protected)/dashboard/_components/dashboard-card.tsx b/src/app/(protected)/dashboard/_components/dashboard-card.tsx index 71f40dfd..46938810 100644 --- a/src/app/(protected)/dashboard/_components/dashboard-card.tsx +++ b/src/app/(protected)/dashboard/_components/dashboard-card.tsx @@ -5,6 +5,8 @@ import { Text } from "@/components/ui/text"; interface DashboardCardProps { title: string; + /** Optional scope caption shown beside the title (e.g. SH-349's all-time note). */ + caption?: string; isLoading?: boolean; error?: unknown; isEmpty: boolean; @@ -14,6 +16,7 @@ interface DashboardCardProps { export function DashboardCard({ title, + caption, isLoading = false, error, isEmpty, @@ -22,8 +25,13 @@ export function DashboardCard({ }: DashboardCardProps) { return ( - + {title} + {!!caption && ( + + {caption} + + )} {isLoading && ( diff --git a/src/app/(protected)/dashboard/_components/dashboard-scope-picker.tsx b/src/app/(protected)/dashboard/_components/dashboard-scope-picker.tsx new file mode 100644 index 00000000..66c63dae --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-scope-picker.tsx @@ -0,0 +1,118 @@ +import { useMemo } from "react"; +import { Popover, Skeleton } from "@mui/material"; +import { ChevronDown, Users } from "lucide-react"; +import type { WorkOrderUser } from "@/domain/work-orders/types/work-order"; +import { CheckboxMenuItem } from "@/components/ui/checkbox-menu-item"; +import { MenuAnchorButton } from "@/components/ui/menu-anchor-button"; +import { useMenuAnchor } from "@/hooks/use-menu-anchor"; +import type { DashboardScope } from "./dashboard-scope"; + +type DashboardScopePickerProps = { + scope: DashboardScope; + onChange: (scope: DashboardScope) => void; + users: WorkOrderUser[]; + usersLoading?: boolean; + currentUserId?: string | number; +}; + +export function DashboardScopePicker({ + scope, + onChange, + users, + usersLoading = false, + currentUserId, +}: DashboardScopePickerProps) { + const { anchorEl, open, setAnchor, close } = useMenuAnchor(); + const meId = currentUserId != null && currentUserId !== "" ? String(currentUserId) : null; + + const dispatchers = useMemo( + () => [...users].sort((a, b) => a.name.localeCompare(b.name)), + [users], + ); + + const label = useMemo(() => { + if (scope.mode === "all") return "All dispatchers"; + if (scope.mode === "mine") return "My WOs"; + return dispatchers.find((user) => String(user.id) === scope.id)?.name ?? "Dispatcher"; + }, [scope, dispatchers]); + + const select = (next: DashboardScope) => { + onChange(next); + close(); + }; + + if (usersLoading && users.length === 0) { + return ( + + ); + } + + return ( + <> + + + {label} + + + + + select({ mode: "all" })} + /> + + {meId != null && ( + select({ mode: "mine" })} + /> + )} + + {dispatchers.map((user) => { + const id = String(user.id); + return ( + me + ) : undefined + } + onClick={() => select({ mode: "individual", id })} + /> + ); + })} + + + ); +} diff --git a/src/app/(protected)/dashboard/_components/dashboard-scope.ts b/src/app/(protected)/dashboard/_components/dashboard-scope.ts new file mode 100644 index 00000000..62e6e7c8 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-scope.ts @@ -0,0 +1,21 @@ +/** + * SH-336 dispatcher-scope selection. Single-select — the Dashboard scopes to at + * most one dispatcher at a time (All company / My WOs / one individual), unlike + * the board's multi-select dispatcher filter. + */ +export type DashboardScope = + { mode: "all" } | { mode: "mine" } | { mode: "individual"; id: string }; + +export const DASHBOARD_SCOPE_ALL: DashboardScope = { mode: "all" }; + +/** Resolves the scope to the `dispatcherId` query param, or null for company-wide. */ +export function scopeDispatcherId( + scope: DashboardScope, + currentUserId: string | number | undefined, +): string | null { + if (scope.mode === "all") return null; + if (scope.mode === "mine") { + return currentUserId != null && currentUserId !== "" ? String(currentUserId) : null; + } + return scope.id || null; +} diff --git a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx index 94231dbd..eb491726 100644 --- a/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx +++ b/src/app/(protected)/dashboard/_components/dispatcher-performance-card.tsx @@ -27,6 +27,13 @@ function formatDays(value: number): string { return (Math.round(value * 10) / 10).toLocaleString(); } +// SH-347: colour the completion rate green at 90+, amber 70–89, red below 70. +function completionRateColor(rate: number): string { + if (rate >= 90) return "success.main"; + if (rate >= 70) return "warning.main"; + return "error.main"; +} + function DispatcherNameCell({ row, range, @@ -38,9 +45,9 @@ function DispatcherNameCell({ // A listed dispatcher is one with work in range; the drill-down filters Work // Orders by dispatcher + range and never uses the completion rate, so gate on // identity rather than the rate. (A dispatcher with assigned work but a 0% - // rate was previously inert here while drillable from Workload.) When SH-347's - // Assigned/Completed counts land on DispatcherPerformanceRow this should - // become `assigned > 0`, matching Workload's `totalWorkOrders > 0`. + // rate was previously inert here while drillable from Workload.) The gate stays + // on identity rather than `assignedCount > 0` so a legacy response without the + // SH-347 count field (assignedCount → 0) keeps its rows drillable. const drillable = Boolean(row.dispatcherId); if (!drillable) { @@ -84,6 +91,12 @@ export function DispatcherPerformanceCard({ Dispatcher + + Assigned + + + Completed + Completion % @@ -98,7 +111,14 @@ export function DispatcherPerformanceCard({ - {`${row.completionRate.toLocaleString()}%`} + {row.assignedCount.toLocaleString()} + {row.completedCount.toLocaleString()} + + {`${row.completionRate.toLocaleString()}%`} + {row.averageResolutionDays == null ? "—" : formatDays(row.averageResolutionDays)} diff --git a/src/app/(protected)/dashboard/_components/status-distribution-card.tsx b/src/app/(protected)/dashboard/_components/status-distribution-card.tsx new file mode 100644 index 00000000..956735eb --- /dev/null +++ b/src/app/(protected)/dashboard/_components/status-distribution-card.tsx @@ -0,0 +1,55 @@ +import { useNavigate } from "react-router"; +import { ALL_WIZARD_STATUSES } from "@/domain/work-orders/types/work-order-wizard"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import type { DashboardStatusBucketRow } from "@/domain/dashboard/types/dashboard-stats"; +import { + workOrderDrilldownUrl, + workOrderStatusDrilldownSearch, +} from "@/domain/dashboard/utils/work-order-drilldown-links"; +import { DashboardBarList } from "./dashboard-bar-list"; +import { DashboardCard } from "./dashboard-card"; + +const EMPTY_MESSAGE = "No work orders match the current filters."; + +const DRILLABLE_STATUSES = new Set(ALL_WIZARD_STATUSES); + +interface StatusDistributionCardProps { + rows: DashboardStatusBucketRow[]; + range: DashboardRangeKey; + isLoading?: boolean; + error?: unknown; +} + +export function StatusDistributionCard({ + rows, + range, + isLoading = false, + error, +}: StatusDistributionCardProps) { + const navigate = useNavigate(); + + return ( + + ({ + id: row.status, + label: row.status, + count: row.count, + }))} + // Lifecycle labels the board can filter on are drillable; the "Unknown" + // bucket (unparseable statuses) has no board filter, so leave it inert. + isSelectable={(row) => DRILLABLE_STATUSES.has(row.id)} + onSelectRow={(row) => + navigate(workOrderDrilldownUrl(workOrderStatusDrilldownSearch(row.id, range))) + } + /> + + ); +} diff --git a/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx b/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx index 0e98910f..d23776ff 100644 --- a/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx +++ b/src/app/(protected)/dashboard/_components/vendor-insights-card.tsx @@ -15,6 +15,7 @@ export function VendorInsightsCard({ rows, isLoading = false, error }: VendorIns return ( row.region !== UNMAPPED_REGION_LABEL); + return ( ({ + rows={zones.map((row) => ({ id: row.region, label: row.region, count: row.workOrderCount, }))} + onSelectRow={(row) => + navigate(workOrderDrilldownUrl(workOrderRegionDrilldownSearch(row.id, range))) + } /> ); diff --git a/src/app/(protected)/dashboard/index.tsx b/src/app/(protected)/dashboard/index.tsx index cb20c9b4..60d6748a 100644 --- a/src/app/(protected)/dashboard/index.tsx +++ b/src/app/(protected)/dashboard/index.tsx @@ -4,11 +4,22 @@ import EventOutlinedIcon from "@mui/icons-material/EventOutlined"; import PendingActionsIcon from "@mui/icons-material/PendingActions"; import ShieldOutlinedIcon from "@mui/icons-material/ShieldOutlined"; import { Box, Button, CircularProgress } from "@mui/material"; +import { Users } from "lucide-react"; import { PageHeader } from "@/components/ui/page-header"; +import { Text } from "@/components/ui/text"; +import { canViewAllDispatchersOnDashboard } from "@/lib/auth/user-utils"; +import { useAuthContext } from "@/providers/auth-context"; import { DashboardKpiCard } from "@/app/(protected)/dashboard/_components/dashboard-kpi-card"; import { DashboardRangeToggle } from "@/app/(protected)/dashboard/_components/dashboard-range-toggle"; import { DashboardTrendCard } from "@/app/(protected)/dashboard/_components/dashboard-trend-card"; +import { DashboardScopePicker } from "@/app/(protected)/dashboard/_components/dashboard-scope-picker"; +import { + DASHBOARD_SCOPE_ALL, + scopeDispatcherId, + type DashboardScope, +} from "@/app/(protected)/dashboard/_components/dashboard-scope"; import { DispatcherTablesSection } from "@/app/(protected)/dashboard/_components/dispatcher-tables-section"; +import { StatusDistributionCard } from "@/app/(protected)/dashboard/_components/status-distribution-card"; import { VendorInsightsCard } from "@/app/(protected)/dashboard/_components/vendor-insights-card"; import { WorkOrderBreakdownCard } from "@/app/(protected)/dashboard/_components/work-order-breakdown-card"; import { WorkOrdersByRegionCard } from "@/app/(protected)/dashboard/_components/work-orders-by-region-card"; @@ -21,6 +32,7 @@ import { useDashboardRegions } from "@/domain/dashboard/use-cases/use-dashboard- import { useDashboardStats } from "@/domain/dashboard/use-cases/use-dashboard-stats"; import { useDashboardVendorInsights } from "@/domain/dashboard/use-cases/use-dashboard-vendor-insights"; import { useDashboardWorkload } from "@/domain/dashboard/use-cases/use-dashboard-workload"; +import { useWorkOrderUsers } from "@/domain/work-orders/use-cases/use-work-orders-list"; import { avetaPendingDrilldownSearch, scheduledTomorrowDrilldownSearch, @@ -30,25 +42,58 @@ import { export default function DashboardPage() { const navigate = useNavigate(); + const { user } = useAuthContext(); + // SH-336: only Scheduler/Admin may broaden the Dashboard past their own work + // orders. A Dispatcher is locked to their own WOs (scoped server-side by + // backend#126) and never sees the picker. + const canViewAll = canViewAllDispatchersOnDashboard(user?.userRoles); + const [range, setRange] = useState(DEFAULT_DASHBOARD_RANGE); + const [scope, setScope] = useState(DASHBOARD_SCOPE_ALL); const [workloadPage, setWorkloadPage] = useState(1); const [performancePage, setPerformancePage] = useState(1); - const stats = useDashboardStats(range); - const workload = useDashboardWorkload(range, workloadPage); - const performance = useDashboardPerformance(range, performancePage); - const regions = useDashboardRegions(range); + + const dispatcherUsers = useWorkOrderUsers(); + + // A Dispatcher sends no dispatcherId (the server already scopes them); only the + // picker, available to Scheduler/Admin, drives an explicit scope. + const dispatcherId = canViewAll ? scopeDispatcherId(scope, user?.id) : null; + + const stats = useDashboardStats(range, dispatcherId); + const workload = useDashboardWorkload(range, workloadPage, dispatcherId, canViewAll); + const performance = useDashboardPerformance(range, performancePage, dispatcherId, canViewAll); + const regions = useDashboardRegions(range, dispatcherId); const vendors = useDashboardVendorInsights(); // A range change re-scopes both dispatcher tables, so their page must reset — // otherwise a switch while on page 3 lands on an out-of-range empty page that // reads as a false "no dispatchers" state. - const changeRange = (next: DashboardRangeKey) => { - setRange(next); + const resetDispatcherPages = () => { setWorkloadPage(1); setPerformancePage(1); }; - const resetFilters = () => changeRange(DEFAULT_DASHBOARD_RANGE); + const changeRange = (next: DashboardRangeKey) => { + setRange(next); + resetDispatcherPages(); + }; + + const changeScope = (next: DashboardScope) => { + setScope(next); + resetDispatcherPages(); + }; + + const resetFilters = () => { + setRange(DEFAULT_DASHBOARD_RANGE); + setScope(DASHBOARD_SCOPE_ALL); + resetDispatcherPages(); + }; + + // A Dispatcher's forced own-WOs scope never triggers the reset affordance (there + // is nothing for them to reset but the date range); a Scheduler/Admin's non-All + // scope does. + const scopeIsFiltered = canViewAll && scope.mode !== "all"; + const showReset = range !== DEFAULT_DASHBOARD_RANGE || scopeIsFiltered; const isRefreshing = [stats, workload, performance, regions, vendors].some((query) => query.isFetching) && @@ -61,11 +106,30 @@ export default function DashboardPage() { actions={ {isRefreshing && } - {range !== DEFAULT_DASHBOARD_RANGE && ( + {showReset && ( )} + {canViewAll ? ( + + ) : ( + + + + My WOs + + + )} } @@ -106,20 +170,29 @@ export default function DashboardPage() { isLoading={stats.isLoading} error={stats.error} /> + - + {canViewAll && ( + + )} { + onApplyRef.current = onApply; + }, [onApply]); + useEffect(() => { if (appliedRef.current) { return; @@ -22,9 +29,9 @@ export function useDashboardDrilldownFilters( appliedRef.current = true; setFromDashboard(true); - onApply(drilldown); + onApplyRef.current(drilldown); setSearchParams({}, { replace: true }); - }, [searchParams, setSearchParams, onApply]); + }, [searchParams, setSearchParams]); return fromDashboard; } diff --git a/src/domain/dashboard/api/dashboard-api.ts b/src/domain/dashboard/api/dashboard-api.ts index 7d3a76f9..5fdd902f 100644 --- a/src/domain/dashboard/api/dashboard-api.ts +++ b/src/domain/dashboard/api/dashboard-api.ts @@ -6,6 +6,7 @@ import type { DashboardRangeParams } from "@/domain/dashboard/types/dashboard-ra import type { DashboardBreakdownRow, DashboardStats, + DashboardStatusBucketRow, } from "@/domain/dashboard/types/dashboard-stats"; import type { DispatcherPerformanceRow } from "@/domain/dashboard/types/dashboard-performance"; import { @@ -79,27 +80,46 @@ function readCollection(value: unknown, key: string): Record[] return asRecords(collection); } -function rangeSearchParams(range?: DashboardRangeParams): Options | undefined { - if (!range?.dateFrom || !range?.dateTo) { - return undefined; +/** + * Stats, Regions, Workload, and Performance share `DashboardStatsQueryDTO` + * (backend#145): the range dates ride along when present, and `dispatcherId` + * scopes the read to a single dispatcher (SH-336's picker — All sends nothing, + * My WOs / an individual sends that id). Vendor Insights and Trend take no such + * param and stay company-wide (SH-349). + */ +function scopedSearchParams( + range?: DashboardRangeParams, + dispatcherId?: string, +): Options | undefined { + const searchParams: Record = {}; + if (range?.dateFrom && range?.dateTo) { + searchParams.dateFrom = range.dateFrom; + searchParams.dateTo = range.dateTo; } - - return { searchParams: { dateFrom: range.dateFrom, dateTo: range.dateTo } }; + if (dispatcherId) { + searchParams.dispatcherId = dispatcherId; + } + return Object.keys(searchParams).length > 0 ? { searchParams } : undefined; } /** * Workload and Performance are paged server-side (backend#126/#127): `page` is - * 1-based and always sent, and the range dates ride along when present. + * 1-based and always sent, the range dates ride along when present, and + * `dispatcherId` scopes to a single dispatcher (SH-336). */ function dispatcherPageSearchParams( range: DashboardRangeParams | undefined, page: number, + dispatcherId?: string, ): Options { const searchParams: Record = { page }; if (range?.dateFrom && range?.dateTo) { searchParams.dateFrom = range.dateFrom; searchParams.dateTo = range.dateTo; } + if (dispatcherId) { + searchParams.dispatcherId = dispatcherId; + } return { searchParams }; } @@ -204,6 +224,17 @@ function mapDispatcherIdentity(raw: Record): { }; } +function mapStatusDistribution(value: unknown): DashboardStatusBucketRow[] { + return asRecords(value) + .map((row) => ({ + status: asString( + readField(row, "status") ?? readField(row, "name") ?? readField(row, "label"), + ), + count: toNumber(readField(row, "count") ?? readField(row, "value")), + })) + .filter((row) => row.status !== ""); +} + function mapDashboardStats(raw: unknown): DashboardStats { const data = toRecord(raw); const average = readField(data, "averageResolutionDays"); @@ -221,6 +252,7 @@ function mapDashboardStats(raw: unknown): DashboardStats { pendingUplifts: toNumber(readField(data, "pendingUplifts")), avetaPending: toNumber(readField(data, "avetaPending")), breakdown: mapBreakdown(readField(data, "breakdown") ?? readField(data, "workOrderBreakdown")), + statusDistribution: mapStatusDistribution(readField(data, "statusDistribution")), }; } @@ -256,6 +288,10 @@ function mapDispatcherPerformance(raw: unknown): DispatcherPerformanceRow[] { readField(rawRow, "averageResolutionDays") == null ? null : toNumber(readField(rawRow, "averageResolutionDays")), + assignedCount: toNumber(readField(rawRow, "assignedCount") ?? readField(rawRow, "assigned")), + completedCount: toNumber( + readField(rawRow, "completedCount") ?? readField(rawRow, "completed"), + ), }; }); } @@ -328,17 +364,24 @@ function mapDashboardTrend(raw: unknown): DashboardTrend { } export const dashboardApi = { - getStats: async (range?: DashboardRangeParams): Promise => { - const data = await apiGet(API_PATHS.dashboard.stats, rangeSearchParams(range)); + getStats: async ( + range?: DashboardRangeParams, + dispatcherId?: string, + ): Promise => { + const data = await apiGet( + API_PATHS.dashboard.stats, + scopedSearchParams(range, dispatcherId), + ); return mapDashboardStats(handleApiResponse(data)); }, getWorkload: async ( range?: DashboardRangeParams, page = 1, + dispatcherId?: string, ): Promise> => { const data = await apiGet( API_PATHS.dashboard.workload, - dispatcherPageSearchParams(range, page), + dispatcherPageSearchParams(range, page, dispatcherId), ); const response = handleApiResponse(data); const items = mapDispatcherWorkload(response); @@ -347,17 +390,24 @@ export const dashboardApi = { getPerformance: async ( range?: DashboardRangeParams, page = 1, + dispatcherId?: string, ): Promise> => { const data = await apiGet( API_PATHS.dashboard.performance, - dispatcherPageSearchParams(range, page), + dispatcherPageSearchParams(range, page, dispatcherId), ); const response = handleApiResponse(data); const items = mapDispatcherPerformance(response); return { items, ...readDispatcherPageMeta(response, page, items.length) }; }, - getRegions: async (range?: DashboardRangeParams): Promise => { - const data = await apiGet(API_PATHS.dashboard.regions, rangeSearchParams(range)); + getRegions: async ( + range?: DashboardRangeParams, + dispatcherId?: string, + ): Promise => { + const data = await apiGet( + API_PATHS.dashboard.regions, + scopedSearchParams(range, dispatcherId), + ); return mapRegions(handleApiResponse(data)); }, getVendorInsights: async (): Promise => { diff --git a/src/domain/dashboard/types/dashboard-performance.ts b/src/domain/dashboard/types/dashboard-performance.ts index dca8f1a4..03c49371 100644 --- a/src/domain/dashboard/types/dashboard-performance.ts +++ b/src/domain/dashboard/types/dashboard-performance.ts @@ -3,4 +3,6 @@ export interface DispatcherPerformanceRow { dispatcherName: string; completionRate: number; averageResolutionDays: number | null; + assignedCount: number; + completedCount: number; } diff --git a/src/domain/dashboard/types/dashboard-stats.ts b/src/domain/dashboard/types/dashboard-stats.ts index 82442c01..1394a801 100644 --- a/src/domain/dashboard/types/dashboard-stats.ts +++ b/src/domain/dashboard/types/dashboard-stats.ts @@ -3,6 +3,11 @@ export interface DashboardBreakdownRow { count: number; } +export interface DashboardStatusBucketRow { + status: string; + count: number; +} + export interface DashboardStats { total: number; open: number; @@ -16,4 +21,5 @@ export interface DashboardStats { pendingUplifts: number; avetaPending: number; breakdown: DashboardBreakdownRow[]; + statusDistribution: DashboardStatusBucketRow[]; } diff --git a/src/domain/dashboard/use-cases/use-dashboard-performance.ts b/src/domain/dashboard/use-cases/use-dashboard-performance.ts index 06491072..3e7c4f71 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-performance.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-performance.ts @@ -9,10 +9,14 @@ import { queryKeys } from "@/infra/query-key/query-key"; export function useDashboardPerformance( range: DashboardRangeKey, page = 1, + dispatcherId: string | null = null, + enabled = true, ): UseQueryResult, Error> { return useQuery({ - queryKey: queryKeys.dashboard.performance(range, page), - queryFn: () => dashboardApi.getPerformance(dashboardRangeParams(range), page), + queryKey: queryKeys.dashboard.performance(range, page, dispatcherId), + queryFn: () => + dashboardApi.getPerformance(dashboardRangeParams(range), page, dispatcherId ?? undefined), staleTime: 60 * 1000, + enabled, }); } diff --git a/src/domain/dashboard/use-cases/use-dashboard-regions.ts b/src/domain/dashboard/use-cases/use-dashboard-regions.ts index 996fc212..787d7477 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-regions.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-regions.ts @@ -7,10 +7,11 @@ import { queryKeys } from "@/infra/query-key/query-key"; export function useDashboardRegions( range: DashboardRangeKey, + dispatcherId: string | null = null, ): UseQueryResult { return useQuery({ - queryKey: queryKeys.dashboard.regions(range), - queryFn: () => dashboardApi.getRegions(dashboardRangeParams(range)), + queryKey: queryKeys.dashboard.regions(range, dispatcherId), + queryFn: () => dashboardApi.getRegions(dashboardRangeParams(range), dispatcherId ?? undefined), staleTime: 60 * 1000, }); } diff --git a/src/domain/dashboard/use-cases/use-dashboard-stats.ts b/src/domain/dashboard/use-cases/use-dashboard-stats.ts index d9e93ee2..9266d7ba 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-stats.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-stats.ts @@ -5,10 +5,13 @@ import type { DashboardStats } from "@/domain/dashboard/types/dashboard-stats"; import { dashboardRangeParams } from "@/domain/dashboard/utils/dashboard-range-utils"; import { queryKeys } from "@/infra/query-key/query-key"; -export function useDashboardStats(range: DashboardRangeKey): UseQueryResult { +export function useDashboardStats( + range: DashboardRangeKey, + dispatcherId: string | null = null, +): UseQueryResult { return useQuery({ - queryKey: queryKeys.dashboard.stats(range), - queryFn: () => dashboardApi.getStats(dashboardRangeParams(range)), + queryKey: queryKeys.dashboard.stats(range, dispatcherId), + queryFn: () => dashboardApi.getStats(dashboardRangeParams(range), dispatcherId ?? undefined), staleTime: 60 * 1000, }); } diff --git a/src/domain/dashboard/use-cases/use-dashboard-workload.ts b/src/domain/dashboard/use-cases/use-dashboard-workload.ts index e2276768..5a970598 100644 --- a/src/domain/dashboard/use-cases/use-dashboard-workload.ts +++ b/src/domain/dashboard/use-cases/use-dashboard-workload.ts @@ -9,10 +9,14 @@ import { queryKeys } from "@/infra/query-key/query-key"; export function useDashboardWorkload( range: DashboardRangeKey, page = 1, + dispatcherId: string | null = null, + enabled = true, ): UseQueryResult, Error> { return useQuery({ - queryKey: queryKeys.dashboard.workload(range, page), - queryFn: () => dashboardApi.getWorkload(dashboardRangeParams(range), page), + queryKey: queryKeys.dashboard.workload(range, page, dispatcherId), + queryFn: () => + dashboardApi.getWorkload(dashboardRangeParams(range), page, dispatcherId ?? undefined), staleTime: 60 * 1000, + enabled, }); } diff --git a/src/domain/dashboard/utils/work-order-drilldown-links.ts b/src/domain/dashboard/utils/work-order-drilldown-links.ts index 837fd104..c83d0592 100644 --- a/src/domain/dashboard/utils/work-order-drilldown-links.ts +++ b/src/domain/dashboard/utils/work-order-drilldown-links.ts @@ -61,6 +61,15 @@ export function workOrderDispatcherDrilldownSearch( return search; } +export function workOrderRegionDrilldownSearch( + region: string, + range: DashboardRangeKey, +): URLSearchParams { + const search = workOrderRangeDrilldownSearch(range); + search.set("regions", region); + return search; +} + export function scheduledTomorrowDrilldownSearch( today: string = businessTodayIso(), ): URLSearchParams { diff --git a/src/domain/work-orders/types/work-order-advanced-filters.ts b/src/domain/work-orders/types/work-order-advanced-filters.ts index e9ad34f9..c187aee8 100644 --- a/src/domain/work-orders/types/work-order-advanced-filters.ts +++ b/src/domain/work-orders/types/work-order-advanced-filters.ts @@ -32,6 +32,7 @@ export interface WorkOrderAdvancedFilters { types: Set; severities: Set; dispatchers: Set; + regions: Set; statuses: Set; rescheduled: boolean; carriedOver: boolean; @@ -55,6 +56,7 @@ export const EMPTY_ADVANCED_FILTERS: WorkOrderAdvancedFilters = { types: new Set(), severities: new Set(), dispatchers: new Set(), + regions: new Set(), statuses: new Set(), rescheduled: false, carriedOver: false, @@ -97,6 +99,7 @@ export type AdvancedFilterSetKey = | "sites" | "types" | "dispatchers" + | "regions" | "statuses" | "pmTypes" | "vendorTechs" diff --git a/src/domain/work-orders/types/work-order-board.ts b/src/domain/work-orders/types/work-order-board.ts index 4c5606b4..3c0d5619 100644 --- a/src/domain/work-orders/types/work-order-board.ts +++ b/src/domain/work-orders/types/work-order-board.ts @@ -287,6 +287,8 @@ export interface WorkOrderBoardSearchQueryParams { /** Past-due filter; independent of WorkOrderType (Other remains types=99). */ overdue?: boolean; dispatchers?: string[]; + /** SH-348: region names (East/Central/West/California/Unmapped/Other). */ + regions?: string[]; statuses?: number[]; pmTypes?: string[]; vendorIds?: number[]; diff --git a/src/domain/work-orders/utils/advanced-filter-chip-builders.ts b/src/domain/work-orders/utils/advanced-filter-chip-builders.ts index 57bdab98..edc707a0 100644 --- a/src/domain/work-orders/utils/advanced-filter-chip-builders.ts +++ b/src/domain/work-orders/utils/advanced-filter-chip-builders.ts @@ -108,6 +108,15 @@ export function appendSetChips( nameOf: (v) => v, clear: (current) => ({ ...current, types: new Set() }), }); + + pushSetChip({ + chips, + key: "regions", + group: "Region", + set: filters.regions, + nameOf: (v) => v, + clear: (current) => ({ ...current, regions: new Set() }), + }); } export function appendSeverityChip(chips: AdvancedFilterChip[], filters: WorkOrderAdvancedFilters) { diff --git a/src/domain/work-orders/utils/advanced-filters-utils.ts b/src/domain/work-orders/utils/advanced-filters-utils.ts index 97e503f2..3f8f5ce5 100644 --- a/src/domain/work-orders/utils/advanced-filters-utils.ts +++ b/src/domain/work-orders/utils/advanced-filters-utils.ts @@ -26,6 +26,7 @@ function cloneFilters(filters: WorkOrderAdvancedFilters): WorkOrderAdvancedFilte types: new Set(filters.types), severities: new Set(filters.severities ?? []), dispatchers: new Set(filters.dispatchers), + regions: new Set(filters.regions ?? []), statuses: new Set(filters.statuses), pmTypes: new Set(filters.pmTypes), vendorTechs: new Set(filters.vendorTechs), @@ -42,6 +43,7 @@ const ADVANCED_FILTER_ACTIVE_SIGNALS = (filters: WorkOrderAdvancedFilters): bool Boolean(filters.types?.size), Boolean(filters.severities?.size), Boolean(filters.dispatchers?.size), + Boolean(filters.regions?.size), Boolean(filters.statuses?.size), filters.rescheduled, filters.carriedOver, diff --git a/src/domain/work-orders/utils/board-query-params.ts b/src/domain/work-orders/utils/board-query-params.ts index 29780d1a..c10519b8 100644 --- a/src/domain/work-orders/utils/board-query-params.ts +++ b/src/domain/work-orders/utils/board-query-params.ts @@ -217,6 +217,7 @@ export function toBoardSearchQueryParams(input: { types: typeFilters.types, overdue: typeFilters.overdue, dispatchers: mapDispatchers(filters.dispatchers), + regions: filters.regions.size > 0 ? [...filters.regions] : undefined, statuses: mapStatuses(filters.statuses), pmTypes: filters.pmTypes.size > 0 ? [...filters.pmTypes] : undefined, vendorIds: resolveVendorIds(filters.vendorTechs, input.vendorIdsByCompanyName), diff --git a/src/domain/work-orders/utils/dashboard-drilldown-params.ts b/src/domain/work-orders/utils/dashboard-drilldown-params.ts index 0d030c6c..c67315c3 100644 --- a/src/domain/work-orders/utils/dashboard-drilldown-params.ts +++ b/src/domain/work-orders/utils/dashboard-drilldown-params.ts @@ -10,6 +10,9 @@ const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/; const COMPLETION_DOC_FILTERS: CompletionDocFilter[] = ["No", "Yes", "NN"]; +// SH-348: the board region filter (backend#146) accepts these region names. +const BOARD_REGION_NAMES = ["East", "Central", "West", "California", "Unmapped/Other"]; + const UPLIFT_FILTER_VALUES: UpliftFilterStatus[] = [ "pending", "approved", @@ -45,6 +48,11 @@ function parseCompletionDocs(raw: string | null): CompletionDocFilter[] { return [...new Set(parseList(raw))].filter((doc): doc is CompletionDocFilter => valid.has(doc)); } +function parseRegions(raw: string | null): string[] { + const valid = new Set(BOARD_REGION_NAMES); + return [...new Set(parseList(raw))].filter((region) => valid.has(region)); +} + function parseUpliftStatuses(raw: string | null): UpliftFilterStatus[] { const valid = new Set(UPLIFT_FILTER_VALUES); return [...new Set(parseList(raw))].filter((value): value is UpliftFilterStatus => @@ -63,6 +71,7 @@ export function parseDashboardDrilldownParams( const statuses = parseStatuses(params.get("statuses")); const types = parseTypes(params.get("types")); const dispatchers = parseList(params.get("dispatchers")); + const regions = parseRegions(params.get("regions")); const upliftStatuses = parseUpliftStatuses(params.get("upliftStatuses")); const hasUplift = params.get("hasUplift") === "1"; @@ -73,6 +82,7 @@ export function parseDashboardDrilldownParams( statuses.length > 0 || types.length > 0 || dispatchers.length > 0 || + regions.length > 0 || upliftStatuses.length > 0 || hasUplift; @@ -101,6 +111,9 @@ export function parseDashboardDrilldownParams( if (dispatchers.length > 0) { filters.dispatchers = new Set(dispatchers); } + if (regions.length > 0) { + filters.regions = new Set(regions); + } if (upliftStatuses.length > 0) { filters.upliftStatuses = new Set(upliftStatuses); } diff --git a/src/infra/query-key/query-key.ts b/src/infra/query-key/query-key.ts index 6760619e..8cf4bb75 100644 --- a/src/infra/query-key/query-key.ts +++ b/src/infra/query-key/query-key.ts @@ -51,12 +51,14 @@ export const queryKeys = { }, dashboard: { all: ["dashboard"] as const, - stats: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "stats", range] as const, - workload: (range: DashboardRangeKey, page = 1) => - [...queryKeys.dashboard.all, "workload", range, page] as const, - performance: (range: DashboardRangeKey, page = 1) => - [...queryKeys.dashboard.all, "performance", range, page] as const, - regions: (range: DashboardRangeKey) => [...queryKeys.dashboard.all, "regions", range] as const, + stats: (range: DashboardRangeKey, dispatcherId: string | null = null) => + [...queryKeys.dashboard.all, "stats", range, dispatcherId] as const, + workload: (range: DashboardRangeKey, page = 1, dispatcherId: string | null = null) => + [...queryKeys.dashboard.all, "workload", range, page, dispatcherId] as const, + performance: (range: DashboardRangeKey, page = 1, dispatcherId: string | null = null) => + [...queryKeys.dashboard.all, "performance", range, page, dispatcherId] as const, + regions: (range: DashboardRangeKey, dispatcherId: string | null = null) => + [...queryKeys.dashboard.all, "regions", range, dispatcherId] as const, vendorInsights: () => [...queryKeys.dashboard.all, "vendorInsights"] as const, trend: (params?: DashboardTrendParams) => [...queryKeys.dashboard.all, "trend", params ?? {}] as const, diff --git a/src/lib/auth/user-utils.ts b/src/lib/auth/user-utils.ts index 55ca7411..1fcd3f4d 100644 --- a/src/lib/auth/user-utils.ts +++ b/src/lib/auth/user-utils.ts @@ -14,3 +14,18 @@ export function isAdminUser(userRoles: string | null | undefined): boolean { .map((role) => role.trim().toLowerCase()) .includes("admin"); } + +/** + * SH-336's `viewAllDispatchersOnDashboard` permission. The codebase has no + * permission model, so it is derived from role: Admin and Scheduler may pick any + * dispatcher (or the whole company) on the Dashboard; a Dispatcher may not and + * is locked to their own work orders. Unknown roles default to the restrictive + * (Dispatcher) behaviour so no one accidentally gains a company-wide view. + */ +export function canViewAllDispatchersOnDashboard(userRoles: string | null | undefined): boolean { + if (!userRoles) { + return false; + } + const roles = userRoles.split(",").map((role) => role.trim().toLowerCase()); + return roles.includes("admin") || roles.includes("scheduler"); +} diff --git a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx index e74ab664..5ad7396e 100644 --- a/src/test/app/(protected)/dashboard/dashboard-page.test.tsx +++ b/src/test/app/(protected)/dashboard/dashboard-page.test.tsx @@ -5,9 +5,10 @@ import { renderWithProviders } from "@/test/test-utils"; const navigate = vi.fn(); const statsRange = vi.fn<(range: DashboardRangeKey) => void>(); -const { workloadMock, performanceMock } = vi.hoisted(() => ({ +const { workloadMock, performanceMock, authUser } = vi.hoisted(() => ({ workloadMock: vi.fn(), performanceMock: vi.fn(), + authUser: { current: { id: "99", userRoles: "Admin" } as { id: string; userRoles: string } }, })); const EMPTY_DISPATCHER_PAGE = { items: [], page: 1, pageSize: 10, totalDispatchers: 0 }; @@ -17,6 +18,17 @@ vi.mock("react-router", async (importOriginal) => ({ useNavigate: () => navigate, })); +// An Admin has `viewAllDispatchersOnDashboard`, so the scope picker and the +// dispatcher tables render (SH-336). +vi.mock("@/providers/auth-context", async (importOriginal) => ({ + ...(await importOriginal()), + useAuthContext: () => ({ user: authUser.current }), +})); + +vi.mock("@/domain/work-orders/use-cases/use-work-orders-list", () => ({ + useWorkOrderUsers: () => ({ data: [], isLoading: false, isFetching: false, error: null }), +})); + vi.mock("@/domain/dashboard/use-cases/use-dashboard-workload", () => ({ useDashboardWorkload: workloadMock, })); @@ -77,6 +89,7 @@ function renderDashboard() { describe("DashboardPage", () => { beforeEach(() => { + authUser.current = { id: "99", userRoles: "Admin" }; navigate.mockReset(); statsRange.mockReset(); workloadMock.mockReset(); @@ -107,6 +120,7 @@ describe("DashboardPage", () => { "Pending Uplifts", "Aveta Pending", "Work Order Breakdown", + "Status Distribution", "Dispatcher Workload", "Dispatcher Performance", "Work Orders by Region", @@ -117,6 +131,27 @@ describe("DashboardPage", () => { expect(statsRange).toHaveBeenCalledWith("this-week"); }); + it("shows a Dispatcher the static My WOs scope and hides the dispatcher tables", () => { + authUser.current = { id: "7", userRoles: "Dispatcher" }; + + renderDashboard(); + + expect(screen.getByText("My WOs")).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "All dispatchers" })).toBeNull(); + expect(screen.queryByText("Dispatcher Workload")).toBeNull(); + expect(screen.queryByText("Dispatcher Performance")).toBeNull(); + // Their scope is server-scoped, so the tables are never even queried. + expect(workloadMock).toHaveBeenCalledWith("this-week", 1, null, false); + }); + + it("lets an Admin open the dispatcher-scope picker", () => { + renderDashboard(); + + expect(screen.getByRole("button", { name: /All dispatchers/ })).toBeInTheDocument(); + expect(screen.getByText("Dispatcher Workload")).toBeInTheDocument(); + expect(workloadMock).toHaveBeenCalledWith("this-week", 1, null, true); + }); + it("exposes positive KPI cards as keyboard-accessible drill-downs", () => { renderDashboard(); @@ -168,8 +203,8 @@ describe("DashboardPage", () => { it("shows the documented empty states when datasets are empty", () => { renderDashboard(); - // Breakdown and Trend share this empty copy, so both cards surface it. - expect(screen.getAllByText("No work orders match the current filters.")).toHaveLength(2); + // Region, Status Distribution, and Trend share this empty copy. + expect(screen.getAllByText("No work orders match the current filters.")).toHaveLength(3); expect(screen.getAllByText("No dispatchers are set up yet.")).toHaveLength(2); expect(screen.getByText("No active vendor has any work orders yet.")).toBeInTheDocument(); }); diff --git a/src/test/domain/dashboard/dashboard-api.test.ts b/src/test/domain/dashboard/dashboard-api.test.ts index 9a73b50a..95f8c258 100644 --- a/src/test/domain/dashboard/dashboard-api.test.ts +++ b/src/test/domain/dashboard/dashboard-api.test.ts @@ -31,6 +31,10 @@ describe("dashboardApi", () => { { Status: "Scheduled", Count: "7" }, { Status: "Completed", Count: 4 }, ], + StatusDistribution: [ + { Status: "Scheduled", Count: "7" }, + { Status: "Unknown", Count: 1 }, + ], }, }); @@ -52,6 +56,10 @@ describe("dashboardApi", () => { { status: "Scheduled", count: 7 }, { status: "Completed", count: 4 }, ], + statusDistribution: [ + { status: "Scheduled", count: 7 }, + { status: "Unknown", count: 1 }, + ], }); expect(apiGet).toHaveBeenCalledWith("Dashboard/Stats", { searchParams: { dateFrom: "2026-09-14", dateTo: "2026-09-18" }, @@ -116,6 +124,8 @@ describe("dashboardApi", () => { DispatcherName: "Dana Reyes", CompletionRate: 96.5, AverageResolutionDays: 3.25, + AssignedCount: 40, + CompletedCount: "38", }, ], Page: 2, @@ -132,6 +142,8 @@ describe("dashboardApi", () => { dispatcherName: "Dana Reyes", completionRate: 96.5, averageResolutionDays: 3.25, + assignedCount: 40, + completedCount: 38, }, ], page: 2, diff --git a/src/test/domain/dashboard/work-order-drilldown-links.test.ts b/src/test/domain/dashboard/work-order-drilldown-links.test.ts index 2c28e20c..836da9e6 100644 --- a/src/test/domain/dashboard/work-order-drilldown-links.test.ts +++ b/src/test/domain/dashboard/work-order-drilldown-links.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { avetaPendingDrilldownSearch, scheduledTomorrowDrilldownSearch, @@ -8,6 +8,10 @@ import { } from "@/domain/dashboard/utils/work-order-drilldown-links"; describe("work-order drilldown links", () => { + afterEach(() => { + vi.useRealTimers(); + }); + it("schedules the tomorrow drilldown on the business clock", () => { const search = scheduledTomorrowDrilldownSearch("2026-09-16"); @@ -30,6 +34,11 @@ describe("work-order drilldown links", () => { }); it("carries the range into status drilldowns", () => { + // "today" resolves against the business clock, so pin it (midday EDT on + // 2026-09-16 → 2026-09-16 in America/New_York) to keep the test deterministic. + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-09-16T16:00:00Z")); + const search = workOrderStatusDrilldownSearch("Scheduled", "today"); expect(search.get("dateFrom")).toBe("2026-09-16"); diff --git a/src/test/domain/work-orders/dashboard-drilldown-params.test.ts b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts index 97518591..8ff30f72 100644 --- a/src/test/domain/work-orders/dashboard-drilldown-params.test.ts +++ b/src/test/domain/work-orders/dashboard-drilldown-params.test.ts @@ -52,6 +52,14 @@ describe("parseDashboardDrilldownParams", () => { expect(filters?.upliftStatuses).toEqual(new Set(["pending"])); }); + it("parses the region drilldown and drops unknown region names", () => { + const filters = parseDashboardDrilldownParams( + new URLSearchParams({ regions: "California, Atlantis" }), + ); + + expect(filters?.regions).toEqual(new Set(["California"])); + }); + it("rejects partial or malformed date ranges", () => { expect( parseDashboardDrilldownParams( diff --git a/src/test/lib/auth/user-utils.test.ts b/src/test/lib/auth/user-utils.test.ts index eddb88c5..ac185d49 100644 --- a/src/test/lib/auth/user-utils.test.ts +++ b/src/test/lib/auth/user-utils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { isAdminUser } from "@/lib/auth/user-utils"; +import { canViewAllDispatchersOnDashboard, isAdminUser } from "@/lib/auth/user-utils"; describe("isAdminUser", () => { it("returns true when Admin appears in roles", () => { @@ -13,3 +13,17 @@ describe("isAdminUser", () => { expect(isAdminUser(undefined)).toBe(false); }); }); + +describe("canViewAllDispatchersOnDashboard", () => { + it("grants the dashboard picker to Admin and Scheduler", () => { + expect(canViewAllDispatchersOnDashboard("Admin")).toBe(true); + expect(canViewAllDispatchersOnDashboard("Scheduler")).toBe(true); + expect(canViewAllDispatchersOnDashboard("Dispatcher, Scheduler")).toBe(true); + }); + + it("locks a Dispatcher (and unknown roles) to their own work orders", () => { + expect(canViewAllDispatchersOnDashboard("Dispatcher")).toBe(false); + expect(canViewAllDispatchersOnDashboard("Technician")).toBe(false); + expect(canViewAllDispatchersOnDashboard(undefined)).toBe(false); + }); +}); From 827f8ca8bae146411486c20d4b6370514a369783 Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Thu, 17 Sep 2026 03:14:15 -0300 Subject: [PATCH 6/7] refactor(dashboard): extract scope hook and header actions to satisfy governance caps Split DashboardPage's scope/paging state into useDashboardScope and the header controls into DashboardHeaderActions, and flatten parseDashboardDrilldownParams' hasAny check, keeping every function under the complexity/line-count gates. --- .../_components/dashboard-header-actions.tsx | 67 +++++++++++ .../_components/use-dashboard-scope.ts | 87 ++++++++++++++ src/app/(protected)/dashboard/index.tsx | 112 ++++-------------- .../utils/dashboard-drilldown-params.ts | 21 ++-- 4 files changed, 185 insertions(+), 102 deletions(-) create mode 100644 src/app/(protected)/dashboard/_components/dashboard-header-actions.tsx create mode 100644 src/app/(protected)/dashboard/_components/use-dashboard-scope.ts diff --git a/src/app/(protected)/dashboard/_components/dashboard-header-actions.tsx b/src/app/(protected)/dashboard/_components/dashboard-header-actions.tsx new file mode 100644 index 00000000..e410c72b --- /dev/null +++ b/src/app/(protected)/dashboard/_components/dashboard-header-actions.tsx @@ -0,0 +1,67 @@ +import { Box, Button, CircularProgress } from "@mui/material"; +import { Users } from "lucide-react"; +import { Text } from "@/components/ui/text"; +import type { WorkOrderUser } from "@/domain/work-orders/types/work-order"; +import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; +import { DashboardRangeToggle } from "./dashboard-range-toggle"; +import { DashboardScopePicker } from "./dashboard-scope-picker"; +import type { DashboardScope } from "./dashboard-scope"; + +interface DashboardHeaderActionsProps { + isRefreshing: boolean; + showReset: boolean; + onResetFilters: () => void; + canViewAll: boolean; + scope: DashboardScope; + onScopeChange: (scope: DashboardScope) => void; + dispatcherUsers: WorkOrderUser[]; + dispatcherUsersLoading: boolean; + currentUserId: string | number | undefined; + range: DashboardRangeKey; + onRangeChange: (range: DashboardRangeKey) => void; +} + +export function DashboardHeaderActions({ + isRefreshing, + showReset, + onResetFilters, + canViewAll, + scope, + onScopeChange, + dispatcherUsers, + dispatcherUsersLoading, + currentUserId, + range, + onRangeChange, +}: DashboardHeaderActionsProps) { + return ( + + {isRefreshing && } + {showReset && ( + + )} + {canViewAll ? ( + + ) : ( + + + + My WOs + + + )} + + + ); +} diff --git a/src/app/(protected)/dashboard/_components/use-dashboard-scope.ts b/src/app/(protected)/dashboard/_components/use-dashboard-scope.ts new file mode 100644 index 00000000..868b8d05 --- /dev/null +++ b/src/app/(protected)/dashboard/_components/use-dashboard-scope.ts @@ -0,0 +1,87 @@ +import { useState } from "react"; +import { canViewAllDispatchersOnDashboard } from "@/lib/auth/user-utils"; +import { useAuthContext } from "@/providers/auth-context"; +import { + DEFAULT_DASHBOARD_RANGE, + type DashboardRangeKey, +} from "@/domain/dashboard/types/dashboard-range"; +import { DASHBOARD_SCOPE_ALL, scopeDispatcherId, type DashboardScope } from "./dashboard-scope"; + +export interface DashboardScopeState { + canViewAll: boolean; + currentUserId: string | number | undefined; + range: DashboardRangeKey; + scope: DashboardScope; + /** The `dispatcherId` query param for the scoped endpoints (null = company-wide). */ + dispatcherId: string | null; + workloadPage: number; + performancePage: number; + showReset: boolean; + setWorkloadPage: (page: number) => void; + setPerformancePage: (page: number) => void; + changeRange: (next: DashboardRangeKey) => void; + changeScope: (next: DashboardScope) => void; + resetFilters: () => void; +} + +/** + * SH-336 dashboard scope/paging state. A Dispatcher (no + * `viewAllDispatchersOnDashboard`) is locked to their own work orders and sends + * no dispatcherId; Scheduler/Admin drive an explicit scope through the picker. + */ +export function useDashboardScope(): DashboardScopeState { + const { user } = useAuthContext(); + const canViewAll = canViewAllDispatchersOnDashboard(user?.userRoles); + + const [range, setRange] = useState(DEFAULT_DASHBOARD_RANGE); + const [scope, setScope] = useState(DASHBOARD_SCOPE_ALL); + const [workloadPage, setWorkloadPage] = useState(1); + const [performancePage, setPerformancePage] = useState(1); + + const dispatcherId = canViewAll ? scopeDispatcherId(scope, user?.id) : null; + + // A range or scope change re-scopes both dispatcher tables, so their page must + // reset — otherwise a switch while on page 3 lands on an out-of-range empty + // page that reads as a false "no dispatchers" state. + const resetPages = () => { + setWorkloadPage(1); + setPerformancePage(1); + }; + + const changeRange = (next: DashboardRangeKey) => { + setRange(next); + resetPages(); + }; + + const changeScope = (next: DashboardScope) => { + setScope(next); + resetPages(); + }; + + const resetFilters = () => { + setRange(DEFAULT_DASHBOARD_RANGE); + setScope(DASHBOARD_SCOPE_ALL); + resetPages(); + }; + + // A Dispatcher's forced own-WOs scope never triggers the reset affordance (only + // an active date range can, for that role); a Scheduler/Admin's non-All scope does. + const scopeIsFiltered = canViewAll && scope.mode !== "all"; + const showReset = range !== DEFAULT_DASHBOARD_RANGE || scopeIsFiltered; + + return { + canViewAll, + currentUserId: user?.id, + range, + scope, + dispatcherId, + workloadPage, + performancePage, + showReset, + setWorkloadPage, + setPerformancePage, + changeRange, + changeScope, + resetFilters, + }; +} diff --git a/src/app/(protected)/dashboard/index.tsx b/src/app/(protected)/dashboard/index.tsx index 60d6748a..60795d8f 100644 --- a/src/app/(protected)/dashboard/index.tsx +++ b/src/app/(protected)/dashboard/index.tsx @@ -1,32 +1,18 @@ -import { useState } from "react"; import { useNavigate } from "react-router"; import EventOutlinedIcon from "@mui/icons-material/EventOutlined"; import PendingActionsIcon from "@mui/icons-material/PendingActions"; import ShieldOutlinedIcon from "@mui/icons-material/ShieldOutlined"; -import { Box, Button, CircularProgress } from "@mui/material"; -import { Users } from "lucide-react"; +import { Box } from "@mui/material"; import { PageHeader } from "@/components/ui/page-header"; -import { Text } from "@/components/ui/text"; -import { canViewAllDispatchersOnDashboard } from "@/lib/auth/user-utils"; -import { useAuthContext } from "@/providers/auth-context"; +import { DashboardHeaderActions } from "@/app/(protected)/dashboard/_components/dashboard-header-actions"; import { DashboardKpiCard } from "@/app/(protected)/dashboard/_components/dashboard-kpi-card"; -import { DashboardRangeToggle } from "@/app/(protected)/dashboard/_components/dashboard-range-toggle"; import { DashboardTrendCard } from "@/app/(protected)/dashboard/_components/dashboard-trend-card"; -import { DashboardScopePicker } from "@/app/(protected)/dashboard/_components/dashboard-scope-picker"; -import { - DASHBOARD_SCOPE_ALL, - scopeDispatcherId, - type DashboardScope, -} from "@/app/(protected)/dashboard/_components/dashboard-scope"; import { DispatcherTablesSection } from "@/app/(protected)/dashboard/_components/dispatcher-tables-section"; import { StatusDistributionCard } from "@/app/(protected)/dashboard/_components/status-distribution-card"; +import { useDashboardScope } from "@/app/(protected)/dashboard/_components/use-dashboard-scope"; import { VendorInsightsCard } from "@/app/(protected)/dashboard/_components/vendor-insights-card"; import { WorkOrderBreakdownCard } from "@/app/(protected)/dashboard/_components/work-order-breakdown-card"; import { WorkOrdersByRegionCard } from "@/app/(protected)/dashboard/_components/work-orders-by-region-card"; -import { - DEFAULT_DASHBOARD_RANGE, - type DashboardRangeKey, -} from "@/domain/dashboard/types/dashboard-range"; import { useDashboardPerformance } from "@/domain/dashboard/use-cases/use-dashboard-performance"; import { useDashboardRegions } from "@/domain/dashboard/use-cases/use-dashboard-regions"; import { useDashboardStats } from "@/domain/dashboard/use-cases/use-dashboard-stats"; @@ -42,59 +28,16 @@ import { export default function DashboardPage() { const navigate = useNavigate(); - const { user } = useAuthContext(); - // SH-336: only Scheduler/Admin may broaden the Dashboard past their own work - // orders. A Dispatcher is locked to their own WOs (scoped server-side by - // backend#126) and never sees the picker. - const canViewAll = canViewAllDispatchersOnDashboard(user?.userRoles); - - const [range, setRange] = useState(DEFAULT_DASHBOARD_RANGE); - const [scope, setScope] = useState(DASHBOARD_SCOPE_ALL); - const [workloadPage, setWorkloadPage] = useState(1); - const [performancePage, setPerformancePage] = useState(1); + const scope = useDashboardScope(); + const { canViewAll, range, dispatcherId, workloadPage, performancePage } = scope; const dispatcherUsers = useWorkOrderUsers(); - - // A Dispatcher sends no dispatcherId (the server already scopes them); only the - // picker, available to Scheduler/Admin, drives an explicit scope. - const dispatcherId = canViewAll ? scopeDispatcherId(scope, user?.id) : null; - const stats = useDashboardStats(range, dispatcherId); const workload = useDashboardWorkload(range, workloadPage, dispatcherId, canViewAll); const performance = useDashboardPerformance(range, performancePage, dispatcherId, canViewAll); const regions = useDashboardRegions(range, dispatcherId); const vendors = useDashboardVendorInsights(); - // A range change re-scopes both dispatcher tables, so their page must reset — - // otherwise a switch while on page 3 lands on an out-of-range empty page that - // reads as a false "no dispatchers" state. - const resetDispatcherPages = () => { - setWorkloadPage(1); - setPerformancePage(1); - }; - - const changeRange = (next: DashboardRangeKey) => { - setRange(next); - resetDispatcherPages(); - }; - - const changeScope = (next: DashboardScope) => { - setScope(next); - resetDispatcherPages(); - }; - - const resetFilters = () => { - setRange(DEFAULT_DASHBOARD_RANGE); - setScope(DASHBOARD_SCOPE_ALL); - resetDispatcherPages(); - }; - - // A Dispatcher's forced own-WOs scope never triggers the reset affordance (there - // is nothing for them to reset but the date range); a Scheduler/Admin's non-All - // scope does. - const scopeIsFiltered = canViewAll && scope.mode !== "all"; - const showReset = range !== DEFAULT_DASHBOARD_RANGE || scopeIsFiltered; - const isRefreshing = [stats, workload, performance, regions, vendors].some((query) => query.isFetching) && !stats.isLoading; @@ -104,34 +47,19 @@ export default function DashboardPage() { - {isRefreshing && } - {showReset && ( - - )} - {canViewAll ? ( - - ) : ( - - - - My WOs - - - )} - - + } /> @@ -189,8 +117,8 @@ export default function DashboardPage() { performance={performance} workloadPage={workloadPage} performancePage={performancePage} - onWorkloadPageChange={setWorkloadPage} - onPerformancePageChange={setPerformancePage} + onWorkloadPageChange={scope.setWorkloadPage} + onPerformancePageChange={scope.setPerformancePage} /> )} diff --git a/src/domain/work-orders/utils/dashboard-drilldown-params.ts b/src/domain/work-orders/utils/dashboard-drilldown-params.ts index c67315c3..bb868e51 100644 --- a/src/domain/work-orders/utils/dashboard-drilldown-params.ts +++ b/src/domain/work-orders/utils/dashboard-drilldown-params.ts @@ -75,16 +75,17 @@ export function parseDashboardDrilldownParams( const upliftStatuses = parseUpliftStatuses(params.get("upliftStatuses")); const hasUplift = params.get("hasUplift") === "1"; - const hasAny = - hasDateRange || - avetaOnly || - docs.length > 0 || - statuses.length > 0 || - types.length > 0 || - dispatchers.length > 0 || - regions.length > 0 || - upliftStatuses.length > 0 || - hasUplift; + const hasAny = [ + hasDateRange, + avetaOnly, + docs.length, + statuses.length, + types.length, + dispatchers.length, + regions.length, + upliftStatuses.length, + hasUplift, + ].some(Boolean); if (!hasAny) { return null; From 6a18cc321a62503af036f83f3c082ac8a48720d8 Mon Sep 17 00:00:00 2001 From: Codex Review Integration Date: Thu, 17 Sep 2026 14:44:57 -0300 Subject: [PATCH 7/7] test(dashboard): update visual baselines for Team Members nav item --- .../dashboard-admin.png | Bin 140554 -> 143485 bytes .../dashboard-dispatcher.png | Bin 119831 -> 122777 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-admin.png b/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-admin.png index 215400e78318821d05b3be02784bd32995c8b143..67a84215626dd1fe04c56f1a504bef0e86226d10 100644 GIT binary patch delta 48372 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 |_qU?{!A_kJl|`k?b=-XU|@@Nnmc`tV_k{U3Sif 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 diff --git a/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-dispatcher.png b/e2e/__screenshots__/dashboard/dashboard.visual.spec.ts/dashboard-dispatcher.png index 569425613d801da6c3bd7a2f61b5fa0478fbf84e..d95ef19431efc1c5e06d3cd229457e8949cfb8cc 100644 GIT binary patch delta 27543 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