From 6bf6fa4867ffc4a7631c8bed606a2a43b33a6b0c Mon Sep 17 00:00:00 2001 From: Mia Wu Date: Mon, 13 Jul 2026 02:10:25 -0400 Subject: [PATCH] frontend changes: change shift order display, added config map --- frontend/src/assets/CGW453.PNG | Bin 0 -> 20905 bytes frontend/src/assets/hero.png | Bin 13057 -> 0 bytes frontend/src/assets/react.svg | 1 - frontend/src/assets/vite.svg | 1 - frontend/src/components/Calendar.jsx | 8 + frontend/src/components/DayColumn.jsx | 18 +- frontend/src/components/RightPanel.jsx | 36 +--- .../src/components/TestWindowDetailsPanel.jsx | 196 ++++++++++++------ 8 files changed, 155 insertions(+), 105 deletions(-) create mode 100644 frontend/src/assets/CGW453.PNG delete mode 100644 frontend/src/assets/hero.png delete mode 100644 frontend/src/assets/react.svg delete mode 100644 frontend/src/assets/vite.svg diff --git a/frontend/src/assets/CGW453.PNG b/frontend/src/assets/CGW453.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d559cd46cce898a87c5d331df13ee85ecc3efb0e GIT binary patch literal 20905 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 P00000NkvXXu0mjft=yBf diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/assets/vite.svg b/frontend/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/frontend/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/frontend/src/components/Calendar.jsx b/frontend/src/components/Calendar.jsx index 8a7f8d0..a09df90 100644 --- a/frontend/src/components/Calendar.jsx +++ b/frontend/src/components/Calendar.jsx @@ -141,10 +141,16 @@ export default function Calendar({ const shifts = scheduleData[key] ?? { shift1: [], shift2: [], shift3: [] } const isToday = date.getTime() === today.getTime() const isWeekend = date.getDay() === 0 || date.getDay() === 6 + // Get next day's shift1 for display + const nextDate = addDays(date, 1) + const nextKey = toDateKey(nextDate) + const nextDayShift1 = scheduleData[nextKey]?.shift1 ?? [] // Which shifts on this date are part of the active test window? const activeShifts = new Set() if (key === activeWindow.shift3Date) activeShifts.add(3) if (key === activeWindow.shift1Date) activeShifts.add(1) + // Check if next day's shift1 is active + const nextDayShift1Active = nextKey === activeWindow.shift1Date return ( - + ) diff --git a/frontend/src/components/RightPanel.jsx b/frontend/src/components/RightPanel.jsx index c8cb8db..c3c22e5 100644 --- a/frontend/src/components/RightPanel.jsx +++ b/frontend/src/components/RightPanel.jsx @@ -1,3 +1,5 @@ +import cgw453Image from '../assets/CGW453.PNG' + function formatCompletionDate(value) { if (!value) return null @@ -28,6 +30,11 @@ export default function RightPanel({ return ( ) } diff --git a/frontend/src/components/TestWindowDetailsPanel.jsx b/frontend/src/components/TestWindowDetailsPanel.jsx index 2e650f2..fefe262 100644 --- a/frontend/src/components/TestWindowDetailsPanel.jsx +++ b/frontend/src/components/TestWindowDetailsPanel.jsx @@ -1,4 +1,10 @@ import { useEffect, useMemo, useState } from 'react' +import { getDeviceAccentClass } from './TestCard' + +const CONFIG_MAP_IMAGE_MODULES = import.meta.glob('../assets/TC*_map/*.png', { + eager: true, + import: 'default', +}) const STATUS_STYLES = { pending: 'bg-gray-700 text-gray-200 border-gray-600', @@ -90,6 +96,16 @@ function formatConfigEntries(config) { .filter(Boolean) } +function getConfigMapImages(configKey) { + if (!configKey) return [] + + const folderToken = `/${configKey.toUpperCase()}_map/` + return Object.entries(CONFIG_MAP_IMAGE_MODULES) + .filter(([path]) => path.includes(folderToken)) + .sort(([pathA], [pathB]) => pathA.localeCompare(pathB, undefined, { numeric: true })) + .map(([, assetUrl]) => assetUrl) +} + function TestRow({ test }) { const [expanded, setExpanded] = useState(false) const statusStyle = STATUS_STYLES[test.status] ?? STATUS_STYLES.pending @@ -103,15 +119,18 @@ function TestRow({ test }) { className="w-full px-4 py-3 text-left hover:bg-gray-800/80 transition-colors" >
-
-

{test.test_id}

-

{test.device ?? '—'} · {formatShiftLabel(test)}

+
+
{test.status ?? 'pending'} - {formatHours(test.estimated_minutes)} + {Number.isFinite(test.estimated_minutes) && test.estimated_minutes > 0 ? `${test.estimated_minutes} min` : '—'}
@@ -127,14 +146,6 @@ function TestRow({ test }) {

Rotation

{test.rotation ?? '—'}

-
-

Priority

-

{test.priority ?? '—'}

-
-
-

Sequence

-

{test.sequence_in_shift ?? '—'}

-
@@ -171,7 +182,15 @@ function TestRow({ test }) { } export default function TestWindowDetailsPanel({ isOpen, windowDetails, onClose }) { + const [showConfigMap, setShowConfigMap] = useState(false) const windowTestConfig = useMemo(() => getWindowTestConfig(windowDetails), [windowDetails]) + const windowConfigMapKey = useMemo( + () => (windowTestConfig.length > 0 ? String(windowTestConfig[0]).toUpperCase() : null), + [windowTestConfig], + ) + const configMapImages = useMemo(() => getConfigMapImages(windowConfigMapKey), [windowConfigMapKey]) + const hasConfigMapImages = configMapImages.length > 0 + const showMapPane = showConfigMap && hasConfigMapImages useEffect(() => { if (!isOpen) return undefined @@ -201,11 +220,13 @@ export default function TestWindowDetailsPanel({ isOpen, windowDetails, onClose />