1<?php 2 3/** 4 * webtrees: online genealogy 5 * Copyright (C) 2022 webtrees development team 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18declare(strict_types=1); 19 20namespace Fisharebest\Webtrees\Module; 21 22use Fisharebest\Webtrees\FlashMessages; 23use Fisharebest\Webtrees\I18N; 24use Psr\Http\Message\ResponseInterface; 25use Psr\Http\Message\ServerRequestInterface; 26 27use function redirect; 28 29/** 30 * Class MapBox - use maps within webtrees 31 */ 32class MapBox extends AbstractModule implements ModuleConfigInterface, ModuleMapProviderInterface 33{ 34 use ModuleConfigTrait; 35 use ModuleMapProviderTrait; 36 37 /** 38 * Name of the map provider. 39 * 40 * @return string 41 */ 42 public function description(): string 43 { 44 $link = '<a href="https://www.mapbox.com" dir="ltr">www.mapbox.com</a>'; 45 46 // I18N: %s is a link/URL 47 return I18N::translate('Create maps using %s.', $link); 48 } 49 50 /** 51 * Should this module be enabled when it is first installed? 52 * 53 * @return bool 54 */ 55 public function isEnabledByDefault(): bool 56 { 57 return false; 58 } 59 60 /** 61 * @return ResponseInterface 62 */ 63 public function getAdminAction(): ResponseInterface 64 { 65 $this->layout = 'layouts/administration'; 66 67 $api_key = $this->getPreference('api_key'); 68 69 return $this->viewResponse('modules/map-box/config', [ 70 'api_key' => $api_key, 71 'title' => $this->title(), 72 ]); 73 } 74 75 /** 76 * Name of the map provider. 77 * 78 * @return string 79 */ 80 public function title(): string 81 { 82 return /* I18N: mapbox.com */ I18N::translate('Mapbox'); 83 } 84 85 /** 86 * @param ServerRequestInterface $request 87 * 88 * @return ResponseInterface 89 */ 90 public function postAdminAction(ServerRequestInterface $request): ResponseInterface 91 { 92 $params = (array) $request->getParsedBody(); 93 94 $this->setPreference('api_key', $params['api_key'] ?? ''); 95 96 FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); 97 98 return redirect($this->getConfigLink()); 99 } 100 101 /** 102 * Parameters to create a TileLayer in LeafletJs. 103 * 104 * @return array<object> 105 */ 106 public function leafletJsTileLayers(): array 107 { 108 $api_key = $this->getPreference('api_key'); 109 110 return [ 111 (object) [ 112 'accessToken' => $api_key, 113 'attribution' => '©<a href="https://www.mapbox.com/about/maps">Mapbox</a> ©<a href="https://www.openstreetmap.org/copyrightt">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback">Improve this map</a></strong>', 114 'default' => false, 115 'id' => 'dark-v10', 116 'label' => 'Dark', 117 'maxZoom' => 20, 118 'minZoom' => 2, 119 'subdomains' => ['a', 'b', 'c', 'd'], 120 'tileSize' => 512, 121 'url' => 'https://api.mapbox.com/styles/v1/mapbox/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', 122 'zoomOffset' => -1, 123 ], 124 (object) [ 125 'accessToken' => $api_key, 126 'attribution' => '©<a href="https://www.mapbox.com/about/maps">Mapbox</a> ©<a href="https://www.openstreetmap.org/copyrightt">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback">Improve this map</a></strong>', 127 'default' => true, 128 'id' => 'light-v10', 129 'label' => 'Light', 130 'maxZoom' => 20, 131 'minZoom' => 2, 132 'subdomains' => ['a', 'b', 'c', 'd'], 133 'tileSize' => 512, 134 'url' => 'https://api.mapbox.com/styles/v1/mapbox/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', 135 'zoomOffset' => -1, 136 ], 137 (object) [ 138 'accessToken' => $api_key, 139 'attribution' => '©<a href="https://www.mapbox.com/about/maps">Mapbox</a> ©<a href="https://www.openstreetmap.org/copyrightt">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback">Improve this map</a></strong>', 140 'default' => false, 141 'id' => 'outdoors-v11', 142 'label' => 'Outdoors', 143 'maxZoom' => 20, 144 'minZoom' => 2, 145 'subdomains' => ['a', 'b', 'c', 'd'], 146 'tileSize' => 512, 147 'url' => 'https://api.mapbox.com/styles/v1/mapbox/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', 148 'zoomOffset' => -1, 149 ], 150 (object) [ 151 'accessToken' => $api_key, 152 'attribution' => '©<a href="https://www.mapbox.com/about/maps">Mapbox</a> ©<a href="https://www.openstreetmap.org/copyrightt">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback">Improve this map</a></strong>', 153 'default' => false, 154 'id' => 'satellite-v9', 155 'label' => 'Satellite', 156 'maxZoom' => 20, 157 'minZoom' => 2, 158 'subdomains' => ['a', 'b', 'c', 'd'], 159 'tileSize' => 512, 160 'url' => 'https://api.mapbox.com/styles/v1/mapbox/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', 161 'zoomOffset' => -1, 162 ], 163 (object) [ 164 'accessToken' => $api_key, 165 'attribution' => '©<a href="https://www.mapbox.com/about/maps">Mapbox</a> ©<a href="https://www.openstreetmap.org/copyrightt">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback">Improve this map</a></strong>', 166 'default' => false, 167 'id' => 'streets-v11', 168 'label' => 'Streets', 169 'maxZoom' => 20, 170 'minZoom' => 2, 171 'subdomains' => ['a', 'b', 'c', 'd'], 172 'tileSize' => 512, 173 'url' => 'https://api.mapbox.com/styles/v1/mapbox/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', 174 'zoomOffset' => -1, 175 ], 176 ]; 177 } 178} 179