From b38fb0403551209388fe6149b5a3c490796841c5 Mon Sep 17 00:00:00 2001
From: Lene Wasskog <lene.wasskog@nibio.no>
Date: Mon, 19 May 2025 15:13:09 +0200
Subject: [PATCH] feat: Include only personal pois in timeseries form

---
 .../ObservationTimeSeriesController.java      |  3 +-
 .../vips/logic/i18n/vipslogictexts.properties |  1 +
 .../logic/i18n/vipslogictexts_nb.properties   |  2 +-
 .../templates/observationTimeSeriesForm.ftl   | 38 +++++++++++--------
 4 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationTimeSeriesController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationTimeSeriesController.java
index ab6031ca..0b0338fa 100644
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationTimeSeriesController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationTimeSeriesController.java
@@ -225,8 +225,7 @@ public class ObservationTimeSeriesController extends HttpServlet {
         request.setAttribute("mapLayers", userBean.getMapLayerJSONForUser(user));
         request.setAttribute("defaultMapCenter", user.getOrganizationId().getDefaultMapCenter());
         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-        request.setAttribute("locationPointOfInterests",
-            pointOfInterestBean.getRelevantPointOfInterestsForUser(user));
+        request.setAttribute("locationPointOfInterests", pointOfInterestBean.getPoisForUser(user));
         request.setAttribute("locationVisibilityFormValue",
             getLocationVisibilityFormValue(observationTimeSeries));
         List<PolygonService> polygonServices =
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
index dbc1492b..c2b5274f 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
@@ -1103,4 +1103,5 @@ observationTimeSeriesStored = Observation time series was stored
 noTimeSeries = No observation time series
 noObservations = No observations
 noForecasts = No forecasts
+timeSeriesNoAvailablePoi=You must create a location before you can register a new time series
 
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
index 0196c0ac..3488de80 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
@@ -1102,4 +1102,4 @@ observationTimeSeriesStored = Tidsserie lagret
 noTimeSeries = Ingen tidsserier
 noObservations = Ingen observasjoner
 noForecasts = Ingen varsler
-
+timeSeriesNoAvailablePoi=Du m� opprette et nytt sted f�r du kan registrere tidsserie
diff --git a/src/main/webapp/templates/observationTimeSeriesForm.ftl b/src/main/webapp/templates/observationTimeSeriesForm.ftl
index e7fb78bd..3877d87e 100644
--- a/src/main/webapp/templates/observationTimeSeriesForm.ftl
+++ b/src/main/webapp/templates/observationTimeSeriesForm.ftl
@@ -62,28 +62,32 @@
         }
 
         fetchPOIs(function (allPois) {
-            buildPOIList(poiListElement, allPois, poiTypes, selectedPointOfInterestId);
+            buildPOIList(poiListElement, allPois, poiTypes, selectedPointOfInterestId, ${user.userId});
             showCorrectMap();
         });
     }
 
-    function buildPOIList(poiListElement, allPois, poiTypes, selectedPointOfInterestId) {
+    function buildPOIList(poiListElement, allPois, poiTypes, selectedPointOfInterestId, userId) {
         poiListElement.options.length = 1;
+        const userPois = allPois.filter(poi => String(poi.userId) === String(userId));
+        if(userPois.length === 0) {
+            document.getElementById("noAvailablePoi").style.display = "block";
+        } else {
+            document.getElementById("noAvailablePoi").style.display = "none";
+        }
         for (const [typeId, typeName] of Object.entries(poiTypes)) {
-            let poiTypeOption = new Option("-- " + typeName + " --", "-1");
+            const poisOfType = userPois.filter(poi => String(poi.pointOfInterestTypeId) === String(typeId));
+            if (poisOfType.length === 0) continue;
+            const poiTypeOption = new Option("-- " + typeName + " --", "");
             poiTypeOption.disabled = true;
             poiListElement.options[poiListElement.options.length] = poiTypeOption;
 
-            for (let i = 0; i < allPois.length; i++) {
-                const poi = allPois[i];
-
-                if (poi.pointOfInterestTypeId == typeId) {
-                    const poiOption = new Option(poi.name, poi.pointOfInterestId);
-                    if (poi.pointOfInterestId === selectedPointOfInterestId) {
-                        poiOption.selected = true;
-                    }
-                    poiListElement.options[poiListElement.options.length] = poiOption;
+            for (const poi of poisOfType) {
+                const poiOption = new Option(poi.name, poi.pointOfInterestId);
+                if (poi.pointOfInterestId === selectedPointOfInterestId) {
+                    poiOption.selected = true;
                 }
+                poiListElement.options[poiListElement.options.length] = poiOption;
             }
         }
     }
@@ -315,6 +319,7 @@
     <div id="errorMsgEl" class="alert alert-danger" <#if !formValidation?has_content> style="display:none;"</#if>>
         <#if formValidation?has_content>${formValidation.validationMessages?replace("\n", "<br>")}</#if>
     </div>
+    <div id="noAvailablePoi" class="alert alert-danger" style="display: none">Du må opprette et nytt sted før du kan registrere tidsserie</div>
     <#if messageKey?has_content>
         <div class="alert alert-success">${i18nBundle(messageKey)}</div>
     </#if>
@@ -430,10 +435,11 @@
                         </select>
                     </div>
                     <div class="form-group">
-                        <label for="locationPointOfInterestId">${i18nBundle.location}&nbsp;&nbsp;<button
-                                    role="button" type="button"
-                                    onclick="addNewLocationPopup();">${i18nBundle.addNew}</button>
-                        </label>
+                        <label for="locationPointOfInterestId">${i18nBundle.location}</label>&nbsp;
+                        <button
+                        role="button" type="button"
+                        onclick="addNewLocationPopup();">${i18nBundle.addNew}</button>
+
                         <select class="form-control" name="locationPointOfInterestId" id="locationPointOfInterestId" onchange="showCorrectMap();">
                             <option value="" disabled selected>${i18nBundle.pleaseSelect} ${i18nBundle.location?lower_case}</option>
                         </select>
-- 
GitLab