diff --git a/assets/js/modules/agenda-modal-forms.js b/assets/js/modules/agenda-modal-forms.js index 9abfd71..f1ce590 100644 --- a/assets/js/modules/agenda-modal-forms.js +++ b/assets/js/modules/agenda-modal-forms.js @@ -109,6 +109,37 @@ export function fillFormWithEvent(event, filterTraducteursByLangue = null) { // Mettre à jour les selects Select2 updateSelect2Fields(); + // Filtrer les options langue selon langues_disponibles si c'est une permanence + const type = extendedProps.type || event.type || ''; + if (type === 'permanence') { + const languesDisponibles = extendedProps.langues_disponibles; + const langueSelect = document.getElementById('langue'); + if (langueSelect && languesDisponibles && typeof languesDisponibles === 'string' && languesDisponibles.trim() !== '') { + const languesPermises = languesDisponibles.split(',').map(l => l.trim()).filter(l => l !== ''); + if (languesPermises.length > 0) { + const currentValue = langueSelect.value; // Récupérer la valeur actuelle (définie juste avant) + Array.from(langueSelect.options).forEach(option => { + if (option.value === '') { + option.style.display = ''; + option.disabled = false; + return; + } + // Garder l'option sélectionnée visible même si elle n'est pas dans langues_disponibles + const isCurrentlySelected = option.value === currentValue; + const optionSlug = option.getAttribute('data-slug'); + const isPermise = optionSlug && languesPermises.includes(optionSlug); + if (isPermise || isCurrentlySelected) { + option.style.display = ''; + option.disabled = false; + } else { + option.style.display = 'none'; + option.disabled = true; + } + }); + } + } + } + // Filtrer les traducteurs selon la langue if (filterTraducteursByLangue) { setTimeout(() => filterTraducteursByLangue(), 50); @@ -118,7 +149,6 @@ export function fillFormWithEvent(event, filterTraducteursByLangue = null) { handleTraducteurExistingCheckbox(extendedProps.id_traducteur || event.id_traducteur); // Gérer les champs conditionnels selon le type - const type = extendedProps.type || event.type || ''; handleTypeConditionalFields(type, event, extendedProps); // Charger le statut liste rouge si bénéficiaire sélectionné diff --git a/assets/js/modules/agenda-modal-select.js b/assets/js/modules/agenda-modal-select.js index 362c81e..938e242 100644 --- a/assets/js/modules/agenda-modal-select.js +++ b/assets/js/modules/agenda-modal-select.js @@ -298,6 +298,7 @@ function filterSelectOptions(data, currentEventData = null) { if (languesPermises.length > 0) { // Parcourir les options et cacher celles dont le data-slug n'est pas dans langues_disponibles + const currentValue = langueSelect.value; // Récupérer la valeur actuellement sélectionnée Array.from(langueSelect.options).forEach(option => { if (option.value === '') { // Garder l'option vide visible @@ -306,10 +307,12 @@ function filterSelectOptions(data, currentEventData = null) { return; } + // Garder l'option sélectionnée visible même si elle n'est pas dans langues_disponibles + const isCurrentlySelected = option.value === currentValue; const optionSlug = option.getAttribute('data-slug'); const isPermise = optionSlug && languesPermises.includes(optionSlug); - if (isPermise) { + if (isPermise || isCurrentlySelected) { option.style.display = ''; option.disabled = false; } else { @@ -372,7 +375,7 @@ function preselectValues(eventData) { 'id_local': extendedProps.id_local, 'id_departement': extendedProps.id_departement, 'id_type_intervention': extendedProps.id_type_intervention, - 'langue': extendedProps.langue + 'langue': extendedProps.langue || eventData.langue }; Object.entries(fieldsToPreselect).forEach(([fieldId, value]) => { @@ -381,6 +384,13 @@ function preselectValues(eventData) { const element = document.getElementById(fieldId); if (!element || element.tagName !== 'SELECT') return; + // Vérifier que l'option existe dans le select avant de la sélectionner + const optionExists = Array.from(element.options).some(opt => opt.value === value.toString()); + if (!optionExists) { + console.warn(`⚠️ Option avec valeur "${value}" non trouvée dans le select ${fieldId}`); + return; + } + // Si Select2 est actif if (window.jQuery && jQuery(element).hasClass('select2-hidden-accessible')) { // Définir la valeur et déclencher l'événement change.select2 @@ -388,6 +398,8 @@ function preselectValues(eventData) { } else { // Select natif element.value = value; + // Déclencher l'événement change pour notifier les autres listeners + element.dispatchEvent(new Event('change', { bubbles: true })); } }); } @@ -434,7 +446,11 @@ export async function populateSelects(eventData = null) { // S'assurer que Select2 est initialisé avant de présélectionner initializeSelect2(); - preselectValues(eventData); + // Petit délai pour s'assurer que le filtrage des langues est bien appliqué avant la présélection + // Et que les options sont bien dans le DOM + setTimeout(() => { + preselectValues(eventData); + }, 100); return; } @@ -458,7 +474,11 @@ export async function populateSelects(eventData = null) { // S'assurer que Select2 est initialisé avant de présélectionner initializeSelect2(); - preselectValues(eventData); + // Petit délai pour s'assurer que le filtrage des langues est bien appliqué avant la présélection + // Et que les options sont bien dans le DOM + setTimeout(() => { + preselectValues(eventData); + }, 100); } catch (error) { console.error('Erreur lors de la récupération des disponibilités:', error);