# [계획서] V2Select 다중 선택 드롭다운 - 선택 항목 표시 개선 > 관련 문서: [맥락노트](./MST[맥락노트]-v2select-multiselect-tooltip.md) | [체크리스트](./MST[체크리스트]-v2select-multiselect-tooltip.md) ## 개요 모든 화면에서 다중 선택 가능한 드롭다운(`V2Select` - `DropdownSelect`)의 선택 항목 표시 방식을 개선합니다. --- ## 현재 동작 - 다중 선택 시 `"3개 선택됨"` 같은 텍스트만 표시 - 어떤 항목이 선택되었는지 드롭다운을 열어야만 확인 가능 ### 현재 코드 (V2Select.tsx - DropdownSelect, 174~178행) ```tsx {selectedLabels.length > 0 ? multiple ? `${selectedLabels.length}개 선택됨` : selectedLabels[0] : placeholder} ``` --- ## 변경 후 동작 ### 1. 선택된 항목 라벨을 쉼표로 연결하여 한 줄로 표시 - 예: `"구매품, 판매품, 재고품"` - `truncate` (text-overflow: ellipsis)로 필드 너비를 넘으면 말줄임(`...`) 처리 - 무조건 한 줄 표시, 넘치면 `...`으로 숨김 ### 2. 텍스트가 말줄임(`...`) 처리될 때만 호버 툴팁 표시 - 필드 너비를 넘어서 `...`으로 잘릴 때만 툴팁 활성화 - 필드 내에 전부 보이면 툴팁 불필요 - 툴팁 내용은 세로 나열로 각 항목을 한눈에 확인 가능 - 툴팁은 딜레이 없이 즉시 표시 --- ## 시각적 동작 예시 | 상태 | 필드 내 표시 | 호버 시 툴팁 | |------|-------------|-------------| | 미선택 | `선택` (placeholder) | 없음 | | 1개 선택 | `구매품` | 없음 | | 3개 선택 (필드 내 수용) | `구매품, 판매품, 재고품` | 없음 (잘리지 않으므로) | | 5개 선택 (필드 넘침) | `구매품, 판매품, 재고품, 외...` | 구매품 / 판매품 / 재고품 / 외주품 / 반제품 (세로 나열) | --- ## 변경 대상 - **파일**: `frontend/components/v2/V2Select.tsx` - **컴포넌트**: `DropdownSelect` 내부 표시 텍스트 부분 (170~178행) - **적용 범위**: `DropdownSelect`를 사용하는 모든 화면 (품목정보, 기타 모든 모달 포함) - **변경 규모**: 약 30줄 내외 소규모 변경 --- ## 코드 설계 ### 추가 import ```tsx import { useRef, useEffect, useState } from "react"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; ``` ### 말줄임 감지 로직 ```tsx // 텍스트가 잘리는지(truncated) 감지 const textRef = useRef(null); const [isTruncated, setIsTruncated] = useState(false); useEffect(() => { const el = textRef.current; if (el) { setIsTruncated(el.scrollWidth > el.clientWidth); } }, [selectedLabels]); ``` ### 수정 코드 (DropdownSelect 내부, 170~178행 대체) ```tsx const displayText = selectedLabels.length > 0 ? (multiple ? selectedLabels.join(", ") : selectedLabels[0]) : placeholder; const isPlaceholder = selectedLabels.length === 0; // 렌더링 부분 {isTruncated && multiple ? ( {displayText}
{selectedLabels.map((label, i) => (
{label}
))}
) : ( {displayText} )} ``` --- ## 설계 원칙 - 기존 단일 선택 동작은 변경하지 않음 - `DropdownSelect` 공통 컴포넌트 수정이므로 모든 화면에 자동 적용 - 무조건 한 줄 표시, 넘치면 `...`으로 말줄임 - 툴팁은 텍스트가 실제로 잘릴 때(`scrollWidth > clientWidth`)만 표시 - 툴팁 내용은 세로 나열로 각 항목 확인 용이 - 툴팁 딜레이 없음 (`delayDuration={0}`) - shadcn 표준 Tooltip 컴포넌트 사용으로 프로젝트 일관성 유지