From 25e60f879fc21e55902ad5c069a5de0a3e340db7 Mon Sep 17 00:00:00 2001
From: Regis <boudinot.regis@yahoo.com>
Date: Wed, 2 Nov 2016 18:54:04 -0600
Subject: [PATCH] basic pagination ^_^ - will make component dynamic soon

---
 .../vue_pipelines_index/index.js.es6          |  1 +
 .../vue_pipelines_index/pipelines.vue.js.es6  | 71 +++++++++++--------
 .../vue_pipelines_index/store.js.es6          |  5 +-
 .../vue_gl_pagination.vue.js.es6              | 54 ++++++++++++++
 4 files changed, 99 insertions(+), 32 deletions(-)
 create mode 100644 app/assets/javascripts/vue_pipelines_index/vue_gl_pagination.vue.js.es6

diff --git a/app/assets/javascripts/vue_pipelines_index/index.js.es6 b/app/assets/javascripts/vue_pipelines_index/index.js.es6
index b8bcfdb30c3..6ecbc1ba8ff 100644
--- a/app/assets/javascripts/vue_pipelines_index/index.js.es6
+++ b/app/assets/javascripts/vue_pipelines_index/index.js.es6
@@ -5,6 +5,7 @@
 
 //= require ./store.js.es6
 //= require ./pipeline_url.vue.js.es6
+//= require ./vue_gl_pagination.vue.js.es6
 //= require ./pipeline_head.vue.js.es6
 //= require ./running_icon.vue.js.es6
 //= require ./running.vue.js.es6
diff --git a/app/assets/javascripts/vue_pipelines_index/pipelines.vue.js.es6 b/app/assets/javascripts/vue_pipelines_index/pipelines.vue.js.es6
index 86c18ace09e..4706ea61c8e 100644
--- a/app/assets/javascripts/vue_pipelines_index/pipelines.vue.js.es6
+++ b/app/assets/javascripts/vue_pipelines_index/pipelines.vue.js.es6
@@ -10,13 +10,14 @@
       'vue-branch-commit': gl.VueBranchCommit,
       'vue-pipeline-url': gl.VuePipelineUrl,
       'vue-pipeline-head': gl.VuePipelineHead,
+      'vue-gl-pagination': gl.VueGlPagination,
     },
     data() {
       return {
         pipelines: [],
         currentPage: '',
         intervalId: '',
-        pageNum: 'page=1',
+        pageNum: 1,
       };
     },
     props: [
@@ -25,50 +26,60 @@
     ],
     created() {
       const url = window.location.toString();
-      if (~url.indexOf('?')) this.pageNum = url.split('?')[1];
+      if (~url.indexOf('?')) this.pageNum = url.split('?')[1].split('=')[1];
       this.store.fetchDataLoop.call(this, Vue, this.pageNum);
     },
     methods: {
       shortsha(pipeline) {
         return pipeline.sha.slice(0, 8);
       },
-      changePage() {
-        // clearInterval(this.intervalId);
-        // this.store.fetchDataLoop.call(this, Vue, this.pageNum);
+      changepage(event) {
+        this.pageNum = +event.target.innerText;
+        // use p instead of page to avoid rails tyring to make an actual request
+        window.history.pushState({}, null, `?p=${this.pageNum}`);
+        clearInterval(this.intervalId);
+        this.store.fetchDataLoop.call(this, Vue, this.pageNum);
       },
       pipelineurl(id) {
         return `pipelines/${id}`;
       },
     },
     template: `
-      <div class="table-holder">
-        <table class="table ci-table">
-          <vue-pipeline-head></vue-pipeline-head>
-          <tbody>
-            <tr class="commit" v-for='pipeline in pipelines'>
-              <td class="commit-link" v-if="pipeline.status">
-                <vue-running-pipeline
+      <div>
+        <div class="table-holder">
+          <table class="table ci-table">
+            <vue-pipeline-head></vue-pipeline-head>
+            <tbody>
+              <tr class="commit" v-for='pipeline in pipelines'>
+                <td class="commit-link" v-if="pipeline.status">
+                  <vue-running-pipeline
+                    :pipeline='pipeline'
+                    :pipelineurl='pipelineurl'
+                  >
+                  </vue-running-pipeline>
+                </td>
+                <vue-pipeline-url
                   :pipeline='pipeline'
                   :pipelineurl='pipelineurl'
                 >
-                </vue-running-pipeline>
-              </td>
-              <vue-pipeline-url
-                :pipeline='pipeline'
-                :pipelineurl='pipelineurl'
-              >
-              </vue-pipeline-url>
-              <vue-branch-commit
-                :pipeline='pipeline'
-                :shortsha='shortsha'
-              >
-              </vue-branch-commit>
-              <vue-stages></vue-stages>
-              <td></td>
-              <vue-pipeline-actions></vue-pipeline-actions>
-            </tr>
-          </tbody>
-        </table>
+                </vue-pipeline-url>
+                <vue-branch-commit
+                  :pipeline='pipeline'
+                  :shortsha='shortsha'
+                >
+                </vue-branch-commit>
+                <vue-stages></vue-stages>
+                <td></td>
+                <vue-pipeline-actions></vue-pipeline-actions>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <vue-gl-pagination
+          :changepage='changepage'
+          :pages='pipelines.length'
+        >
+        </vue-gl-pagination>
       </div>
     `,
   });
diff --git a/app/assets/javascripts/vue_pipelines_index/store.js.es6 b/app/assets/javascripts/vue_pipelines_index/store.js.es6
index 66cb989030a..bf5fba45194 100644
--- a/app/assets/javascripts/vue_pipelines_index/store.js.es6
+++ b/app/assets/javascripts/vue_pipelines_index/store.js.es6
@@ -3,11 +3,12 @@
 
 ((gl) => {
   const api = '/api/v3/projects';
+  const paginate = '?per_page=5&page=';
 
   gl.PipelineStore = class {
     fetchDataLoop(Vue, pageNum) {
       const goFetch = () =>
-        this.$http.get(`${api}/${this.scope}/pipelines?per_page=30&${pageNum}`)
+        this.$http.get(`${api}/${this.scope}/pipelines${paginate}${pageNum}`)
           .then((response) => {
             Vue.set(this, 'pipelines', JSON.parse(response.body));
           }, () => new Flash(
@@ -20,7 +21,7 @@
       // eventually clearInterval(this.intervalId)
       this.intervalId = setInterval(() => {
         goFetch();
-      }, 3000);
+      }, 30000);
     }
   };
 })(window.gl || (window.gl = {}));
diff --git a/app/assets/javascripts/vue_pipelines_index/vue_gl_pagination.vue.js.es6 b/app/assets/javascripts/vue_pipelines_index/vue_gl_pagination.vue.js.es6
new file mode 100644
index 00000000000..29d4a4df511
--- /dev/null
+++ b/app/assets/javascripts/vue_pipelines_index/vue_gl_pagination.vue.js.es6
@@ -0,0 +1,54 @@
+/* global Vue, gl */
+/* eslint-disable no-param-reassign */
+
+((gl) => {
+  gl.VueGlPagination = Vue.extend({
+    props: [
+      'changepage',
+      'pages',
+    ],
+    template: `
+      <div class="gl-pagination">
+        <ul class="pagination clearfix">
+          <li class="prev disabled">
+            <span>Prev</span>
+          </li>
+          <li class="page active">
+            <a @click='changepage($event)'>1</a>
+          </li>
+          <li class="page">
+            <a
+              rel="next"
+              @click='changepage($event)'
+            >
+              2
+            </a>
+          </li>
+          <li class="page">
+            <a @click='changepage($event)'>3</a>
+          </li>
+          <li class="page">
+            <a @click='changepage($event)'>4</a>
+          </li>
+          <li class="page">
+            <a @click='changepage($event)'>5</a>
+          </li>
+          <li class="page">
+            <span class="page gap">…</span>
+          </li>
+          <li class="next">
+            <a
+              rel="next"
+              href="pipelines?page=2"
+            >
+              Next
+            </a>
+          </li>
+          <li class="last">
+            <a href="pipelines?page=936">Last »</a>
+          </li>
+        </ul>
+      </div>
+    `,
+  });
+})(window.gl || (window.gl = {}));
-- 
GitLab