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 @@