/** * 검증게시판 — 좌측 이슈 목록 (단계 필터 + 검색) */ import React, { useMemo } from 'react'; import type { VerificationIssueDto } from '../../utils/verificationBoardApi'; import { VERIFICATION_ISSUE_STAGES, stageColor, stageLabel, type VerificationIssueStage, } from '../../utils/verificationBoardStages'; import VerificationStageIcon from './VerificationStageIcon'; import { formatIsoDateTime } from '../../utils/timezone'; interface Props { issues: VerificationIssueDto[]; selectedId: number | null; stageFilter: VerificationIssueStage | ''; searchQuery: string; onStageFilterChange: (stage: VerificationIssueStage | '') => void; onSearchChange: (q: string) => void; onSelect: (issue: VerificationIssueDto) => void; } const VerificationIssueListPanel: React.FC = ({ issues, selectedId, stageFilter, searchQuery, onStageFilterChange, onSearchChange, onSelect, }) => { const filtered = useMemo(() => { const q = searchQuery.trim().toLowerCase(); if (!q) return issues; return issues.filter(i => i.title.toLowerCase().includes(q) || i.content.toLowerCase().includes(q) || (i.reproductionPath?.toLowerCase().includes(q) ?? false), ); }, [issues, searchQuery]); return (
onSearchChange(e.target.value)} aria-label="검색" />
{filtered.length}건 {searchQuery.trim() && issues.length !== filtered.length && ( / {issues.length}건 중 )}
); }; export default VerificationIssueListPanel;