From 99528bbe85401000b751ef4787e59cb6c6dc0cf0 Mon Sep 17 00:00:00 2001 From: Arca Ege Cengiz Date: Fri, 3 Apr 2026 00:53:23 +0000 Subject: [PATCH] Add project type filter to ysws review page --- .../dashboard/admin/review/+page.svelte | 4 +- .../admin/ysws-review/+page.server.ts | 104 +++++++++++------- .../dashboard/admin/ysws-review/+page.svelte | 21 +++- 3 files changed, 85 insertions(+), 44 deletions(-) diff --git a/src/routes/dashboard/admin/review/+page.svelte b/src/routes/dashboard/admin/review/+page.svelte index b8b9299..87665b8 100644 --- a/src/routes/dashboard/admin/review/+page.svelte +++ b/src/routes/dashboard/admin/review/+page.svelte @@ -145,7 +145,7 @@ - {#each data.leaderboard as row} + {#each data.leaderboard as row (row.id)} {row.name} @@ -178,7 +178,7 @@ {:else}
- {#each projects as project} + {#each projects as project (project.project.id)}
diff --git a/src/routes/dashboard/admin/ysws-review/+page.server.ts b/src/routes/dashboard/admin/ysws-review/+page.server.ts index 852adee..5af5f49 100644 --- a/src/routes/dashboard/admin/ysws-review/+page.server.ts +++ b/src/routes/dashboard/admin/ysws-review/+page.server.ts @@ -1,5 +1,6 @@ import { db } from '$lib/server/db/index.js'; import { project, user, devlog, t2Review } from '$lib/server/db/schema.js'; +import { getProjectLinkType } from '$lib/utils'; import { error } from '@sveltejs/kit'; import { eq, and, sql, ne, inArray, desc, gt } from 'drizzle-orm'; @@ -23,11 +24,12 @@ export async function load({ locals, url }) { .getAll('user') .map((id) => parseInt(id)) .filter((id) => !isNaN(id) && id > 0); + const typeFilter = url.searchParams.getAll('type'); const doubleDippingFilter = hasFilters ? (url.searchParams.getAll('doubleDippingWith') as (typeof project.doubleDippingWith._.data)[]) : (['none'] as (typeof project.doubleDippingWith._.data)[]); - const projects = await getProjects(statusFilter, projectFilter, userFilter, doubleDippingFilter); + const projects = await getProjects(statusFilter, projectFilter, userFilter, typeFilter, doubleDippingFilter); const allProjects = await db .select({ @@ -73,6 +75,7 @@ export async function load({ locals, url }) { status: statusFilter, project: projectFilter, user: userFilter, + type: typeFilter, doubleDippingWith: doubleDippingFilter } }; @@ -82,47 +85,66 @@ async function getProjects( statusFilter: (typeof project.status._.data)[], projectFilter: number[], userFilter: number[], + typeFilter: string[], doubleDippingFilter: (typeof project.doubleDippingWith._.data)[] ) { - return await db - .select({ - project: { - id: project.id, - name: project.name, - description: project.description, - url: project.url, - createdAt: project.createdAt, - status: project.status - }, - user: { - id: user.id, - name: user.name - }, - timeSpent: sql`COALESCE(SUM(${devlog.timeSpent}), 0)`, - devlogCount: sql`COALESCE(COUNT(${devlog.id}), 0)` - }) - .from(project) - .leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false))) - .leftJoin(user, eq(user.id, project.userId)) - .where( - and( - eq(project.deleted, false), - statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined, - projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined, - userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined, - doubleDippingFilter.length > 0 - ? inArray(project.doubleDippingWith, doubleDippingFilter) - : undefined + return ( + await db + .select({ + project: { + id: project.id, + name: project.name, + description: project.description, + url: project.url, + editorFileType: project.editorFileType, + editorUrl: project.editorUrl, + uploadedFileUrl: project.uploadedFileUrl, + status: project.status, + createdAt: project.createdAt + }, + user: { + id: user.id, + name: user.name + }, + timeSpent: sql`COALESCE(SUM(${devlog.timeSpent}), 0)`, + devlogCount: sql`COALESCE(COUNT(${devlog.id}), 0)` + }) + .from(project) + .leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false))) + .leftJoin(user, eq(user.id, project.userId)) + .where( + and( + eq(project.deleted, false), + statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined, + projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined, + userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined, + doubleDippingFilter.length > 0 + ? inArray(project.doubleDippingWith, doubleDippingFilter) + : undefined + ) ) - ) - .groupBy( - project.id, - project.name, - project.description, - project.url, - project.createdAt, - project.status, - user.id, - user.name - ); + .groupBy( + project.id, + project.name, + project.description, + project.url, + project.editorFileType, + project.editorUrl, + project.uploadedFileUrl, + project.createdAt, + project.status, + user.id, + user.name + ) + ).filter((item) => + typeFilter.length > 0 + ? typeFilter.includes( + getProjectLinkType( + item.project.editorFileType, + item.project.editorUrl, + item.project.uploadedFileUrl + ) + ) + : true + ); } diff --git a/src/routes/dashboard/admin/ysws-review/+page.svelte b/src/routes/dashboard/admin/ysws-review/+page.svelte index d22d7fd..883f180 100644 --- a/src/routes/dashboard/admin/ysws-review/+page.svelte +++ b/src/routes/dashboard/admin/ysws-review/+page.svelte @@ -33,7 +33,7 @@

Filter & Sort

-
+
+ + +