PSFPortal/app/components/Pagination.svelte

95 lines
3 KiB
Svelte
Raw Normal View History

2019-12-30 14:27:49 +00:00
<script>
import page from 'page'
2019-12-30 14:27:49 +00:00
export let pagination;
export let pageChange;
export let URLSearchName = 'page';
2019-12-30 18:20:50 +00:00
export let displayPages = 10;
2019-12-30 14:27:49 +00:00
let pages = []
2019-12-30 18:20:50 +00:00
function pageClick(event) {
const target_page = parseInt(event.target.getAttribute('data-page'));
event.preventDefault()
pageChange(target_page)
2019-12-30 18:20:50 +00:00
}
2019-12-30 14:27:49 +00:00
$ : {
const new_pages = [];
let pi = 0, i;
let pg = pagination;
2019-12-30 18:20:50 +00:00
const pageChunk = Math.max(Math.ceil(displayPages/3), 1);
2019-12-30 14:27:49 +00:00
const middleChunk = Math.max(Math.ceil(pageChunk/2), 1);
const leftBound = Math.min(pageChunk+1, pagination.page_count);
const rightBound = Math.max(pagination.page_count-pageChunk, 1);
// fast path: draw all pages
2019-12-30 18:20:50 +00:00
if (pg.page_count <= displayPages || rightBound <= leftBound) {
2019-12-30 14:27:49 +00:00
for (i = 1; i <= pg.page_count; i++)
new_pages[pi++] = i;
} else {
let middleLeft = Math.max(pg.page-middleChunk, leftBound);
let middleRight = Math.min(pg.page+middleChunk, rightBound);
// left and middle chunks are joined
if (middleLeft == leftBound) {
middleLeft += 1;
middleRight = Math.min(middleLeft+pageChunk, rightBound);
// middle and right chunks are joined
} else if (middleRight == rightBound) {
middleRight -= 1;
middleLeft = Math.min(middleRight-middleChunk, rightBound);
}
//console.log("[1-"+leftBound+"]", "["+middleLeft+"-"+middleRight+"]", "["+rightBound+"-"+pagination.page_count+"]");
// left chunk
for (i = 1; i <= leftBound; i++) new_pages[pi++] = i;
if (leftBound+1 != middleLeft) new_pages[pi++] = -1;
// middle chunk
for (i = middleLeft; i <= middleRight; i++) new_pages[pi++] = i;
// right chunk
if (middleRight+1 != rightBound) new_pages[pi++] = -1;
for (i = rightBound; i <= pg.page_count; i++) new_pages[pi++] = i;
}
pages = new_pages
//console.log(pages);
}
</script>
<p>Displaying {(pagination.page-1)*pagination.items_per_page+1} &mdash; {Math.min(pagination.page*pagination.items_per_page, pagination.item_count)}</p>
<nav aria-label="Page navigation">
2019-12-30 18:20:50 +00:00
<ul class="pagination pagination-sm">
<li class="page-item" class:disabled={pagination.page<=1}>
<a class="page-link" href="?{URLSearchName}={pagination.page-1}"
on:click|preventDefault={pageClick}
2019-12-30 18:20:50 +00:00
data-page={pagination.page-1}
aria-label="Previous">
&laquo;
</a>
</li>
{#each pages as page,i}
2019-12-30 14:27:49 +00:00
{#if page == -1}
2019-12-30 18:20:50 +00:00
<li class="page-item page-last-separator disabled"><span class="page-link">...</span></li>
2019-12-30 14:27:49 +00:00
{:else}
2019-12-30 18:20:50 +00:00
<li class="page-item" class:active={page==pagination.page}>
<a on:click|preventDefault={pageClick} href="?{URLSearchName}={page}" data-page={page} class="page-link">{page}</a>
2019-12-30 18:20:50 +00:00
</li>
2019-12-30 14:27:49 +00:00
{/if}
2019-12-30 18:20:50 +00:00
{/each}
<li class="page-item" class:disabled={pagination.page>=pagination.page_count}>
<a class="page-link" href="?{URLSearchName}={pagination.page+1}"
2019-12-30 18:20:50 +00:00
data-page={pagination.page+1}
on:click|preventDefault={pageClick}
2019-12-30 18:20:50 +00:00
aria-label="Next">
&raquo;
</a>
</li>
</ul>
2019-12-30 14:27:49 +00:00
</nav>