corrections
This commit is contained in:
parent
040a1075e4
commit
3349b8b1f7
@ -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();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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,7 +378,12 @@ function filterSelectOptions(data, currentEventData = null) {
|
|||||||
option.disabled = false;
|
option.disabled = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
filterSelect('langue', data.langues || []);
|
// 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 || []);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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) {
|
||||||
console.warn(`⚠️ Option avec valeur "${value}" non trouvée dans le select ${fieldId}`);
|
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}`);
|
||||||
|
}
|
||||||
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);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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';
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user