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}
+
+
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 = '
';
+ 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 = '
';
- 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 = '
';
- 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({