'use client'; import React, { useState, useEffect } from 'react'; import { Panel } from 'primereact/panel'; import { Message } from 'primereact/message'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Timeline } from 'primereact/timeline'; import { Accordion, AccordionTab } from 'primereact/accordion'; import { Tooltip } from 'primereact/tooltip'; import phaseValidationService, { type PhaseValidationResult, type ValidationError, type ValidationWarning } from '../../services/phaseValidationService'; import type { PhaseChantier } from '../../types/btp'; interface PhaseValidationPanelProps { phase: PhaseChantier; allPhases: PhaseChantier[]; onStartPhase?: (phaseId: string) => void; onViewPrerequisite?: (prerequisiteId: string) => void; className?: string; compact?: boolean; } const PhaseValidationPanel: React.FC = ({ phase, allPhases, onStartPhase, onViewPrerequisite, className = '', compact = false }) => { const [validation, setValidation] = useState(null); const [loading, setLoading] = useState(true); const [expandedSections, setExpandedSections] = useState(['errors']); useEffect(() => { validatePhase(); }, [phase, allPhases]); const validatePhase = async () => { setLoading(true); try { const result = phaseValidationService.validatePhaseStart(phase, allPhases, { strictMode: false }); setValidation(result); } catch (error) { console.error('Erreur lors de la validation de la phase:', error); } finally { setLoading(false); } }; const getSeverityIcon = (severity: string) => { switch (severity) { case 'error': return 'pi pi-times-circle'; case 'warning': return 'pi pi-exclamation-triangle'; case 'info': return 'pi pi-info-circle'; default: return 'pi pi-circle'; } }; const getSeverityColor = (severity: string) => { switch (severity) { case 'error': return 'danger'; case 'warning': return 'warning'; case 'info': return 'info'; default: return 'secondary'; } }; const renderValidationStatus = () => { if (!validation) return null; const statusColor = validation.readyToStart ? 'success' : validation.canStart ? 'warning' : 'danger'; const statusIcon = validation.readyToStart ? 'pi pi-check-circle' : validation.canStart ? 'pi pi-exclamation-triangle' : 'pi pi-times-circle'; const statusText = validation.readyToStart ? 'Prête à démarrer' : validation.canStart ? 'Peut démarrer avec précautions' : 'Ne peut pas démarrer'; return (
{statusText} {validation.errors.length > 0 && ( )} {validation.warnings.length > 0 && ( )}
); }; const renderErrorsAndWarnings = () => { if (!validation || (validation.errors.length === 0 && validation.warnings.length === 0)) { return ( ); } return (
{validation.errors.map((error, index) => (
{error.message} {error.phaseId && onViewPrerequisite && (
))} {validation.warnings.map((warning, index) => (
{warning.message}
{warning.recommendation && ( 💡 {warning.recommendation} )}
))}
); }; const renderPrerequisites = () => { if (!phase.prerequis || phase.prerequis.length === 0) { return ( ); } const prerequisitePhases = phase.prerequis .map(prereqId => allPhases.find(p => p.id === prereqId)) .filter(Boolean) as PhaseChantier[]; if (prerequisitePhases.length === 0) { return ( ); } return (
{prerequisitePhases.map(prereq => { const isCompleted = prereq.statut === 'TERMINEE'; const isInProgress = prereq.statut === 'EN_COURS'; return (
{prereq.nom} {prereq.critique && ( )}
{prereq.dateFinReelle && ( Terminé le {new Date(prereq.dateFinReelle).toLocaleDateString('fr-FR')} )} {prereq.dateFinPrevue && !prereq.dateFinReelle && ( Prévu le {new Date(prereq.dateFinPrevue).toLocaleDateString('fr-FR')} )} {onViewPrerequisite && (
); })}
); }; const renderBlockingPhases = () => { if (!validation || validation.blockedBy.length === 0) { return null; } return (
Phase bloquée par :
{validation.blockedBy.map((blocker, index) => ( ))}
); }; const renderActionButtons = () => { if (!validation || !onStartPhase) return null; return (
); }; if (loading) { return (
Validation en cours...
); } if (compact) { return (
{renderValidationStatus()} {validation && validation.blockedBy.length > 0 && (
Bloquée par : {validation.blockedBy.join(', ')}
)}
); } return ( Validation des prérequis {validation && !validation.readyToStart && ( )} } className={className} toggleable > {renderValidationStatus()} {renderBlockingPhases()} setExpandedSections(e.index as string[])} > Erreurs et avertissements {validation && (validation.errors.length > 0 || validation.warnings.length > 0) && (
{validation.errors.length > 0 && ( )} {validation.warnings.length > 0 && ( )}
)} } > {renderErrorsAndWarnings()}
{renderPrerequisites()}
{renderActionButtons()}
); }; export default PhaseValidationPanel;