'use client'; import React, { useState, useRef, useEffect } from 'react'; import { useParams } from 'next/navigation'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { Calendar } from 'primereact/calendar'; import { InputNumber } from 'primereact/inputnumber'; import { Dropdown } from 'primereact/dropdown'; import { Checkbox } from 'primereact/checkbox'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Badge } from 'primereact/badge'; import PhasesTable from '../../../../../components/phases/PhasesTable'; import usePhasesManager from '../../../../../hooks/usePhasesManager'; import type { PhaseChantier, PhaseFormData } from '../../../../../types/btp-extended'; const PhasesCleanPage: React.FC = () => { const params = useParams(); const chantierId = params?.id as string; const toast = useRef(null); // Hook de gestion des phases const { phases, loading, selectedPhase, setSelectedPhase, loadPhases, createPhase, updatePhase, deletePhase, startPhase, setToastRef } = usePhasesManager({ chantierId }); const [globalFilter, setGlobalFilter] = useState(''); // États pour les dialogues const [showPhaseDialog, setShowPhaseDialog] = useState(false); const [editingPhase, setEditingPhase] = useState(false); // États pour les formulaires const [phaseForm, setPhaseForm] = useState({ nom: '', description: '', dateDebutPrevue: '', dateFinPrevue: '', dureeEstimeeHeures: 8, priorite: 'MOYENNE', critique: false, ordreExecution: 1, budgetPrevu: 0, coutReel: 0, prerequisPhases: [], competencesRequises: [], materielsNecessaires: [], fournisseursRecommandes: [] }); // Initialisation useEffect(() => { setToastRef(toast.current); if (chantierId) { loadPhases(); } }, [chantierId, setToastRef, loadPhases]); // Gestionnaires d'événements const handleEditPhase = (phase: PhaseChantier) => { setSelectedPhase(phase); setEditingPhase(true); setPhaseForm({ nom: phase.nom, description: phase.description || '', dateDebutPrevue: phase.dateDebutPrevue || '', dateFinPrevue: phase.dateFinPrevue || '', dureeEstimeeHeures: phase.dureeEstimeeHeures || 8, priorite: phase.priorite || 'MOYENNE', critique: phase.critique || false, ordreExecution: phase.ordreExecution || 1, budgetPrevu: phase.budgetPrevu || 0, coutReel: phase.coutReel || 0, prerequisPhases: phase.prerequisPhases || [], competencesRequises: phase.competencesRequises || [], materielsNecessaires: phase.materielsNecessaires || [], fournisseursRecommandes: phase.fournisseursRecommandes || [] }); setShowPhaseDialog(true); }; const handleSavePhase = async () => { if (!phaseForm.nom.trim()) { toast.current?.show({ severity: 'warn', summary: 'Données manquantes', detail: 'Veuillez remplir le nom de la phase', life: 3000 }); return; } try { const phaseData = { ...phaseForm, chantierId: chantierId }; if (editingPhase && selectedPhase) { await updatePhase(selectedPhase.id!, phaseData); } else { await createPhase(phaseData); } setShowPhaseDialog(false); setEditingPhase(false); setSelectedPhase(null); resetPhaseForm(); } catch (error) { console.error('Erreur lors de la sauvegarde de la phase:', error); } }; const resetPhaseForm = () => { setPhaseForm({ nom: '', description: '', dateDebutPrevue: '', dateFinPrevue: '', dureeEstimeeHeures: 8, priorite: 'MOYENNE', critique: false, ordreExecution: 1, budgetPrevu: 0, coutReel: 0, prerequisPhases: [], competencesRequises: [], materielsNecessaires: [], fournisseursRecommandes: [] }); }; // Templates de la toolbar const toolbarStartTemplate = (
Phases - Version Clean
); const toolbarEndTemplate = (
setGlobalFilter(e.target.value)} placeholder="Rechercher..." />
); return (
{/* Dialog pour créer/modifier une phase */} { setShowPhaseDialog(false); setEditingPhase(false); resetPhaseForm(); }} footer={
} style={{ width: '50vw', maxWidth: '600px' }} modal >
setPhaseForm(prev => ({ ...prev, nom: e.target.value }))} className="w-full" placeholder="Ex: Fondations, Gros œuvre..." />
setPhaseForm(prev => ({ ...prev, description: e.target.value }))} className="w-full" rows={3} placeholder="Description détaillée de la phase..." />
setPhaseForm(prev => ({ ...prev, dureeEstimeeHeures: e.value || 0 }))} className="w-full" min={1} suffix=" h" />
setPhaseForm(prev => ({ ...prev, priorite: e.value }))} className="w-full" />
setPhaseForm(prev => ({ ...prev, critique: e.checked }))} />
); }; export default PhasesCleanPage;