From 0e18b46a153755f65df1d53e4aa3e3d9adcca02e Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 11 Oct 2026 21:24:52 +0200 Subject: [PATCH] =?UTF-8?q?Nastaven=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Core/MapovyPodklad.php | 38 +++++++ app/Presentation/@layout.latte | 6 +- app/Presentation/Mapa/default.latte | 2 +- .../Nastaveni/NastaveniPresenter.php | 46 ++++++++ app/Presentation/Nastaveni/default.latte | 25 +++++ app/Presentation/Obvod/view.latte | 2 +- app/Presentation/Stari/default.latte | 2 +- www/css/base.css | 35 ++++++ www/js/mapa.js | 59 +--------- www/js/mapove-podklady.js | 101 ++++++++++++++++++ www/js/obvod-nahled.js | 25 +---- www/js/stari.js | 40 +------ 12 files changed, 263 insertions(+), 118 deletions(-) create mode 100644 app/Core/MapovyPodklad.php create mode 100644 app/Presentation/Nastaveni/NastaveniPresenter.php create mode 100644 app/Presentation/Nastaveni/default.latte create mode 100644 www/js/mapove-podklady.js diff --git a/app/Core/MapovyPodklad.php b/app/Core/MapovyPodklad.php new file mode 100644 index 0000000..dcd976f --- /dev/null +++ b/app/Core/MapovyPodklad.php @@ -0,0 +1,38 @@ + + */ + public static function moznosti(): array + { + return [ + self::OSM => 'OpenStreetMap', + self::MAPYCZ => 'Mapy.cz', + self::MAPYCZ_LETECKA => 'Mapy.cz (letecká)', + ]; + } + + public static function platny(?string $hodnota): string + { + return array_key_exists((string) $hodnota, self::moznosti()) + ? (string) $hodnota + : self::VYCHOZI; + } +} diff --git a/app/Presentation/@layout.latte b/app/Presentation/@layout.latte index 57ff84c..c134db4 100644 --- a/app/Presentation/@layout.latte +++ b/app/Presentation/@layout.latte @@ -15,6 +15,7 @@ + {* Locate-Control *} @@ -28,7 +29,7 @@ {* naše vlastní styly *} - + {ifset title}{include title|stripHtml} | {/ifset}Obvody @@ -55,7 +56,8 @@ Home Mapa Obvody - Zvěstovatelé + Zvěstovatelé + Nastavení Odhlásit {else} Home diff --git a/app/Presentation/Mapa/default.latte b/app/Presentation/Mapa/default.latte index dc8dfc6..6294efe 100644 --- a/app/Presentation/Mapa/default.latte +++ b/app/Presentation/Mapa/default.latte @@ -11,5 +11,5 @@ - + {/block} diff --git a/app/Presentation/Nastaveni/NastaveniPresenter.php b/app/Presentation/Nastaveni/NastaveniPresenter.php new file mode 100644 index 0000000..7128055 --- /dev/null +++ b/app/Presentation/Nastaveni/NastaveniPresenter.php @@ -0,0 +1,46 @@ +addRadioList('podklad', 'Mapové podklady', MapovyPodklad::moznosti()) + ->setDefaultValue($this->aktualni()) + ->setRequired('Vyberte mapové podklady.'); + $form->addSubmit('send', 'Uložit'); + $form->addProtection('Platnost formuláře vypršela, odešlete ho znovu.'); + $form->onSuccess[] = $this->podkladFormSucceeded(...); + return $form; + } + + private function podkladFormSucceeded(Form $form, ArrayHash $values): void + { + $this->getHttpResponse()->setCookie( + MapovyPodklad::COOKIE, + MapovyPodklad::platny((string) $values->podklad), + '+1 year', + '/', + null, + null, + false, + ); + $this->flashMessage('Nastavení bylo uloženo.'); + $this->redirect('default'); + } + + private function aktualni(): string + { + return MapovyPodklad::platny($this->getHttpRequest()->getCookie(MapovyPodklad::COOKIE)); + } +} diff --git a/app/Presentation/Nastaveni/default.latte b/app/Presentation/Nastaveni/default.latte new file mode 100644 index 0000000..ae486d6 --- /dev/null +++ b/app/Presentation/Nastaveni/default.latte @@ -0,0 +1,25 @@ +{block content} + +
+
+
+

Nastavení

+

Platí jen pro toto zařízení.

+
+
+ +
+
{$error}
+
+ Mapové podklady +

Výchozí podklad je OpenStreetMap. Vybraná mapa se použije na celé mapě i v náhledu obvodu.

+
+ + +
+
+
+ +
+
+
diff --git a/app/Presentation/Obvod/view.latte b/app/Presentation/Obvod/view.latte index a80d357..f43a7d1 100644 --- a/app/Presentation/Obvod/view.latte +++ b/app/Presentation/Obvod/view.latte @@ -161,7 +161,7 @@ - + - + {/block} diff --git a/www/css/base.css b/www/css/base.css index 387b1d4..1f3fd1c 100644 --- a/www/css/base.css +++ b/www/css/base.css @@ -724,6 +724,41 @@ body:has(#map[data-max]) { margin-top: 0.4rem; } +.podklady { + border: 0; + margin: 0 0 0.85rem; + padding: 0; +} + +.podklady-popis { + margin-bottom: 0.75rem; +} + +.formular .form-check { + display: flex; + align-items: center; + gap: 0.55rem; + min-height: 2.2rem; + margin-bottom: 0.2rem; +} + +.formular .form-check-input { + width: 1.15rem; + height: 1.15rem; + margin: 0; + border-color: #2652a8; +} + +.formular .form-check-input:checked { + background-color: #2652a8; + border-color: #2652a8; +} + +.formular .form-check-label { + color: #1a1a1a; + font-size: 1.05rem; +} + .tabulka { width: 100%; border-collapse: separate; diff --git a/www/js/mapa.js b/www/js/mapa.js index 4411ae0..8ebad4e 100644 --- a/www/js/mapa.js +++ b/www/js/mapa.js @@ -1,63 +1,12 @@ -// Mapy.CZ: -const API_KEY = 'Uw8gm6JPZpnT3GfNnh8adARpQI-WBGy6QaY9g6VhD74'; -var mapyCZ = L.tileLayer(`https://api.mapy.cz/v1/maptiles/basic/256/{z}/{x}/{y}?apikey=${API_KEY}`, { - minZoom: 0, - maxZoom: 19, - attribution: '© Seznam.cz a.s. a další', -}) -var mapyCZletecka = L.tileLayer(`https://api.mapy.cz/v1/maptiles/aerial/256/{z}/{x}/{y}?apikey=${API_KEY}`, { - minZoom: 0, - maxZoom: 19, - attribution: '© Seznam.cz a.s. a další', -}) -// OpenStreetMap - base: -var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { - maxZoom: 19, - attribution: '© OpenStreetMap' -}) - -// Výchozí bod + podkladové mapy: +var podklady = MapovePodklady.vytvor(); var map = L.map('map', { center: [50.853501146, 14.8425], // Hrádek zoom: 13, - layers: [mapyCZ] + layers: [MapovePodklady.vychozi(podklady)] }); -// Rámeček s výběrem podkladů: -var baseMaps = { - "Mapy.cz": mapyCZ, - "Mapy.cz (letecká)": mapyCZletecka, - "OpenStreetMap": osm -}; -var layerControl = L.control.layers(baseMaps).addTo(map); - -/* -We also require you to include our logo somewhere over the map. -We create our own map control implementing a documented interface, -that shows a clickable logo. -See https://leafletjs.com/reference.html#control -*/ -const LogoControl = L.Control.extend({ - options: { - position: 'bottomleft', - }, - - onAdd: function (map) { - const container = L.DomUtil.create('div'); - const link = L.DomUtil.create('a', '', container); - - link.setAttribute('href', 'http://mapy.cz/'); - link.setAttribute('target', '_blank'); - link.innerHTML = ''; - L.DomEvent.disableClickPropagation(link); - - return container; - }, -}); -// finally we add our LogoControl to the map -new LogoControl().addTo(map, { - layers: [mapyCZ, mapyCZletecka] -}); +var layerControl = L.control.layers(MapovePodklady.popisky(podklady)).addTo(map); +MapovePodklady.logo(map, podklady); // futury: function onEachFeature(feature, layer) { diff --git a/www/js/mapove-podklady.js b/www/js/mapove-podklady.js new file mode 100644 index 0000000..773772a --- /dev/null +++ b/www/js/mapove-podklady.js @@ -0,0 +1,101 @@ +// Sdílené podkladové mapy. Výchozí je OpenStreetMap, volbu drží cookie mapovyPodklad. +(function (global) { + var COOKIE = 'mapovyPodklad'; + var VYCHOZI = 'osm'; + var API_KEY = 'Uw8gm6JPZpnT3GfNnh8adARpQI-WBGy6QaY9g6VhD74'; + + function ctiCookie(jmeno) { + var shoda = document.cookie.match(new RegExp('(?:^|; )' + jmeno + '=([^;]*)')); + if (!shoda) { + return ''; + } + try { + return decodeURIComponent(shoda[1]); + } catch (e) { + return shoda[1]; + } + } + + function klic() { + var hodnota = ctiCookie(COOKIE); + if (hodnota === 'mapycz' || hodnota === 'mapycz-letecka') { + return hodnota; + } + return VYCHOZI; + } + + function vytvor() { + return { + osm: L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap', + }), + mapycz: L.tileLayer('https://api.mapy.cz/v1/maptiles/basic/256/{z}/{x}/{y}?apikey=' + API_KEY, { + minZoom: 0, + maxZoom: 19, + attribution: '© Seznam.cz a.s. a další', + }), + 'mapycz-letecka': L.tileLayer('https://api.mapy.cz/v1/maptiles/aerial/256/{z}/{x}/{y}?apikey=' + API_KEY, { + minZoom: 0, + maxZoom: 19, + attribution: '© Seznam.cz a.s. a další', + }), + }; + } + + function vychozi(vrstvy) { + return vrstvy[klic()] || vrstvy[VYCHOZI]; + } + + function popisky(vrstvy) { + return { + 'Mapy.cz': vrstvy.mapycz, + 'Mapy.cz (letecká)': vrstvy['mapycz-letecka'], + 'OpenStreetMap': vrstvy.osm, + }; + } + + function jeMapyCz(vrstva, vrstvy) { + return vrstva === vrstvy.mapycz || vrstva === vrstvy['mapycz-letecka']; + } + + function logo(map, vrstvy) { + var control = new (L.Control.extend({ + options: { position: 'bottomleft' }, + onAdd: function () { + var container = L.DomUtil.create('div'); + var link = L.DomUtil.create('a', '', container); + link.setAttribute('href', 'http://mapy.cz/'); + link.setAttribute('target', '_blank'); + link.innerHTML = 'Mapy.cz'; + L.DomEvent.disableClickPropagation(link); + return container; + }, + }))(); + + function obnov() { + var aktivni = false; + map.eachLayer(function (layer) { + if (jeMapyCz(layer, vrstvy)) { + aktivni = true; + } + }); + if (aktivni && !control._map) { + control.addTo(map); + } else if (!aktivni && control._map) { + control.remove(); + } + } + + map.on('baselayerchange', obnov); + obnov(); + } + + global.MapovePodklady = { + klic: klic, + vytvor: vytvor, + vychozi: vychozi, + popisky: popisky, + logo: logo, + }; +})(window); diff --git a/www/js/obvod-nahled.js b/www/js/obvod-nahled.js index 3b46afa..60db011 100644 --- a/www/js/obvod-nahled.js +++ b/www/js/obvod-nahled.js @@ -11,33 +11,14 @@ return; } - var API_KEY = 'Uw8gm6JPZpnT3GfNnh8adARpQI-WBGy6QaY9g6VhD74'; - var mapyCZ = L.tileLayer('https://api.mapy.cz/v1/maptiles/basic/256/{z}/{x}/{y}?apikey=' + API_KEY, { - minZoom: 0, - maxZoom: 19, - attribution: '© Seznam.cz a.s. a další', - }); - + var podklady = MapovePodklady.vytvor(); var map = L.map(el, { center: [50.853501146, 14.8425], zoom: 14, - layers: [mapyCZ], + layers: [MapovePodklady.vychozi(podklady)], scrollWheelZoom: false, }); - - var LogoControl = L.Control.extend({ - options: { position: 'bottomleft' }, - onAdd: function () { - var container = L.DomUtil.create('div'); - var link = L.DomUtil.create('a', '', container); - link.setAttribute('href', 'http://mapy.cz/'); - link.setAttribute('target', '_blank'); - link.innerHTML = 'Mapy.cz'; - L.DomEvent.disableClickPropagation(link); - return container; - }, - }); - new LogoControl().addTo(map); + MapovePodklady.logo(map, podklady); function style() { return { diff --git a/www/js/stari.js b/www/js/stari.js index 6ec8998..dadbd0b 100644 --- a/www/js/stari.js +++ b/www/js/stari.js @@ -116,47 +116,15 @@ }; } - var API_KEY = 'Uw8gm6JPZpnT3GfNnh8adARpQI-WBGy6QaY9g6VhD74'; - var mapyCZ = L.tileLayer('https://api.mapy.cz/v1/maptiles/basic/256/{z}/{x}/{y}?apikey=' + API_KEY, { - minZoom: 0, - maxZoom: 19, - attribution: '© Seznam.cz a.s. a další', - }); - var mapyCZletecka = L.tileLayer('https://api.mapy.cz/v1/maptiles/aerial/256/{z}/{x}/{y}?apikey=' + API_KEY, { - minZoom: 0, - maxZoom: 19, - attribution: '© Seznam.cz a.s. a další', - }); - var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { - maxZoom: 19, - attribution: '© OpenStreetMap', - }); - + var podklady = MapovePodklady.vytvor(); var map = L.map(mapaEl, { center: [50.853501146, 14.8425], zoom: 13, - layers: [mapyCZ], + layers: [MapovePodklady.vychozi(podklady)], }); - L.control.layers({ - 'Mapy.cz': mapyCZ, - 'Mapy.cz (letecká)': mapyCZletecka, - 'OpenStreetMap': osm, - }).addTo(map); - - var LogoControl = L.Control.extend({ - options: { position: 'bottomleft' }, - onAdd: function () { - var container = L.DomUtil.create('div'); - var link = L.DomUtil.create('a', '', container); - link.setAttribute('href', 'http://mapy.cz/'); - link.setAttribute('target', '_blank'); - link.innerHTML = 'Mapy.cz'; - L.DomEvent.disableClickPropagation(link); - return container; - }, - }); - new LogoControl().addTo(map); + L.control.layers(MapovePodklady.popisky(podklady)).addTo(map); + MapovePodklady.logo(map, podklady); var legendaEl = null; var Legenda = L.Control.extend({