corrections

This commit is contained in:
theShlavuk 2026-01-21 22:20:02 +01:00
parent 040a1075e4
commit 3349b8b1f7
5 changed files with 86 additions and 26 deletions

View File

@ -159,7 +159,8 @@ document.addEventListener('DOMContentLoaded', function() {
} }
// Initialiser Select2 sur les <select> (commun à tous les contextes) // Initialiser Select2 sur les <select> (commun à tous les contextes)
jQuery('.select2').select2(); // Exclure les selects avec skip-select2 (comme le select langue dans le modal)
jQuery('.select2:not(.skip-select2)').select2();
}); });

View File

@ -44,7 +44,6 @@ export function clearDomCache() {
export function safeSetValue(elementId, value) { export function safeSetValue(elementId, value) {
const element = getElement(elementId); const element = getElement(elementId);
if (!element) { if (!element) {
console.warn(`Élément ${elementId} non trouvé dans le DOM`);
return false; return false;
} }
@ -54,6 +53,7 @@ export function safeSetValue(elementId, value) {
} else { } else {
element.value = value; element.value = value;
} }
return true; return true;
} }
@ -65,7 +65,6 @@ export function safeSetValue(elementId, value) {
export function safeGetValue(elementId) { export function safeGetValue(elementId) {
const element = getElement(elementId); const element = getElement(elementId);
if (!element) { if (!element) {
console.warn(`Élément ${elementId} non trouvé dans le DOM`);
return null; return null;
} }
return element.value; return element.value;

View File

@ -40,7 +40,6 @@ export function fillFormWithDate(data) {
*/ */
export function fillFormWithEvent(event, filterTraducteursByLangue = null) { export function fillFormWithEvent(event, filterTraducteursByLangue = null) {
if (!event) { if (!event) {
console.warn('fillFormWithEvent: event est undefined');
return; return;
} }
@ -83,18 +82,18 @@ export function fillFormWithEvent(event, filterTraducteursByLangue = null) {
setCurrentDateTime(); setCurrentDateTime();
} }
} catch (error) { } catch (error) {
console.error('Erreur lors du parsing des dates FullCalendar', error);
setCurrentDateTime(); setCurrentDateTime();
} }
} else { } else {
console.warn('Aucune donnée de date/heure trouvée, utilisation de la date actuelle');
setCurrentDateTime(); setCurrentDateTime();
} }
// Remplir les autres champs // Remplir les autres champs
const extendedProps = event.extendedProps || {}; const extendedProps = event.extendedProps || {};
safeSetValue('type', extendedProps.type || event.type || ''); safeSetValue('type', extendedProps.type || event.type || '');
safeSetValue('langue', extendedProps.langue || event.langue || '');
const langueValue = extendedProps.langue || event.langue || '';
safeSetValue('langue', langueValue);
const beneficiaireId = extendedProps.id_beneficiaire || event.id_beneficiaire || ''; const beneficiaireId = extendedProps.id_beneficiaire || event.id_beneficiaire || '';
safeSetValue('id_beneficiaire', beneficiaireId); safeSetValue('id_beneficiaire', beneficiaireId);

View File

@ -26,9 +26,52 @@ export function initializeSelect2() {
return; return;
} }
// Vérifier spécifiquement le select langue avant initialisation
const langueSelect = document.getElementById('langue');
if (langueSelect) {
// Forcer l'ajout de la classe skip-select2 si elle n'est pas présente
if (!langueSelect.classList.contains('skip-select2')) {
console.warn('⚠️ [LANGUE] Classe skip-select2 manquante, ajout forcé');
langueSelect.classList.add('skip-select2');
}
const hasSkipSelect2 = langueSelect.classList.contains('skip-select2');
const hasSelect2Class = langueSelect.classList.contains('select2');
const isAlreadySelect2 = window.jQuery && jQuery(langueSelect).hasClass('select2-hidden-accessible');
console.log('🔵 [LANGUE] initializeSelect2 - skip-select2:', hasSkipSelect2, '| classe select2:', hasSelect2Class, '| Déjà Select2:', isAlreadySelect2, '| ID:', langueSelect.id, '| Classes:', langueSelect.className, '| HTML:', langueSelect.outerHTML.substring(0, 200));
// Si le select langue a skip-select2 mais est déjà en Select2, le détruire
if (hasSkipSelect2 && isAlreadySelect2) {
console.log('⚠️ [LANGUE] Select2 détecté sur select avec skip-select2, destruction...');
try {
jQuery(langueSelect).select2('destroy');
// Nettoyer les classes et attributs Select2
langueSelect.classList.remove('select2-hidden-accessible', 'select2');
langueSelect.removeAttribute('data-select2-id');
langueSelect.removeAttribute('tabindex');
langueSelect.removeAttribute('aria-hidden');
console.log('✅ [LANGUE] Select2 détruit, classes après:', langueSelect.className);
} catch (e) {
console.warn('Erreur lors de la destruction Select2 pour langue:', e);
}
}
// S'assurer que la classe select2 n'est pas présente si skip-select2 est là
if (hasSkipSelect2 && hasSelect2Class) {
langueSelect.classList.remove('select2');
console.log('🧹 [LANGUE] Classe select2 retirée (skip-select2 présent)');
}
}
jQuery('#eventModal select:not(.skip-select2)').each(function() { jQuery('#eventModal select:not(.skip-select2)').each(function() {
const $select = jQuery(this); const $select = jQuery(this);
// Ignorer explicitement le select langue s'il a skip-select2
if ($select.attr('id') === 'langue' && $select.hasClass('skip-select2')) {
console.log('⏭️ [LANGUE] Ignoré dans initializeSelect2 (skip-select2)');
return;
}
// Si Select2 est déjà initialisé, le détruire pour réappliquer // Si Select2 est déjà initialisé, le détruire pour réappliquer
if ($select.hasClass('select2-hidden-accessible') || $select.data('select2')) { if ($select.hasClass('select2-hidden-accessible') || $select.data('select2')) {
try { $select.select2('destroy'); } catch (e) {} try { $select.select2('destroy'); } catch (e) {}
@ -320,8 +363,6 @@ function filterSelectOptions(data, currentEventData = null) {
option.disabled = true; option.disabled = true;
} }
}); });
console.log('✅ [LANGUE] Options filtrées selon langues_disponibles:', languesPermises);
} else { } else {
// Si langues_disponibles est vide, afficher toutes les options // Si langues_disponibles est vide, afficher toutes les options
Array.from(langueSelect.options).forEach(option => { Array.from(langueSelect.options).forEach(option => {
@ -337,9 +378,14 @@ function filterSelectOptions(data, currentEventData = null) {
option.disabled = false; option.disabled = false;
}); });
} }
// Ne pas filtrer les langues en mode edit (quand l'événement a un ID)
// Le filtrage par disponibilités ne doit s'appliquer qu'en mode création
const isEditMode = currentEventData && (currentEventData.id || currentEventData.extendedProps?.id);
if (!isEditMode) {
filterSelect('langue', data.langues || []); filterSelect('langue', data.langues || []);
} }
} }
}
/** /**
* Réinitialise le display des options du select langue * Réinitialise le display des options du select langue
@ -354,8 +400,6 @@ export function resetLangueSelectDisplay() {
option.style.display = ''; option.style.display = '';
option.disabled = false; option.disabled = false;
}); });
console.log('🔄 [LANGUE] Display des options réinitialisé');
} }
/** /**
@ -384,10 +428,24 @@ 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;
// Tracer spécifiquement pour le champ langue
if (fieldId === 'langue') {
const currentValue = element.value || '';
const isSelect2 = window.jQuery && jQuery(element).hasClass('select2-hidden-accessible');
const hasSkipSelect2 = element.classList.contains('skip-select2');
const optionCount = element.options.length;
const optionExists = Array.from(element.options).some(opt => opt.value === value.toString());
console.log('🟣 [LANGUE] preselectValues - Valeur actuelle:', currentValue, '| Valeur à appliquer:', value, '| Source:', extendedProps.langue ? 'extendedProps' : eventData.langue ? 'eventData' : 'N/A', '| Select2:', isSelect2, '| skip-select2:', hasSkipSelect2, '| Options:', optionCount, '| Option existe:', optionExists);
}
// Vérifier que l'option existe dans le select avant de la sélectionner // 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()); const optionExists = Array.from(element.options).some(opt => opt.value === value.toString());
if (!optionExists) { if (!optionExists) {
if (fieldId === 'langue') {
console.warn(`⚠️ [LANGUE] Option avec valeur "${value}" non trouvée dans le select`);
} else {
console.warn(`⚠️ Option avec valeur "${value}" non trouvée dans le select ${fieldId}`); console.warn(`⚠️ Option avec valeur "${value}" non trouvée dans le select ${fieldId}`);
}
return; return;
} }
@ -401,6 +459,14 @@ function preselectValues(eventData) {
// Déclencher l'événement change pour notifier les autres listeners // Déclencher l'événement change pour notifier les autres listeners
element.dispatchEvent(new Event('change', { bubbles: true })); element.dispatchEvent(new Event('change', { bubbles: true }));
} }
// Vérifier la valeur après application pour le champ langue
if (fieldId === 'langue') {
const finalValue = element.value || '';
const selectedOption = element.options[element.selectedIndex];
const selectedText = selectedOption ? selectedOption.text : 'N/A';
console.log('🟠 [LANGUE] preselectValues - Valeur après application:', finalValue, '| Option sélectionnée:', selectedText, '| selectedIndex:', element.selectedIndex);
}
}); });
} }

View File

@ -51,7 +51,6 @@ export function restoreModalData() {
export function openSubModal(subModalId, onBeforeOpen = null, onAfterClose = null, delay = 300) { export function openSubModal(subModalId, onBeforeOpen = null, onAfterClose = null, delay = 300) {
const subModal = document.getElementById(subModalId); const subModal = document.getElementById(subModalId);
if (!subModal) { if (!subModal) {
console.error(`Sous-modale non trouvée: ${subModalId}`);
return; return;
} }
@ -63,7 +62,7 @@ export function openSubModal(subModalId, onBeforeOpen = null, onAfterClose = nul
try { try {
onBeforeOpen(subModal); onBeforeOpen(subModal);
} catch (error) { } catch (error) {
console.error('Erreur dans onBeforeOpen:', error); // Erreur silencieuse
} }
} }
@ -90,7 +89,7 @@ export function openSubModal(subModalId, onBeforeOpen = null, onAfterClose = nul
try { try {
onAfterClose(subModal); onAfterClose(subModal);
} catch (error) { } catch (error) {
console.error('Erreur dans onAfterClose:', error); // Erreur silencieuse
} }
} }
@ -114,7 +113,6 @@ async function loadEventIncidents(eventId) {
const incidents = await apiFetch(`events/${eventId}/incidents`); const incidents = await apiFetch(`events/${eventId}/incidents`);
return incidents || []; return incidents || [];
} catch (error) { } catch (error) {
console.error('Erreur lors du chargement des incidents:', error);
return []; return [];
} }
} }
@ -189,7 +187,6 @@ async function openIncidentsViewModal(eventId) {
formFooter.style.display = 'none'; formFooter.style.display = 'none';
} catch (error) { } catch (error) {
console.error('Erreur lors du chargement des incidents:', error);
listContainer.innerHTML = '<p class="text-danger">Erreur lors du chargement des incidents</p>'; listContainer.innerHTML = '<p class="text-danger">Erreur lors du chargement des incidents</p>';
notifyError('Erreur lors du chargement des incidents'); notifyError('Erreur lors du chargement des incidents');
} }
@ -242,7 +239,6 @@ export async function checkAndDisplayIncidentsButton(eventId) {
viewIncidentsBtn.style.display = 'none'; viewIncidentsBtn.style.display = 'none';
} }
} catch (error) { } catch (error) {
console.error('Erreur lors de la vérification des incidents:', error);
viewIncidentsBtn.style.display = 'none'; viewIncidentsBtn.style.display = 'none';
} }
} }
@ -267,7 +263,6 @@ export function openModal(mode, eventData = null) {
const modal = document.getElementById('eventModal'); const modal = document.getElementById('eventModal');
if (!modal) { if (!modal) {
console.error('❌ Élément modal non trouvé');
return; return;
} }
@ -277,6 +272,12 @@ export function openModal(mode, eventData = null) {
bsModal = new window.bootstrap.Modal(modal); bsModal = new window.bootstrap.Modal(modal);
} }
// S'assurer que le select langue a la classe skip-select2 AVANT toute initialisation
const langueSelect = document.getElementById('langue');
if (langueSelect && !langueSelect.classList.contains('skip-select2')) {
langueSelect.classList.add('skip-select2');
}
// Initialiser les composants // Initialiser les composants
initializeEntityCreators(); initializeEntityCreators();
initializeSelect2(); initializeSelect2();
@ -312,13 +313,11 @@ export function openModal(mode, eventData = null) {
currentMode = 'view'; currentMode = 'view';
} }
if (mode === 'edit' && isEventPast) { if (mode === 'edit' && isEventPast) {
console.warn('Impossible de modifier un événement passé');
notifyError('Impossible de modifier un événement passé'); notifyError('Impossible de modifier un événement passé');
mode = 'view'; mode = 'view';
currentMode = 'view'; currentMode = 'view';
} }
if (mode === 'create' && !userCanCreate) { if (mode === 'create' && !userCanCreate) {
console.warn('Utilisateur non autorisé à créer des événements');
return; return;
} }
@ -515,7 +514,6 @@ function initializeLangueFilter() {
export function openCheckPresenceModal(eventData) { export function openCheckPresenceModal(eventData) {
const modal = document.getElementById('eventCheckPresenceModal'); const modal = document.getElementById('eventCheckPresenceModal');
if (!modal) { if (!modal) {
console.error('Modal eventCheckPresenceModal non trouvée');
return; return;
} }
@ -526,7 +524,6 @@ export function openCheckPresenceModal(eventData) {
// Vérifier que c'est bien un événement de groupe // Vérifier que c'est bien un événement de groupe
if (eventType !== 'groupe') { if (eventType !== 'groupe') {
console.warn('openCheckPresenceModal appelée pour un événement non-groupe');
return; return;
} }
@ -667,7 +664,6 @@ async function handleGroupPresenceSubmission(eventId, presenceData) {
throw new Error(response?.data?.message || 'Erreur lors de l\'enregistrement des présences'); throw new Error(response?.data?.message || 'Erreur lors de l\'enregistrement des présences');
} }
} catch (error) { } catch (error) {
console.error('Erreur lors de l\'enregistrement des présences:', error);
notifyError(error.message || 'Erreur lors de l\'enregistrement des présences'); notifyError(error.message || 'Erreur lors de l\'enregistrement des présences');
} }
} }
@ -707,7 +703,6 @@ function initializePresenceAutocomplete() {
suggestionsDiv.style.display = 'none'; suggestionsDiv.style.display = 'none';
} }
} catch (error) { } catch (error) {
console.error('Erreur lors de la recherche de bénéficiaires:', error);
currentSuggestions = []; currentSuggestions = [];
suggestionsDiv.style.display = 'none'; suggestionsDiv.style.display = 'none';
} }