Skip to content

Commit 6840b64

Browse files
authored
Merge pull request #105 from hackclub/BoarderGamez/main
Filter by editor type
2 parents 2444d07 + e053f24 commit 6840b64

File tree

4 files changed

+102
-44
lines changed

4 files changed

+102
-44
lines changed

src/lib/utils.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,14 @@ export function calculateMarketPrice(
7878
return Math.round(-m * shopScoreRemainder + maxPrice);
7979
}
8080
}
81+
82+
export function getProjectLinkType(
83+
editorFileType: string | null,
84+
editorUrl: string | null,
85+
uploadedFileUrl: string | null
86+
): string {
87+
if (editorFileType === 'url' && editorUrl?.includes('cad.onshape.com')) return 'onshape';
88+
if (editorFileType === 'url' && editorUrl?.includes('autodesk360.com')) return 'fusion-link';
89+
if (editorFileType === 'upload' && uploadedFileUrl?.endsWith('.f3d')) return 'fusion-file';
90+
return 'unknown';
91+
}

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

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { project, user, devlog, t1Review } from '$lib/server/db/schema.js';
33
import { error } from '@sveltejs/kit';
44
import { eq, and, sql, ne, inArray, desc, gt } 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) {
@@ -12,7 +13,7 @@ export async function load({ locals }) {
1213
throw error(403, { message: 'oi get out' });
1314
}
1415

15-
const projects = await getProjects(['submitted'], [], []);
16+
const projects = await getProjects(['submitted'], [], [], []);
1617

1718
const allProjects = await db
1819
.select({
@@ -82,14 +83,17 @@ export const actions = {
8283
return parseInt(userId.toString());
8384
});
8485

85-
const projects = await getProjects(statusFilter, projectFilter, userFilter);
86+
const typeFilter = data.getAll('type') as string[];
87+
88+
const projects = await getProjects(statusFilter, projectFilter, userFilter, typeFilter);
8689

8790
return {
8891
projects,
8992
fields: {
9093
status: statusFilter,
9194
project: projectFilter,
92-
user: userFilter
95+
user: userFilter,
96+
type: typeFilter
9397
}
9498
};
9599
}
@@ -98,44 +102,63 @@ export const actions = {
98102
async function getProjects(
99103
statusFilter: (typeof project.status._.data)[],
100104
projectFilter: number[],
101-
userFilter: number[]
105+
userFilter: number[],
106+
typeFilter: string[]
102107
) {
103-
return await db
104-
.select({
105-
project: {
106-
id: project.id,
107-
name: project.name,
108-
description: project.description,
109-
url: project.url,
110-
createdAt: project.createdAt,
111-
status: project.status
112-
},
113-
user: {
114-
id: user.id,
115-
name: user.name
116-
},
117-
timeSpent: sql<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
118-
devlogCount: sql<number>`COALESCE(COUNT(${devlog.id}), 0)`
119-
})
120-
.from(project)
121-
.leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false)))
122-
.leftJoin(user, eq(user.id, project.userId))
123-
.where(
124-
and(
125-
eq(project.deleted, false),
126-
statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined,
127-
projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined,
128-
userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined
108+
return (
109+
await db
110+
.select({
111+
project: {
112+
id: project.id,
113+
name: project.name,
114+
description: project.description,
115+
url: project.url,
116+
editorFileType: project.editorFileType,
117+
editorUrl: project.editorUrl,
118+
uploadedFileUrl: project.uploadedFileUrl,
119+
status: project.status,
120+
createdAt: project.createdAt
121+
},
122+
user: {
123+
id: user.id,
124+
name: user.name
125+
},
126+
timeSpent: sql<number>`COALESCE(SUM(${devlog.timeSpent}), 0)`,
127+
devlogCount: sql<number>`COALESCE(COUNT(${devlog.id}), 0)`
128+
})
129+
.from(project)
130+
.leftJoin(devlog, and(eq(project.id, devlog.projectId), eq(devlog.deleted, false)))
131+
.leftJoin(user, eq(user.id, project.userId))
132+
.where(
133+
and(
134+
eq(project.deleted, false),
135+
statusFilter.length > 0 ? inArray(project.status, statusFilter) : undefined,
136+
projectFilter.length > 0 ? inArray(project.id, projectFilter) : undefined,
137+
userFilter.length > 0 ? inArray(project.userId, userFilter) : undefined
138+
)
129139
)
130-
)
131-
.groupBy(
132-
project.id,
133-
project.name,
134-
project.description,
135-
project.url,
136-
project.createdAt,
137-
project.status,
138-
user.id,
139-
user.name
140-
);
140+
.groupBy(
141+
project.id,
142+
project.name,
143+
project.description,
144+
project.url,
145+
project.editorFileType,
146+
project.editorUrl,
147+
project.uploadedFileUrl,
148+
project.createdAt,
149+
project.status,
150+
user.id,
151+
user.name
152+
)
153+
).filter((item) =>
154+
typeFilter.length > 0
155+
? typeFilter.includes(
156+
getProjectLinkType(
157+
item.project.editorFileType,
158+
item.project.editorUrl,
159+
item.project.uploadedFileUrl
160+
)
161+
)
162+
: true
163+
);
141164
}

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { enhance } from '$app/forms';
33
import Head from '$lib/components/Head.svelte';
4-
import { projectStatuses } from '$lib/utils.js';
4+
import { projectStatuses, getProjectLinkType } from '$lib/utils.js';
55
import { ExternalLink } from '@lucide/svelte';
66
import relativeDate from 'tiny-relative-date';
77
@@ -42,7 +42,7 @@
4242
};
4343
}}
4444
>
45-
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3">
45+
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-4">
4646
<!-- Project status -->
4747
<label class="flex flex-col gap-1">
4848
<span class="font-medium">Status</span>
@@ -103,6 +103,22 @@
103103
</select>
104104
</div>
105105
</label>
106+
107+
<!-- Type-->
108+
<label class="flex flex-col gap-1">
109+
<span class="font-medium">Type</span>
110+
<select
111+
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"
112+
name="type"
113+
value={form?.fields.type ?? []}
114+
multiple
115+
>
116+
<option value="onshape" class="truncate">Onshape</option>
117+
<option value="fusion-link" class="truncate">Fusion Link</option>
118+
<option value="fusion-file" class="truncate">Fusion File</option>
119+
<option value="unknown" class="truncate">Other</option>
120+
</select>
121+
</label>
106122
</div>
107123
<button type="submit" class="button md primary mt-3 w-full" disabled={formPending}
108124
>Apply!</button
@@ -183,6 +199,13 @@
183199
{:else}
184200
<div class="mb-2"></div>
185201
{/if}
202+
<p class="text-sm">
203+
Type: {getProjectLinkType(
204+
project.project.editorFileType,
205+
project.project.editorUrl,
206+
project.project.uploadedFileUrl
207+
)}
208+
</p>
186209
<p class="text-sm">
187210
{project.devlogCount} journal{project.devlogCount !== 1 ? 's' : ''} ∙ {Math.floor(
188211
project.timeSpent / 60

src/routes/dashboard/admin/review/[id]/+page.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import Devlog from '$lib/components/Devlog.svelte';
44
import Head from '$lib/components/Head.svelte';
55
import { enhance } from '$app/forms';
6-
import { projectStatuses } from '$lib/utils.js';
6+
import { projectStatuses, getProjectLinkType} from '$lib/utils.js';
77
import ProjectLinks from '$lib/components/ProjectLinks.svelte';
88
import Spinny3DPreview from '$lib/components/Spinny3DPreview.svelte';
99
import { Download } from '@lucide/svelte';
@@ -49,6 +49,7 @@
4949
uploadedFileUrl={data.project.project.uploadedFileUrl}
5050
/>
5151
</div>
52+
<p class="text-sm">Type: {getProjectLinkType(data.project.project.editorFileType, data.project.project.editorUrl, data.project.project.uploadedFileUrl)}</p>
5253
</div>
5354

5455
<div>

0 commit comments

Comments
 (0)