diff --git a/database/migrations/structure/20220526_1315_unlisted_maps.sql b/database/migrations/structure/20220526_1315_unlisted_maps.sql new file mode 100644 index 0000000..bd91f6b --- /dev/null +++ b/database/migrations/structure/20220526_1315_unlisted_maps.sql @@ -0,0 +1,2 @@ +ALTER TABLE `maps` + ADD `unlisted` TINYINT(1) NOT NULL DEFAULT 0; diff --git a/public/static/css/maps.css b/public/static/css/maps.css index 70e7821..275265b 100644 --- a/public/static/css/maps.css +++ b/public/static/css/maps.css @@ -13,6 +13,10 @@ div.mapItem.new { align-items: center; } +div.mapItem.unlisted { + opacity: 0.6; +} + div.mapItem>div.title { background-color: #28a745; color: white; diff --git a/public/static/js/map_editor.js b/public/static/js/map_editor.js index 433bc05..6533941 100644 --- a/public/static/js/map_editor.js +++ b/public/static/js/map_editor.js @@ -18,6 +18,7 @@ MapEditor.metadata.name = form.elements.name.value; MapEditor.metadata.description = form.elements.description.value; + MapEditor.metadata.unlisted = form.elements.unlisted.checked; document.getElementById('mapName').innerHTML = form.elements.name.value ? form.elements.name.value : '[unnamed map]'; @@ -254,6 +255,9 @@ if (MapEditor.metadata.description !== null) { data.append('description', MapEditor.metadata.description); } + if (MapEditor.metadata.unlisted !== null) { + data.append('unlisted', MapEditor.metadata.unlisted); + } for (var placeId in MapEditor.added) { if (!MapEditor.added.hasOwnProperty(placeId)) { diff --git a/src/Controller/MapAdminController.php b/src/Controller/MapAdminController.php index aff6a7e..dd00f88 100644 --- a/src/Controller/MapAdminController.php +++ b/src/Controller/MapAdminController.php @@ -81,6 +81,7 @@ class MapAdminController implements ISecured 'mapId' => $mapId, 'mapName' => $map->getName(), 'mapDescription' => str_replace('
', "\n", $map->getDescription()), + 'mapUnlisted' => $map->getUnlisted(), 'bounds' => $map->getBounds()->toArray(), 'places' => &$places ]); @@ -175,6 +176,9 @@ class MapAdminController implements ISecured if (isset($_POST['description'])) { $map->setDescription(str_replace(["\n", "\r\n"], '
', $_POST['description'])); } + if (isset($_POST['unlisted'])) { + $map->setUnlisted((bool)$_POST['unlisted']); + } $this->pdm->saveToDb($map); diff --git a/src/Controller/MapsController.php b/src/Controller/MapsController.php index 87bca4c..d4f68af 100644 --- a/src/Controller/MapsController.php +++ b/src/Controller/MapsController.php @@ -30,12 +30,19 @@ class MapsController ['maps', 'bound_north_lat'], ['maps', 'bound_east_lng'], ['maps', 'area'], + ['maps', 'unlisted'], new RawExpression('COUNT(places.id) AS num_places') ]); $select->leftJoin('places', ['places', 'map_id'], '=', ['maps', 'id']); $select->groupBy(['maps', 'id']); $select->orderBy('name'); + $user = $this->request->user(); + $isAdmin = $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN); + if (!$isAdmin) { + $select->where(['maps', 'unlisted'], '=', false); + } + $result = $select->execute(); $maps = []; @@ -45,11 +52,10 @@ class MapsController $maps[] = $map; } - $user = $this->request->user(); return new HtmlContent('maps', [ 'maps' => $maps, 'isLoggedIn' => $user !== null, - 'isAdmin' => $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN) + 'isAdmin' => $isAdmin ]); } diff --git a/src/PersistentData/Model/Map.php b/src/PersistentData/Model/Map.php index 919c156..cabcb66 100644 --- a/src/PersistentData/Model/Map.php +++ b/src/PersistentData/Model/Map.php @@ -6,7 +6,7 @@ class Map extends Model { protected static string $table = 'maps'; - protected static array $fields = ['name', 'description', 'bound_south_lat', 'bound_west_lng', 'bound_north_lat', 'bound_east_lng', 'area']; + protected static array $fields = ['name', 'description', 'bound_south_lat', 'bound_west_lng', 'bound_north_lat', 'bound_east_lng', 'area', 'unlisted']; private string $name = ''; @@ -16,6 +16,8 @@ class Map extends Model private float $area = 0.0; + private bool $unlisted = false; + public function __construct() { $this->bounds = Bounds::createDirectly(-90.0, -180.0, 90.0, 180.0); @@ -61,6 +63,11 @@ class Map extends Model $this->area = $area; } + public function setUnlisted(bool $unlisted): void + { + $this->unlisted = $unlisted; + } + public function getName(): string { return $this->name; @@ -100,4 +107,9 @@ class Map extends Model { return $this->area; } + + public function getUnlisted(): bool + { + return $this->unlisted; + } } diff --git a/views/admin/map_editor.php b/views/admin/map_editor.php index cd69871..2908278 100644 --- a/views/admin/map_editor.php +++ b/views/admin/map_editor.php @@ -54,6 +54,9 @@
+
+ > +
diff --git a/views/maps.php b/views/maps.php index 730ddbf..e5e3922 100644 --- a/views/maps.php +++ b/views/maps.php @@ -86,7 +86,7 @@ TODO: condition! @section(main)
-
+