From f320313d190d2f94fe9f067bde0fa21b698c99fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e?= <tpoussard@neogeo.fr>
Date: Tue, 5 Jul 2022 16:50:08 +0200
Subject: [PATCH] ask user confirmation to leave filtered features detail view
 & display return button after edition

---
 .../Feature/Detail/FeatureHeader.vue          | 22 +++++++++++++
 src/store/modules/feature.store.js            |  1 -
 src/views/Feature/FeatureDetail.vue           | 32 +++++++++++++++++++
 src/views/Project/ProjectDetail.vue           | 18 +++++++----
 4 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/src/components/Feature/Detail/FeatureHeader.vue b/src/components/Feature/Detail/FeatureHeader.vue
index 0e871cb0..913398f8 100644
--- a/src/components/Feature/Detail/FeatureHeader.vue
+++ b/src/components/Feature/Detail/FeatureHeader.vue
@@ -4,6 +4,20 @@
       <div class="content">
         {{ currentFeature.title || currentFeature.feature_id }}
         <div class="ui icon right floated compact buttons">
+          <router-link
+            v-if="displayToListButton"
+            id="feature-detail-to-features-list"
+            :to="{
+              name: 'liste-signalements',
+              params: { slug: $route.params.slug },
+            }"
+            custom
+          >
+            <div class="ui button tiny-margin teal">
+              <i class="ui icon arrow right" />
+              Retour à la liste des signalements
+            </div>
+          </router-link>
           <span
             v-if="featuresCount"
             id="feature-count"
@@ -129,6 +143,10 @@ export default {
       type: Object,
       default: () => {},
     },
+    displayToListButton: {
+      type: Boolean,
+      default: false,
+    },
   },
 
   computed: {
@@ -185,4 +203,8 @@ export default {
 #next-feature {
   margin-right: .5rem !important;
 }
+#feature-detail-to-features-list {
+  line-height: 0;
+  margin-right: 5px;
+}
 </style>
\ No newline at end of file
diff --git a/src/store/modules/feature.store.js b/src/store/modules/feature.store.js
index 6e5d3da9..5d785813 100644
--- a/src/store/modules/feature.store.js
+++ b/src/store/modules/feature.store.js
@@ -193,7 +193,6 @@ const feature = {
                 slug_signal: featureId,
                 message: routeName === 'editer-signalement' ? 'Le signalement a été mis à jour' : 'Le signalement a été crée'
               },
-              query: router.history.current.query,
             });
             dispatch('projects/GET_ALL_PROJECTS', null, { root:true }); //* & refresh project list
           });
diff --git a/src/views/Feature/FeatureDetail.vue b/src/views/Feature/FeatureDetail.vue
index 08ff409f..62fc5e58 100644
--- a/src/views/Feature/FeatureDetail.vue
+++ b/src/views/Feature/FeatureDetail.vue
@@ -10,6 +10,7 @@
             :features-count="featuresCount"
             :slug-signal="slugSignal"
             :feature-type="featureType"
+            :display-to-list-button="displayToListButton"
             @setIsCancelling="isCanceling = true"
             @tofeature="pushNgo"
           />
@@ -118,6 +119,30 @@ export default {
     FeatureComments
   },
 
+  beforeRouteEnter (to, from, next) {
+    // if the user edited the feature, coming from filtered features details browsing,
+    // display a button to turn back to the list view, in order to start again from the list
+    // because order changes after edition, depending the sort criteria
+    // in beforeRouteEnter, the component is not mounted and this doesn't exist yet, thus we store the value in window object
+    window.displayToListButton = false; // reinitialisation of the value
+    if (from.query.offset !== undefined) { // if a queryset for filtered features is stored in the route from
+      window.displayToListButton = true; // toggle the value to display the button
+    }
+    next(); // continue page loading
+  },
+
+  beforeRouteLeave (to, from, next) {
+    if (// In case of filtered listed featuers, if the user wants to edit a feature,
+      from.query.offset >= 0 &&
+        to.name === 'editer-signalement' &&
+        !this.confirmLeave() // warn the user that features order might change
+    ){
+      next(false);
+    } else {// Navigate to next view
+      next();
+    }
+  },
+
   data() {
     return {
       attachments: [],
@@ -139,6 +164,7 @@ export default {
       featuresCount: null,
       isCanceling: false,
       slugSignal: '',
+      displayToListButton: false,
     };
   },
 
@@ -170,6 +196,8 @@ export default {
 
   mounted() {
     this.initPage();
+    // when this is available, set the value with previously stored value in windows to pass it as a prop
+    this.displayToListButton = window.displayToListButton;
   },
 
   beforeDestroy() {
@@ -232,6 +260,10 @@ export default {
       this.DISCARD_LOADER();
     },
 
+    confirmLeave() {
+      return window.confirm('Vous allez quittez la vue signalement filtré, l\'ordre des signalements pourrait changer après édition d\'un signalement.');
+    },
+
     async pushNgo(newEntry) {
       this.$router.push(newEntry); //* update the params or queries in the route/url
       await this.getPageInfo();
diff --git a/src/views/Project/ProjectDetail.vue b/src/views/Project/ProjectDetail.vue
index 12183102..3fb599f4 100644
--- a/src/views/Project/ProjectDetail.vue
+++ b/src/views/Project/ProjectDetail.vue
@@ -75,17 +75,21 @@
               ref="map"
             />
 
-            <div
+            <router-link
               id="features-list"
-              class="ui button fluid teal"
-              @click="$router.push({
+              :to="{
                 name: 'liste-signalements',
                 params: { slug: slug },
-              })"
+              }"
+              custom
             >
-              <i class="ui icon arrow right" />
-              Voir tous les signalements
-            </div>
+              <div
+                class="ui button fluid teal"
+              >
+                <i class="ui icon arrow right" />
+                Voir tous les signalements
+              </div>
+            </router-link>
 
             <div 
               id="popup" 
-- 
GitLab