From f0fbfbab5bc048016c0d356a9a34b48ae5f21fc7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e=20Poussard?= <tpoussard@neogeo.fr>
Date: Wed, 29 Dec 2021 17:50:14 +0100
Subject: [PATCH] WIP:testing partial_update -> bug feature disappear + bug
 page number missing first one

---
 src/components/feature/FeatureListTable.vue |  6 +++
 src/services/feature-api.js                 | 15 +++++++
 src/store/modules/feature.js                | 43 +++++++++++----------
 src/views/feature/Feature_list.vue          | 33 ++++++++++------
 4 files changed, 65 insertions(+), 32 deletions(-)

diff --git a/src/components/feature/FeatureListTable.vue b/src/components/feature/FeatureListTable.vue
index 73f9d690..0a3e7a33 100644
--- a/src/components/feature/FeatureListTable.vue
+++ b/src/components/feature/FeatureListTable.vue
@@ -83,6 +83,7 @@
               <!-- :class="['ui checkbox', {disabled: canDeleteFeature(feature)}]" -->
               <input
                 type="checkbox"
+                @input="storeClickedFeature(feature)"
                 :id="feature.id"
                 :value="feature.id"
                 v-model="checked"
@@ -254,6 +255,7 @@ export default {
   props: [
     "paginatedFeatures",
     "checkedFeatures",
+    "clickedFeatures",
     "featuresCount",
     "pagination",
     "sort",
@@ -311,6 +313,10 @@ export default {
   },
 
   methods: {
+    storeClickedFeature(feature) {
+      this.clickedFeatures.push({feature_id: feature.id, feature_type: feature.properties.feature_type.slug})
+    },
+
     canDeleteFeature(feature) {
       return feature.properties.creator.username !== this.user.username &&
                   !this.user.is_superuser &&
diff --git a/src/services/feature-api.js b/src/services/feature-api.js
index 30b3fb8e..3b218823 100644
--- a/src/services/feature-api.js
+++ b/src/services/feature-api.js
@@ -62,6 +62,21 @@ const featureAPI = {
     }
   },
 
+  async updateFeature({ feature_id, feature_type__slug, project__slug, newStatus }) {
+    let url = `${baseUrl}features/${feature_id}/?feature_type__slug=${feature_type__slug}&project__slug=${project__slug}`
+
+    const response = await axios({
+      url,
+      method: "PATCH",
+      data: { id: feature_id, status: newStatus, feature_type: feature_type__slug }
+    })
+    if (response.status === 200 && response.data) {
+      return response;
+    } else {
+      return null;
+    }
+  },
+
   async postComment({ featureId, comment }) {
     const response = await axios.post(
       `${baseUrl}features/${featureId}/comments/`, { comment }
diff --git a/src/store/modules/feature.js b/src/store/modules/feature.js
index fd331b50..b6f7503c 100644
--- a/src/store/modules/feature.js
+++ b/src/store/modules/feature.js
@@ -172,7 +172,6 @@ const feature = {
 
     SEND_FEATURE({ state, rootState, commit, dispatch }, routeName) {
       commit("DISPLAY_LOADER", "Le signalement est en cours de création", { root: true })
-      const message = routeName === "editer-signalement" ? "Le signalement a été mis à jour" : "Le signalement a été crée";
       function redirect(featureId) {
         dispatch(
           'GET_PROJECT_FEATURE',
@@ -188,7 +187,7 @@ const feature = {
               params: {
                 slug_type_signal: rootState.feature_type.current_feature_type_slug,
                 slug_signal: featureId,
-                message,
+                message: routeName === "editer-signalement" ? "Le signalement a été mis à jour" : "Le signalement a été crée"
               },
             });
             dispatch("GET_ALL_PROJECTS", null, {root:true}) //* & refresh project list
@@ -201,30 +200,32 @@ const feature = {
         redirect(featureId);
       }
 
-      //* prepare feature data to send
-      let extraFormObject = {}; //* prepare an object to be flatten in properties of geojson
-      for (const field of state.extra_form) {
-        extraFormObject[field.name] = field.value;
-      }
-      const geojson = {
-        "id": state.form.feature_id,
-        "type": "Feature",
-        "geometry": state.form.geometry,
-        "properties": {
-          "title": state.form.title,
-          "description": state.form.description.value,
-          "status": state.form.status.value,
-          "project": rootState.project_slug,
-          "feature_type": rootState.feature_type.current_feature_type_slug,
-          ...extraFormObject
+      function createGeojson() { //* prepare feature data to send
+        let extraFormObject = {}; //* prepare an object to be flatten in properties of geojson
+        for (const field of state.extra_form) {
+          extraFormObject[field.name] = field.value;
+        }
+        return {
+          "id": state.form.feature_id,
+          "type": "Feature",
+          "geometry": state.form.geometry,
+          "properties": {
+            "title": state.form.title,
+            "description": state.form.description.value,
+            "status": state.form.status.value,
+            "project": rootState.project_slug,
+            "feature_type": rootState.feature_type.current_feature_type_slug,
+            ...extraFormObject
+          }
         }
       }
 
+      const geojson = createGeojson();
       let url = `${rootState.configuration.VUE_APP_DJANGO_API_BASE}features/`
       if (routeName === "editer-signalement") {
-        url += `${state.form.feature_id}/?` +
-        `feature_type__slug=${rootState.feature_type.current_feature_type_slug}` +
-        `&project__slug=${rootState.project_slug}`
+        url += `${state.form.feature_id}/?
+        feature_type__slug=${rootState.feature_type.current_feature_type_slug} 
+        &project__slug=${rootState.project_slug}`
       }
 
       return axios({
diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue
index d058dc56..7e459db7 100644
--- a/src/views/feature/Feature_list.vue
+++ b/src/views/feature/Feature_list.vue
@@ -164,12 +164,14 @@
       <SidebarLayers v-if="basemaps && map" />
     </div>
     <!-- | -->
+      <!-- v-on:update:clickedFeatures="handleClickedFeatures" -->
     <FeatureListTable
       v-show="!showMap"
       v-on:update:page="handlePageChange"
       v-on:update:sort="handleSortChange"
       :paginatedFeatures="paginatedFeatures"
       :checkedFeatures.sync="checkedFeatures"
+      :clickedFeatures.sync="clickedFeatures"
       :featuresCount="featuresCount"
       :pagination="pagination"
       :sort="sort"
@@ -256,6 +258,7 @@ export default {
         title: null,
       },
       baseUrl: this.$store.state.configuration.BASE_URL,
+      clickedFeatures: [],
       modalAllDeleteOpen: false,
       map: null,
       zoom: null,
@@ -351,10 +354,8 @@ export default {
       );
     },
 
-    availableStatus() {
-
+    availableStatus() { //* attente de réponse sur le ticket
       return this.statusChoices.filter((status) => status)
-
     },
 
     featureTypeChoices() {
@@ -364,7 +365,8 @@ export default {
 
   methods: {
     ...mapActions('feature', [
-      'GET_PROJECT_FEATURES'
+      'GET_PROJECT_FEATURES',
+      'SEND_FEATURE'
     ]),
 
     toggleAddFeature() {
@@ -382,18 +384,27 @@ export default {
     },
 
     clickOutsideDropdown(e) {
-      if (!e.target.closest('#button-dropdown'))
+      if (!e.target.closest("#button-dropdown")) {
         this.showModifyStatus = false;
-        this.showAddFeature = false;
+        setTimeout(() => { //* timout necessary to give time to click on link to add feature
+          this.showAddFeature = false;
+        }, 500);
+      }
     },
 
-    modifyStatus(newValue) {
-      console.log("newValue", newValue)
+    modifyStatus(newStatus) {
+      console.log("newStatus", newStatus)
+      this.checkedFeatures.forEach((feature_id) => {
+        let feature_type__slug = this.clickedFeatures.find((el) => el.feature_id === feature_id).feature_type
+        console.log("feature_type__slug", feature_type__slug)
+        featureAPI.updateFeature({feature_id, feature_type__slug, project__slug: this.$route.params.slug, newStatus})
+      })
     },
 
+
     deleteFeature(feature_id) {
       const url = `${this.API_BASE_URL}features/${feature_id}/?project__slug=${this.project.slug}`;
-      axios
+      axios //TODO: REFACTO -> Delete function already exist in store
         .delete(url, {})
         .then(() => {
           if (!this.modalAllDeleteOpen) {
@@ -415,8 +426,8 @@ export default {
     deleteAllFeatureSelection() {
       let feature = {};
       this.checkedFeatures.forEach((feature_id) => {
-        feature = { feature_id: feature_id };
-        this.deleteFeature(feature.feature_id);
+        feature = { feature_id: feature_id }; // ? Is this usefull ?
+        this.deleteFeature(feature.feature_id); //? since property feature_id is directly used after...
       });
       this.modalAllDelete();
     },
-- 
GitLab