Skip to content

Commit e053f24

Browse files
committed
Update filter to be server-side
1 parent 0a9360b commit e053f24

File tree

3 files changed

+70
-57
lines changed

3 files changed

+70
-57
lines changed

src/lib/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ export function calculateMarketPrice(
7979
}
8080
}
8181

82-
export function getProjectLinkType(editorFileType: string | null, editorUrl: string | null, uploadedFileUrl: string | null): string {
82+
export function getProjectLinkType(
83+
editorFileType: string | null,
84+
editorUrl: string | null,
85+
uploadedFileUrl: string | null
86+
): string {
8387
if (editorFileType === 'url' && editorUrl?.includes('cad.onshape.com')) return 'onshape';
8488
if (editorFileType === 'url' && editorUrl?.includes('autodesk360.com')) return 'fusion-link';
8589
if (editorFileType === 'upload' && uploadedFileUrl?.endsWith('.f3d')) return 'fusion-file';

src/routes/dashboard/admin/review/+page.server.ts

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { project, user, devlog } from '$lib/server/db/schema.js';
33
import { error } from '@sveltejs/kit';
44
import { eq, and, sql, ne, inArray } from 'drizzle-orm';
55
import type { Actions } from './$types';
6+
import { getProjectLinkType } from '$lib/utils';
67

78
export async function load({ locals }) {
89
if (!locals.user) {
@@ -63,7 +64,6 @@ export const actions = {
6364

6465
const typeFilter = data.getAll('type') as string[];
6566

66-
6767
const projects = await getProjects(statusFilter, projectFilter, userFilter, typeFilter);
6868

6969
return {
@@ -84,48 +84,60 @@ async function getProjects(
8484
userFilter: number[],
8585
typeFilter: string[]
8686
) {
87-
return await db
88-
.select({
89-
project: {
90-
id: project.id,
91-
name: project.name,
92-
description: project.description,
93-
url: project.url,
94-
editorFileType: project.editorFileType,
95-
editorUrl: project.editorUrl,
96-
uploadedFileUrl: project.uploadedFileUrl,
97-
status: project.status,
98-
createdAt: project.createdAt
99-
},
100-
user: {
101-
id: user.id,
102-
name: user.name
103-
},
104-
timeSpent: sql<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
105-
devlogCount: sql<number>`COALESCE(COUNT(${devlog.id}), 0)`
106-
})
107-
.from(project)
108-
.leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false)))
109-
.leftJoin(user, eq(user.id, project.userId))
110-
.where(
111-
and(
112-
eq(project.deleted, false),
113-
statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined,
114-
projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined,
115-
userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined
87+
return (
88+
await db
89+
.select({
90+
project: {
91+
id: project.id,
92+
name: project.name,
93+
description: project.description,
94+
url: project.url,
95+
editorFileType: project.editorFileType,
96+
editorUrl: project.editorUrl,
97+
uploadedFileUrl: project.uploadedFileUrl,
98+
status: project.status,
99+
createdAt: project.createdAt
100+
},
101+
user: {
102+
id: user.id,
103+
name: user.name
104+
},
105+
timeSpent: sql<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
106+
devlogCount: sql<number>`COALESCE(COUNT(${devlog.id}), 0)`
107+
})
108+
.from(project)
109+
.leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false)))
110+
.leftJoin(user, eq(user.id, project.userId))
111+
.where(
112+
and(
113+
eq(project.deleted, false),
114+
statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined,
115+
projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined,
116+
userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined
117+
)
118+
)
119+
.groupBy(
120+
project.id,
121+
project.name,
122+
project.description,
123+
project.url,
124+
project.editorFileType,
125+
project.editorUrl,
126+
project.uploadedFileUrl,
127+
project.createdAt,
128+
project.status,
129+
user.id,
130+
user.name
116131
)
117-
)
118-
.groupBy(
119-
project.id,
120-
project.name,
121-
project.description,
122-
project.url,
123-
project.editorFileType,
124-
project.editorUrl,
125-
project.uploadedFileUrl,
126-
project.createdAt,
127-
project.status,
128-
user.id,
129-
user.name
130-
);
132+
).filter((item) =>
133+
typeFilter.length > 0
134+
? typeFilter.includes(
135+
getProjectLinkType(
136+
item.project.editorFileType,
137+
item.project.editorUrl,
138+
item.project.uploadedFileUrl
139+
)
140+
)
141+
: true
142+
);
131143
}

src/routes/dashboard/admin/review/+page.svelte

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
1010
let projectSearch = $state('');
1111
let userSearch = $state('');
12-
let typeFilter = $state<string[]>([]);
1312
1413
let projects = $derived(form?.projects ?? data.projects);
1514
@@ -21,12 +20,6 @@
2120
let filteredUsers = $derived(
2221
data.users.filter((user) => user.name.toLowerCase().includes(userSearch.toLowerCase()))
2322
);
24-
let displayedProjects = $derived(
25-
projects.filter(p =>
26-
typeFilter.length === 0 ||
27-
typeFilter.includes(getProjectLinkType(p.project.editorFileType, p.project.editorUrl, p.project.uploadedFileUrl))
28-
)
29-
);
3023
3124
let formPending = $state(false);
3225
</script>
@@ -110,20 +103,20 @@
110103
</select>
111104
</div>
112105
</label>
106+
113107
<!-- Type-->
114108
<label class="flex flex-col gap-1">
115-
116109
<span class="font-medium">Type</span>
117110
<select
118111
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"
119112
name="type"
120-
bind:value={typeFilter}
113+
value={form?.fields.type ?? []}
121114
multiple
122115
>
123116
<option value="onshape" class="truncate">Onshape</option>
124117
<option value="fusion-link" class="truncate">Fusion Link</option>
125118
<option value="fusion-file" class="truncate">Fusion File</option>
126-
<option value="unknown" class="truncate">Unknown</option>
119+
<option value="unknown" class="truncate">Other</option>
127120
</select>
128121
</label>
129122
</div>
@@ -170,7 +163,7 @@
170163
</div>
171164
{:else}
172165
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2 2xl:grid-cols-3">
173-
{#each displayedProjects as project}
166+
{#each projects as project}
174167
<div
175168
class="themed-box relative flex flex-col p-3 shadow-lg/20 transition-all hover:scale-102"
176169
>
@@ -200,7 +193,11 @@
200193
<div class="mb-2"></div>
201194
{/if}
202195
<p class="text-sm">
203-
Type: {getProjectLinkType(project.project.editorFileType, project.project.editorUrl, project.project.uploadedFileUrl)}
196+
Type: {getProjectLinkType(
197+
project.project.editorFileType,
198+
project.project.editorUrl,
199+
project.project.uploadedFileUrl
200+
)}
204201
</p>
205202
<p class="text-sm">
206203
{project.devlogCount} journal{project.devlogCount !== 1 ? 's' : ''} ∙ {Math.floor(

0 commit comments

Comments
 (0)