'use client'; import React, { useState, useContext } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Button } from 'primereact/button'; import { Toolbar } from 'primereact/toolbar'; import { Dropdown } from 'primereact/dropdown'; import { InputSwitch } from 'primereact/inputswitch'; import { LayoutContext } from '../../layout/context/layoutcontext'; import type { PhaseChantier } from '../../types/btp-extended'; import phaseValidationService from '../../services/phaseValidationService'; interface AtlantisResponsivePhasesTableProps { phases: PhaseChantier[]; onPhaseSelect?: (phase: PhaseChantier) => void; onPhaseStart?: (phaseId: string) => void; onPhaseValidate?: (phase: PhaseChantier) => void; className?: string; } const AtlantisResponsivePhasesTable: React.FC = ({ phases, onPhaseSelect, onPhaseStart, onPhaseValidate, className = '' }) => { const [selectedPhase, setSelectedPhase] = useState(null); const [globalFilter, setGlobalFilter] = useState(''); const [filters, setFilters] = useState({}); const { layoutConfig, isDesktop } = useContext(LayoutContext); // Options de filtrage responsive const [compactView, setCompactView] = useState(!isDesktop()); const [showSubPhases, setShowSubPhases] = useState(true); const handlePhaseSelect = (phase: PhaseChantier) => { setSelectedPhase(phase); onPhaseSelect?.(phase); }; // Template pour le nom des phases avec hiérarchie Atlantis const nameBodyTemplate = (rowData: PhaseChantier) => { const isSubPhase = !!rowData.phaseParent; return (
{isSubPhase && ( )} {rowData.nom} {rowData.critique && ( )}
); }; // Template pour le statut avec Tag PrimeReact const statusBodyTemplate = (rowData: PhaseChantier) => { const getSeverity = () => { switch (rowData.statut) { case 'TERMINEE': return 'success'; case 'EN_COURS': return 'info'; default: return 'secondary'; } }; return ( ); }; // Template pour l'avancement avec style Atlantis const progressBodyTemplate = (rowData: PhaseChantier) => { const progress = rowData.pourcentageAvancement || 0; return (
{progress}%
); }; // Template pour la validation avec couleurs Atlantis const validationBodyTemplate = (rowData: PhaseChantier) => { const validation = phaseValidationService.validatePhaseStart(rowData, phases); const getValidationButton = () => { if (validation.readyToStart) { return (
); }; // Template pour les dates avec style Atlantis const dateBodyTemplate = (field: string) => (rowData: PhaseChantier) => { const date = rowData[field as keyof PhaseChantier] as string; if (!date) return -; const formattedDate = new Date(date).toLocaleDateString('fr-FR'); const isOverdue = field.includes('Fin') && rowData.statut !== 'TERMINEE' && new Date(date) < new Date(); return ( {formattedDate} {isOverdue && } ); }; // Barre d'outils responsive Atlantis const toolbarStart = (
Phases du chantier
{!isDesktop() && ( )}
); const toolbarEnd = (
setCompactView(e.value)} />
setShowSubPhases(e.value)} />
); // Filtrer les phases selon les options const filteredPhases = phases.filter(phase => { if (!showSubPhases && phase.phaseParent) return false; return true; }); // Déterminer les colonnes à afficher selon la taille d'écran const getVisibleColumns = () => { if (compactView) { return ['nom', 'statut', 'pourcentageAvancement', 'actions']; } else if (!isDesktop()) { return ['nom', 'statut', 'pourcentageAvancement', 'validation', 'actions']; } else { return ['nom', 'statut', 'pourcentageAvancement', 'dateDebutPrevue', 'dateFinPrevue', 'validation', 'actions']; } }; const visibleColumns = getVisibleColumns(); return (
setSelectedPhase(e.value)} selectionMode="single" dataKey="id" size={compactView ? 'small' : 'normal'} stripedRows responsiveLayout="scroll" className="datatable-responsive" emptyMessage="Aucune phase trouvée" globalFilter={globalFilter} header={ isDesktop() ? (
Gestion des phases ({filteredPhases.length}) setGlobalFilter(e.target.value)} />
) : undefined } > {visibleColumns.includes('nom') && ( )} {visibleColumns.includes('statut') && ( )} {visibleColumns.includes('pourcentageAvancement') && ( )} {visibleColumns.includes('dateDebutPrevue') && ( )} {visibleColumns.includes('dateFinPrevue') && ( )} {visibleColumns.includes('validation') && ( )} {visibleColumns.includes('actions') && ( )}
{/* Informations sur la phase sélectionnée - Style Atlantis */} {selectedPhase && (
Phase sélectionnée

{selectedPhase.nom} - {selectedPhase.statut} - {selectedPhase.pourcentageAvancement || 0}% d'avancement

{selectedPhase.description && (

{selectedPhase.description}

)}
)}
); }; export default AtlantisResponsivePhasesTable;