From 63f3bbb9e43c2918423c1a84670b9f6e1b09f5bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timoth=C3=A9e=20Poussard?= <tpoussard@neogeo.fr>
Date: Fri, 10 Dec 2021 15:23:53 +0100
Subject: [PATCH] display ellipsis and first-last page

---
 src/components/feature/FeatureListTable.vue | 73 ++++++++++++++-------
 1 file changed, 51 insertions(+), 22 deletions(-)

diff --git a/src/components/feature/FeatureListTable.vue b/src/components/feature/FeatureListTable.vue
index 6e1c8ada..e72a7e88 100644
--- a/src/components/feature/FeatureListTable.vue
+++ b/src/components/feature/FeatureListTable.vue
@@ -198,7 +198,18 @@
         >Précédent</a
       >
       <span>
-        <span v-if="displayedPagesNumber[0] > 1" class="ellipsis">…</span>
+        <span v-if="pagination.currentPage >= 5">
+          <a
+            key="page1"
+            @click="$emit('update:page', 1)"
+            class="paginate_button"
+            aria-controls="table-features"
+            data-dt-idx="1"
+            tabindex="0"
+            >{{ 1 }}</a
+          >
+          <span class="ellipsis">…</span>
+        </span>
         <a
           v-for="pageNumber in displayedPagesNumber"
           :key="'page' + pageNumber"
@@ -212,7 +223,18 @@
           tabindex="0"
           >{{ pageNumber }}</a
         >
-        <span v-if="displayedPagesNumber.slice(-1)[0] < pageNumbers.slice(-1)[0]" class="ellipsis">…</span>
+        <span v-if="(lastPageNumber - pagination.currentPage) >= 4">
+          <span class="ellipsis">…</span>
+          <a
+            :key="'page' + lastPageNumber"
+            @click="$emit('update:page', lastPageNumber)"
+            class="paginate_button"
+            aria-controls="table-features"
+            data-dt-idx="1"
+            tabindex="0"
+            >{{ lastPageNumber }}</a
+          >
+        </span>
       </span>
       <a
         id="table-features_next"
@@ -244,12 +266,6 @@ export default {
     "sort",
   ],
 
-  data() {
-    return {
-      displayedPageStart: 0
-    }
-  },
-
   computed: {
     ...mapState(["user"]),
     ...mapGetters(["project", "permissions"]),
@@ -267,6 +283,12 @@ export default {
       },
     },
 
+    displayedPageEnd() {
+      return this.featuresCount <= this.pagination.end
+        ? this.featuresCount
+        : this.pagination.end;
+    },
+
     pageNumbers() {
       const totalPages = Math.ceil(
         this.featuresCount / this.pagination.pagesize
@@ -277,15 +299,25 @@ export default {
       });
     },
 
-    displayedPageEnd() {
-      return this.featuresCount <= this.pagination.end
-        ? this.featuresCount
-        : this.pagination.end;
+    lastPageNumber() {
+      return this.pageNumbers.slice(-1)[0];
     },
 
     displayedPagesNumber() {
-      return [...this.pageNumbers].splice(this.displayedPageStart, 5);
-    }
+      //* si la page courante est inférieur à 5, la liste commence à l'index 0 et on retourne 5 pages
+      let firstPageInList = 0;
+      let pagesQuantity = 5;
+        //* à partir de la 5ième page et jusqu'à la 4ième page avant la fin : n'afficher que 3 page entre les ellipses et la page courante doit être au milieu
+      if (this.pagination.currentPage >= 5 && !(this.lastPageNumber - this.pagination.currentPage < 4)) {
+        firstPageInList = this.pagination.currentPage - 2;
+        pagesQuantity = 3
+      }
+      //* a partir de 4 résultat avant la fin afficher seulement les 5 derniers résultats
+      if (this.lastPageNumber - this.pagination.currentPage < 4) {
+        firstPageInList = this.lastPageNumber - 5;
+      }
+      return this.pageNumbers.slice(firstPageInList, firstPageInList + pagesQuantity);
+    },
   },
 
   methods: {
@@ -309,17 +341,14 @@ export default {
     changeSort(column) {
       if (this.sort.column === column) {
         //changer order
-        this.$emit(
-          "update:sort",
-          { column: this.sort.column, ascending: !this.sort.ascending }
-        );
+        this.$emit("update:sort", {
+          column: this.sort.column,
+          ascending: !this.sort.ascending,
+        });
       } else {
         this.sort.column = column;
         this.sort.ascending = true;
-        this.$emit(
-          "update:sort",
-          { column, ascending: true }
-        );
+        this.$emit("update:sort", { column, ascending: true });
       }
     },
   },
-- 
GitLab