Merge branch 'Marvin'
# Conflicts: # templates/sortie/create.html.twig
This commit is contained in:
@@ -4,100 +4,62 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
const saveLieuButton = document.getElementById("save-lieu");
|
const saveLieuButton = document.getElementById("save-lieu");
|
||||||
const lieuNomInput = document.getElementById("lieu-nom");
|
const lieuNomInput = document.getElementById("lieu-nom");
|
||||||
const lieuNomError = document.getElementById("lieu-nom-error");
|
const lieuNomError = document.getElementById("lieu-nom-error");
|
||||||
const villeSelect = document.getElementById("sortie_ville");
|
|
||||||
const lieuSelect = document.getElementById("sortie_lieu");
|
const lieuSelect = document.getElementById("sortie_lieu");
|
||||||
|
|
||||||
let map, marker, selectedAddress, selectedRue, cityPolygon, cityBounds;
|
let map, marker, selectedAddress, selectedRue, selectedVille, selectedCodePostal;
|
||||||
|
|
||||||
// Ouvrir la modal
|
// Ouvrir la modal
|
||||||
document.getElementById("add-lieu-button").addEventListener("click", async () => {
|
document.getElementById("add-lieu-button").addEventListener("click", () => {
|
||||||
const villeId = villeSelect.value;
|
addLieuModal.classList.remove("hidden");
|
||||||
|
|
||||||
if (!villeId) {
|
// Détruire la carte si elle existe déjà
|
||||||
alert("Veuillez sélectionner une ville avant d'ajouter un lieu.");
|
if (map) {
|
||||||
return;
|
map.remove();
|
||||||
|
map = null;
|
||||||
|
marker = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// Initialiser la carte
|
||||||
// Récupérer les limites et le centre de la ville depuis le serveur
|
map = L.map("map").setView([48.8566, 2.3522], 13); // Coordonnées par défaut (Paris)
|
||||||
const response = await fetch(`/get-bounds/${villeId}`);
|
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||||
if (!response.ok) {
|
maxZoom: 19,
|
||||||
throw new Error("Erreur lors de la récupération des informations de la ville.");
|
minZoom: 13,
|
||||||
}
|
}).addTo(map);
|
||||||
const data = await response.json();
|
|
||||||
|
|
||||||
addLieuModal.classList.remove("hidden");
|
// Gérer les clics sur la carte
|
||||||
|
map.on("click", async (e) => {
|
||||||
|
const { lat, lng } = e.latlng;
|
||||||
|
selectedAddress = { lat, lng };
|
||||||
|
|
||||||
// Détruire la carte si elle existe déjà
|
if (marker) {
|
||||||
if (map) {
|
marker.setLatLng([lat, lng]);
|
||||||
map.remove();
|
} else {
|
||||||
map = null;
|
marker = L.marker([lat, lng]).addTo(map);
|
||||||
marker = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialiser la carte
|
try {
|
||||||
map = L.map("map").setView([data.centerLat, data.centerLng], 13);
|
// Utiliser l'API Nominatim pour récupérer les informations d'adresse
|
||||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
const response = await fetch(
|
||||||
maxZoom: 19,
|
`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}`
|
||||||
minZoom: 13,
|
);
|
||||||
}).addTo(map);
|
if (!response.ok) {
|
||||||
|
throw new Error("Erreur lors de la récupération des informations de l'adresse.");
|
||||||
|
}
|
||||||
|
|
||||||
cityBounds = L.latLngBounds(
|
const data = await response.json();
|
||||||
[data.south, data.west],
|
selectedRue = data.address.road || "Rue inconnue";
|
||||||
[data.north, data.east]
|
selectedVille = data.address.city || data.address.town || data.address.village || "Ville inconnue";
|
||||||
);
|
selectedCodePostal = data.address.postcode || "Code postal inconnu";
|
||||||
|
|
||||||
map.fitBounds(cityBounds);
|
console.log(`Rue: ${selectedRue}, Ville: ${selectedVille}, Code postal: ${selectedCodePostal}`);
|
||||||
map.setMaxBounds(cityBounds);
|
} catch (error) {
|
||||||
|
console.error("Erreur lors de la recherche inversée :", error);
|
||||||
// Ajouter le polygone de la ville si disponible
|
selectedRue = null;
|
||||||
if (data.polygon_geojson) {
|
selectedVille = null;
|
||||||
cityPolygon = L.geoJSON(data.polygon_geojson, {
|
selectedCodePostal = null;
|
||||||
style: {
|
alert("Impossible de récupérer l'adresse à partir de ces coordonnées.");
|
||||||
color: "blue",
|
|
||||||
weight: 2,
|
|
||||||
fillOpacity: 0.3,
|
|
||||||
},
|
|
||||||
}).addTo(map);
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
// Gérer les clics sur la carte
|
|
||||||
map.on("click", async (e) => {
|
|
||||||
const { lat, lng } = e.latlng;
|
|
||||||
|
|
||||||
if (!cityBounds.contains([lat, lng])) {
|
|
||||||
alert("Vous ne pouvez pas sélectionner un emplacement en dehors de la ville.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedAddress = { lat, lng };
|
|
||||||
|
|
||||||
if (marker) {
|
|
||||||
marker.setLatLng([lat, lng]);
|
|
||||||
} else {
|
|
||||||
marker = L.marker([lat, lng]).addTo(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
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 de l'adresse.");
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
selectedRue = data.address.road || "Rue inconnue";
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la recherche inversée :", error);
|
|
||||||
selectedRue = null;
|
|
||||||
alert("Impossible de récupérer l'adresse à partir de ces coordonnées.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur :", error);
|
|
||||||
alert("Impossible de récupérer les données de la ville.");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Fermer la modal
|
// Fermer la modal
|
||||||
@@ -118,17 +80,11 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!selectedAddress || !selectedRue) {
|
if (!selectedAddress || !selectedRue || !selectedVille || !selectedCodePostal) {
|
||||||
alert("Veuillez sélectionner un emplacement valide sur la carte.");
|
alert("Veuillez sélectionner un emplacement valide sur la carte.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const villeId = villeSelect.value;
|
|
||||||
if (!villeId) {
|
|
||||||
alert("Veuillez sélectionner une ville.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Réinitialiser les erreurs
|
// Réinitialiser les erreurs
|
||||||
lieuNomError.textContent = "";
|
lieuNomError.textContent = "";
|
||||||
lieuNomError.classList.add("hidden");
|
lieuNomError.classList.add("hidden");
|
||||||
@@ -142,9 +98,10 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
nom,
|
nom,
|
||||||
rue: selectedRue,
|
rue: selectedRue,
|
||||||
|
ville: selectedVille,
|
||||||
|
codePostal: selectedCodePostal,
|
||||||
latitude: selectedAddress.lat,
|
latitude: selectedAddress.lat,
|
||||||
longitude: selectedAddress.lng,
|
longitude: selectedAddress.lng,
|
||||||
villeId,
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
.then((response) => response.json().then((data) => ({ status: response.status, data })))
|
.then((response) => response.json().then((data) => ({ status: response.status, data })))
|
||||||
@@ -166,4 +123,4 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
alert("Une erreur inattendue s'est produite.");
|
alert("Une erreur inattendue s'est produite.");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
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) {
|
|
||||||
// Désactiver le menu déroulant des lieux au départ
|
|
||||||
lieuSelect.disabled = true;
|
|
||||||
|
|
||||||
// Listener pour le changement de ville
|
|
||||||
villeSelect.addEventListener('change', function () {
|
|
||||||
const villeId = villeSelect.value;
|
|
||||||
|
|
||||||
// Réinitialisation des options de lieu
|
|
||||||
lieuSelect.innerHTML = '<option value="">Sélectionnez un lieu</option>';
|
|
||||||
lieuSelect.disabled = true; // Toujours désactiver avant de récupérer les données
|
|
||||||
|
|
||||||
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 => {
|
|
||||||
// Ajouter les options si des lieux sont disponibles
|
|
||||||
if (data.length > 0) {
|
|
||||||
data.forEach(lieu => {
|
|
||||||
const option = document.createElement('option');
|
|
||||||
option.value = lieu.id; // Utiliser l'ID pour la soumission
|
|
||||||
option.textContent = lieu.nom; // Texte visible dans le menu
|
|
||||||
|
|
||||||
option.dataset.details = JSON.stringify({
|
|
||||||
rue: lieu.rue,
|
|
||||||
codePostal: lieu.codePostal,
|
|
||||||
latitude: lieu.latitude,
|
|
||||||
longitude: lieu.longitude
|
|
||||||
});
|
|
||||||
|
|
||||||
lieuSelect.appendChild(option);
|
|
||||||
});
|
|
||||||
lieuSelect.disabled = false; // Activer le menu des lieux
|
|
||||||
} else {
|
|
||||||
lieuSelect.innerHTML = '<option value="">Aucun lieu disponible</option>';
|
|
||||||
lieuSelect.disabled = true; // Toujours désactivé si aucun lieu n'est trouvé
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.error('Erreur lors de la récupération des lieux :', error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Listener pour le changement de lieu
|
|
||||||
lieuSelect.addEventListener('change', function () {
|
|
||||||
const selectedOption = lieuSelect.options[lieuSelect.selectedIndex];
|
|
||||||
if (selectedOption) {
|
|
||||||
const lieuDetails = selectedOption.dataset.details
|
|
||||||
? JSON.parse(selectedOption.dataset.details)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
// Mise à jour des labels avec les détails du lieu sélectionné
|
|
||||||
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';
|
|
||||||
|
|
||||||
console.log('Lieu sélectionné:', lieuDetails);
|
|
||||||
} else {
|
|
||||||
// Réinitialiser les labels si aucun lieu n'est sélectionné
|
|
||||||
rueLabel.textContent = 'Renseigner avec le lieu';
|
|
||||||
codePostalLabel.textContent = 'Renseigner avec le lieu';
|
|
||||||
latitudeLabel.textContent = 'Renseigner avec le lieu';
|
|
||||||
longitudeLabel.textContent = 'Renseigner avec le lieu';
|
|
||||||
|
|
||||||
console.log('Aucun lieu sélectionné.');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.error('Les champs ville-select ou lieu-select sont introuvables.');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
59
assets/js/show-lieu.js
Normal file
59
assets/js/show-lieu.js
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
console.log("DOMContentLoaded");
|
||||||
|
const lieuSelect = document.getElementById("sortie_lieu");
|
||||||
|
const rueValue = document.getElementById("rue-value");
|
||||||
|
const codePostalValue = document.getElementById("codePostal-value");
|
||||||
|
const latitudeValue = document.getElementById("latitude-value");
|
||||||
|
const longitudeValue = document.getElementById("longitude-value");
|
||||||
|
const villeValue = document.getElementById("ville-value");
|
||||||
|
|
||||||
|
// Vérifier que le champ "lieu" existe
|
||||||
|
if (!lieuSelect) {
|
||||||
|
console.error("Le champ 'lieu-select' est introuvable.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Script chargé. En attente de la sélection d'un lieu.");
|
||||||
|
|
||||||
|
// Écouter les changements sur le champ "lieu"
|
||||||
|
lieuSelect.addEventListener("change", async () => {
|
||||||
|
const lieuId = lieuSelect.value;
|
||||||
|
|
||||||
|
console.log(`Lieu sélectionné : ${lieuId}`);
|
||||||
|
|
||||||
|
// Si aucun lieu sélectionné, réinitialiser les champs
|
||||||
|
if (!lieuId) {
|
||||||
|
console.warn("Aucun lieu sélectionné. Réinitialisation des champs.");
|
||||||
|
rueValue.textContent = "Renseigner avec le lieu";
|
||||||
|
codePostalValue.textContent = "Renseigner avec le lieu";
|
||||||
|
latitudeValue.textContent = "Renseigner avec le lieu";
|
||||||
|
longitudeValue.textContent = "Renseigner avec le lieu";
|
||||||
|
villeValue.textContent = "Renseigner avec le lieu";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Requête vers l'API pour récupérer les données du lieu
|
||||||
|
console.log(`Envoi de la requête à l'API pour le lieu ID : ${lieuId}`);
|
||||||
|
const response = await fetch(`/lieux/${lieuId}`);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Erreur lors de la récupération des informations (statut ${response.status})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
console.log("Données reçues depuis l'API :", data);
|
||||||
|
|
||||||
|
// Mise à jour des champs avec les données récupérées
|
||||||
|
rueValue.textContent = data.rue || "Non renseigné";
|
||||||
|
codePostalValue.textContent = data.codePostal || "Non renseigné";
|
||||||
|
latitudeValue.textContent = data.latitude || "Non renseigné";
|
||||||
|
longitudeValue.textContent = data.longitude || "Non renseigné";
|
||||||
|
villeValue.textContent = data.ville || "Non renseigné";
|
||||||
|
|
||||||
|
console.log("Champs mis à jour avec succès.");
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Erreur lors de la récupération des données :", error);
|
||||||
|
alert("Une erreur s'est produite lors de la récupération des informations du lieu.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
namespace App\Controller;
|
namespace App\Controller;
|
||||||
|
|
||||||
use App\Entity\Lieu;
|
use App\Entity\Lieu;
|
||||||
use App\Entity\Ville;
|
use App\Repository\LieuRepository;
|
||||||
use App\Repository\VilleRepository;
|
use App\Repository\VilleRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
@@ -30,18 +30,12 @@ class LieuController extends AbstractController
|
|||||||
): JsonResponse {
|
): JsonResponse {
|
||||||
$data = json_decode($request->getContent(), true);
|
$data = json_decode($request->getContent(), true);
|
||||||
|
|
||||||
if (!isset($data['nom'], $data['latitude'], $data['longitude'], $data['villeId'])) {
|
if (!isset($data['nom'], $data['latitude'], $data['longitude'], $data['ville'], $data['codePostal'])) {
|
||||||
return new JsonResponse(['error' => 'Données manquantes.'], Response::HTTP_BAD_REQUEST);
|
return new JsonResponse(['error' => 'Données manquantes.'], Response::HTTP_BAD_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
$ville = $villeRepository->find($data['villeId']);
|
|
||||||
if (!$ville) {
|
|
||||||
return new JsonResponse(['error' => 'Ville non trouvée.'], Response::HTTP_NOT_FOUND);
|
|
||||||
}
|
|
||||||
|
|
||||||
$existingLieuByName = $entityManager->getRepository(Lieu::class)->findOneBy([
|
$existingLieuByName = $entityManager->getRepository(Lieu::class)->findOneBy([
|
||||||
'nom' => $data['nom'],
|
'nom' => $data['nom'],
|
||||||
'ville' => $ville,
|
|
||||||
]);
|
]);
|
||||||
if ($existingLieuByName) {
|
if ($existingLieuByName) {
|
||||||
return new JsonResponse(['error' => "Un lieu avec le nom '{$data['nom']}' existe déjà."], Response::HTTP_CONFLICT);
|
return new JsonResponse(['error' => "Un lieu avec le nom '{$data['nom']}' existe déjà."], Response::HTTP_CONFLICT);
|
||||||
@@ -52,7 +46,8 @@ class LieuController extends AbstractController
|
|||||||
$lieu->setRue($data['rue']);
|
$lieu->setRue($data['rue']);
|
||||||
$lieu->setLatitude($data['latitude']);
|
$lieu->setLatitude($data['latitude']);
|
||||||
$lieu->setLongitude($data['longitude']);
|
$lieu->setLongitude($data['longitude']);
|
||||||
$lieu->setVille($ville);
|
$lieu->setVille($data['ville']);
|
||||||
|
$lieu->setCodePostal($data['codePostal']);
|
||||||
|
|
||||||
$entityManager->persist($lieu);
|
$entityManager->persist($lieu);
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
@@ -63,51 +58,21 @@ class LieuController extends AbstractController
|
|||||||
], Response::HTTP_CREATED);
|
], Response::HTTP_CREATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/lieux/{id}', name: 'lieu_details', methods: ['GET'])]
|
||||||
#[Route('/get-bounds/{villeId}', name: 'get_bounds', methods: ['GET'])]
|
public function getLieuDetails(string $id, LieuRepository $lieuRepository): JsonResponse
|
||||||
public function getBounds(VilleRepository $villeRepository, string $villeId): JsonResponse
|
|
||||||
{
|
{
|
||||||
$ville = $villeRepository->find($villeId);
|
$lieu = $lieuRepository->find($id);
|
||||||
|
|
||||||
if (!$ville) {
|
if (!$lieu) {
|
||||||
return new JsonResponse(['error' => 'Ville non trouvée'], Response::HTTP_NOT_FOUND);
|
return new JsonResponse(['error' => 'Lieu introuvable'], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
$params = [
|
return new JsonResponse([
|
||||||
'q' => $ville->getNom(),
|
'rue' => $lieu->getRue(),
|
||||||
'format' => 'json',
|
'codePostal' => $lieu->getCodePostal(),
|
||||||
'polygon_geojson' => 1,
|
'latitude' => $lieu->getLatitude(),
|
||||||
];
|
'longitude' => $lieu->getLongitude(),
|
||||||
$url = 'https://nominatim.openstreetmap.org/search?' . http_build_query($params);
|
'ville' => $lieu->getVille(),
|
||||||
|
]);
|
||||||
try {
|
|
||||||
$context = stream_context_create([
|
|
||||||
'http' => [
|
|
||||||
'header' => "User-Agent: MyApp/1.0 (contact@myapp.com)\r\n",
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$response = file_get_contents($url, false, $context);
|
|
||||||
$data = json_decode($response, true);
|
|
||||||
|
|
||||||
if (!empty($data[0]['boundingbox'])) {
|
|
||||||
$boundingBox = $data[0]['boundingbox'];
|
|
||||||
$centerLat = ($boundingBox[0] + $boundingBox[1]) / 2;
|
|
||||||
$centerLng = ($boundingBox[2] + $boundingBox[3]) / 2;
|
|
||||||
|
|
||||||
return new JsonResponse([
|
|
||||||
'south' => $boundingBox[0],
|
|
||||||
'north' => $boundingBox[1],
|
|
||||||
'west' => $boundingBox[2],
|
|
||||||
'east' => $boundingBox[3],
|
|
||||||
'centerLat' => $centerLat,
|
|
||||||
'centerLng' => $centerLng,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new JsonResponse(['error' => 'Bounding box non trouvée'], Response::HTTP_NOT_FOUND);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,54 +26,48 @@ class SortieController extends AbstractController
|
|||||||
ParticipantRepository $participantRepository,
|
ParticipantRepository $participantRepository,
|
||||||
EtatRepository $etatRepository
|
EtatRepository $etatRepository
|
||||||
): Response {
|
): Response {
|
||||||
$sortie = new Sortie();
|
// Vérifier si l'utilisateur est connecté
|
||||||
|
$userConnect = $tokenStorage->getToken()?->getUser();
|
||||||
$token = $tokenStorage->getToken();
|
|
||||||
$userConnect = $token?->getUser();
|
|
||||||
|
|
||||||
if (!$userConnect) {
|
if (!$userConnect) {
|
||||||
$this->addFlash('error', 'Vous devez être connecté pour créer une sortie.');
|
$this->addFlash('error', 'Vous devez être connecté pour créer une sortie.');
|
||||||
return $this->redirectToRoute('app_login');
|
return $this->redirectToRoute('app_login');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sortie = new Sortie();
|
||||||
$form = $this->createForm(SortieType::class, $sortie);
|
$form = $this->createForm(SortieType::class, $sortie);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$lieuId = $form->get('lieu')->getData();
|
// Vérifier le lieu
|
||||||
$lieu = $lieuRepository->find($lieuId);
|
$lieu = $form->get('lieu')->getData();
|
||||||
|
|
||||||
if (!$lieu) {
|
if (!$lieu) {
|
||||||
$this->addFlash('error', 'Le lieu sélectionné est invalide.');
|
$this->addFlash('error', 'Veuillez sélectionner un lieu valide.');
|
||||||
return $this->redirectToRoute('sortie_create');
|
return $this->redirectToRoute('sortie_create');
|
||||||
}
|
}
|
||||||
|
|
||||||
$sortie->setLieu($lieu);
|
// Vérifier le participant (organisateur)
|
||||||
|
|
||||||
$participant = $participantRepository->find($userConnect->getIdParticipant());
|
$participant = $participantRepository->find($userConnect->getIdParticipant());
|
||||||
|
|
||||||
if (!$participant) {
|
if (!$participant) {
|
||||||
$this->addFlash('error', 'Impossible de déterminer le site de l\'utilisateur.');
|
$this->addFlash('error', 'Impossible de trouver votre profil.');
|
||||||
return $this->redirectToRoute('sortie_create');
|
return $this->redirectToRoute('sortie_create');
|
||||||
}
|
}
|
||||||
|
|
||||||
$sortie->setSite($participant->getSite());
|
// Définir les relations et l'état initial
|
||||||
|
$etat = $etatRepository->findOneBy(['libelle' => 'Créée']);
|
||||||
$etat = $etatRepository->find('019349ba-38ca-7a39-93c3-62f046671525');
|
|
||||||
if (!$etat) {
|
if (!$etat) {
|
||||||
$this->addFlash('error', 'État non trouvé.');
|
$this->addFlash('error', 'Erreur interne : état introuvable.');
|
||||||
return $this->redirectToRoute('sortie_create');
|
return $this->redirectToRoute('sortie_create');
|
||||||
}
|
}
|
||||||
|
|
||||||
$sortie->setEtat($etat);
|
$sortie->setLieu($lieu)
|
||||||
|
->setSite($participant->getSite())
|
||||||
$sortie->setOrganisateur($participant);
|
->setEtat($etat)
|
||||||
|
->setOrganisateur($participant);
|
||||||
|
|
||||||
$entityManager->persist($sortie);
|
$entityManager->persist($sortie);
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
|
|
||||||
$this->addFlash('success', 'La sortie a été créée avec succès.');
|
$this->addFlash('success', 'La sortie a été créée avec succès.');
|
||||||
|
|
||||||
return $this->redirectToRoute('home');
|
return $this->redirectToRoute('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,64 +78,54 @@ class SortieController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/view/{id}', name: 'view', methods: ['GET'])]
|
#[Route('/view/{id}', name: 'view', methods: ['GET'])]
|
||||||
public function view(string $id, EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage): Response
|
public function view(
|
||||||
{
|
string $id,
|
||||||
$token = $tokenStorage->getToken();
|
EntityManagerInterface $entityManager,
|
||||||
$userConnect = $token?->getUser();
|
TokenStorageInterface $tokenStorage
|
||||||
|
): Response {
|
||||||
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
||||||
|
|
||||||
if (!$sortie) {
|
if (!$sortie) {
|
||||||
$this->addFlash('error', 'La sortie demandée n\'existe pas.');
|
$this->addFlash('error', 'Cette sortie n\'existe pas.');
|
||||||
return $this->redirectToRoute('home');
|
return $this->redirectToRoute('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
$profile = $this->getUser();
|
|
||||||
|
|
||||||
return $this->render('sortie/view.html.twig', [
|
return $this->render('sortie/view.html.twig', [
|
||||||
'sortie' => $sortie,
|
'sortie' => $sortie,
|
||||||
'profile' => $userConnect,
|
'profile' => $tokenStorage->getToken()?->getUser(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/inscription/{id}', name: 'inscription', methods: ['POST'])]
|
#[Route('/inscription/{id}', name: 'inscription', methods: ['POST'])]
|
||||||
public function inscription(string $id, EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage): Response
|
public function inscription(
|
||||||
{
|
string $id,
|
||||||
$token = $tokenStorage->getToken();
|
EntityManagerInterface $entityManager,
|
||||||
$userConnect = $token?->getUser();
|
TokenStorageInterface $tokenStorage
|
||||||
|
): Response {
|
||||||
|
$userConnect = $tokenStorage->getToken()?->getUser();
|
||||||
if (!$userConnect) {
|
if (!$userConnect) {
|
||||||
$this->addFlash('error', 'Vous devez être connecté pour vous inscrire.');
|
$this->addFlash('error', 'Vous devez être connecté pour vous inscrire.');
|
||||||
return $this->redirectToRoute('app_login');
|
return $this->redirectToRoute('app_login');
|
||||||
}
|
}
|
||||||
|
|
||||||
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
||||||
|
|
||||||
if (!$sortie) {
|
if (!$sortie) {
|
||||||
$this->addFlash('error', 'La sortie demandée n\'existe pas.');
|
$this->addFlash('error', 'Cette sortie n\'existe pas.');
|
||||||
return $this->redirectToRoute('home');
|
return $this->redirectToRoute('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Conditions supplémentaires pour l'inscription
|
||||||
if ($sortie->getEtat()->getLibelle() !== 'Ouverte') {
|
if ($sortie->getEtat()->getLibelle() !== 'Ouverte') {
|
||||||
$this->addFlash('error', 'Vous ne pouvez pas vous inscrire à cette sortie car elle n\'est pas ouverte.');
|
$this->addFlash('error', 'Cette sortie n\'est pas ouverte aux inscriptions.');
|
||||||
return $this->redirectToRoute('sortie_view', ['id' => $id]);
|
} elseif ($sortie->getParticipants()->contains($userConnect)) {
|
||||||
}
|
|
||||||
|
|
||||||
if ($sortie->getParticipants()->contains($userConnect)) {
|
|
||||||
$this->addFlash('error', 'Vous êtes déjà inscrit à cette sortie.');
|
$this->addFlash('error', 'Vous êtes déjà inscrit à cette sortie.');
|
||||||
return $this->redirectToRoute('sortie_view', ['id' => $id]);
|
} elseif ($sortie->getParticipants()->count() >= $sortie->getNbInscriptionsMax()) {
|
||||||
|
$this->addFlash('error', 'Cette sortie est complète.');
|
||||||
|
} else {
|
||||||
|
$sortie->addParticipant($userConnect);
|
||||||
|
$entityManager->flush();
|
||||||
|
$this->addFlash('success', 'Votre inscription a été validée.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($sortie->getParticipants()->count() >= $sortie->getNbInscriptionsMax()) {
|
|
||||||
$this->addFlash('error', 'Le nombre maximum d\'inscriptions a été atteint pour cette sortie.');
|
|
||||||
return $this->redirectToRoute('sortie_view', ['id' => $id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$sortie->addParticipant($userConnect);
|
|
||||||
$entityManager->flush();
|
|
||||||
|
|
||||||
$this->addFlash('success', 'Vous êtes inscrit à la sortie avec succès !');
|
|
||||||
|
|
||||||
return $this->redirectToRoute('sortie_view', ['id' => $id]);
|
return $this->redirectToRoute('sortie_view', ['id' => $id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,17 +138,14 @@ class SortieController extends AbstractController
|
|||||||
LieuRepository $lieuRepository
|
LieuRepository $lieuRepository
|
||||||
): Response {
|
): Response {
|
||||||
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
$sortie = $entityManager->getRepository(Sortie::class)->find($id);
|
||||||
|
|
||||||
if (!$sortie) {
|
if (!$sortie) {
|
||||||
$this->addFlash('error', 'La sortie demandée n\'existe pas.');
|
$this->addFlash('error', 'Cette sortie n\'existe pas.');
|
||||||
return $this->redirectToRoute('home');
|
return $this->redirectToRoute('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
$token = $tokenStorage->getToken();
|
$userConnect = $tokenStorage->getToken()?->getUser();
|
||||||
$userConnect = $token?->getUser();
|
|
||||||
|
|
||||||
if ($userConnect->getIdParticipant() !== $sortie->getOrganisateur()->getIdParticipant()) {
|
if ($userConnect->getIdParticipant() !== $sortie->getOrganisateur()->getIdParticipant()) {
|
||||||
$this->addFlash('error', 'Vous n\'avez pas l\'autorisation de modifier cette sortie.');
|
$this->addFlash('error', 'Vous ne pouvez pas modifier cette sortie.');
|
||||||
return $this->redirectToRoute('home');
|
return $this->redirectToRoute('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,17 +153,13 @@ class SortieController extends AbstractController
|
|||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$lieuId = $form->get('lieu')->getData();
|
$lieu = $form->get('lieu')->getData();
|
||||||
$lieu = $lieuRepository->find($lieuId);
|
|
||||||
|
|
||||||
if ($lieu) {
|
if ($lieu) {
|
||||||
$sortie->setLieu($lieu);
|
$sortie->setLieu($lieu);
|
||||||
}
|
}
|
||||||
|
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
|
|
||||||
$this->addFlash('success', 'La sortie a été mise à jour avec succès.');
|
$this->addFlash('success', 'Les modifications ont été enregistrées.');
|
||||||
|
|
||||||
return $this->redirectToRoute('sortie_view', ['id' => $sortie->getIdSortie()]);
|
return $this->redirectToRoute('sortie_view', ['id' => $sortie->getIdSortie()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,5 +169,4 @@ class SortieController extends AbstractController
|
|||||||
'profile' => $userConnect,
|
'profile' => $userConnect,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ use App\Entity\Lieu;
|
|||||||
use App\Entity\Participant;
|
use App\Entity\Participant;
|
||||||
use App\Entity\Site;
|
use App\Entity\Site;
|
||||||
use App\Entity\Sortie;
|
use App\Entity\Sortie;
|
||||||
use App\Entity\Ville;
|
|
||||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
|
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
|
||||||
|
|||||||
@@ -6,7 +6,14 @@
|
|||||||
{% block title %}📣 Sortie.com Nouvelle sortie 🔊{% endblock %}
|
{% block title %}📣 Sortie.com Nouvelle sortie 🔊{% endblock %}
|
||||||
{% block stylesheets %}
|
{% block stylesheets %}
|
||||||
{{ encore_entry_link_tags('app') }}
|
{{ encore_entry_link_tags('app') }}
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet-geosearch/dist/geosearch.css" />
|
||||||
<style>
|
<style>
|
||||||
|
#map {
|
||||||
|
width: 100%;
|
||||||
|
height: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
.form-group {
|
.form-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -39,6 +46,10 @@
|
|||||||
.modern-button svg {
|
.modern-button svg {
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
#add-lieu-modal .bg-white {
|
||||||
|
max-width: 80%;
|
||||||
|
max-height: 90%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
@@ -51,6 +62,7 @@
|
|||||||
|
|
||||||
{{ form_start(form, { 'attr': { 'class': 'space-y-6' } }) }}
|
{{ form_start(form, { 'attr': { 'class': 'space-y-6' } }) }}
|
||||||
|
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -85,30 +97,41 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<div class="form-group">
|
|
||||||
<label for="sortie_ville">Ville</label>
|
|
||||||
{{ form_widget(form.ville, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500' } }) }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="sortie_codePostal">Code postal</label>
|
<label for="sortie_lieu">Lieu</label>
|
||||||
{{ form_widget(form.codePostal, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500' } }) }}
|
<div class="flex items-center space-x-2">
|
||||||
|
{{ form_widget(form.lieu, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500', 'id': 'lieu-select' } }) }}
|
||||||
|
<button type="button" id="add-lieu-button" class="modern-button">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" class="w-5 h-5">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" />
|
||||||
|
</svg>
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div>
|
||||||
<label for="sortie_rue">Rue</label>
|
<label class="block text-sm font-medium text-gray-700">Rue :</label>
|
||||||
{{ form_widget(form.rue, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500' } }) }}
|
<span id="rue-value" class="block w-full p-3 border border-gray-300 rounded-lg bg-gray-100">Renseigner avec le lieu</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700">Code postal :</label>
|
||||||
|
<span id="codePostal-value" class="block w-full p-3 border border-gray-300 rounded-lg bg-gray-100">Renseigner avec le lieu</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700">Ville :</label>
|
||||||
|
<span id="ville-value" class="block w-full p-3 border border-gray-300 rounded-lg bg-gray-100">Renseigner avec le lieu</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700">Latitude :</label>
|
||||||
|
<span id="latitude-value" class="block w-full p-3 border border-gray-300 rounded-lg bg-gray-100">Renseigner avec le lieu</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700">Longitude :</label>
|
||||||
|
<span id="longitude-value" class="block w-full p-3 border border-gray-300 rounded-lg bg-gray-100">Renseigner avec le lieu</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="sortie_latitude">Latitude</label>
|
|
||||||
{{ form_widget(form.latitude, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500' } }) }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="sortie_longitude">Longitude</label>
|
|
||||||
{{ form_widget(form.longitude, { 'attr': { 'class': 'block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500' } }) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -124,4 +147,31 @@
|
|||||||
{{ form_end(form, { 'render_rest': false }) }}
|
{{ form_end(form, { 'render_rest': false }) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="add-lieu-modal" class="fixed inset-0 flex items-center justify-center bg-gray-800 bg-opacity-50 hidden">
|
||||||
|
<div class="bg-white p-6 rounded-lg shadow-lg w-full max-w-4xl">
|
||||||
|
<h2 class="text-xl font-bold mb-4">Ajouter un lieu</h2>
|
||||||
|
|
||||||
|
<div class="form-group mb-4">
|
||||||
|
<label for="lieu-nom" class="block text-sm font-medium text-gray-700">Nom du lieu</label>
|
||||||
|
<input type="text" id="lieu-nom" class="block w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="Nom du lieu" />
|
||||||
|
<div id="lieu-nom-error" class="text-sm text-red-500 mt-1 hidden"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="map" class="w-full h-96 mb-4 rounded-lg"></div>
|
||||||
|
|
||||||
|
<div class="flex justify-end space-x-4">
|
||||||
|
<button type="button" id="cancel-add-lieu" class="px-4 py-2 bg-gray-500 text-white rounded-lg hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-gray-300">Annuler</button>
|
||||||
|
<button type="button" id="save-lieu" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-300">Enregistrer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% block javascripts %}
|
||||||
|
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet-geosearch/dist/geosearch.umd.js"></script>
|
||||||
|
{{ encore_entry_script_tags('add-lieu') }}
|
||||||
|
{{ encore_entry_script_tags('show-lieu') }}
|
||||||
|
{% endblock %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -62,12 +62,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||||
<div>
|
|
||||||
<label for="ville" class="block text-sm font-semibold text-gray-700 mb-2">
|
|
||||||
🏙️ Ville
|
|
||||||
</label>
|
|
||||||
{{ form_row(form.ville, { 'attr': { 'class': 'w-full rounded-md border-gray-300 shadow focus:ring-blue-500 focus:border-blue-500' } }) }}
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<label for="lieu" class="block text-sm font-semibold text-gray-700 mb-2">
|
<label for="lieu" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||||
📍 Lieu
|
📍 Lieu
|
||||||
|
|||||||
@@ -93,8 +93,8 @@
|
|||||||
<ul class="mt-4 text-gray-700 space-y-2">
|
<ul class="mt-4 text-gray-700 space-y-2">
|
||||||
<li><strong>🏢 Nom :</strong> {{ sortie.lieu.nom }}</li>
|
<li><strong>🏢 Nom :</strong> {{ sortie.lieu.nom }}</li>
|
||||||
<li><strong>📍 Rue :</strong> {{ sortie.lieu.rue }}</li>
|
<li><strong>📍 Rue :</strong> {{ sortie.lieu.rue }}</li>
|
||||||
<li><strong>🏙️ Ville :</strong> {{ sortie.lieu.ville.nom }}</li>
|
<li><strong>🏙️ Ville :</strong> {{ sortie.lieu.ville }}</li>
|
||||||
<li><strong>✉️ Code postal :</strong> {{ sortie.lieu.ville.codePostal }}</li>
|
<li><strong>✉️ Code postal :</strong> {{ sortie.lieu.ville }}</li>
|
||||||
<li><strong>🌍 Latitude :</strong> {{ sortie.lieu.latitude }}</li>
|
<li><strong>🌍 Latitude :</strong> {{ sortie.lieu.latitude }}</li>
|
||||||
<li><strong>🌍 Longitude :</strong> {{ sortie.lieu.longitude }}</li>
|
<li><strong>🌍 Longitude :</strong> {{ sortie.lieu.longitude }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ Encore
|
|||||||
* and one CSS file (e.g. app.css) if your JavaScript imports CSS.
|
* and one CSS file (e.g. app.css) if your JavaScript imports CSS.
|
||||||
*/
|
*/
|
||||||
.addEntry('app', './assets/app.js')
|
.addEntry('app', './assets/app.js')
|
||||||
.addEntry('lieu', './assets/js/lieu.js')
|
|
||||||
.addEntry('add-lieu', './assets/js/add-lieu.js')
|
.addEntry('add-lieu', './assets/js/add-lieu.js')
|
||||||
|
.addEntry('show-lieu', './assets/js/show-lieu.js')
|
||||||
|
|
||||||
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization.
|
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization.
|
||||||
.splitEntryChunks()
|
.splitEntryChunks()
|
||||||
|
|||||||
Reference in New Issue
Block a user