'use client'; import React, { useState, useEffect, useRef } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Tag } from 'primereact/tag'; import { Card } from 'primereact/card'; import { FilterMatchMode } from 'primereact/api'; import { materielService } from '../../../../services/api'; import { Materiel, TypeMateriel, StatutMateriel } from '../../../../types/btp'; import { formatDate, formatCurrency } from '../../../../utils/formatters'; const MaterielsDisponiblesPage = () => { const [materiels, setMateriels] = useState([]); const [selectedMateriels, setSelectedMateriels] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [dateDebut, setDateDebut] = useState(new Date()); const [dateFin, setDateFin] = useState(new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)); // +7 jours const [typeFilter, setTypeFilter] = useState(''); const toast = useRef(null); const dt = useRef>(null); const typeOptions = [ { label: 'Tous les types', value: '' }, ...Object.values(TypeMateriel).map(type => ({ label: type.replace('_', ' '), value: type })) ]; useEffect(() => { loadMaterielsDisponibles(); }, [dateDebut, dateFin, typeFilter]); const loadMaterielsDisponibles = async () => { try { setLoading(true); const dateDebutStr = dateDebut ? dateDebut.toISOString().split('T')[0] : undefined; const dateFinStr = dateFin ? dateFin.toISOString().split('T')[0] : undefined; const data = await materielService.getDisponibles(dateDebutStr, dateFinStr, typeFilter || undefined); setMateriels(data); } catch (error) { console.error('Erreur lors du chargement:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les matériels disponibles', life: 3000 }); } finally { setLoading(false); } }; const reserverMateriel = async (materiel: Materiel) => { if (!dateDebut || !dateFin) { toast.current?.show({ severity: 'warn', summary: 'Attention', detail: 'Veuillez sélectionner une période', life: 3000 }); return; } try { await materielService.reserver( materiel.id, dateDebut.toISOString().split('T')[0], dateFin.toISOString().split('T')[0] ); toast.current?.show({ severity: 'success', summary: 'Succès', detail: `Matériel ${materiel.nom} réservé`, life: 3000 }); // Recharger la liste loadMaterielsDisponibles(); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors de la réservation', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; // Templates pour les colonnes const typeBodyTemplate = (rowData: Materiel) => { return ( ); }; const statutBodyTemplate = (rowData: Materiel) => { return ( ); }; const valeurBodyTemplate = (rowData: Materiel) => { return formatCurrency(rowData.valeurActuelle || rowData.valeurAchat); }; const actionBodyTemplate = (rowData: Materiel) => { return (
); }; const getTypeSeverity = (type?: TypeMateriel) => { switch (type) { case TypeMateriel.ENGIN_CHANTIER: return 'danger'; case TypeMateriel.OUTILLAGE: return 'warning'; case TypeMateriel.EQUIPEMENT_SECURITE: return 'success'; case TypeMateriel.VEHICULE: return 'info'; default: return undefined; } }; const leftToolbarTemplate = () => { return (

Matériels Disponibles

({materiels.length} matériels)
); }; const rightToolbarTemplate = () => { return (