document.addEventListener("DOMContentLoaded", () => { const addLieuModal = document.getElementById("add-lieu-modal"); const cancelAddLieu = document.getElementById("cancel-add-lieu"); const saveLieuButton = document.getElementById("save-lieu"); const lieuNomInput = document.getElementById("lieu-nom"); const lieuNomError = document.getElementById("lieu-nom-error"); const lieuSelect = document.getElementById("sortie_lieu"); let map, marker, selectedAddress, selectedRue, selectedVille, selectedCodePostal; // Ouvrir la modal document.getElementById("add-lieu-button").addEventListener("click", () => { addLieuModal.classList.remove("hidden"); // Détruire la carte si elle existe déjà if (map) { map.remove(); map = null; marker = null; } // Initialiser la carte map = L.map("map").setView([48.8566, 2.3522], 13); // Coordonnées par défaut (Paris) L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { maxZoom: 22, // Zoom infini minZoom: 3, }).addTo(map); // Ajouter la barre de recherche const searchControl = new GeoSearch.GeoSearchControl({ provider: new GeoSearch.OpenStreetMapProvider(), style: 'bar', // Style de la barre de recherche showMarker: false, // Ne pas ajouter de marqueur automatique retainZoomLevel: false, keepResult: true, searchLabel: "Rechercher un lieu...", }); map.addControl(searchControl); // Gérer les clics sur la carte map.on("click", async (e) => { const { lat, lng } = e.latlng; selectedAddress = { lat, lng }; if (marker) { marker.setLatLng([lat, lng]); } else { marker = L.marker([lat, lng]).addTo(map); } try { // Utiliser l'API Nominatim pour récupérer les informations d'adresse const response = await fetch( `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}` ); if (!response.ok) { throw new Error("Erreur lors de la récupération des informations de l'adresse."); } const data = await response.json(); selectedRue = data.address.road || "Rue inconnue"; selectedVille = data.address.city || data.address.town || data.address.village || "Ville inconnue"; selectedCodePostal = data.address.postcode || "Code postal inconnu"; console.log(`Rue: ${selectedRue}, Ville: ${selectedVille}, Code postal: ${selectedCodePostal}`); } catch (error) { console.error("Erreur lors de la recherche inversée :", error); selectedRue = null; selectedVille = null; selectedCodePostal = null; alert("Impossible de récupérer l'adresse à partir de ces coordonnées."); } }); }); // Fermer la modal cancelAddLieu.addEventListener("click", () => { addLieuModal.classList.add("hidden"); lieuNomInput.value = ""; lieuNomError.textContent = ""; lieuNomError.classList.add("hidden"); }); // Enregistrer le lieu saveLieuButton.addEventListener("click", () => { const nom = lieuNomInput.value.trim(); if (!nom) { lieuNomError.textContent = "Le nom est obligatoire."; lieuNomError.classList.remove("hidden"); return; } if (!selectedAddress || !selectedRue || !selectedVille || !selectedCodePostal) { alert("Veuillez sélectionner un emplacement valide sur la carte."); return; } // Réinitialiser les erreurs lieuNomError.textContent = ""; lieuNomError.classList.add("hidden"); // Envoyer les données au serveur fetch("/lieu/set", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ nom, rue: selectedRue, ville: selectedVille, codePostal: selectedCodePostal, latitude: selectedAddress.lat, longitude: selectedAddress.lng, }), }) .then((response) => response.json().then((data) => ({ status: response.status, data }))) .then(({ status, data }) => { if (status >= 200 && status < 300) { // Rafraîchir la page après l'ajout réussi location.reload(); } else { if (data.error.includes("nom")) { lieuNomError.textContent = data.error; lieuNomError.classList.remove("hidden"); } else { alert(data.error || "Une erreur est survenue."); } } }) .catch((error) => { console.error("Erreur :", error); alert("Une erreur inattendue s'est produite."); }); }); });