diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5580e950..c4494a72 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,13 +5,23 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [0.1.7] — 2024-04-17
+
+### Added
+
+- Map controls to toggle polylines and points visibility
+
+### Changed
+
+- Added content padding for mobile view
+- Fixed stat card layout for mobile view
+
## [0.1.6.3] — 2024-04-07
### Changed
- Removed strong_params from POST /api/v1/points
-
## [0.1.6.1] — 2024-04-06
### Fixed
diff --git a/app/javascript/controllers/maps_controller.js b/app/javascript/controllers/maps_controller.js
index 519ea4dc..44044af0 100644
--- a/app/javascript/controllers/maps_controller.js
+++ b/app/javascript/controllers/maps_controller.js
@@ -10,11 +10,27 @@ export default class extends Controller {
var markers = JSON.parse(this.element.dataset.coordinates)
var center = markers[markers.length - 1] || JSON.parse(this.element.dataset.center)
var center = (center === undefined) ? [52.516667, 13.383333] : center;
- var map = L.map(this.containerTarget).setView([center[0], center[1]], 14);
+
+ var map = L.map(this.containerTarget, {
+ layers: [this.osmMapLayer(), this.osmHotMapLayer()]
+ }).setView([center[0], center[1]], 14);
+
+ var markersArray = this.markersArray(markers)
+ var markersLayer = L.layerGroup(markersArray)
+
+ var polylineCoordinates = markers.map(element => element.slice(0, 2));
+ var polylineLayer = L.polyline(polylineCoordinates)
+
+ var controlsLayer = {
+ "Points": markersLayer,
+ "Polyline": polylineLayer
+ }
+
+ var layerControl = L.control.layers(this.baseMaps(), controlsLayer).addTo(map);
this.addTileLayer(map);
- this.addMarkers(map, markers);
- this.addPolyline(map, markers);
+ markersLayer.addTo(map);
+ polylineLayer.addTo(map);
this.addLastMarker(map, markers);
}
@@ -22,6 +38,50 @@ export default class extends Controller {
this.map.remove();
}
+ osmMapLayer() {
+ return L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
+ maxZoom: 19,
+ attribution: '© OpenStreetMap'
+ })
+ }
+
+ osmHotMapLayer() {
+ return L.tileLayer('https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', {
+ maxZoom: 19,
+ attribution: '© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France'
+ })
+ }
+
+ baseMaps() {
+ return {
+ "OpenStreetMap": this.osmMapLayer(),
+ "OpenStreetMap.HOT": this.osmHotMapLayer()
+ }
+ }
+
+ controlsLayer() {
+ return {
+ "Points": this.markersLayer,
+ "Polyline": this.polylineLayer
+ }
+ }
+
+ markersArray(markers_data) {
+ var markersArray = []
+
+ for (var i = 0; i < markers_data.length; i++) {
+ var lat = markers_data[i][0];
+ var lon = markers_data[i][1];
+
+ var popupContent = this.popupContent(markers_data[i]);
+ var circleMarker = L.circleMarker([lat, lon], {radius: 4})
+
+ markersArray.push(circleMarker.bindPopup(popupContent).openPopup())
+ }
+
+ return markersArray
+ }
+
popupContent(marker) {
return `
Timestamp: ${this.formatDate(marker[4])}
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index dbd7a696..7f3d83c6 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -18,7 +18,7 @@