From b619355763fb240cd491c11da761406281576a33 Mon Sep 17 00:00:00 2001 From: Johngreen Date: Wed, 11 Feb 2026 09:31:07 +0900 Subject: [PATCH] feat: collapsible area groups in machine list (30+ auto-collapsed) --- dashboard/app/globals.css | 16 ++++++++++++++++ dashboard/components/MachineList.tsx | 22 ++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/dashboard/app/globals.css b/dashboard/app/globals.css index c4e3398..47f5a15 100644 --- a/dashboard/app/globals.css +++ b/dashboard/app/globals.css @@ -2459,6 +2459,22 @@ a { font-weight: 400; } +.machine-group-chevron { + font-size: 20px; + color: var(--md-on-surface-variant); + transition: transform 0.2s ease; + transform: rotate(-90deg); + margin-left: 4px; +} + +.machine-group-chevron-open { + transform: rotate(0deg); +} + +.machine-group-header:hover { + opacity: 0.85; +} + .machine-card-top { display: flex; justify-content: space-between; diff --git a/dashboard/components/MachineList.tsx b/dashboard/components/MachineList.tsx index 3f3108f..0f2bfaa 100644 --- a/dashboard/components/MachineList.tsx +++ b/dashboard/components/MachineList.tsx @@ -1,5 +1,6 @@ 'use client'; +import { useState, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import type { Machine, Criticality } from '@/lib/types'; @@ -73,26 +74,39 @@ export function MachineList({ machines, tenantId, onEdit, onDelete, onBatchInspe } }; + const [collapsed, setCollapsed] = useState>(() => { + const init: Record = {}; + Object.keys(groupedMachines).forEach(area => { + init[area] = groupedMachines[area].length > 30; + }); + return init; + }); + + const toggleArea = useCallback((area: string) => { + setCollapsed(prev => ({ ...prev, [area]: !prev[area] })); + }, []); + return (
{sortedAreas.map(area => (
-
+
toggleArea(area)} style={{ cursor: 'pointer' }}>

location_on {area} ({groupedMachines[area].length}대) + expand_more

{onBatchInspect && ( )}
-
+ {!collapsed[area] &&
{groupedMachines[area].map((machine) => (
))} -
+
}
))} {sortedAreas.length === 0 && (