From 84fd72e3db347e05038002149e36f230af3bb954 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e?= <tpoussard@neogeo.fr>
Date: Tue, 9 Aug 2022 14:55:26 +0200
Subject: [PATCH] add snap on feature edition & fix undefined feature_type in
 popup

---
 src/services/edition-service.js   | 24 +++++++++++++++++++++++-
 src/services/map-service.js       |  2 +-
 src/views/Feature/FeatureEdit.vue |  1 +
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/services/edition-service.js b/src/services/edition-service.js
index 850bc21f..2b25a85e 100644
--- a/src/services/edition-service.js
+++ b/src/services/edition-service.js
@@ -1,4 +1,4 @@
-import { Draw } from 'ol/interaction';
+import { Draw, Snap } from 'ol/interaction';
 import GeometryType from 'ol/geom/GeometryType';
 import Modify from 'ol/interaction/Modify';
 import Select from 'ol/interaction/Select';
@@ -267,6 +267,28 @@ const editionService = {
   removeActiveFeatures() {
     this.drawnFeature = null;
     this.featureToEdit = null;
+  },
+
+  addSnapInteraction(map) {
+    // The snap interaction must be added after the Modify and Draw interactions
+    // in order for its map browser event handlers to be fired first. Its handlers
+    // are responsible of doing the snapping.
+
+    // Since we can't give a list of source to snap,
+    // we use this workaround, an interaction collection: https://github.com/openlayers/openlayers/issues/7100
+    let interactions = [];
+    map.getLayers().forEach((layer) => {
+      if (layer instanceof VectorLayer) {
+        let interaction = new Snap({
+          source: layer.getSource()
+        });
+        interactions.push(interaction);
+      }
+    });
+
+    for(let snap of interactions ) {
+      map.addInteraction(snap);
+    }
   }
 
 };
diff --git a/src/services/map-service.js b/src/services/map-service.js
index 63e4204c..c9f696e6 100644
--- a/src/services/map-service.js
+++ b/src/services/map-service.js
@@ -554,7 +554,7 @@ const mapService = {
                     Statut : ${status}
                   </div>
                   <div>
-                    Type : <a id="goToFeatureTypeDetail" class="pointer"> ${feature_type.title} </a>
+                    Type : ${ feature_type ? '<a id="goToFeatureTypeDetail" class="pointer">' + feature_type.title + '</a>' : 'Type de signalement inconnu' }
                   </div>
                   <div>
                     Dernière&nbsp;mise&nbsp;à&nbsp;jour&nbsp;:&nbsp;${date_maj}
diff --git a/src/views/Feature/FeatureEdit.vue b/src/views/Feature/FeatureEdit.vue
index 6059ea53..45a27e77 100644
--- a/src/views/Feature/FeatureEdit.vue
+++ b/src/views/Feature/FeatureEdit.vue
@@ -888,6 +888,7 @@ export default {
               )[0];
               editionService.setFeatureToEdit(currentFeature);
               this.updateMap(currentFeature);
+              editionService.addSnapInteraction(this.map);
             }
           }
           this.mapLoading = false;
-- 
GitLab