feat: Ajout d'un composant permettant de visualiser les fichiers signés

par les parents
This commit is contained in:
N3WT DE COMPET
2025-04-27 14:56:57 +02:00
parent 545349c7db
commit 7f442b9cae
2 changed files with 192 additions and 54 deletions

View File

@ -58,7 +58,6 @@ import {
import { fetchProfiles } from '@/app/actions/authAction'; import { fetchProfiles } from '@/app/actions/authAction';
import { import {
BASE_URL,
FE_ADMIN_SUBSCRIPTIONS_EDIT_URL, FE_ADMIN_SUBSCRIPTIONS_EDIT_URL,
FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL, FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL,
} from '@/utils/Url'; } from '@/utils/Url';
@ -68,6 +67,7 @@ import { useCsrfToken } from '@/context/CsrfContext';
import logger from '@/utils/logger'; import logger from '@/utils/logger';
import { PhoneLabel } from '@/components/PhoneLabel'; import { PhoneLabel } from '@/components/PhoneLabel';
import FileUpload from '@/components/FileUpload'; import FileUpload from '@/components/FileUpload';
import FilesModal from '@/components/Inscription/FilesModal';
export default function Page({ params: { locale } }) { export default function Page({ params: { locale } }) {
const t = useTranslations('subscriptions'); const t = useTranslations('subscriptions');
@ -108,7 +108,7 @@ export default function Page({ params: { locale } }) {
const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false); const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false);
const [isFilesModalOpen, setIsFilesModalOpen] = useState(false); const [isFilesModalOpen, setIsFilesModalOpen] = useState(false);
const [selectedRowFiles, setSelectedRowFiles] = useState([]); const [selectedRegisterForm, setSelectedRegisterForm] = useState([]);
const [popupVisible, setPopupVisible] = useState(false); const [popupVisible, setPopupVisible] = useState(false);
const [popupMessage, setPopupMessage] = useState(''); const [popupMessage, setPopupMessage] = useState('');
@ -156,28 +156,10 @@ export default function Page({ params: { locale } }) {
}; };
const openFilesModal = (row) => { const openFilesModal = (row) => {
const files = []; setSelectedRegisterForm(row || []);
if (row.registration_file) {
files.push({
name: "Fichier d'inscription",
url: `${BASE_URL}${row.registration_file}`,
});
}
if (row.sepa_file) {
files.push({
name: 'Mandat SEPA',
url: `${BASE_URL}${row.sepa_file}`,
});
}
setSelectedRowFiles(files);
setIsFilesModalOpen(true); setIsFilesModalOpen(true);
}; };
const closeFilesModal = () => {
setIsFilesModalOpen(false);
setSelectedRowFiles([]);
};
const requestErrorHandler = (err) => { const requestErrorHandler = (err) => {
logger.error('Error fetching data:', err); logger.error('Error fetching data:', err);
}; };
@ -971,20 +953,6 @@ export default function Page({ params: { locale } }) {
</div> </div>
), ),
}, },
{
name: t('files'),
transform: (row) =>
row.registration_file != null && (
<ul>
<li className="flex items-center gap-2">
<FileText size={16} />
<a href={`${BASE_URL}${row.registration_file}`} target="_blank">
{row.registration_file?.split('/').pop()}
</a>
</li>
</ul>
),
},
{ {
name: 'Actions', name: 'Actions',
transform: (row) => ( transform: (row) => (
@ -1216,27 +1184,10 @@ export default function Page({ params: { locale } }) {
/> />
)} )}
{isFilesModalOpen && ( {isFilesModalOpen && (
<Modal <FilesModal
isOpen={isFilesModalOpen} isOpen={isFilesModalOpen}
setIsOpen={setIsFilesModalOpen} setIsOpen={setIsFilesModalOpen}
title="Fichiers disponibles" selectedRegisterForm={selectedRegisterForm}
ContentComponent={() => (
<ul className="space-y-4">
{selectedRowFiles.map((file, index) => (
<li key={index} className="flex items-center gap-2">
<FileText className="w-5 h-5 text-gray-500" />
<a
href={file.url}
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
{file.name}
</a>
</li>
))}
</ul>
)}
/> />
)} )}
</div> </div>

View File

@ -0,0 +1,187 @@
import React, { useState, useEffect } from 'react';
import Modal from '@/components/Modal';
import { FileText } from 'lucide-react';
import {
fetchSchoolFileTemplatesFromRegistrationFiles,
fetchParentFileTemplatesFromRegistrationFiles,
} from '@/app/actions/subscriptionAction';
import { BASE_URL } from '@/utils/Url';
const FilesModal = ({
isOpen,
setIsOpen,
title = 'Fichiers disponibles',
selectedRegisterForm,
}) => {
const [files, setFiles] = useState({
schoolFiles: [],
parentFiles: [],
sepaFile: null,
});
useEffect(() => {
if (!selectedRegisterForm?.student?.id) {
console.error(
'selectedRegisterForm.student.id est invalide ou manquant.'
);
return;
}
let fetchedSchoolFiles = []; // Déclaré dans un scope plus large
// Fetch school and parent files sequentially
fetchSchoolFileTemplatesFromRegistrationFiles(
selectedRegisterForm.student.id
)
.then((schoolFiles) => {
if (!Array.isArray(schoolFiles)) {
console.error(
'Les fichiers scolaires ne sont pas un tableau :',
schoolFiles
);
return;
}
fetchedSchoolFiles = schoolFiles; // Assigner les fichiers scolaires
// Fetch parent files after school files
return fetchParentFileTemplatesFromRegistrationFiles(
selectedRegisterForm.student.id
);
})
.then((parentFiles) => {
// Construct the categorized files list
const categorizedFiles = {
schoolFiles: fetchedSchoolFiles.map((file) => ({
name: file.name || 'Document scolaire',
url: file.file ? `${BASE_URL}${file.file}` : null,
})),
parentFiles: parentFiles.map((file) => ({
name: file.master_name || 'Document parent',
url: file.file ? `${BASE_URL}${file.file}` : null,
})),
sepaFile: selectedRegisterForm.sepa_file
? {
name: 'Mandat SEPA',
url: `${BASE_URL}${selectedRegisterForm.sepa_file}`,
}
: null,
};
setFiles(categorizedFiles);
})
.catch((error) => {
console.error('Erreur lors de la récupération des fichiers :', error);
});
}, [selectedRegisterForm]);
return (
<Modal
isOpen={isOpen}
setIsOpen={setIsOpen}
title={
<h2 className="text-2xl font-bold text-gray-800 border-b pb-2 mb-4">
{title}
</h2>
}
ContentComponent={() => (
<div className="space-y-6">
{/* Section Fichiers École */}
<div>
<h3 className="text-lg font-semibold text-gray-800 mb-4">
Formulaires de l'établissement
</h3>
<ul className="space-y-2">
{files.schoolFiles.length > 0 ? (
files.schoolFiles.map((file, index) => (
<li key={index} className="flex items-center gap-2">
<FileText className="w-5 h-5 text-gray-500" />
{file.url ? (
<a
href={file.url}
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
{file.name}
</a>
) : (
<span className="text-gray-400">
{file.name} (Non disponible)
</span>
)}
</li>
))
) : (
<p className="text-gray-500">
Aucun fichier scolaire disponible.
</p>
)}
</ul>
</div>
<hr className="border-t border-gray-300" />
{/* Section Fichiers Parent */}
<div>
<h3 className="text-lg font-semibold text-gray-800 mb-4">
Pièces fournies
</h3>
<ul className="space-y-2">
{files.parentFiles.length > 0 ? (
files.parentFiles.map((file, index) => (
<li key={index} className="flex items-center gap-2">
<FileText className="w-5 h-5 text-gray-500" />
{file.url ? (
<a
href={file.url}
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
{file.name}
</a>
) : (
<span className="text-gray-400">
{file.name} (Non disponible)
</span>
)}
</li>
))
) : (
<p className="text-gray-500">
Aucun fichier parent disponible.
</p>
)}
</ul>
</div>
<hr className="border-t border-gray-300" />
{/* Section Mandat SEPA */}
<div>
<h3 className="text-lg font-semibold text-gray-800 mb-4">
Mandat SEPA
</h3>
{files.sepaFile ? (
<div className="flex items-center gap-2">
<FileText className="w-5 h-5 text-gray-500" />
<a
href={files.sepaFile.url}
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
{files.sepaFile.name}
</a>
</div>
) : (
<p className="text-gray-500">Aucun mandat SEPA disponible.</p>
)}
</div>
</div>
)}
/>
);
};
export default FilesModal;