import React, { useState } from 'react'; import { ProjectState, UserRole, Priority } from '../types'; import { PlusCircle, Building2, Calendar, ArrowRight, Activity, DollarSign, UserCircle, Lock, Flag } from 'lucide-react'; interface ProjectListProps { projects: ProjectState[]; onSelectProject: (projectId: string) => void; onCreateProject: (project: Partial) => void; userRole: UserRole; onSwitchRole: (role: UserRole) => void; } const ProjectList: React.FC = ({ projects, onSelectProject, onCreateProject, userRole, onSwitchRole }) => { const [isModalOpen, setIsModalOpen] = useState(false); const [newProjectName, setNewProjectName] = useState(''); const [contractValue, setContractValue] = useState(''); const [priority, setPriority] = useState('MEDIUM'); const canCreateProject = userRole === 'DIRECTOR'; console.log('Current projects IDs:', projects.map(p => p.id)); const handleCreate = (e: React.FormEvent) => { e.preventDefault(); onCreateProject({ name: newProjectName, contractValue: Number(contractValue), priority, startDate: new Date().toISOString().split('T')[0], endDate: new Date().toISOString().split('T')[0], status: 'ACTIVE', boq: [], dprs: [], bills: [], liabilities: [], documents: [] }); setIsModalOpen(false); setNewProjectName(''); setContractValue(''); setPriority('MEDIUM'); }; const getRoleLabel = (role: UserRole) => { switch(role) { case 'DIRECTOR': return 'Project Director'; case 'MANAGER': return 'Project Manager'; case 'ENGINEER': return 'Site Engineer'; case 'ACCOUNTANT': return 'Accountant'; default: return role; } }; const getPriorityColor = (p: Priority) => { switch(p) { case 'HIGH': return 'bg-red-50 text-red-700 border-red-200'; case 'MEDIUM': return 'bg-amber-50 text-amber-700 border-amber-200'; case 'LOW': return 'bg-blue-50 text-blue-700 border-blue-200'; default: return 'bg-slate-50 text-slate-700 border-slate-200'; } }; return (

My Projects

Manage your construction portfolio across different sites.

{getRoleLabel(userRole)}
{canCreateProject ? ( ) : (
Create Disabled
)}
{(() => { const seen = new Set(); const duplicates = projects.filter(p => { if (seen.has(p.id)) return true; seen.add(p.id); return false; }); if (duplicates.length > 0) { console.warn('Duplicate project IDs found:', duplicates.map(d => d.id)); } return null; })()} {projects.map((project, index) => (
onSelectProject(project.id)} className="group bg-white rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-all cursor-pointer overflow-hidden relative" >
{project.status}
{project.priority}

{project.name}

৳{(project.contractValue / 1000000).toFixed(2)} Million
{project.startDate} to {project.endDate}
{project.boq.length} BOQ Items
Open Dashboard
))} {projects.length === 0 && (

No projects yet

Create your first construction project to get started.

{canCreateProject && ( )}
)}
{isModalOpen && (

New Project

setNewProjectName(e.target.value)} placeholder="e.g., Bridge Construction at..." className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none" />
setContractValue(e.target.value)} placeholder="0" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none text-sm" />
)}
); }; export default ProjectList;