document.addEventListener("DOMContentLoaded", () => { // Initialisation des écouteurs globaux si besoin }); // --- 1. GESTION DE LA MODALE D'ÉDITION --- function openHolidayModal(mode) { const modal = document.getElementById("holidayModal"); const form = document.getElementById("holidayForm"); const btnDelete = document.getElementById("btn_delete"); // Reset complet form.reset(); document.getElementById("inp_id").value = ""; document.getElementById("list_transport").innerHTML = ""; document.getElementById("list_accommodation").innerHTML = ""; document.getElementById("list_activity").innerHTML = ""; if (mode === "add") { document.getElementById("modalTitle").innerText = "Nouveau Voyage"; btnDelete.style.display = "none"; } else { document.getElementById("modalTitle").innerText = "Modifier le voyage"; btnDelete.style.display = "block"; } modal.classList.add("open"); modal.style.display = "flex"; // --- AJOUT : FORCER LE SCROLL EN HAUT --- const content = modal.querySelector(".pf-modal-content"); if (content) { content.scrollTop = 0; } // Optionnel : Mettre le focus sur le premier champ (Titre) // setTimeout(() => document.getElementById('inp_title').focus(), 50); } function closeHolidayModal() { const modal = document.getElementById("holidayModal"); modal.classList.remove("open"); modal.style.display = "none"; } // Fonction appelée au clic sur une carte (injectée par PHP) function editHoliday(data) { openHolidayModal("edit"); const h = data.main; // Remplissage des champs principaux document.getElementById("inp_id").value = h.id; document.getElementById("inp_title").value = h.title; document.getElementById("inp_status").value = h.status; document.getElementById("inp_period").value = h.period_hint; document.getElementById("inp_start").value = h.start_date; document.getElementById("inp_end").value = h.end_date; document.getElementById("inp_food").value = h.budget_food > 0 ? h.budget_food : ""; document.getElementById("inp_extra").value = h.budget_extra > 0 ? h.budget_extra : ""; document.getElementById("inp_notes").value = h.notes; // Remplissage des listes dynamiques if (data.items && data.items.length > 0) { data.items.forEach((item) => { addItem(item.category, item.name, item.amount, item.is_paid); }); } } // --- 2. GESTION DES LISTES DYNAMIQUES (Transport, etc.) --- function addItem(category, name = "", amount = "", isPaid = 0) { const container = document.getElementById("list_" + category); const div = document.createElement("div"); // Utilisation des classes CSS définies précédemment div.className = "savings-line-item"; // Checkbox logique pour "Payé" const checkedAttr = isPaid == 1 ? "checked" : ""; div.innerHTML = ` `; container.appendChild(div); } function deleteHoliday() { if (!confirm("Supprimer définitivement ce voyage ?")) return; const form = document.getElementById("holidayForm"); // On ajoute un input caché pour signaler la suppression au PHP const input = document.createElement("input"); input.type = "hidden"; input.name = "action_delete"; input.value = "1"; form.appendChild(input); form.submit(); } // --- 3. GESTION DE LA CARTE (Leaflet) --- let map = null; function toggleMap() { const modal = document.getElementById("hol-map-modal"); if (modal.style.display === "flex") { modal.style.display = "none"; } else { modal.style.display = "flex"; // Petit délai pour laisser le temps au DOM de s'afficher avant d'init Leaflet setTimeout(initMap, 100); } } function initMap() { if (map) { map.invalidateSize(); // Recalcule la taille si la fenêtre a changé return; } if (typeof L === "undefined") return; // Centré sur l'Europe par défaut map = L.map("hol-map").setView([46.6, 2.4], 4); L.tileLayer( "https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png", { attribution: "© OpenStreetMap", }, ).addTo(map); // On récupère les points définis en global dans le PHP if (typeof HOL_MAP_POINTS !== "undefined") { HOL_MAP_POINTS.forEach((pt) => { const color = pt.status === "planned" || pt.status === "booked" ? "green" : "blue"; // Cercle simple L.circleMarker([pt.lat, pt.lng], { color: color, radius: 8, fillOpacity: 0.8, }) .addTo(map) .bindPopup(`${pt.title}
${pt.status}`); }); } }