/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { Project } from '../../types'; import { projectService } from '../../services/projectService'; import { Search, Plus, Calendar, Users, Filter, BarChart2 } from 'lucide-react'; interface OpsProjectsListProps { onSelectProject: (projectId: string, tab: 'dashboard' | 'survey' | 'distribution') => void; onNavigateToCreateProject: () => void; } export const OpsProjectsList: React.FC = ({ onSelectProject, onNavigateToCreateProject, }) => { const [projects, setProjects] = React.useState([]); const [searchQuery, setSearchQuery] = React.useState(''); const [statusFilter, setStatusFilter] = React.useState('all'); React.useEffect(() => { const loadAndSync = async () => { setProjects(projectService.getProjects()); try { await projectService.syncFromBackend(); setProjects(projectService.getProjects()); } catch (err) { console.error('Failed to sync projects on list load', err); } }; loadAndSync(); }, []); const handleDeleteProject = async (id: string, e: React.MouseEvent) => { e.stopPropagation(); if (window.confirm('정말로 이 프로젝트를 삭제하시겠습니까? 관련 모든 조직도 및 응답 정보가 지워집니다.')) { try { await projectService.deleteProject(id); const remaining = projects.filter((p) => p.id !== id); setProjects(remaining); } catch (err) { alert('프로젝트 삭제에 실패했습니다.'); } } }; // Filter projects const filteredProjects = projects.filter((proj) => { const matchesSearch = proj.title.toLowerCase().includes(searchQuery.toLowerCase()) || proj.company_info.name.toLowerCase().includes(searchQuery.toLowerCase()); const matchesStatus = statusFilter === 'all' || proj.status === statusFilter; return matchesSearch && matchesStatus; }); return (
{/* Top Header Controls */}

전체 프로젝트 목록

등록된 모든 조직 네트워크 분석 진단 목록입니다. 검색 및 상태 필터를 지원합니다.

{/* Filter and Search Bar Row */}
{/* Search */}
setSearchQuery(e.target.value)} className="w-full pl-9 pr-4 py-2 text-sm border border-slate-200 focus:bg-white focus:ring-2 focus:ring-orange-500/10 focus:border-orange-500 rounded-lg transition-all outline-none" id="projects-search-input" />
{/* Filter */}
{/* Projects Grid List */} {filteredProjects.length === 0 ? (

검색 조건에 맞는 진단 프로젝트가 없습니다.

) : (
{filteredProjects.map((proj) => { const totalEmps = proj.employees.length; const submitted = proj.employees.filter((e) => e.response_status === 'submitted').length; const progressPct = totalEmps > 0 ? Math.round((submitted / totalEmps) * 100) : 0; return (
onSelectProject(proj.id, 'dashboard')} className="bg-white border border-slate-100 hover:border-orange-200 rounded-xl p-5 transition-all cursor-pointer flex flex-col justify-between gap-4 group" id={`project-item-${proj.id}`} >
{proj.company_info.name}

{proj.title}

{proj.status === 'collecting' ? '수집 중' : proj.status === 'draft' ? '초안' : '마감됨'}
{proj.start_date} ~ {proj.end_date} {totalEmps}명 대상
{/* Progress bar info */}
진행률 {submitted}/{totalEmps}명 ({progressPct}%)
{/* Foot card actions */}
ID: {proj.survey_login_id}
); })}
)}
); };