forme création sortie

This commit is contained in:
marvin
2024-11-20 12:50:43 +01:00
parent caa78c634b
commit d6c6956dc6
8 changed files with 361 additions and 92 deletions

182
assets/js/add-lieu.js Normal file
View File

@@ -0,0 +1,182 @@
document.addEventListener("DOMContentLoaded", () => {
console.log("Script chargé");
const addLieuButton = document.getElementById("add-lieu-button");
const addLieuModal = document.getElementById("add-lieu-modal");
const cancelAddLieu = document.getElementById("cancel-add-lieu");
const selectLocationButton = document.getElementById("select-location");
const addressDisplay = document.getElementById("lieu-details");
let map, marker, selectedAddress;
if (addLieuButton && addLieuModal && cancelAddLieu && selectLocationButton) {
// Affiche la modal
addLieuButton.addEventListener("click", () => {
const villeId = document.getElementById("sortie_ville").value;
if (!villeId) {
alert("Veuillez sélectionner une ville avant d'ajouter un lieu.");
return;
}
addLieuModal.classList.remove("hidden");
// Détruire la carte si elle existe déjà
if (map) {
map.remove();
map = null;
marker = null;
}
// Récupère les limites de la ville
fetch(`/get-bounds/${villeId}`)
.then(response => {
if (!response.ok) {
throw new Error("Erreur lors de la récupération des limites de la ville");
}
return response.json();
})
.then(data => {
console.log("Bounds de la ville :", data);
// Initialise la carte
map = L.map("map").setView([data.centerLat, data.centerLng], 13);
// Ajout du fond de carte
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
}).addTo(map);
// Limite le déplacement de la carte aux bounds
const bounds = L.latLngBounds(
[data.south, data.west],
[data.north, data.east]
);
map.setMaxBounds(bounds);
map.fitBounds(bounds);
// Empêche de dézoomer au-delà de la ville
map.setMinZoom(map.getZoom());
// Gestion de la sélection d'un lieu sur la carte
map.on("click", async (e) => {
const { lat, lng } = e.latlng;
// Place un marqueur
if (marker) {
marker.setLatLng([lat, lng]);
} else {
marker = L.marker([lat, lng]).addTo(map);
}
// Récupère l'adresse à partir des coordonnées
try {
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 du lieu.");
}
const data = await response.json();
console.log("Détails du lieu :", data);
selectedAddress = data.display_name;
// Affiche les détails du lieu
const addressDetails = `
<p><strong>Rue :</strong> ${data.address.road || "Non disponible"}</p>
<p><strong>Ville :</strong> ${data.address.city || data.address.town || "Non disponible"}</p>
<p><strong>Code postal :</strong> ${data.address.postcode || "Non disponible"}</p>
<p><strong>Pays :</strong> ${data.address.country || "Non disponible"}</p>
`;
addressDisplay.innerHTML = addressDetails;
} catch (error) {
console.error("Erreur lors de la récupération des informations :", error);
addressDisplay.textContent = "Impossible de récupérer l'adresse.";
}
});
})
.catch(error => {
console.error("Erreur :", error);
});
});
// Ferme la modal sans enregistrer
cancelAddLieu.addEventListener("click", () => {
addLieuModal.classList.add("hidden");
addressDisplay.innerHTML = ""; // Réinitialise les détails de l'adresse
});
// Sélectionne l'emplacement et envoie les données au serveur
selectLocationButton.addEventListener("click", () => {
if (marker) {
const lat = marker.getLatLng().lat;
const lng = marker.getLatLng().lng;
const villeId = document.getElementById("sortie_ville").value;
if (!villeId) {
alert("Veuillez sélectionner une ville avant d'ajouter un lieu.");
return;
}
if (!selectedAddress) {
alert("Veuillez sélectionner un emplacement sur la carte.");
return;
}
// Demande le nom du lieu à l'utilisateur
const nom = prompt("Nom du lieu ?");
if (!nom) {
alert("Le nom du lieu est obligatoire.");
return;
}
// Envoie les données au serveur
fetch("/lieu/set", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
nom,
rue: selectedAddress,
latitude: lat,
longitude: lng,
villeId,
}),
})
.then((response) => {
if (!response.ok) {
throw new Error("Erreur lors de l'ajout du lieu.");
}
return response.json();
})
.then((data) => {
console.log("Lieu ajouté :", data);
// Ajoute le lieu à la liste déroulante
const lieuSelect = document.getElementById("sortie_lieu");
const option = document.createElement("option");
option.value = data.id;
option.textContent = data.nom;
lieuSelect.appendChild(option);
// Sélectionne automatiquement le nouveau lieu
lieuSelect.value = data.id;
// Ferme la modal
addLieuModal.classList.add("hidden");
})
.catch((error) => {
console.error("Erreur :", error);
});
} else {
alert("Veuillez sélectionner un emplacement sur la carte.");
}
});
} else {
console.error("Éléments requis pour ajouter un lieu introuvables.");
}
});

62
assets/js/lieu.js Normal file
View File

@@ -0,0 +1,62 @@
document.addEventListener('DOMContentLoaded', function () {
const villeSelect = document.getElementById('sortie_ville');
const lieuSelect = document.getElementById('sortie_lieu');
const rueLabel = document.getElementById('rue-value');
const codePostalLabel = document.getElementById('codePostal-value');
const latitudeLabel = document.getElementById('latitude-value');
const longitudeLabel = document.getElementById('longitude-value');
if (villeSelect && lieuSelect) {
villeSelect.addEventListener('change', function () {
const villeId = villeSelect.value;
lieuSelect.innerHTML = '<option value="">Sélectionnez un lieu</option>';
lieuSelect.disabled = true;
if (villeId) {
fetch(`/get-lieux/${villeId}`)
.then(response => {
if (!response.ok) {
throw new Error('Erreur lors de la récupération des lieux');
}
return response.json();
})
.then(data => {
lieuSelect.innerHTML = '<option value="">Sélectionnez un lieu</option>';
data.forEach(lieu => {
const option = document.createElement('option');
option.value = lieu.id;
option.textContent = lieu.nom;
option.dataset.details = JSON.stringify(lieu);
lieuSelect.appendChild(option);
});
lieuSelect.disabled = false;
})
.catch(error => {
console.error('Erreur lors de la récupération des lieux :', error);
});
}
});
lieuSelect.addEventListener('change', function () {
const selectedOption = lieuSelect.options[lieuSelect.selectedIndex];
if (selectedOption && selectedOption.dataset.details) {
const lieuDetails = JSON.parse(selectedOption.dataset.details);
rueLabel.textContent = lieuDetails.rue || 'Non renseignée';
codePostalLabel.textContent = lieuDetails.codePostal || 'Non renseigné';
latitudeLabel.textContent = lieuDetails.latitude || 'Non renseignée';
longitudeLabel.textContent = lieuDetails.longitude || 'Non renseignée';
} else {
rueLabel.textContent = 'Renseigner avec le lieu';
codePostalLabel.textContent = 'Renseigner avec le lieu';
latitudeLabel.textContent = 'Renseigner avec le lieu';
longitudeLabel.textContent = 'Renseigner avec le lieu';
}
});
} else {
console.error('Les champs ville-select ou lieu-select sont introuvables.');
}
});