PSFPortal/app/components/PaginatedList.svelte

82 lines
1.8 KiB
Svelte
Raw Permalink Normal View History

2019-12-30 14:27:49 +00:00
<script>
import { onMount } from 'svelte'
import axios from 'axios'
import Pagination from '../components/Pagination'
2019-12-30 18:20:50 +00:00
export let setURLParam = false;
export let URLSearchName = 'page';
2019-12-30 14:27:49 +00:00
export let fetch;
let data;
let fetching = false;
let pagination = { page: 1 };
export async function refresh(newpage) {
if (newpage !== undefined && typeof newpage == "number")
await list_fetch(newpage)
else
await list_fetch(pagination.page)
2019-12-30 14:27:49 +00:00
}
onMount(async () => {
const url = new URL(window.location.href)
2019-12-30 18:20:50 +00:00
let initialPage = 1;
2019-12-30 14:27:49 +00:00
2019-12-30 18:20:50 +00:00
if (setURLParam) {
let param = parseInt(url.searchParams.get(URLSearchName))
2019-12-30 14:27:49 +00:00
if (!isNaN(param))
2019-12-30 18:20:50 +00:00
initialPage = param;
}
await list_fetch(initialPage);
2019-12-30 14:27:49 +00:00
})
async function pageChange(page) {
if (pagination.page == page || fetching)
return
if (setURLParam) {
const url = new URL(window.location.href);
url.searchParams.set(URLSearchName, page);
history.replaceState(null, null,
url.pathname + url.search + url.hash)
}
2019-12-30 14:27:49 +00:00
await list_fetch(page);
}
async function list_fetch(page) {
fetching = true;
try {
if (fetch != undefined) {
const results = await fetch(page)
if (results != undefined) {
data = results[0];
pagination = results[1]
}
}
} finally {
fetching = false;
}
}
</script>
{#if data}
<slot name="header" data={data} pagination={pagination}></slot>
2019-12-30 18:20:50 +00:00
{#if pagination.item_count > 0}
{#if pagination.page_count > 1}
<Pagination {pagination} {pageChange} {setURLParam} {URLSearchName} />
{/if}
<slot name="body" data={data} pagination={pagination}></slot>
{#if pagination.page_count > 1}
<Pagination {pagination} {pageChange} {setURLParam} {URLSearchName} />
{/if}
2019-12-30 18:20:50 +00:00
{/if}
2019-12-30 14:27:49 +00:00
<slot name="footer" data={data} pagination={pagination}></slot>
{/if}