gitlab-org--gitlab-foss/app/assets/javascripts/vue_pagination/index.js.es6

107 lines
2.9 KiB
JavaScript
Raw Normal View History

/* global Vue, gl */
2016-11-08 16:57:16 -05:00
/* eslint-disable no-param-reassign, no-plusplus */
2016-12-08 19:41:59 -05:00
//= require ./param_helper.js.es6
((gl) => {
2016-11-18 17:26:49 -05:00
const PAGINATION_UI_BUTTON_LIMIT = 4;
const SPREAD = '...';
const PREV = 'Prev';
const NEXT = 'Next';
const FIRST = '<< First';
const LAST = 'Last >>';
gl.VueGlPagination = Vue.extend({
props: [
'change',
2016-12-07 15:35:26 -05:00
'pageInfo',
],
methods: {
changePage(e) {
let pagenum = this.pageInfo.page;
2016-12-08 19:41:59 -05:00
let apiScope = gl.getParameterByName('scope');
if (!apiScope) apiScope = 'all';
const text = e.target.innerText;
const { totalPages, nextPage, previousPage } = this.pageInfo;
if (text === SPREAD) return;
// the regex here is to read if the string coming in will become a valid string
// had issues with parsing using `+` because `typeof NaN === 'number'`
if (/^-?[\d.]+(?:e-?\d+)?$/.test(text)) pagenum = +text;
if (text === LAST) pagenum = totalPages;
if (text === NEXT) pagenum = nextPage;
if (text === PREV) pagenum = previousPage;
if (text === FIRST) pagenum = 1;
this.change(pagenum, apiScope);
},
},
computed: {
2016-12-07 15:35:26 -05:00
prev() {
return this.pageInfo.previousPage;
},
next() {
return this.pageInfo.nextPage;
2016-11-08 17:03:25 -05:00
},
2016-11-08 14:23:29 -05:00
getItems() {
2016-12-07 15:35:26 -05:00
const total = this.pageInfo.totalPages;
const page = this.pageInfo.page;
2016-11-08 14:23:29 -05:00
const items = [];
2016-12-07 15:35:26 -05:00
if (page > 1) items.push({ title: FIRST });
2016-11-08 16:57:16 -05:00
if (page > 1) {
2016-12-07 15:35:26 -05:00
items.push({ title: PREV });
2016-11-08 16:57:16 -05:00
} else {
2016-12-07 15:35:26 -05:00
items.push({ title: PREV, disabled: true });
2016-11-08 16:57:16 -05:00
}
2016-11-08 14:23:29 -05:00
2016-11-18 17:26:49 -05:00
if (page > 6) items.push({ title: SPREAD, separator: true });
2016-11-08 14:23:29 -05:00
2016-11-18 17:26:49 -05:00
const start = Math.max(page - PAGINATION_UI_BUTTON_LIMIT, 1);
const end = Math.min(page + PAGINATION_UI_BUTTON_LIMIT, total);
2016-11-08 16:23:16 -05:00
2016-11-08 16:57:16 -05:00
for (let i = start; i <= end; i++) {
const isActive = i === page;
2016-12-07 15:35:26 -05:00
items.push({ title: i, active: isActive });
2016-11-08 16:57:16 -05:00
}
2016-11-08 16:23:16 -05:00
2016-11-18 17:26:49 -05:00
if (total - page > PAGINATION_UI_BUTTON_LIMIT) {
items.push({ title: SPREAD, separator: true });
}
2016-11-08 16:57:16 -05:00
if (page === total) {
2016-12-07 15:35:26 -05:00
items.push({ title: NEXT, disabled: true });
2016-11-08 16:57:16 -05:00
} else if (total - page >= 1) {
2016-12-07 15:35:26 -05:00
items.push({ title: NEXT });
2016-11-08 16:57:16 -05:00
}
2016-12-07 15:35:26 -05:00
if (total - page >= 1) items.push({ title: LAST });
2016-11-08 14:23:29 -05:00
return items;
},
},
template: `
<div class="gl-pagination">
2016-11-08 16:57:16 -05:00
<ul class="pagination clearfix" v-for='item in getItems'>
2016-11-08 16:23:16 -05:00
<li
2016-11-08 16:57:16 -05:00
:class='{
separator: item.separator,
active: item.active,
disabled: item.disabled
}'
2016-11-08 16:23:16 -05:00
>
<a
@click="changePage($event)"
2016-11-08 16:57:16 -05:00
>
{{item.title}}
</a>
2016-11-08 16:23:16 -05:00
</li>
</ul>
</div>
`,
});
})(window.gl || (window.gl = {}));