From 56e1356ac3b2e40eb56b11f2bfae99b1b26bd8ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e=20Poussard?= <tpoussard@neogeo.fr>
Date: Fri, 8 Oct 2021 18:18:59 +0200
Subject: [PATCH] add drag & drop and update store with new order for layers

---
 src/components/map-layers/SidebarLayers.vue   |  1 -
 .../project/ProjectMappingContextLayer.vue    |  2 +-
 .../project/project_mapping_basemap.vue       | 67 ++++++++++++++++---
 src/views/project/Project_mapping.vue         |  1 +
 4 files changed, 60 insertions(+), 11 deletions(-)

diff --git a/src/components/map-layers/SidebarLayers.vue b/src/components/map-layers/SidebarLayers.vue
index 8ee1575b..dace42ef 100644
--- a/src/components/map-layers/SidebarLayers.vue
+++ b/src/components/map-layers/SidebarLayers.vue
@@ -86,7 +86,6 @@
           </p>
           <label>Opacité &nbsp;<span>(%)</span></label>
           <div class="range-container">
-            <!-- // todo : rendre réactif les valeurs et connectés avec store/Map -->
             <input
               @change="updateOpacity($event, layer)"
               type="range"
diff --git a/src/components/project/ProjectMappingContextLayer.vue b/src/components/project/ProjectMappingContextLayer.vue
index 9b732a33..567d47ab 100644
--- a/src/components/project/ProjectMappingContextLayer.vue
+++ b/src/components/project/ProjectMappingContextLayer.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="ui segment layer-item">
+  <div :id="layer.dataKey" class="ui segment layer-item">
     <div class="ui divided form">
       <div class="field" data-type="layer-field">
         <label for="form.layer.id_for_label" class="layer-handle-sort">
diff --git a/src/components/project/project_mapping_basemap.vue b/src/components/project/project_mapping_basemap.vue
index 39e2421d..99fb2a40 100644
--- a/src/components/project/project_mapping_basemap.vue
+++ b/src/components/project/project_mapping_basemap.vue
@@ -20,7 +20,11 @@
     </div>
 
     <div class="nested">
-      <div v-if="basemap.layers" class="ui segments layers-container">
+      <div
+        :id="`list-${basemap.id}`"
+        v-if="basemap.layers"
+        class="ui segments layers-container"
+      >
         <ProjectMappingContextLayer
           v-for="layer in basemap.layers"
           :key="'layer-' + layer.dataKey"
@@ -60,6 +64,7 @@
 </template>
 
 <script>
+import Sortable from "sortablejs";
 import ProjectMappingContextLayer from "@/components/project/ProjectMappingContextLayer.vue";
 
 export default {
@@ -127,7 +132,49 @@ export default {
         }),
       });
     },
+
+    //* drag & drop *//
+
+    onlayerMove(event) {
+      console.log(event);
+      //* Get the names of the current layers in order.
+      const currentLayersNamesInOrder = Array.from(
+        document.getElementsByClassName("layer-item")
+      ).map((el) => el.id);
+
+      //* increment value 'order' in this.basemap.layers looping over layers from template ^
+      let order = 0;
+      let movedLayers = [];
+      for (let id of currentLayersNamesInOrder) {
+        let matchingLayer = this.basemap.layers.find(
+          (el) => el.dataKey === Number(id)
+        );
+        if (matchingLayer) {
+          matchingLayer["order"] = order;
+          movedLayers.push(matchingLayer);
+          order += 1;
+        }
+      }
+      //* update the store
+      this.$store.commit("map/UPDATE_BASEMAP", {
+        layers: movedLayers,
+        id: this.basemap.id,
+        title: this.basemap.title,
+        errors: this.basemap.errors,
+      });
+    },
+
+    initSortable() {
+      new Sortable(document.getElementById(`list-${this.basemap.id}`), {
+        animation: 150,
+        handle: ".layer-handle-sort", // The element that is active to drag
+        ghostClass: "blue-background-class",
+        dragClass: "white-opacity-background-class",
+        onEnd: this.onlayerMove.bind(this),
+      });
+    },
   },
+
   watch: {
     "basemap.title": {
       deep: true,
@@ -153,14 +200,16 @@ export default {
   //   this.errors = [];
   // }
 
-  // mounted() { //* not present in original
-  //   if (!this.basemap.title) {
-  //     this.$store.commit("map/UPDATE_BASEMAP", {
-  //       id: this.basemap.id,
-  //       title: newValue,
-  //     });
-  //   }
-  // },
+  mounted() {
+    //* not present in original
+    this.initSortable();
+    //   if (!this.basemap.title) {
+    //     this.$store.commit("map/UPDATE_BASEMAP", {
+    //       id: this.basemap.id,
+    //       title: newValue,
+    //     });
+    //   }
+  },
 };
 </script>
 
diff --git a/src/views/project/Project_mapping.vue b/src/views/project/Project_mapping.vue
index 976ea82b..8db53df2 100644
--- a/src/views/project/Project_mapping.vue
+++ b/src/views/project/Project_mapping.vue
@@ -83,6 +83,7 @@ export default {
       this.newBasemapIds.push(this.basemapMaxId + 1); //* register new basemaps to seperate post and put
       this.$store.commit("map/CREATE_BASEMAP", this.basemapMaxId + 1);
     },
+    
     checkTitles() {
       let isValid = true;
       this.basemaps.forEach((basemap) => {
-- 
GitLab