diff --git a/app/(main)/admin/attributions/page.tsx b/app/(main)/admin/attributions/page.tsx index 61a51f0..dd7bbe2 100644 --- a/app/(main)/admin/attributions/page.tsx +++ b/app/(main)/admin/attributions/page.tsx @@ -1,381 +1,381 @@ -'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 ( -