Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/routes/dashboard/admin/review/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@
</tr>
</thead>
<tbody>
{#each data.leaderboard as row}
{#each data.leaderboard as row (row.id)}
<tr>
<td class="py-1" align="left">
<a class="underline" href={`/dashboard/users/${row.id}`}>{row.name}</a>
Expand Down Expand Up @@ -178,7 +178,7 @@
</div>
{:else}
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2 2xl:grid-cols-3">
{#each projects as project}
{#each projects as project (project.project.id)}
<div
class="themed-box relative flex flex-col p-3 shadow-lg/20 transition-all hover:scale-102"
>
Expand Down
104 changes: 63 additions & 41 deletions src/routes/dashboard/admin/ysws-review/+page.server.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -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({
Expand Down Expand Up @@ -73,6 +75,7 @@ export async function load({ locals, url }) {
status: statusFilter,
project: projectFilter,
user: userFilter,
type: typeFilter,
doubleDippingWith: doubleDippingFilter
}
};
Expand All @@ -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<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
devlogCount: sql<number>`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<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
devlogCount: sql<number>`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
);
}
21 changes: 20 additions & 1 deletion src/routes/dashboard/admin/ysws-review/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
<div class="themed-box grow p-3">
<h2 class="mb-2 text-xl font-bold">Filter & Sort</h2>
<form method="GET">
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-4">
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5">
<!-- Project status -->
<label class="flex flex-col gap-1">
<span class="font-medium">Status</span>
Expand Down Expand Up @@ -95,6 +95,25 @@
</div>
</label>

<!-- Type-->
<label class="flex flex-col gap-1">
<span class="font-medium">Type</span>
<select
class="h-40 grow border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 placeholder:text-primary-900 active:ring-3"
name="type"
value={data.fields.type}
multiple
>
<option value="onshape" class="truncate">Onshape</option>
<option value="fusion-link" class="truncate">Fusion Link</option>
<option value="fusion-file" class="truncate">Fusion File</option>
<option value="blender" class="truncate">Blender</option>
<option value="freecad" class="truncate">FreeCAD</option>
<option value="solvespace" class="truncate">SolveSpace</option>
<option value="unknown" class="truncate">Other</option>
</select>
</label>

<!-- Double Dipping -->
<label class="flex flex-col gap-1">
<span class="font-medium">Double Dipping</span>
Expand Down
Loading