From d90cab7ac72ba4cc27890070e417687c521147af Mon Sep 17 00:00:00 2001
From: Lene Wasskog <lene.wasskog@nibio.no>
Date: Wed, 23 Oct 2024 09:15:23 +0200
Subject: [PATCH] feat: Remove bottom-left info panel for selected point,
 improve popup content and button labels

---
 src/main/webapp/js/mapModal.js | 87 ++++++++--------------------------
 1 file changed, 19 insertions(+), 68 deletions(-)

diff --git a/src/main/webapp/js/mapModal.js b/src/main/webapp/js/mapModal.js
index 877c042b..9e1f5b59 100644
--- a/src/main/webapp/js/mapModal.js
+++ b/src/main/webapp/js/mapModal.js
@@ -35,13 +35,11 @@ class MapModal {
     static TRANSLATIONS = {
         nb: {
             selectLocation: 'Velg sted',
-            saveLocation: 'Lagre nytt sted',
             createNewLocation: 'Opprett nytt sted',
             name: 'Navn',
             latitude: 'Breddegrad',
             longitude: 'Lengdegrad',
             type: 'Type',
-            submitLocation: 'OK',
             zoomToLocation: 'Zoom til meg',
             geolocationNotSupported: 'Geolokalisering støttes ikke av denne nettleseren',
             geolocationFailed: 'Fant ikke din posisjon',
@@ -56,13 +54,11 @@ class MapModal {
         },
         en: {
             selectLocation: 'Select location',
-            saveLocation: 'Save new location',
             createNewLocation: 'Create New Location',
             name: 'Name',
             latitude: 'Latitude',
             longitude: 'Longitude',
             type: 'Type',
-            submitLocation: 'OK',
             zoomToLocation: 'Zoom to My Location',
             geolocationNotSupported: 'Geolocation is not supported by this browser',
             geolocationFailed: 'Unable to retrieve your location',
@@ -110,11 +106,6 @@ class MapModal {
         this.selectedExistingPointMarker = null;
         this.coordinatePrecision = 6;
 
-        this.displaySelectedFeatureInfoControl = new DisplaySelectedFeatureInfoControl({
-            translations: this.translations,
-            onSubmit: (feature) => {this.confirmSelection(feature)},
-            coordinatePrecision: this.coordinatePrecision
-        });
         this.zoomToLocationControl = new ZoomToLocationControl({
             translations: this.translations
         });
@@ -181,9 +172,8 @@ class MapModal {
         tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
             maxZoom: 19
         }).addTo(this.map);
-        console.info("Create map " + this.mapContainerId + " centered on (" + latitude + "," + longitude + ") with points", this.geoJsonData);
+        console.info("Create map " + this.mapContainerId + " centered on (" + latitude + "," + longitude + ") with points", this.geoJsonData ? this.geoJsonData.features : null);
 
-        this.map.addControl(this.displaySelectedFeatureInfoControl);
         this.map.addControl(this.zoomToLocationControl);
         this.map.addControl(this.closeMapControl);
 
@@ -226,7 +216,6 @@ class MapModal {
         if(this.selectedExistingPointMarker === layer) {
             layer.closePopup();
             this.removeSelectedPointMarkerIfExists();
-            this.displaySelectedFeatureInfoControl.updateInfoPanel();
         }
         layer.unbindPopup();
         layer.off('click');
@@ -236,7 +225,6 @@ class MapModal {
         layer.bindPopup(this.popupContent(layer.feature));
         layer.on('click', () => {
             this.displaySelectedPoint(layer.feature, layer, false);
-            this.displaySelectedFeatureInfoControl.updateInfoPanel(layer.feature)
         });
     }
 
@@ -245,7 +233,6 @@ class MapModal {
         const selectedLayer = this.getLayerById(pointOfInterestId);
         this.displaySelectedPoint(selectedFeature, selectedLayer, true);
         selectedLayer.openPopup();
-        this.displaySelectedFeatureInfoControl.updateInfoPanel(selectedFeature);
     }
 
     getFeatureById(pointOfInterestId) {
@@ -301,7 +288,6 @@ class MapModal {
             this.removeSelectedPointMarkerIfExists();
             this.removeNewPointMarkerIfExists();
             this.closeNewPointFormIfOpen();
-            this.displaySelectedFeatureInfoControl.updateInfoPanel(null);
 
             // Calculate the pixel position from the map's click event
             const containerPoint = this.map.latLngToContainerPoint(latlng);
@@ -393,7 +379,23 @@ class MapModal {
     }
 
     popupContent(feature) {
-        return `<div id='poi-popup'>${feature.properties.pointOfInterestName}</div>`;
+        const popupElement = document.createElement("div");
+        popupElement.id = 'poi-popup';
+        const name = feature.properties.pointOfInterestName;
+        const type = this.translations['poiType' + feature.properties.pointOfInterestTypeId];
+        const latitude = feature.geometry.coordinates[1].toFixed(this.coordinatePrecision);
+        const longitude = feature.geometry.coordinates[0].toFixed(this.coordinatePrecision);
+        const buttonLabel = this.translations.selectLocation;
+        popupElement.innerHTML = `<h4>${name}</h4>
+        <b>${this.translations.latitude}</b> ${latitude}<br>
+        <b>${this.translations.longitude}</b> ${longitude}<br>
+        <b>${this.translations.type}</b> ${type}<br><br>
+        <button id="submit-button" class="btn btn-primary">${buttonLabel}</button>`
+        const buttonElement = popupElement.querySelector("#submit-button");
+        buttonElement.addEventListener('click', () => {
+            this.confirmSelection(feature);
+        });
+        return popupElement;
     }
 
     /**
@@ -452,7 +454,7 @@ class MapModal {
                     </select>
                 </div>
                 <div class="form-group text-right">
-                    <button id="map-poi-submit-button" class="btn btn-primary">${this.translations.submitLocation}</button>
+                    <button id="map-poi-submit-button" class="btn btn-primary">${this.translations.selectLocation}</button>
                 </div>                
             </div>`;
         this.mapContainerElement.appendChild(form);
@@ -489,55 +491,6 @@ class MapModal {
 
 }
 
-const DisplaySelectedFeatureInfoControl = Control.extend({
-    options: {
-        position: 'bottomleft',
-        onSubmit: undefined,
-        translations: {},
-        coordinatePrecision: 5
-    },
-
-    onAdd: function (map) {
-        const container = DomUtil.create('div', 'leaflet-bar leaflet-control hidden');
-        container.id = 'selected-point-info-panel';
-        const infoMessageDiv = DomUtil.create('div', 'info-message', container);
-        infoMessageDiv.id = 'info-message';
-        const button = DomUtil.create('button', 'btn btn-primary', container);
-        button.id = 'confirm-button';
-        return container;
-    },
-
-    updateInfoPanel: function (feature) {
-        const container = this._container;
-        const infoMessageDiv = container.querySelector('#info-message');
-        const confirmButton = container.querySelector('#confirm-button');
-
-        if (feature) {
-            const name = feature.properties.pointOfInterestName;
-            const type = this.options.translations['poiType' + feature.properties.pointOfInterestTypeId];
-            const latitude = feature.geometry.coordinates[1].toFixed(this.options.coordinatePrecision);
-            const longitude = feature.geometry.coordinates[0].toFixed(this.options.coordinatePrecision);
-
-            infoMessageDiv.innerHTML = `
-            <h4>${name}</h4>
-            <b>${this.options.translations.latitude}</b> ${latitude}<br>
-            <b>${this.options.translations.longitude}</b> ${longitude}<br>
-            <b>${this.options.translations.type}</b> ${type}`
-
-            confirmButton.innerHTML = feature.properties.pointOfInterestId
-                ? this.options.translations.selectLocation
-                : this.options.translations.saveLocation;
-
-            confirmButton.onclick = () => {
-                this.options.onSubmit(feature);
-            };
-            container.classList.remove('hidden');
-        } else {
-            container.classList.add('hidden');
-        }
-    }
-});
-
 const ZoomToLocationControl = Control.extend({
     options: {
         position: 'topleft',
@@ -669,8 +622,6 @@ const LegendControl = Control.extend({
         itemDiv.style.textDecoration = isVisible ? "none" : "line-through solid black 2px";
     }
 
-
-
 });
 
 // Export the module
-- 
GitLab