'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useRef, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Badge } from 'primereact/badge'; import { Dialog } from 'primereact/dialog'; import { InputNumber } from 'primereact/inputnumber'; import { InputTextarea } from 'primereact/inputtextarea'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import PhasesTable from '../../../../components/phases/PhasesTable'; import usePhasesManager from '../../../../hooks/usePhasesManager'; import { PhaseChantier } from '../../../../types/btp-extended'; const DashboardPhasesPage = () => { const toast = useRef(null); const { phases, loading, selectedPhase, setSelectedPhase, loadPhases, startPhase, deletePhase, suspendPhase, resumePhase, completePhase, updateProgress, getStatistics, setToastRef } = usePhasesManager(); const [showAvancementDialog, setShowAvancementDialog] = useState(false); const [showSuspendreDialog, setShowSuspendreDialog] = useState(false); const [avancement, setAvancement] = useState(0); const [motifSuspension, setMotifSuspension] = useState(''); const [globalFilter, setGlobalFilter] = useState(''); // Initialisation useEffect(() => { setToastRef(toast.current); loadPhases(); }, [setToastRef, loadPhases]); // Gestionnaires d'événements const handleUpdateAvancement = async () => { if (!selectedPhase) return; try { await updateProgress(selectedPhase.id!, avancement); setShowAvancementDialog(false); } catch (error) { // Erreur déjà gérée dans le hook } }; const handleSuspendre = async () => { if (!selectedPhase) return; try { await suspendPhase(selectedPhase.id!, motifSuspension); setShowSuspendreDialog(false); setMotifSuspension(''); } catch (error) { // Erreur déjà gérée dans le hook } }; const handlePhaseProgress = (phase: PhaseChantier) => { setSelectedPhase(phase); setAvancement(phase.pourcentageAvancement || 0); setShowAvancementDialog(true); }; const handlePhaseSuspend = (phase: PhaseChantier) => { setSelectedPhase(phase); setShowSuspendreDialog(true); }; // Récupération des statistiques const stats = getStatistics(); // Toolbar const toolbarStartTemplate = (
Tableau de bord des phases
); const toolbarEndTemplate = (
setGlobalFilter(e.target.value)} placeholder="Rechercher..." />
); return (

Tableau de bord des phases de chantier

{/* Statistiques */}
Phases en cours
{stats.enCours}
Phases en retard
{stats.enRetard}
Phases critiques
{stats.critiques}
Avancement moyen
{stats.avancementMoyen}%
{/* Table des phases avec le composant réutilisable */}
{/* Dialog avancement */} setShowAvancementDialog(false)} footer={
} >
setAvancement(e.value || 0)} suffix="%" min={0} max={100} />
{/* Dialog suspension */} setShowSuspendreDialog(false)} footer={
} >
setMotifSuspension(e.target.value)} rows={3} required />
); }; export default DashboardPhasesPage;