szurubooru/client/js/views/manual_page_view.js

81 lines
2.9 KiB
JavaScript

'use strict';
const events = require('../events.js');
const misc = require('../util/misc.js');
const views = require('../util/views.js');
function removeConsecutiveDuplicates(a) {
return a.filter((item, pos, ary) => {
return !pos || item != ary[pos - 1];
});
}
class ManualPageView {
constructor() {
this.holderTemplate = views.getTemplate('manual-pager');
this.navTemplate = views.getTemplate('manual-pager-nav');
}
render(ctx) {
const target = document.getElementById('content-holder');
const source = this.holderTemplate();
const pageContentHolder = source.querySelector('.page-content-holder');
const pageNav = source.querySelector('.page-nav');
ctx.requestPage(ctx.initialPage).then(response => {
let pageRendererCtx = response;
pageRendererCtx.target = pageContentHolder;
ctx.pageRenderer.render(pageRendererCtx);
const totalPages = Math.ceil(response.total / response.pageSize);
const threshold = 2;
let pagesVisible = [];
for (let i = 1; i <= threshold; i++) {
pagesVisible.push(i);
}
for (let i = totalPages - threshold; i <= totalPages; i++) {
pagesVisible.push(i);
}
for (let i = ctx.initialPage - threshold;
i <= ctx.initialPage + threshold;
i++) {
pagesVisible.push(i);
}
pagesVisible = pagesVisible.filter((item, pos, ary) => {
return item >= 1 && item <= totalPages;
});
pagesVisible = pagesVisible.sort((a, b) => { return a - b; });
pagesVisible = removeConsecutiveDuplicates(pagesVisible);
const pages = [];
let lastPage = 0;
for (let page of pagesVisible) {
if (page !== lastPage + 1) {
pages.push({ellipsis: true});
}
pages.push({
number: page,
link: ctx.clientUrl.format({page: page}),
active: ctx.initialPage === page,
});
lastPage = page;
}
views.showView(pageNav, this.navTemplate({
prevLink: ctx.clientUrl.format({page: ctx.initialPage - 1}),
nextLink: ctx.clientUrl.format({page: ctx.initialPage + 1}),
prevLinkActive: ctx.initialPage > 1,
nextLinkActive: ctx.initialPage < totalPages,
pages: pages,
}));
views.listenToMessages(target);
views.showView(target, source);
}, response => {
views.listenToMessages(target);
views.showView(target, source);
events.notify(events.Error, response.description);
});
}
}
module.exports = ManualPageView;