From 77cf2e93e903c5debb95e0b7a009608188eabcf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e=20Poussard?= <tpoussard@neogeo.fr>
Date: Tue, 28 Dec 2021 17:13:42 +0100
Subject: [PATCH] WIP: selecting features to edit

---
 src/components/feature/FeatureListTable.vue | 52 +++++++++++------
 src/views/feature/Feature_list.vue          | 64 ++++++++++++++++++++-
 2 files changed, 95 insertions(+), 21 deletions(-)

diff --git a/src/components/feature/FeatureListTable.vue b/src/components/feature/FeatureListTable.vue
index 5817a4fa..73f9d690 100644
--- a/src/components/feature/FeatureListTable.vue
+++ b/src/components/feature/FeatureListTable.vue
@@ -78,28 +78,21 @@
         <tr v-for="(feature, index) in paginatedFeatures" :key="index">
           <td class="center">
             <div
-              class="ui checkbox"
-              :class="
-                feature.properties.creator.username !== user.username &&
-                !user.is_superuser &&
-                !isUserProjectAdministrator
-                  ? 'disabled'
-                  : ''
-              "
+              :class="['ui checkbox', {disabled: isEditDisabled(feature)}]"
             >
+              <!-- :class="['ui checkbox', {disabled: canDeleteFeature(feature)}]" -->
               <input
                 type="checkbox"
                 :id="feature.id"
                 :value="feature.id"
                 v-model="checked"
-                :disabled="
-                  feature.properties.creator.username !== user.username &&
-                  !user.is_superuser &&
-                  !isUserProjectAdministrator
-                "
+                :disabled="isEditDisabled(feature)"
+                name="select"
               />
-              <label></label>
+              <label for="select"></label>
+                <!-- :disabled="canDeleteFeature(feature)" -->
             </div>
+            {{canDeleteFeature(feature)}}
           </td>
 
           <td class="center">
@@ -269,10 +262,7 @@ export default {
   computed: {
     ...mapState(["user"]),
     ...mapGetters(["project", "permissions"]),
-
-    isUserProjectAdministrator() {
-      return this.permissions.is_project_administrator;
-    },
+    ...mapState(["user", "USER_LEVEL_PROJECTS"]),
 
     checked: {
       get() {
@@ -321,6 +311,32 @@ export default {
   },
 
   methods: {
+    canDeleteFeature(feature) {
+      return feature.properties.creator.username !== this.user.username &&
+                  !this.user.is_superuser &&
+                  !this.permissions.is_project_administrator
+    },
+
+    isEditDisabled(feature) {
+      //console.log("feature", feature)
+      const userStatus = this.USER_LEVEL_PROJECTS[this.project.slug];
+      const access = {
+        "Administrateur projet" : ["draft", "published", "archived"],
+        "Modérateur" : ["pending"],
+        "Super Contributeur" : ["draft", this.project.moderation ? "pending" : "published"],
+        "Contributeur" : ["draft", this.project.moderation ? "pending" : "published"],
+      };
+
+      console.log("userStatus", userStatus)
+      if (userStatus === "Super Contributeur" || userStatus === "Contributeur") {
+        console.log("feature.properties.creator.username", feature.properties.creator.username)
+        console.log("this.user.username", this.user.username)
+        if (feature.properties.creator.username !== this.user.username) return true;
+      }
+      //console.log("access[userStatus].includes(feature.properties.status.value)", access[userStatus].includes(feature.properties.status.value))
+      return !access[userStatus].includes(feature.properties.status.value);
+    },
+    
     getUserName(feature) {
       if (!feature.properties.creator) {
         return " ---- ";
diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue
index e72194a6..d058dc56 100644
--- a/src/views/feature/Feature_list.vue
+++ b/src/views/feature/Feature_list.vue
@@ -36,10 +36,11 @@
               feature_types.length > 0 &&
               permissions.can_create_feature
             "
+            id="button-dropdown"
             class="item right"
           >
             <div
-              @click="showAddFeature = !showAddFeature"
+              @click="toggleAddFeature"
               class="ui dropdown button compact button-hover-green"
               data-tooltip="Ajouter un signalement"
               data-position="bottom left"
@@ -67,13 +68,40 @@
               </div>
             </div>
 
+
+            <div
+              v-if="checkedFeatures.length > 0"
+              @click="toggleModifyStatus"
+              class="ui dropdown button compact button-hover-green margin-left-25"
+              data-tooltip="Modifier le statut des Signalements"
+              data-position="bottom center"
+            >
+              <i class="pencil fitted icon"></i>
+              <div
+                v-if="showModifyStatus"
+                class="menu transition visible"
+                style="z-index: 9999"
+              >
+                <div class="header">Modifier le statut des Signalements</div>
+                <div class="scrolling menu text-wrap">
+                  <span
+                    v-for="status in availableStatus"
+                    :key="status.value"
+                    @click="modifyStatus(status.value)"
+                    class="item"
+                  >
+                    {{ status.name }}
+                  </span>
+                </div>
+              </div>
+            </div>
+
             <div
               v-if="checkedFeatures.length"
               @click="modalAllDelete"
               class="ui button compact button-hover-red margin-left-25"
               data-tooltip="Effacer tous les types de signalements sélectionnés"
-              data-position="left center"
-              data-variation="mini"
+              data-position="bottom right"
             >
               <i class="grey trash fitted icon"></i>
             </div>
@@ -250,6 +278,7 @@ export default {
       },
       showMap: true,
       showAddFeature: false,
+      showModifyStatus: false,
     };
   },
 
@@ -322,6 +351,12 @@ export default {
       );
     },
 
+    availableStatus() {
+
+      return this.statusChoices.filter((status) => status)
+
+    },
+
     featureTypeChoices() {
       return this.feature_types.map((el) => el.title);
     },
@@ -331,10 +366,31 @@ export default {
     ...mapActions('feature', [
       'GET_PROJECT_FEATURES'
     ]),
+
+    toggleAddFeature() {
+      this.showAddFeature = !this.showAddFeature;
+      this.showModifyStatus = false;
+    },
+
+    toggleModifyStatus() {
+      this.showModifyStatus = !this.showModifyStatus;
+      this.showAddFeature = false;
+    },
+
     modalAllDelete() {
       this.modalAllDeleteOpen = !this.modalAllDeleteOpen;
     },
 
+    clickOutsideDropdown(e) {
+      if (!e.target.closest('#button-dropdown'))
+        this.showModifyStatus = false;
+        this.showAddFeature = false;
+    },
+
+    modifyStatus(newValue) {
+      console.log("newValue", newValue)
+    },
+
     deleteFeature(feature_id) {
       const url = `${this.API_BASE_URL}features/${feature_id}/?project__slug=${this.project.slug}`;
       axios
@@ -550,9 +606,11 @@ export default {
       this.initMap();
     }
     this.fetchPagedFeatures();
+    window.addEventListener("mousedown", this.clickOutsideDropdown);
   },
 
   destroyed() {
+    window.removeEventListener("mousedown", this.clickOutsideDropdown);
     //* allow user to change page if ever stuck on loader
     this.$store.commit("DISCARD_LOADER");
   },
-- 
GitLab