import React, { useState, useEffect } from 'react'; import { Plus, Download, Edit, Trash2, FolderPlus, Signature } from 'lucide-react'; import Modal from '@/components/Modal'; import Table from '@/components/Table'; import FileUpload from '@/components/FileUpload'; import { formatDate } from '@/utils/Date'; import { BASE_URL } from '@/utils/Url'; import { fetchRegisterFormFileTemplate, createRegistrationFormFileTemplate, editRegistrationFormFileTemplate, deleteRegisterFormFileTemplate, getRegisterFormFileTemplate } from '@/app/actions/subscriptionAction'; import { fetchRegistrationFileGroups, createRegistrationFileGroup, deleteRegistrationFileGroup, editRegistrationFileGroup } from '@/app/actions/registerFileGroupAction'; import RegistrationFileGroupForm from '@/components/RegistrationFileGroupForm'; import { useEstablishment } from '@/context/EstablishmentContext'; export default function FilesManagement({ csrfToken }) { const [fichiers, setFichiers] = useState([]); const [groups, setGroups] = useState([]); const [selectedGroup, setSelectedGroup] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [isEditing, setIsEditing] = useState(false); const [fileToEdit, setFileToEdit] = useState(null); const [isGroupModalOpen, setIsGroupModalOpen] = useState(false); const [groupToEdit, setGroupToEdit] = useState(null); const { selectedEstablishmentId } = useEstablishment(); // Fonction pour transformer les données des fichiers avec les informations complètes du groupe const transformFileData = (file, groups) => { if (!file.group) return file; const groupInfo = groups.find(g => g.id === file.group); return { ...file, group: groupInfo || { id: file.group, name: 'Groupe inconnu' } }; }; useEffect(() => { Promise.all([ fetchRegisterFormFileTemplate(), fetchRegistrationFileGroups(selectedEstablishmentId) ]).then(([filesData, groupsData]) => { setGroups(groupsData); // Sélectionner automatiquement le premier groupe s'il existe if (groupsData.length > 0) { setSelectedGroup(groupsData[0].id.toString()); } // Transformer chaque fichier pour inclure les informations complètes du groupe const transformedFiles = filesData.map(file => transformFileData(file, groupsData)); setFichiers(transformedFiles); }).catch(err => { console.log(err.message); }); }, []); const handleFileDelete = (fileId) => { deleteRegisterFormFileTemplate(fileId, csrfToken) .then(response => { if (response.ok) { setFichiers(fichiers.filter(fichier => fichier.id !== fileId)); alert('Fichier supprimé avec succès.'); } else { alert('Erreur lors de la suppression du fichier.'); } }) .catch(error => { console.error('Error deleting file:', error); alert('Erreur lors de la suppression du fichier.'); }); }; const handleFileEdit = (file) => { setIsEditing(true); setFileToEdit(file); setIsModalOpen(true); }; const handleFileUpload = ({file, name, is_required, order, groupId}) => { if (!name) { alert('Veuillez entrer un nom de fichier.'); return; } const formData = new FormData(); if(file) { formData.append('file', file); } formData.append('name', name); formData.append('is_required', is_required); formData.append('order', order); // Modification ici : vérifier si groupId existe et n'est pas vide if (groupId && groupId !== '') { formData.append('group', groupId); // Notez que le nom du champ est 'group' et non 'group_id' } if (isEditing && fileToEdit) { editRegistrationFormFileTemplate(fileToEdit.id, formData, csrfToken) .then(data => { // Transformer le fichier mis à jour avec les informations du groupe const transformedFile = transformFileData(data, groups); setFichiers(prevFichiers => prevFichiers.map(f => f.id === fileToEdit.id ? transformedFile : f) ); setIsModalOpen(false); setFileToEdit(null); setIsEditing(false); }) .catch(error => { console.error('Error editing file:', error); alert('Erreur lors de la modification du fichier'); }); } else { createRegistrationFormFileTemplate(formData, csrfToken) .then(data => { // Transformer le nouveau fichier avec les informations du groupe const transformedFile = transformFileData(data, groups); setFichiers(prevFiles => [...prevFiles, transformedFile]); setIsModalOpen(false); }) .catch(error => { console.error('Error uploading file:', error); }); } }; const handleGroupSubmit = (groupData) => { if (groupToEdit) { editRegistrationFileGroup(groupToEdit.id, groupData, csrfToken) .then(updatedGroup => { setGroups(groups.map(group => group.id === groupToEdit.id ? updatedGroup : group)); setGroupToEdit(null); setIsGroupModalOpen(false); }) .catch(error => { console.error('Error handling group:', error); alert('Erreur lors de l\'opération sur le groupe'); }); } else { createRegistrationFileGroup(groupData, csrfToken) .then(newGroup => { setGroups([...groups, newGroup]); setIsGroupModalOpen(false); }) .catch(error => { console.error('Error handling group:', error); alert('Erreur lors de l\'opération sur le groupe'); }); } }; const handleGroupEdit = (group) => { setGroupToEdit(group); setIsGroupModalOpen(true); }; const handleGroupDelete = (groupId) => { // Vérifier si des fichiers utilisent ce groupe const filesInGroup = fichiers.filter(file => file.group && file.group.id === groupId); if (filesInGroup.length > 0) { alert('Impossible de supprimer ce groupe car il contient des fichiers. Veuillez d\'abord retirer tous les fichiers de ce groupe.'); return; } if (window.confirm('Êtes-vous sûr de vouloir supprimer ce groupe ?')) { deleteRegistrationFileGroup(groupId, csrfToken) .then((response) => { if (response.status === 409) { throw new Error('Ce groupe est lié à des inscriptions existantes.'); } if (!response.ok) { throw new Error('Erreur lors de la suppression du groupe.'); } setGroups(groups.filter(group => group.id !== groupId)); alert('Groupe supprimé avec succès.'); }) .catch(error => { console.error('Error deleting group:', error); alert(error.message || 'Erreur lors de la suppression du groupe. Vérifiez qu\'aucune inscription n\'utilise ce groupe.'); }); } }; // Ajouter cette fonction de filtrage const filteredFiles = fichiers.filter(file => { if (!selectedGroup) return true; return file.group && file.group.id === parseInt(selectedGroup); }); const columnsFiles = [ { name: 'Nom du fichier', transform: (row) => row.name }, { name: 'Groupe', transform: (row) => row.group ? row.group.name : 'Aucun' }, { name: 'Date de création', transform: (row) => formatDate(new Date (row.date_added),"DD/MM/YYYY hh:mm:ss") }, { name: 'Fichier Obligatoire', transform: (row) => row.is_required ? 'Oui' : 'Non' }, { name: 'Ordre de fusion', transform: (row) => row.order }, { name: 'Actions', transform: (row) => (
)} ]; const columnsGroups = [ { name: 'Nom du groupe', transform: (row) => row.name }, { name: 'Description', transform: (row) => row.description }, { name: 'Actions', transform: (row) => (