From 5866427544e24c8e79cb773d38bda683f63f4531 Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Fri, 9 May 2025 09:38:47 +0200 Subject: [PATCH] fix: Ajout d'un champ is_required pour les documents parents facultatifs --- Back-End/Subscriptions/models.py | 1 + Back-End/Subscriptions/serializers.py | 2 + Front-End/messages/en/sidebar.json | 2 +- Front-End/messages/fr/sidebar.json | 2 +- .../src/app/[locale]/admin/messagerie/page.js | 2 +- Front-End/src/components/Admin/EmailSender.js | 7 ++-- Front-End/src/components/CheckBox.js | 1 + .../Inscription/InscriptionFormShared.js | 26 +++++++------ .../Structure/Files/ParentFilesSection.js | 39 +++++++++++++++++-- 9 files changed, 61 insertions(+), 21 deletions(-) diff --git a/Back-End/Subscriptions/models.py b/Back-End/Subscriptions/models.py index c80285c..7e44db4 100644 --- a/Back-End/Subscriptions/models.py +++ b/Back-End/Subscriptions/models.py @@ -291,6 +291,7 @@ class RegistrationParentFileMaster(models.Model): groups = models.ManyToManyField(RegistrationFileGroup, related_name='parent_file_masters', blank=True) name = models.CharField(max_length=255, default="") description = models.CharField(blank=True, null=True) + is_required = models.BooleanField(default=False) ############################################################ ####################### CLONE FILES ######################## diff --git a/Back-End/Subscriptions/serializers.py b/Back-End/Subscriptions/serializers.py index 88e32b2..1c36b7e 100644 --- a/Back-End/Subscriptions/serializers.py +++ b/Back-End/Subscriptions/serializers.py @@ -46,6 +46,8 @@ class RegistrationParentFileTemplateSerializer(serializers.ModelSerializer): file_url = serializers.SerializerMethodField() master_name = serializers.CharField(source='master.name', read_only=True) master_description = serializers.CharField(source='master.description', read_only=True) + is_required = serializers.BooleanField(source='master.is_required', read_only=True) + class Meta: model = RegistrationParentFileTemplate fields = '__all__' diff --git a/Front-End/messages/en/sidebar.json b/Front-End/messages/en/sidebar.json index 5d1f90c..16cc0fe 100644 --- a/Front-End/messages/en/sidebar.json +++ b/Front-End/messages/en/sidebar.json @@ -8,4 +8,4 @@ "settings": "Settings", "schoolAdmin": "School Administration", "messagerie": "Messenger" -} \ No newline at end of file +} diff --git a/Front-End/messages/fr/sidebar.json b/Front-End/messages/fr/sidebar.json index 8779ee8..aba45e7 100644 --- a/Front-End/messages/fr/sidebar.json +++ b/Front-End/messages/fr/sidebar.json @@ -8,4 +8,4 @@ "settings": "Paramètres", "schoolAdmin": "Administration Scolaire", "messagerie": "Messagerie" -} \ No newline at end of file +} diff --git a/Front-End/src/app/[locale]/admin/messagerie/page.js b/Front-End/src/app/[locale]/admin/messagerie/page.js index 2d77602..ed035e5 100644 --- a/Front-End/src/app/[locale]/admin/messagerie/page.js +++ b/Front-End/src/app/[locale]/admin/messagerie/page.js @@ -7,4 +7,4 @@ export default function MessageriePage({ csrfToken }) { ); -} \ No newline at end of file +} diff --git a/Front-End/src/components/Admin/EmailSender.js b/Front-End/src/components/Admin/EmailSender.js index ee55ec1..1de6feb 100644 --- a/Front-End/src/components/Admin/EmailSender.js +++ b/Front-End/src/components/Admin/EmailSender.js @@ -17,14 +17,15 @@ export default function EmailSender({ csrfToken }) { message, }; sendMessage(data); - }; return (

Envoyer un Email

- + {status}

}
); -} \ No newline at end of file +} diff --git a/Front-End/src/components/CheckBox.js b/Front-End/src/components/CheckBox.js index dfe8bec..a821482 100644 --- a/Front-End/src/components/CheckBox.js +++ b/Front-End/src/components/CheckBox.js @@ -8,6 +8,7 @@ const CheckBox = ({ itemLabelFunc = () => null, horizontal, }) => { + console.log(formData); const isChecked = formData[fieldName].includes(parseInt(item.id)); return (
{ - // Vérifier si tous les parentFileTemplates ont leur champ "file" différent de null - const allUploaded = parentFileTemplates.every( - (template) => template.file !== null - ); + // Vérifier si tous les documents avec is_required = true ont leur champ "file" différent de null + const allRequiredUploaded = parentFileTemplates + .filter((template) => template.is_required) // Ne garder que les documents requis + .every((template) => template.file !== null); // Vérifier que chaque fichier requis est uploadé // Mettre à jour isPage6Valid en fonction de cette condition - setIsPage6Valid(allUploaded); + setIsPage6Valid(allRequiredUploaded); + console.log(allRequiredUploaded); }, [parentFileTemplates]); const handleTemplateSigned = (index) => { @@ -659,8 +660,7 @@ export default function InscriptionFormShared({ (currentPage === 2 && !isPage2Valid) || (currentPage === 3 && !isPage3Valid) || (currentPage === 4 && !isPage4Valid) || - (currentPage === 5 && !isPage5Valid) || - (currentPage === 6 && !isPage6Valid) + (currentPage === 5 && !isPage5Valid) ? 'bg-gray-300 text-gray-700 cursor-not-allowed' : 'bg-emerald-500 text-white hover:bg-emerald-600' }`} @@ -669,8 +669,7 @@ export default function InscriptionFormShared({ (currentPage === 2 && !isPage2Valid) || (currentPage === 3 && !isPage3Valid) || (currentPage === 4 && !isPage4Valid) || - (currentPage === 5 && !isPage5Valid) || - (currentPage === 6 && !isPage6Valid) + (currentPage === 5 && !isPage5Valid) } primary name="Next" @@ -682,7 +681,12 @@ export default function InscriptionFormShared({ e.preventDefault(); handleSubmit(e); }} - className="px-4 py-2 bg-emerald-500 text-white rounded-md shadow-sm hover:bg-emerald-600 focus:outline-none" + className={`px-4 py-2 rounded-md shadow-sm focus:outline-none ${ + currentPage === 6 && !isPage6Valid + ? 'bg-gray-300 text-gray-700 cursor-not-allowed' + : 'bg-emerald-500 text-white hover:bg-emerald-600' + }`} + disabled={currentPage === 6 && !isPage6Valid} primary /> )} diff --git a/Front-End/src/components/Structure/Files/ParentFilesSection.js b/Front-End/src/components/Structure/Files/ParentFilesSection.js index ba60bb3..764eee4 100644 --- a/Front-End/src/components/Structure/Files/ParentFilesSection.js +++ b/Front-End/src/components/Structure/Files/ParentFilesSection.js @@ -8,6 +8,7 @@ import logger from '@/utils/logger'; import { createRegistrationParentFileTemplate } from '@/app/actions/registerFileGroupAction'; import { useCsrfToken } from '@/context/CsrfContext'; import SectionHeader from '@/components/SectionHeader'; +import ToggleSwitch from '@/components/ToggleSwitch'; export default function ParentFilesSection({ parentFiles, @@ -32,7 +33,7 @@ export default function ParentFilesSection({ const handleAddEmptyRequiredDocument = () => { setEditingDocumentId('new'); - setFormData({ name: '', description: '', groups: [] }); + setFormData({ name: '', description: '', groups: [], is_required: false }); // Add is_required setSelectedGroups([]); // Réinitialiser les groupes sélectionnés }; @@ -58,7 +59,6 @@ export default function ParentFilesSection({ "Attention !\nVeuillez sélectionner au moins un dossier d'inscription pour valider l'opération" ); setPopupVisible(true); - setPopupVisible(true); return; } @@ -73,13 +73,12 @@ export default function ParentFilesSection({ setFormData(null); setSelectedGroups([]); - guardianDetails.forEach((guardian, index) => { + guardianDetails.forEach((guardian) => { // Création des templates const data = { master: createdDocument?.id, registration_form: guardian.registration_form, }; - console.log(guardian); createRegistrationParentFileTemplate(data, csrfToken) .then((response) => { logger.debug('Template enregistré avec succès:', response); @@ -178,6 +177,22 @@ export default function ParentFilesSection({ errorMsg={null} /> ); + case 'Obligatoire': + return ( +
+ { + const { checked } = e.target; // Récupère l'état du toggle + setFormData((prevData) => ({ + ...prevData, + is_required: checked, // Met à jour directement le champ is_required + })); + }} + /> +
+ ); case 'Actions': return (
@@ -218,6 +233,18 @@ export default function ParentFilesSection({ .join(', ')} ); + case 'Obligatoire': + return ( + + {document.is_required ? 'Oui' : 'Non'} + + ); case 'Actions': return (
@@ -283,6 +310,10 @@ export default function ParentFilesSection({ transform: (row) => renderRequiredDocumentCell(row, "Dossiers d'inscription"), }, + { + name: 'Obligatoire', + transform: (row) => renderRequiredDocumentCell(row, 'Obligatoire'), + }, { name: 'Actions', transform: (row) => renderRequiredDocumentCell(row, 'Actions'),