89 lines
2.3 KiB
Svelte
89 lines
2.3 KiB
Svelte
<script lang="ts">
|
|
import {route} from "../../../common/Routing.js";
|
|
import {Pagination} from "../../../common/Pagination.js";
|
|
import Icon from "../utils/Icon.svelte";
|
|
|
|
export let pagination: string;
|
|
export let routeName: string;
|
|
export let contextSize: number;
|
|
|
|
if (typeof contextSize !== 'number') contextSize = parseInt(contextSize);
|
|
|
|
$: paginationObj = pagination ? Pagination.deserialize(pagination) : null;
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
@import "../../scss/helpers";
|
|
|
|
.pagination {
|
|
ul {
|
|
display: flex;
|
|
flex-direction: row;
|
|
width: fit-content;
|
|
max-width: 100%;
|
|
margin: 8px auto;
|
|
padding: 0;
|
|
|
|
list-style: none;
|
|
overflow-x: auto;
|
|
|
|
border-radius: 5px;
|
|
|
|
li {
|
|
white-space: nowrap;
|
|
|
|
a, span {
|
|
display: block;
|
|
padding: 8px 12px;
|
|
|
|
&:not(span):hover {
|
|
background: #0002;
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
background: #fff2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
|
|
{#if paginationObj && (paginationObj.hasPrevious() || paginationObj.hasNext())}
|
|
<nav class="pagination">
|
|
<ul class="panel">
|
|
{#if paginationObj.hasPrevious()}
|
|
<li><a href={route(routeName, {page: paginationObj.page - 1})}>
|
|
<Icon name="chevron-left"/>
|
|
Previous
|
|
</a></li>
|
|
|
|
{#each paginationObj.previousPages(contextSize) as i}
|
|
{#if i === -1}
|
|
<li class="ellipsis"><span>...</span></li>
|
|
{:else}
|
|
<li><a href={route(routeName, {page: i})}>{i}</a></li>
|
|
{/if}
|
|
{/each}
|
|
{/if}
|
|
|
|
<li class="active"><span>{paginationObj.page}</span></li>
|
|
|
|
{#if paginationObj.hasNext()}
|
|
{#each paginationObj.nextPages(contextSize) as i}
|
|
{#if i === -1}
|
|
<li class="ellipsis"><span>...</span></li>
|
|
{:else}
|
|
<li><a href={route(routeName, {page: i})}>{i}</a></li>
|
|
{/if}
|
|
{/each}
|
|
|
|
<li><a href={route(routeName, {page: paginationObj.page + 1})}>
|
|
Next
|
|
<Icon name="chevron-right"/>
|
|
</a></li>
|
|
{/if}
|
|
</ul>
|
|
</nav>
|
|
{/if}
|