diff --git a/frontend/src/routes/(app)/links/+page.server.ts b/frontend/src/routes/(app)/links/+page.server.ts index 40baa93..bcd92a1 100644 --- a/frontend/src/routes/(app)/links/+page.server.ts +++ b/frontend/src/routes/(app)/links/+page.server.ts @@ -19,7 +19,7 @@ export const load = (async (event) => { let sortBy = event.url.searchParams.get('sortBy') let page = parseInt(event.url.searchParams.get('page') ?? '1') let perPage = parseInt( - event.url.searchParams.get('perPage') ?? '10', + event.url.searchParams.get('perPage') ?? '12', ) if (isNaN(page)) { @@ -83,6 +83,21 @@ export const load = (async (event) => { .offset(perPage * (page - 1)) .limit(perPage) + const pagination = db + .select({ + total: sql`count(*)`.as('total'), + }) + .from(shortener) + .where( + and( + eq(shortener.userId, user.id), + project_id ? eq(shortener.projectId, project_id) : undefined, + search + ? ilike(shortener.link, `%${decodeURI(search)}%`) + : undefined, + ), + ) + if (sortBy === 'latest') { shorteners.orderBy(desc(shortener.createdAt)) } else if (sortBy === 'oldest') { @@ -108,5 +123,6 @@ export const load = (async (event) => { perPage, search, sortBy, + pagination, } }) satisfies PageServerLoad diff --git a/frontend/src/routes/(app)/links/+page.svelte b/frontend/src/routes/(app)/links/+page.svelte index 20ce8b5..b8abe06 100644 --- a/frontend/src/routes/(app)/links/+page.svelte +++ b/frontend/src/routes/(app)/links/+page.svelte @@ -80,36 +80,25 @@ qrDialogOpen = true } - let page: number = data.page - let perPage: any = { label: data.perPage, value: data.perPage } - let selectedProjectUUID: string | null - $: selectedProjectUUID = data.selected_project.value let search: string | null = data.search let searchUpdateTimeout: any - let sortBy: any = { label: data.sortBy, value: data.sortBy } $: browser && - updateUrl(selectedProjectUUID, page, perPage, search, sortBy) + goto(updateSearchParam([{ name: 'search', value: search }])) - const updateUrl = ( - selectedProjectUUID: string | null, - page: number, - perPage: any, - search: string | null, - sortBy: any, + const updateSearchParam = ( + params: { name: string; value: any }[], ) => { - let query = [`page=${page}`, `perPage=${perPage.value}`] - if (selectedProjectUUID) { - query.push(`project=${selectedProjectUUID}`) - } - if (search) { - query.push(`search=${encodeURI(search)}`) - } - if (sortBy) { - query.push(`sortBy=${sortBy.value}`) - } - - goto(`/links?${query.join('&')}`) + const urlParams = new URLSearchParams(window.location.search) + params.map(({ name, value }) => { + if (value) { + urlParams.set(name, value) + } else { + urlParams.delete(name) + } + }) + const searchParams = urlParams.toString() + return '/links?' + searchParams } @@ -135,41 +124,61 @@ No project found. - { - selectedProjectUUID = null - page = 1 - open = false - }}> - - All - - {#each data.projects as project} + { - selectedProjectUUID = project.uuid - page = 1 open = false }}> - {project.name} + All + + {#each data.projects as project} + + { + open = false + }}> + + {project.name} + + {/each} - + @@ -177,8 +186,15 @@ Sort By {#each ['latest', 'oldest', 'most_visited'] as sortBy} - {sortBy} + + + {sortBy} + + {/each} @@ -304,40 +320,91 @@ {/each} -
- - - - - - - Page Size - {#each [10, 20, 50, 100] as pageSize} + {:else} +
+
+
+
No Shortener Found
+
+ +
+
+ {/if} +{/await} + +{#await data.pagination then pagination} +
+ + + + + + + Page Size + {#each [12, 24, 48, 96] as pageSize} + {pageSize} - {/each} - - - - - - + + {/each} + + + + + + + {#if data.page <= 1} - {#each pages as page (page.key)} - {#if page.type === 'ellipsis'} - - - - {:else} + {:else} + + + + + + {/if} + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + - {/if} - {/each} + + {/if} + {/each} + {#if data.page >= pagination[0].total / data.perPage} - - -
- {:else} -
-
-
-
No Shortener Found
-
- -
-
- {/if} + {:else} + + + + + + {/if} + + +
{/await}