d4a37aca52
QoL 2/2: pole „Szukaj miejsca" (nazwa/adres/POI) + interaktywna mapa na formularzach horoskopu / interpretacji / kalendarza. Bez klucza API. - geocode.py: proxy OSM/Nominatim PO STRONIE SERWERA (poprawny User-Agent, throttling ~1 req/s, cache TTL 1h) — endpointy /geocode i /reverse. Wolanie z serwera, nie z przegladarki: latwiej trzymac polityke Nominatim i dziala niezaleznie od secure-context (http://<ip>). - _location_picker.html: wspolny partial (search + wyniki + mapa + atrybucja), wpiety includem do 3 formularzy z polami lat/lon. - geo.js: Leaflet — wyszukiwanie (debounce), klik na wynik ustawia lat/lon i centruje mape, klik/drag pineski ustawia wspolrzedne + /reverse pokazuje nazwe; sync z „Tu i teraz" (now.js emituje event astrololo:coords). - Leaflet 1.9.4 vendorowany lokalnie (static/vendor/leaflet, BSD-2-Clause, permisywny) — niezaleznosc od CDN; kafelki mapy z OSM. Marker jako divIcon (bez plikow PNG). - styles.css: style pod ciemny motyw. Zweryfikowane w przegladarce: domyslny widok (pineska na Szpitalu Barlickiego), wyszukanie „Wawel Krakow" -> lista -> klik ustawia 50.0547/19.9361 i przesuwa mape, klik w mape ustawia wspolrzedne + reverse wypelnia nazwe. Zero bledow w konsoli. /geocode i /reverse zwracaja szpital; cache dziala. Uwaga wdrozeniowa: pod prezentacji potrzebuje egressu do nominatim.openstreetmap.org; przegladarki — do tile.openstreetmap.org. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
45 lines
1.9 KiB
JavaScript
45 lines
1.9 KiB
JavaScript
// „Tu i teraz": uzupełnia datę/godzinę/strefę z przeglądarki oraz — jeśli to
|
|
// możliwe — lokalizację (lat/lon).
|
|
//
|
|
// UWAGA: geolokalizacja przeglądarki działa tylko w "secure context"
|
|
// (https:// lub localhost). Na http://<ip> przeglądarka NIE pyta o zgodę,
|
|
// tylko po cichu odmawia — dlatego pokazujemy jawny komunikat w #geoNote.
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
const btn = document.getElementById('nowBtn');
|
|
if (!btn) return;
|
|
|
|
const note = document.getElementById('geoNote');
|
|
const say = msg => { if (note) note.textContent = msg; };
|
|
|
|
btn.addEventListener('click', function () {
|
|
const d = new Date();
|
|
const pad = n => String(n).padStart(2, '0');
|
|
document.querySelector('input[name=date]').value =
|
|
d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());
|
|
document.querySelector('input[name=time]').value = pad(d.getHours()) + ':' + pad(d.getMinutes());
|
|
document.querySelector('input[name=tz_offset]').value = (-d.getTimezoneOffset() / 60);
|
|
|
|
if (!('geolocation' in navigator)) {
|
|
say('Ta przeglądarka nie udostępnia geolokalizacji — wpisz lat/lon ręcznie.');
|
|
return;
|
|
}
|
|
if (!window.isSecureContext) {
|
|
say('Lokalizacja z przeglądarki wymaga HTTPS lub localhost (otwarto przez http://) — wpisz lat/lon ręcznie.');
|
|
return;
|
|
}
|
|
say('Pobieram lokalizację…');
|
|
navigator.geolocation.getCurrentPosition(
|
|
function (pos) {
|
|
document.querySelector('input[name=lat]').value = pos.coords.latitude.toFixed(4);
|
|
document.querySelector('input[name=lon]').value = pos.coords.longitude.toFixed(4);
|
|
document.dispatchEvent(new CustomEvent('astrololo:coords')); // zsynchronizuj mapę (geo.js)
|
|
say('Lokalizacja pobrana ✓');
|
|
},
|
|
function (err) {
|
|
say('Nie udało się pobrać lokalizacji: ' + (err && err.message ? err.message : 'odmowa dostępu'));
|
|
},
|
|
{ timeout: 8000 }
|
|
);
|
|
});
|
|
});
|