From 6a6b4b442b362183e52c4c7ec337f8ff93e50d7b Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Mon, 29 Dec 2025 00:45:55 +0100 Subject: [PATCH] xycyxc --- partials/landing/account/dashboard.php | 130 +++++++++++++++++-------- 1 file changed, 90 insertions(+), 40 deletions(-) diff --git a/partials/landing/account/dashboard.php b/partials/landing/account/dashboard.php index 66139d8..3693db8 100644 --- a/partials/landing/account/dashboard.php +++ b/partials/landing/account/dashboard.php @@ -511,6 +511,10 @@ $eventsPast = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; +
+ + Hält Karte und Adresse synchron. +
@@ -573,9 +577,14 @@ $eventsPast = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; const mapWrapper = document.getElementById('mapWrapper'); const mapContainer = document.getElementById('mapContainer'); const btnMapSearch = document.getElementById('btnMapSearch'); + const btnAddrToMap = document.getElementById('btnAddrToMap'); const mapSearch = document.getElementById('mapSearch'); const latInput = document.getElementById('evLat'); const lngInput = document.getElementById('evLng'); + const streetInput = document.getElementById('evStreet'); + const zipInput = document.getElementById('evZip'); + const cityInput = document.getElementById('evCity'); + const regionInput = document.getElementById('evRegion'); let map, marker; function ensureLeaflet(callback) { @@ -590,6 +599,71 @@ $eventsPast = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; document.body.appendChild(script); } + function updateAddressFields(addr) { + if (!addr) return; + if (streetInput) { + const street = [addr.road || '', addr.house_number || ''].filter(Boolean).join(' ').trim(); + if (street) streetInput.value = street; + } + if (zipInput && addr.postcode) zipInput.value = addr.postcode; + if (cityInput && (addr.city || addr.town || addr.village)) cityInput.value = addr.city || addr.town || addr.village; + if (regionInput && (addr.suburb || addr.state || addr.county)) regionInput.value = addr.suburb || addr.state || addr.county; + } + + function setLatLngInputs(latlng) { + latInput.value = latlng.lat.toFixed(7); + lngInput.value = latlng.lng.toFixed(7); + } + + function setMarker(latlng, center = true) { + if (!map) return; + if (marker) { + marker.setLatLng(latlng); + } else { + marker = L.marker(latlng, { draggable: true }).addTo(map); + marker.on('dragend', () => { + const ll = marker.getLatLng(); + setLatLngInputs(ll); + reverseGeocode(ll.lat, ll.lng); + }); + } + setLatLngInputs(latlng); + if (center) { + map.setView(latlng, Math.max(map.getZoom(), 14)); + } + } + + function reverseGeocode(lat, lng) { + fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${encodeURIComponent(lat)}&lon=${encodeURIComponent(lng)}`, { + headers: { 'Accept-Language': 'de', 'User-Agent': 'papa-kind-treff/1.0' }, + }) + .then(r => r.json()) + .then(data => updateAddressFields(data.address)) + .catch(() => {}); + } + + function geocodeAndPlace(query) { + fetch('https://nominatim.openstreetmap.org/search?format=jsonv2&limit=1&q=' + encodeURIComponent(query), { + headers: { 'Accept-Language': 'de', 'User-Agent': 'papa-kind-treff/1.0' }, + }) + .then(r => r.json()) + .then(data => { + if (Array.isArray(data) && data[0]) { + const lat = parseFloat(data[0].lat); + const lng = parseFloat(data[0].lon); + ensureLeaflet(() => { + mapWrapper.hidden = false; + initMap(); + if (!Number.isNaN(lat) && !Number.isNaN(lng)) { + setMarker({ lat, lng }); + updateAddressFields(data[0].address); + } + }); + } + }) + .catch(() => {}); + } + function initMap() { if (map) { map.invalidateSize(); return; } map = L.map(mapContainer).setView([51.1657, 10.4515], 6); @@ -598,22 +672,10 @@ $eventsPast = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; attribution: '© OpenStreetMap', }).addTo(map); - const setMarker = (latlng) => { - if (marker) { - marker.setLatLng(latlng); - } else { - marker = L.marker(latlng, { draggable: true }).addTo(map); - marker.on('dragend', () => { - const ll = marker.getLatLng(); - latInput.value = ll.lat.toFixed(7); - lngInput.value = ll.lng.toFixed(7); - }); - } - latInput.value = latlng.lat.toFixed(7); - lngInput.value = latlng.lng.toFixed(7); - }; - - map.on('click', (e) => setMarker(e.latlng)); + map.on('click', (e) => { + setMarker(e.latlng); + reverseGeocode(e.latlng.lat, e.latlng.lng); + }); const lat = parseFloat(latInput.value); const lng = parseFloat(lngInput.value); @@ -633,29 +695,17 @@ $eventsPast = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; btnMapSearch?.addEventListener('click', () => { const q = (mapSearch?.value || '').trim(); if (!q) return; - fetch('https://nominatim.openstreetmap.org/search?format=jsonv2&limit=1&q=' + encodeURIComponent(q), { - headers: { 'Accept-Language': 'de', 'User-Agent': 'papa-kind-treff/1.0' }, - }) - .then(r => r.json()) - .then(data => { - if (Array.isArray(data) && data[0]) { - const lat = parseFloat(data[0].lat); - const lng = parseFloat(data[0].lon); - ensureLeaflet(() => { - mapWrapper.hidden = false; - initMap(); - if (!Number.isNaN(lat) && !Number.isNaN(lng)) { - map.setView([lat, lng], 15); - if (window.L) { - if (!marker) marker = L.marker([lat, lng], { draggable: true }).addTo(map); - marker.setLatLng([lat, lng]); - latInput.value = lat.toFixed(7); - lngInput.value = lng.toFixed(7); - } - } - }); - } - }) - .catch(() => {}); + geocodeAndPlace(q); + }); + + btnAddrToMap?.addEventListener('click', () => { + const parts = [ + streetInput?.value || '', + zipInput?.value || '', + cityInput?.value || '', + regionInput?.value || '', + ].map(v => v.trim()).filter(Boolean); + if (!parts.length) return; + geocodeAndPlace(parts.join(', ')); });