'use client'; import React from 'react'; import { Card } from 'primereact/card'; import { Badge } from 'primereact/badge'; import { Tag } from 'primereact/tag'; import { Button } from 'primereact/button'; import { ProgressBar } from 'primereact/progressbar'; import type { PhaseChantier } from '../../types/btp'; interface PhasesQuickPreviewProps { phases: PhaseChantier[]; className?: string; onViewDetails?: () => void; } const PhasesQuickPreview: React.FC = ({ phases, className = '', onViewDetails }) => { const getPhaseStats = () => { const total = phases.length; const principales = phases.filter(p => !p.phaseParent).length; const sousPhases = phases.filter(p => p.phaseParent).length; const enCours = phases.filter(p => p.statut === 'EN_COURS').length; const terminees = phases.filter(p => p.statut === 'TERMINEE').length; const critiques = phases.filter(p => p.critique).length; const enRetard = phases.filter(p => { if (p.statut === 'TERMINEE') return false; const maintenant = new Date(); const dateFinPrevue = p.dateFinPrevue ? new Date(p.dateFinPrevue) : null; return dateFinPrevue ? dateFinPrevue < maintenant : false; }).length; const avancementMoyen = total > 0 ? Math.round(phases.reduce((acc, p) => acc + (p.pourcentageAvancement || 0), 0) / total) : 0; return { total, principales, sousPhases, enCours, terminees, critiques, enRetard, avancementMoyen }; }; const stats = getPhaseStats(); const getProgressColor = (percentage: number) => { if (percentage >= 80) return 'success'; if (percentage >= 50) return 'info'; if (percentage >= 25) return 'warning'; return 'danger'; }; const getNextPhases = () => { return phases .filter(p => p.statut === 'PLANIFIEE' || p.statut === 'EN_COURS') .sort((a, b) => (a.ordreExecution || 0) - (b.ordreExecution || 0)) .slice(0, 3); }; const nextPhases = getNextPhases(); return ( {/* Statistiques rapides */}
{stats.total}
Total phases
{stats.terminees}
Terminées
{stats.enCours}
En cours
{stats.critiques}
Critiques
{/* Avancement global */}
Avancement global
= 80 ? '#10b981' : stats.avancementMoyen >= 50 ? '#3b82f6' : stats.avancementMoyen >= 25 ? '#f59e0b' : '#ef4444' } />
{/* Alertes */} {(stats.enRetard > 0 || stats.critiques > 0) && (
{stats.enRetard > 0 && ( 1 ? 's' : ''} en retard`} severity="danger" icon="pi pi-exclamation-triangle" /> )} {stats.critiques > 0 && ( 1 ? 's' : ''} critique${stats.critiques > 1 ? 's' : ''}`} severity="warning" icon="pi pi-flag" /> )}
)} {/* Prochaines phases */} {nextPhases.length > 0 && (

Prochaines phases

{nextPhases.map((phase, index) => (
{index + 1}
{phase.nom}
{phase.dateFinPrevue && `Prévue: ${new Date(phase.dateFinPrevue).toLocaleDateString('fr-FR')}`}
{phase.critique && ( )}
))}
)} {/* Structure hiérarchique */}
Structure du projet
{stats.principales} principales
{stats.sousPhases} sous-phases
{/* Actions */} {onViewDetails && (
)}
); }; export default PhasesQuickPreview;