/*
Vue
...
data: {
pagination: {
page: 1,
per_page: {{ per_page }},
size: {{ pagedata['count'] }}
},
}
...
Flask
pagedata['pagination'] = {
"page": page,
"per_page": app.config['ITEMS_ON_PAGE'],
"size": 0
}
*/
let paginationTemplate = `
...
...
`;
root.components['pagination-component'] = {
template: paginationTemplate,
data: function() {
return {
}
},
props:{
pagination: {
type: Array,
required: true,
default: {
page: 1,
per_page: 25,
size: 0
}
},
clickHandler: {
type: Function,
default: function() { }
},
},
methods: {
handlePageSelected: function(selected) {
/* Установить номер текущей страницы и вызвать функция обновления
* страницы
*
* Аргументы:
* selected -- номер страницы
*/
let vm = this;
vm.pagination.page = selected;
vm.clickHandler();
},
pages: function() {
let vm = this;
return Math.ceil(vm.pagination.size/vm.pagination.per_page);
},
},
computed: {
has_prev: function() {
let vm = this;
return vm.pagination.page > 1;
},
has_next: function() {
let vm = this;
return vm.pagination.page < vm.pages();
},
iter_pages: function() {
/* */
let vm = this;
let last = 0;
let left_edge=2, left_current=2,
right_current=5, right_edge=2;
let result = [];
for (let num = 1; num < vm.pages()+1; num++) {
if (num <= left_edge ||
(num > vm.pagination.page - left_current - 1 &&
num < vm.pagination.page + right_current) ||
num > vm.pages() - right_edge) {
if (last + 1 != num) {
result.push(null);
} else {
result.push(num);
}
last = num
}
};
return result;
},
}
};