'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect, useRef } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; import { InputNumber } from 'primereact/inputnumber'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { InputTextarea } from 'primereact/inputtextarea'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { ConfirmDialog } from 'primereact/confirmdialog'; import { Tag } from 'primereact/tag'; import { FilterMatchMode } from 'primereact/api'; import { maintenanceService, materielService } from '../../../services/api'; import { MaintenanceMateriel, Materiel, TypeMaintenance, StatutMaintenance } from '../../../types/btp'; import { formatDate, formatCurrency } from '../../../utils/formatters'; const MaintenancesPage = () => { const [maintenances, setMaintenances] = useState([]); const [maintenance, setMaintenance] = useState>({}); const [materiels, setMateriels] = useState([]); const [selectedMaintenances, setSelectedMaintenances] = useState([]); const [maintenanceDialog, setMaintenanceDialog] = useState(false); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [submitted, setSubmitted] = useState(false); const toast = useRef(null); const dt = useRef>(null); const typeOptions = Object.values(TypeMaintenance).map(type => ({ label: type.replace('_', ' '), value: type })); const statutOptions = Object.values(StatutMaintenance).map(statut => ({ label: statut.replace('_', ' '), value: statut })); useEffect(() => { loadData(); }, []); const loadData = async () => { try { setLoading(true); const [maintenancesData, materielsData] = await Promise.all([ maintenanceService.getAll(), materielService.getAll() ]); setMaintenances(maintenancesData); setMateriels(materielsData); } catch (error) { console.error('Erreur lors du chargement:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les données', life: 3000 }); } finally { setLoading(false); } }; const openNew = () => { setMaintenance({ type: TypeMaintenance.PREVENTIVE, statut: StatutMaintenance.PLANIFIEE, datePrevue: new Date().toISOString(), cout: 0 }); setSubmitted(false); setMaintenanceDialog(true); }; const hideDialog = () => { setSubmitted(false); setMaintenanceDialog(false); setMaintenance({}); }; const saveMaintenance = async () => { setSubmitted(true); if (maintenance.description?.trim() && maintenance.materiel) { try { let savedMaintenance: MaintenanceMateriel; if (maintenance.id) { savedMaintenance = await maintenanceService.update(maintenance.id, maintenance); const updatedMaintenances = maintenances.map(m => m.id === maintenance.id ? savedMaintenance : m ); setMaintenances(updatedMaintenances); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Maintenance mise à jour', life: 3000 }); } else { savedMaintenance = await maintenanceService.create(maintenance); setMaintenances([...maintenances, savedMaintenance]); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Maintenance créée', life: 3000 }); } hideDialog(); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors de la sauvegarde', life: 3000 }); } } }; const editMaintenance = (maintenance: MaintenanceMateriel) => { setMaintenance({ ...maintenance }); setMaintenanceDialog(true); }; const confirmDeleteSelected = () => { if (selectedMaintenances && selectedMaintenances.length > 0) { // Implémenter la suppression en lot si nécessaire } }; const deleteMaintenance = async (maintenance: MaintenanceMateriel) => { try { await maintenanceService.delete(maintenance.id); const updatedMaintenances = maintenances.filter(m => m.id !== maintenance.id); setMaintenances(updatedMaintenances); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Maintenance supprimée', life: 3000 }); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors de la suppression', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; const onInputChange = (e: React.ChangeEvent, name: string) => { const val = (e.target && e.target.value) || ''; const _maintenance = { ...maintenance }; (_maintenance as any)[name] = val; setMaintenance(_maintenance); }; const onInputNumberChange = (value: number | null, name: string) => { const _maintenance = { ...maintenance }; (_maintenance as any)[name] = value; setMaintenance(_maintenance); }; const onDropdownChange = (e: any, name: string) => { const _maintenance = { ...maintenance }; (_maintenance as any)[name] = e.value; setMaintenance(_maintenance); }; const onDateChange = (e: any, name: string) => { const _maintenance = { ...maintenance }; (_maintenance as any)[name] = e.value; setMaintenance(_maintenance); }; // Templates pour les colonnes const materielBodyTemplate = (rowData: MaintenanceMateriel) => { return rowData.materiel?.nom || 'N/A'; }; const typeBodyTemplate = (rowData: MaintenanceMateriel) => { return ( ); }; const statutBodyTemplate = (rowData: MaintenanceMateriel) => { return ( ); }; const coutBodyTemplate = (rowData: MaintenanceMateriel) => { return formatCurrency(rowData.cout); }; const dateBodyTemplate = (rowData: MaintenanceMateriel) => { return formatDate(rowData.datePrevue); }; const dateRealisationBodyTemplate = (rowData: MaintenanceMateriel) => { return formatDate(rowData.dateRealisee); }; const actionBodyTemplate = (rowData: MaintenanceMateriel) => { return (
); }; const getTypeSeverity = (type?: TypeMaintenance) => { switch (type) { case TypeMaintenance.PREVENTIVE: return 'success'; case TypeMaintenance.CORRECTIVE: return 'danger'; case TypeMaintenance.REVISION: return 'info'; case TypeMaintenance.CONTROLE_TECHNIQUE: return 'warning'; case TypeMaintenance.NETTOYAGE: return 'secondary'; default: return undefined; } }; const getStatutSeverity = (statut?: StatutMaintenance) => { switch (statut) { case StatutMaintenance.PLANIFIEE: return 'info'; case StatutMaintenance.EN_COURS: return 'warning'; case StatutMaintenance.TERMINEE: return 'success'; case StatutMaintenance.ANNULEE: return 'danger'; default: return undefined; } }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (