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é <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