// Variable globale pour les données de l'événement let eventData = null // Initialize the map const map = new maplibregl.Map({ container: 'map', style: 'https://tiles.openfreemap.org/styles/liberty', center: [2.2137, 46.2276], // Default center (center of metropolitan France) zoom: 5 }); // Add navigation controls map.addControl(new maplibregl.NavigationControl()); // Add attribution control with OpenStreetMap attribution map.addControl(new maplibregl.AttributionControl({ customAttribution: '© OpenStreetMap contributors' })); // Add marker for event location let marker = new maplibregl.Marker({ draggable: true }); ; // Function to populate form with event data function populateForm() { console.log('🔄 Tentative de récupération des données événement...'); // Essayer de récupérer les données depuis window (définies dans le template) try { if (typeof window.eventData !== 'undefined' && window.eventData) { eventData = window.eventData; console.log('✅ Données événement récupérées depuis window:', eventData); } else { throw new Error('Aucune donnée d\'événement trouvée dans window.eventData'); } } catch (error) { console.error('❌ Erreur lors de la récupération des données événement:', error); showResult('Erreur lors du chargement des données de l\'événement: ' + error.message, 'error'); return; } // Vérifier la validité des données if (!eventData) { console.error('❌ eventData est null ou undefined'); showResult('Données d\'événement manquantes', 'error'); return; } if (!eventData.properties) { console.error('❌ eventData.properties est manquant:', eventData); showResult('Structure de données d\'événement invalide (properties manquant)', 'error'); return; } console.log('✅ Données événement validées, remplissage du formulaire...'); // Remplir le tableau des propriétés populatePropertiesTable(eventData.properties); const properties = eventData.properties; // Set form values document.getElementById('label').value = properties.label || ''; document.getElementById('type').value = properties.type || 'scheduled'; document.getElementById('what').value = properties.what || ''; // Handle optional fields if (properties['what:series']) { document.getElementById('what_series').value = properties['what:series']; } if (properties.where) { document.getElementById('where').value = properties.where; } // Format dates for datetime-local input if (properties.start) { const startDate = new Date(properties.start); document.getElementById('start').value = startDate.toISOString().slice(0, 16); } if (properties.stop) { const stopDate = new Date(properties.stop); document.getElementById('stop').value = stopDate.toISOString().slice(0, 16); } // Set marker on map if (eventData.geometry && eventData.geometry.coordinates) { const coords = eventData.geometry.coordinates; marker.setLngLat(coords).addTo(map); // Center map on event location map.flyTo({ center: coords, zoom: 10 }); } // Initialiser l'autocomplétion pour le champ "what" const whatInput = document.getElementById('what'); if (whatInput && window.initializeEventTypeAutocomplete) { initializeEventTypeAutocomplete(whatInput); } } // Function to populate the properties table function populatePropertiesTable(properties) { const tableBody = document.getElementById('propertiesTableBody'); if (!tableBody) return; // Clear existing rows tableBody.innerHTML = ''; // Sort properties alphabetically const sortedProperties = Object.keys(properties).sort(); sortedProperties.forEach(key => { const value = properties[key]; const row = document.createElement('tr'); // Determine value type and format let displayValue; let valueType; if (value === null) { displayValue = 'null'; valueType = 'null'; } else if (typeof value === 'object') { displayValue = `
${JSON.stringify(value, null, 2)}`; valueType = 'object'; } else if (typeof value === 'string' && value.match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/)) { displayValue = value + ` (${new Date(value).toLocaleString()})`; valueType = 'datetime'; } else if (typeof value === 'string' && value.startsWith('http')) { displayValue = `${value}`; valueType = 'url'; } else { displayValue = String(value); valueType = typeof value; } row.innerHTML = `
'; if (eventId) { linksHtml += `Voir l'événement | `; } linksHtml += 'Retour à la carte
'; resultElement.innerHTML += linksHtml; }) .catch(error => { console.error('❌ Erreur lors de la modification:', error); showResult(`❌ Erreur lors de la modification: ${error.message}`, 'error'); }); }); // Handle delete button click document.getElementById('deleteButton').addEventListener('click', function() { // Get event ID const eventId = document.getElementById('eventId').value; // Show confirmation dialog if (confirm('Êtes-vous sûr de vouloir supprimer cet événement ? Cette action ne peut pas être annulée.')) { // Show loading message showResult('Suppression en cours...', 'info'); // Submit delete request to external API fetch(`https://api.openeventdatabase.org/event/${eventId}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' } }) .then(response => { if (response.ok || response.status === 204) { showResult('✅ Événement supprimé avec succès !', 'success'); // Add link to go back to map const resultElement = document.getElementById('result'); resultElement.innerHTML += ``; // Disable form controls const formElements = document.querySelectorAll('#eventForm input, #eventForm select, #eventForm button'); formElements.forEach(element => { element.disabled = true; }); // Redirect to demo page after 3 seconds setTimeout(() => { window.location.href = '/demo'; }, 3000); } else if (response.status === 404) { throw new Error('Événement non trouvé sur l\'API externe'); } else if (response.status === 403) { throw new Error('Accès non autorisé - un secret pourrait être requis pour supprimer cet événement'); } else { return response.text().then(text => { throw new Error(text || `Erreur HTTP ${response.status}: ${response.statusText}`); }); } }) .catch(error => { console.error('Erreur lors de la suppression:', error); if (error.name === 'TypeError' && error.message.includes('Failed to fetch')) { showResult('❌ Erreur de connexion : Impossible de joindre l\'API api.openeventdatabase.org', 'error'); } else { showResult(`❌ Erreur lors de la suppression : ${error.message}`, 'error'); } }); } });