'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 { Card } from 'primereact/card'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Dialog } from 'primereact/dialog'; import { Dropdown } from 'primereact/dropdown'; import { MultiSelect } from 'primereact/multiselect'; import { Tag } from 'primereact/tag'; import { Divider } from 'primereact/divider'; import clientService from '../../../../services/clientService'; import userService from '../../../../services/userService'; import type { Client } from '../../../../types/btp'; import type { User } from '../../../../types/auth'; interface ClientGestionnaire { client: Client; gestionnairePrincipal?: User; gestionnairesSecondaires: User[]; } const AttributionsPage = () => { const [clients, setClients] = useState([]); const [gestionnaires, setGestionnaires] = useState([]); const [attributions, setAttributions] = useState([]); const [loading, setLoading] = useState(true); const [attributionDialog, setAttributionDialog] = useState(false); const [selectedClient, setSelectedClient] = useState(null); const [selectedGestionnairePrincipal, setSelectedGestionnairePrincipal] = useState(null); const [selectedGestionnairesSecondaires, setSelectedGestionnairesSecondaires] = useState([]); const toast = useRef(null); useEffect(() => { loadData(); }, []); const loadData = async () => { try { setLoading(true); // Charger les clients const clientsData = await clientService.getAll(); setClients(clientsData); // Charger les gestionnaires depuis le service const gestionnairesData = await userService.getGestionnaires(); setGestionnaires(gestionnairesData); // Construire les attributions const attributionsData = clientsData.map(client => ({ client, gestionnairePrincipal: gestionnairesData.find(g => g.id === client.gestionnairePrincipalId), gestionnairesSecondaires: gestionnairesData.filter(g => client.gestionnairesSecondaires?.includes(g.id) ) })); setAttributions(attributionsData); } catch (error) { console.error('Erreur lors du chargement des données:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les données', life: 3000 }); } finally { setLoading(false); } }; const openAttributionDialog = (client: Client) => { setSelectedClient(client); // Pré-remplir les sélections actuelles const gestionnairePrincipal = gestionnaires.find(g => g.id === client.gestionnairePrincipalId); setSelectedGestionnairePrincipal(gestionnairePrincipal || null); const gestionnairesSecondaires = gestionnaires.filter(g => client.gestionnairesSecondaires?.includes(g.id) ); setSelectedGestionnairesSecondaires(gestionnairesSecondaires); setAttributionDialog(true); }; const saveAttribution = async () => { if (!selectedClient) return; try { const updatedClient = { ...selectedClient, gestionnairePrincipalId: selectedGestionnairePrincipal?.id, gestionnairesSecondaires: selectedGestionnairesSecondaires.map(g => g.id) }; // Mise à jour côté serveur await clientService.update(selectedClient.id, updatedClient); // Mettre à jour localement const updatedClients = clients.map(c => c.id === selectedClient.id ? updatedClient : c ); setClients(updatedClients); // Mettre à jour les attributions const updatedAttributions = attributions.map(a => a.client.id === selectedClient.id ? { ...a, client: updatedClient, gestionnairePrincipal: selectedGestionnairePrincipal || undefined, gestionnairesSecondaires: selectedGestionnairesSecondaires } : a ); setAttributions(updatedAttributions); setAttributionDialog(false); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Attribution mise à jour', life: 3000 }); } catch (error) { console.error('Erreur lors de la sauvegarde:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de sauvegarder l\'attribution', life: 3000 }); } }; const hideDialog = () => { setAttributionDialog(false); setSelectedClient(null); setSelectedGestionnairePrincipal(null); setSelectedGestionnairesSecondaires([]); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
{attributions.filter(a => a.gestionnairePrincipal).length} / {attributions.length} clients attribués
); }; const actionBodyTemplate = (rowData: ClientGestionnaire) => { return (