Skip to content

Commit 4f4c679

Browse files
committed
fixes
1 parent 655b053 commit 4f4c679

10 files changed

Lines changed: 86 additions & 156 deletions

File tree

src/lib/components/archiveProject.svelte

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import ArchivedPaginationWithLimit from './archivedPaginationWithLimit.svelte';
2+
import PaginationWithLimit from './paginationWithLimit.svelte';
33
import { Button, InputText } from '$lib/elements/forms';
44
import { DropList, GridItem1, CardContainer, Modal } from '$lib/components';
55
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
@@ -320,13 +320,14 @@
320320
{/each}
321321
</CardContainer>
322322

323-
<div class="pagination-container">
324-
<ArchivedPaginationWithLimit
325-
name="Archived Projects"
326-
{limit}
327-
offset={archivedOffset}
328-
total={archivedTotalOverall} />
329-
</div>
323+
<PaginationWithLimit
324+
name="Archived Projects"
325+
{limit}
326+
offset={archivedOffset}
327+
total={archivedTotalOverall}
328+
pageParam="archivedPage"
329+
removeOnFirstPage
330+
class="pagination-container" />
330331
</div>
331332
</Accordion>
332333
</div>
@@ -400,7 +401,7 @@
400401
align-items: center;
401402
gap: 8px;
402403
}
403-
.pagination-container {
404+
:global(.pagination-container) {
404405
margin-top: 16px;
405406
}
406407
</style>

src/lib/components/archivedLimit.svelte

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/lib/components/archivedPagination.svelte

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/lib/components/archivedPaginationWithLimit.svelte

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/lib/components/limit.svelte

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
export let sum: number;
99
export let limit: number;
1010
export let name: string;
11+
export let pageParam: string = 'page';
12+
export let removeOnFirstPage: boolean = false;
1113
1214
const options = [
1315
{ label: '6', value: 6 },
@@ -23,10 +25,15 @@
2325
url.searchParams.set('limit', limit.toString());
2426
await preferences.setLimit(limit);
2527
26-
if (url.searchParams.has('page')) {
27-
const page = Number(url.searchParams.get('page'));
28+
if (url.searchParams.has(pageParam)) {
29+
const page = Number(url.searchParams.get(pageParam));
2830
const newPage = Math.floor(((page - 1) * previousLimit) / limit);
29-
url.searchParams.set('page', newPage.toString());
31+
const safePage = Math.max(1, Number.isFinite(newPage) ? newPage : 1);
32+
if (removeOnFirstPage && safePage === 1) {
33+
url.searchParams.delete(pageParam);
34+
} else {
35+
url.searchParams.set(pageParam, safePage.toString());
36+
}
3037
}
3138
3239
await goto(url.toString());

src/lib/components/pagination.svelte

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,21 @@
66
export let limit: number;
77
export let offset: number;
88
export let useCreateLink = true;
9+
export let pageParam: string = 'page';
10+
export let removeOnFirstPage: boolean = false;
911
1012
$: currentPage = Math.floor(offset / limit + 1);
1113
1214
function getLink(page: number): string {
1315
const url = new URL(pageStore.url);
1416
if (page === 1) {
15-
url.searchParams.delete('page');
17+
if (removeOnFirstPage) {
18+
url.searchParams.delete(pageParam);
19+
} else {
20+
url.searchParams.set(pageParam, '1');
21+
}
1622
} else {
17-
url.searchParams.set('page', page.toString());
23+
url.searchParams.set(pageParam, page.toString());
1824
}
1925
2026
return url.toString();

src/lib/components/paginationWithLimit.svelte

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,37 @@
88
offset,
99
total,
1010
name,
11-
useCreateLink = true
11+
useCreateLink = true,
12+
pageParam = 'page',
13+
removeOnFirstPage = false,
14+
...restProps
1215
}: {
1316
limit: number;
1417
offset: number;
1518
total: number;
1619
name: string;
1720
useCreateLink?: boolean;
21+
pageParam?: string;
22+
removeOnFirstPage?: boolean;
23+
[key: string]: any;
1824
} = $props();
1925
2026
const showLimit = $derived(!!useCreateLink);
2127
const direction = $derived(showLimit ? 'row' : 'column');
2228
const alignItems = $derived(showLimit ? 'center' : 'flex-end');
2329
</script>
2430

25-
<Layout.Stack wrap="wrap" {direction} {alignItems} justifyContent="space-between">
31+
<Layout.Stack wrap="wrap" {direction} {alignItems} justifyContent="space-between" {...restProps}>
2632
{#if showLimit}
27-
<Limit {limit} sum={total} {name} />
33+
<Limit {limit} sum={total} {name} {pageParam} {removeOnFirstPage} />
2834
{/if}
2935

30-
<Pagination on:page {limit} {offset} sum={total} {useCreateLink} />
36+
<Pagination
37+
on:page
38+
{limit}
39+
{offset}
40+
sum={total}
41+
{useCreateLink}
42+
{pageParam}
43+
{removeOnFirstPage} />
3144
</Layout.Stack>

src/lib/components/paginator.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
name = 'items',
1414
gap = 's',
1515
offset = $bindable(0),
16-
children
16+
children,
17+
...restProps
1718
}: {
1819
items: T[];
1920
limit?: number;
@@ -26,14 +27,15 @@
2627
| undefined;
2728
offset?: number;
2829
children: Snippet<[T[], number]>;
30+
[key: string]: any;
2931
} = $props();
3032
3133
let total = $derived(items.length);
3234
3335
let paginatedItems = $derived(items.slice(offset, offset + limit));
3436
</script>
3537

36-
<Layout.Stack {gap}>
38+
<Layout.Stack {gap} {...restProps}>
3739
{@render children(paginatedItems, limit)}
3840

3941
{#if !hideFooter}

src/routes/(console)/organization-[organization]/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
}
111111
112112
$: projectsToArchive = (data.archivedProjectsPage ?? data.projects.projects).filter(
113-
(project) => (isCloud ? project.status === 'archived' : project.status !== 'active') // fallback for non-cloud
113+
(project) => project.status === 'archived'
114114
);
115115
116116
$: activeProjects = (data.activeProjectsPage ?? data.projects.projects).filter(

src/routes/(console)/organization-[organization]/+page.ts

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,43 +21,42 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
2121
const archivedPage = parseInt(url.searchParams.get('archivedPage') || '1');
2222
const archivedOffset = pageToOffset(archivedPage, limit);
2323

24-
// fetch active projects with offset set
25-
const activeProjects = await sdk.forConsole.projects.list({
26-
queries: [
27-
Query.offset(offset),
28-
Query.equal('teamId', params.organization),
29-
Query.or([Query.equal('status', 'active'), Query.isNull('status')]),
30-
Query.limit(limit),
31-
Query.orderDesc('')
32-
],
33-
search: search || undefined
34-
});
35-
36-
// Fetch archived projects with separate pagination
37-
const archivedProjects = await sdk.forConsole.projects.list({
38-
queries: [
39-
Query.offset(archivedOffset),
40-
Query.equal('teamId', params.organization),
41-
Query.equal('status', 'archived'),
42-
Query.limit(limit),
43-
Query.orderDesc('')
44-
],
45-
search: search || undefined
46-
});
47-
48-
// get total counts
49-
const activeTotal = await sdk.forConsole.projects.list({
50-
queries: [
51-
Query.equal('teamId', params.organization),
52-
Query.or([Query.equal('status', 'active'), Query.isNull('status')])
53-
],
54-
search: search || undefined
55-
});
56-
57-
const archivedTotal = await sdk.forConsole.projects.list({
58-
queries: [Query.equal('teamId', params.organization), Query.equal('status', 'archived')],
59-
search: search || undefined
60-
});
24+
const [activeProjects, archivedProjects, activeTotal, archivedTotal] = await Promise.all([
25+
sdk.forConsole.projects.list({
26+
queries: [
27+
Query.offset(offset),
28+
Query.equal('teamId', params.organization),
29+
Query.or([Query.equal('status', 'active'), Query.isNull('status')]),
30+
Query.limit(limit),
31+
Query.orderDesc('')
32+
],
33+
search: search || undefined
34+
}),
35+
sdk.forConsole.projects.list({
36+
queries: [
37+
Query.offset(archivedOffset),
38+
Query.equal('teamId', params.organization),
39+
Query.equal('status', 'archived'),
40+
Query.limit(limit),
41+
Query.orderDesc('')
42+
],
43+
search: search || undefined
44+
}),
45+
sdk.forConsole.projects.list({
46+
queries: [
47+
Query.equal('teamId', params.organization),
48+
Query.or([Query.equal('status', 'active'), Query.isNull('status')])
49+
],
50+
search: search || undefined
51+
}),
52+
sdk.forConsole.projects.list({
53+
queries: [
54+
Query.equal('teamId', params.organization),
55+
Query.equal('status', 'archived')
56+
],
57+
search: search || undefined
58+
})
59+
]);
6160

6261
// set `default` if no region!
6362
for (const project of activeProjects.projects) {

0 commit comments

Comments
 (0)