diff --git a/changes/changelog.d/84.bugfix b/changes/changelog.d/84.bugfix new file mode 100644 index 0000000000000000000000000000000000000000..2d7e08da04fc728b4f48fc33156a845777fc2317 --- /dev/null +++ b/changes/changelog.d/84.bugfix @@ -0,0 +1 @@ +Smarter pagination which takes a fixed size (#84) diff --git a/front/src/components/Pagination.vue b/front/src/components/Pagination.vue index 83b386fdeb57f72700b97abacf37c4512bcff5e0..71813a18a400ec2c712d19889d8e1a2a4372d414 100644 --- a/front/src/components/Pagination.vue +++ b/front/src/components/Pagination.vue @@ -1,23 +1,23 @@ <template> <div class="ui pagination borderless menu"> - <a - @click="selectPage(1)" - :class="[{'disabled': current === 1}, 'item']"><i class="angle double left icon"></i></a> <a @click="selectPage(current - 1)" :class="[{'disabled': current - 1 < 1}, 'item']"><i class="angle left icon"></i></a> - <a - v-for="page in pages" - @click="selectPage(page)" - :class="[{'active': page === current}, 'item']"> - {{ page }} - </a> + <template> + <a + v-if="page !== 'skip'" + v-for="page in pages" + @click="selectPage(page)" + :class="[{'active': page === current}, 'item']"> + {{ page }} + </a> + <a v-else class="disabled item"> + ... + </a> + </template> <a @click="selectPage(current + 1)" :class="[{'disabled': current + 1 > maxPage}, 'item']"><i class="angle right icon"></i></a> - <a - @click="selectPage(maxPage)" - :class="[{'disabled': current === maxPage}, 'item']"><i class="angle double right icon"></i></a> </div> </template> @@ -32,7 +32,38 @@ export default { }, computed: { pages: function () { - return _.range(1, this.maxPage + 1) + let range = 2 + let current = this.current + let beginning = _.range(1, Math.min(this.maxPage, 1 + range)) + let middle = _.range(Math.max(1, current - range + 1), Math.min(this.maxPage, current + range)) + let end = _.range(this.maxPage, Math.max(1, this.maxPage - range)) + let allowed = beginning.concat(middle, end) + allowed = _.uniq(allowed) + allowed = _.sortBy(allowed, [(e) => { return e }]) + let final = [] + allowed.forEach(p => { + let last = final.slice(-1)[0] + let consecutive = true + if (last === 'skip') { + consecutive = false + } else { + if (!last) { + consecutive = true + } else { + consecutive = last + 1 === p + } + } + if (consecutive) { + final.push(p) + } else { + if (p !== 'skip') { + final.push('skip') + final.push(p) + } + } + }) + console.log(final) + return final }, maxPage: function () { return Math.ceil(this.total / this.paginateBy)