138 lines
5.2 KiB
JavaScript
138 lines
5.2 KiB
JavaScript
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.");
|
|
});
|
|
});
|
|
});
|