function colorHeadingTable() { const headers = document.querySelectorAll('th'); headers.forEach(header => { const text = header.textContent; const match = text.match(/\((\d+)\s*\/\s*(\d+)\)/); if (match) { const [_, completed, total] = match; const ratio = completed / total; const alpha = ratio.toFixed(2); header.style.backgroundColor = `rgba(154, 205, 50, ${alpha})`; } }); } function check_validity(e) { let errors = []; document.querySelectorAll('.is-invalid').forEach(input => { input.classList.remove('is-invalid'); }); const nameInput = document.querySelector('input[name="commerce_tag_value__name"]'); if (!nameInput.value.trim()) { errors.push("Le nom de l'établissement est obligatoire"); nameInput.classList.add('is-invalid'); } const emailInput = document.querySelector('input[name="commerce_tag_value__contact:email"]'); if (emailInput && emailInput.value) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(emailInput.value)) { errors.push("L'adresse email n'est pas valide"); emailInput.classList.add('is-invalid'); } } const phoneInput = document.querySelector('input[name="commerce_tag_value__contact:phone"]'); if (phoneInput && phoneInput.value) { const phoneRegex = /^(\+33|0)[1-9](\d{2}){4}$/; if (!phoneRegex.test(phoneInput.value.replace(/\s/g, ''))) { errors.push("Le numéro de téléphone n'est pas valide"); phoneInput.classList.add('is-invalid'); } } if (errors.length > 0) { e.preventDefault(); document.querySelector('#validation_messages').innerHTML = errors.join('
'); document.querySelector('#validation_messages').classList.add('is-invalid'); } } // Générer une couleur pastel aléatoire const genererCouleurPastel = () => { // Utiliser des valeurs plus claires (180-255) pour obtenir des tons pastel const r = Math.floor(Math.random() * 75 + 180); const g = Math.floor(Math.random() * 75 + 180); const b = Math.floor(Math.random() * 75 + 180); return `rgb(${r}, ${g}, ${b})`; }; async function searchInseeCode(query) { try { // Afficher l'indicateur de chargement document.querySelector('#loading_search_insee').classList.remove('d-none'); const response = await fetch(`https://geo.api.gouv.fr/communes?nom=${query}&fields=nom,code,codesPostaux&limit=10`); const data = await response.json(); document.querySelector('#loading_search_insee').classList.add('d-none'); return data.map(commune => ({ label: `${commune.nom} (${commune.codesPostaux.join(', ')}, code insee ${commune.code})`, insee: commune.code, postcodes: commune.codesPostaux })); } catch (error) { console.error('Erreur lors de la recherche du code INSEE:', error); return []; } } function updateMapHeightForLargeScreens() { const mapFound = document.querySelector('#map'); if (mapFound && window.innerHeight > 800 && window.innerWidth > 800) { mapFound.style.height = window.innerWidth * 0.8 + 'px'; } else { console.log('window.innerHeight', window.innerHeight); } } // lister les changesets de l'utilisateur osm-commerces async function listChangesets() { // Ajouter le header Accept pour demander du JSON const options = { headers: { 'Accept': 'application/json' } }; const changesets = await fetch('https://api.openstreetmap.org/api/0.6/changesets?display_name=osm-commerce-fr', options); const data = await changesets.json(); console.log(data.changesets.length); // Grouper les changesets par période const now = new Date(); const last24h = new Date(now - 24 * 60 * 60 * 1000); const last7days = new Date(now - 7 * 24 * 60 * 60 * 1000); const last30days = new Date(now - 30 * 24 * 60 * 60 * 1000); const stats = { last24h: 0, last7days: 0, last30days: 0 }; data.changesets.forEach(changeset => { const changesetDate = new Date(changeset.closed_at); if (changesetDate >= last24h) { stats.last24h++; } if (changesetDate >= last7days) { stats.last7days++; } if (changesetDate >= last30days) { stats.last30days++; } }); // Afficher les statistiques const historyDiv = document.getElementById('userChangesHistory'); if (historyDiv) { historyDiv.innerHTML = `

Changesets créés :

Dernières 24h :
${stats.last24h}
7 derniers jours :
${stats.last7days}
30 derniers jours :
${stats.last30days}
`; } } function openInPanoramax() { const center = map.getCenter(); const zoom = map.getZoom(); const panoramaxUrl = `https://api.panoramax.xyz/?focus=map&map=${zoom}/${center.lat}/${center.lng}`; window.open(panoramaxUrl); } window.openInPanoramax = openInPanoramax; window.listChangesets = listChangesets; window.updateMapHeightForLargeScreens = updateMapHeightForLargeScreens; window.searchInseeCode = searchInseeCode; window.genererCouleurPastel = genererCouleurPastel; window.check_validity = check_validity;