amélioration select langue

This commit is contained in:
theShlavuk 2026-01-21 21:59:24 +01:00
parent 90bb68af53
commit 040a1075e4
2 changed files with 55 additions and 5 deletions

View File

@ -109,6 +109,37 @@ export function fillFormWithEvent(event, filterTraducteursByLangue = null) {
// Mettre à jour les selects Select2 // Mettre à jour les selects Select2
updateSelect2Fields(); 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 // Filtrer les traducteurs selon la langue
if (filterTraducteursByLangue) { if (filterTraducteursByLangue) {
setTimeout(() => filterTraducteursByLangue(), 50); setTimeout(() => filterTraducteursByLangue(), 50);
@ -118,7 +149,6 @@ export function fillFormWithEvent(event, filterTraducteursByLangue = null) {
handleTraducteurExistingCheckbox(extendedProps.id_traducteur || event.id_traducteur); handleTraducteurExistingCheckbox(extendedProps.id_traducteur || event.id_traducteur);
// Gérer les champs conditionnels selon le type // Gérer les champs conditionnels selon le type
const type = extendedProps.type || event.type || '';
handleTypeConditionalFields(type, event, extendedProps); handleTypeConditionalFields(type, event, extendedProps);
// Charger le statut liste rouge si bénéficiaire sélectionné // Charger le statut liste rouge si bénéficiaire sélectionné

View File

@ -298,6 +298,7 @@ function filterSelectOptions(data, currentEventData = null) {
if (languesPermises.length > 0) { if (languesPermises.length > 0) {
// Parcourir les options et cacher celles dont le data-slug n'est pas dans langues_disponibles // 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 => { Array.from(langueSelect.options).forEach(option => {
if (option.value === '') { if (option.value === '') {
// Garder l'option vide visible // Garder l'option vide visible
@ -306,10 +307,12 @@ function filterSelectOptions(data, currentEventData = null) {
return; 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 optionSlug = option.getAttribute('data-slug');
const isPermise = optionSlug && languesPermises.includes(optionSlug); const isPermise = optionSlug && languesPermises.includes(optionSlug);
if (isPermise) { if (isPermise || isCurrentlySelected) {
option.style.display = ''; option.style.display = '';
option.disabled = false; option.disabled = false;
} else { } else {
@ -372,7 +375,7 @@ function preselectValues(eventData) {
'id_local': extendedProps.id_local, 'id_local': extendedProps.id_local,
'id_departement': extendedProps.id_departement, 'id_departement': extendedProps.id_departement,
'id_type_intervention': extendedProps.id_type_intervention, 'id_type_intervention': extendedProps.id_type_intervention,
'langue': extendedProps.langue 'langue': extendedProps.langue || eventData.langue
}; };
Object.entries(fieldsToPreselect).forEach(([fieldId, value]) => { Object.entries(fieldsToPreselect).forEach(([fieldId, value]) => {
@ -381,6 +384,13 @@ function preselectValues(eventData) {
const element = document.getElementById(fieldId); const element = document.getElementById(fieldId);
if (!element || element.tagName !== 'SELECT') return; 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 // Si Select2 est actif
if (window.jQuery && jQuery(element).hasClass('select2-hidden-accessible')) { if (window.jQuery && jQuery(element).hasClass('select2-hidden-accessible')) {
// Définir la valeur et déclencher l'événement change.select2 // Définir la valeur et déclencher l'événement change.select2
@ -388,6 +398,8 @@ function preselectValues(eventData) {
} else { } else {
// Select natif // Select natif
element.value = value; 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 // S'assurer que Select2 est initialisé avant de présélectionner
initializeSelect2(); 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; return;
} }
@ -458,7 +474,11 @@ export async function populateSelects(eventData = null) {
// S'assurer que Select2 est initialisé avant de présélectionner // S'assurer que Select2 est initialisé avant de présélectionner
initializeSelect2(); 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) { } catch (error) {
console.error('Erreur lors de la récupération des disponibilités:', error); console.error('Erreur lors de la récupération des disponibilités:', error);