import ProjectLayout from '../../Layouts/ProjectLayout'; import { Card, CardContent } from '@/Components/ui/card'; import { MapPin, Users, TrendingUp, DollarSign, Calendar } from 'lucide-react'; import { PageProps } from '@/types'; interface ProjectData { id: number; ulid: string; name: string; code: string; description?: string; status: string; location?: string; client_name?: string; contract_value: string; total_capitalization: string; completion_percentage: string; capitalization_percentage: number; is_over_budget: boolean; contract_duration?: number; start_date?: string; target_end_date?: string; actual_end_date?: string; created_at: string; } interface StatusOption { value: string; label: string } interface Props extends PageProps { project: ProjectData; taskStats: { total: number; pending: number; in_progress: number; completed: number }; allowedTransitions: StatusOption[]; } const formatCurrency = (v: string) => new Intl.NumberFormat('en-PH', { style: 'currency', currency: 'PHP' }).format(Number(v)); function StatCard({ icon: Icon, label, value, sub }: { icon: React.ComponentType<{ className?: string }>; label: string; value: string; sub?: string }) { return (

{label}

{value}

{sub &&

{sub}

}
); } export default function Overview({ project, taskStats, allowedTransitions }: Props) { return ( {/* Stat Cards */}
= 80 ? 'bg-amber-100' : 'bg-gray-100' }`}> = 80 ? 'text-amber-600' : 'text-gray-600' }`} />

Capitalization

{project.capitalization_percentage.toFixed(1)}%

{formatCurrency(project.total_capitalization)}

= 80 ? 'bg-amber-500' : 'bg-emerald-500' }`} style={{ width: `${Math.min(project.capitalization_percentage, 100)}%` }} />
{project.description &&

Description

{project.description}

}
{project.location &&
{project.location}
} {project.client_name &&
Client: {project.client_name}
}
{/* Capitalization Section */}

Cost Capitalization

= 80 ? 'text-amber-600' : 'text-gray-800' }`}>{project.capitalization_percentage.toFixed(1)}% of contract value

= 80 ? 'bg-amber-500' : 'bg-emerald-500' }`} style={{ width: `${Math.min(project.capitalization_percentage, 100)}%` }} />

{formatCurrency(project.total_capitalization)} / {formatCurrency(project.contract_value)}

{project.is_over_budget && (

⚠ Over budget

)}
{/* Task Progress Section */}

Progress

{taskStats.completed} / {taskStats.total} tasks completed

0 ? `${(taskStats.completed / taskStats.total) * 100}%` : '0%' }} />

{taskStats.total > 0 ? `${((taskStats.completed / taskStats.total) * 100).toFixed(0)}%` : '0%'} complete

{taskStats.total > 0 && (

Task Distribution

{taskStats.completed > 0 && (
)} {taskStats.in_progress > 0 && (
)} {taskStats.pending > 0 && (
)}
)} {taskStats.total > 0 ? (
{[ { label: 'Completed', count: taskStats.completed, color: 'bg-emerald-500', textColor: 'text-emerald-600' }, { label: 'In Progress', count: taskStats.in_progress, color: 'bg-blue-500', textColor: 'text-blue-600' }, { label: 'Pending', count: taskStats.pending, color: 'bg-gray-300', textColor: 'text-gray-500' }, ].map((item) => { const pct = taskStats.total > 0 ? (item.count / taskStats.total) * 100 : 0; return (
{item.label}
{item.count} task{item.count !== 1 ? 's' : ''} ({pct.toFixed(0)}%)
); })}
) : (

No tasks yet. Add tasks to track progress.

)}
); }