From 0a9360ba4eb39b63b353a178e3bb470aa2584c75 Mon Sep 17 00:00:00 2001 From: BoarderGamez Date: Tue, 6 Jan 2026 01:42:06 +0000 Subject: [PATCH 1/6] Added markation of type plus filtering --- src/lib/utils.ts | 7 ++++ .../dashboard/admin/review/+page.server.ts | 23 +++++++++---- .../dashboard/admin/review/+page.svelte | 32 +++++++++++++++++-- .../dashboard/admin/review/[id]/+page.svelte | 3 +- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index d3d0eef..fc08c9d 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -78,3 +78,10 @@ export function calculateMarketPrice( return Math.round(-m * shopScoreRemainder + maxPrice); } } + +export function getProjectLinkType(editorFileType: string | null, editorUrl: string | null, uploadedFileUrl: string | null): string { + if (editorFileType === 'url' && editorUrl?.includes('cad.onshape.com')) return 'onshape'; + if (editorFileType === 'url' && editorUrl?.includes('autodesk360.com')) return 'fusion-link'; + if (editorFileType === 'upload' && uploadedFileUrl?.endsWith('.f3d')) return 'fusion-file'; + return 'unknown'; +} diff --git a/src/routes/dashboard/admin/review/+page.server.ts b/src/routes/dashboard/admin/review/+page.server.ts index 1abf3bf..0a38355 100644 --- a/src/routes/dashboard/admin/review/+page.server.ts +++ b/src/routes/dashboard/admin/review/+page.server.ts @@ -12,7 +12,7 @@ export async function load({ locals }) { throw error(403, { message: 'oi get out' }); } - const projects = await getProjects(['submitted'], [], []); + const projects = await getProjects(['submitted'], [], [], []); const allProjects = await db .select({ @@ -61,14 +61,18 @@ export const actions = { return parseInt(userId.toString()); }); - const projects = await getProjects(statusFilter, projectFilter, userFilter); + const typeFilter = data.getAll('type') as string[]; + + + const projects = await getProjects(statusFilter, projectFilter, userFilter, typeFilter); return { projects, fields: { status: statusFilter, project: projectFilter, - user: userFilter + user: userFilter, + type: typeFilter } }; } @@ -77,7 +81,8 @@ export const actions = { async function getProjects( statusFilter: (typeof project.status._.data)[], projectFilter: number[], - userFilter: number[] + userFilter: number[], + typeFilter: string[] ) { return await db .select({ @@ -86,8 +91,11 @@ async function getProjects( name: project.name, description: project.description, url: project.url, - createdAt: project.createdAt, - status: project.status + editorFileType: project.editorFileType, + editorUrl: project.editorUrl, + uploadedFileUrl: project.uploadedFileUrl, + status: project.status, + createdAt: project.createdAt }, user: { id: user.id, @@ -112,6 +120,9 @@ async function getProjects( project.name, project.description, project.url, + project.editorFileType, + project.editorUrl, + project.uploadedFileUrl, project.createdAt, project.status, user.id, diff --git a/src/routes/dashboard/admin/review/+page.svelte b/src/routes/dashboard/admin/review/+page.svelte index 2f5c3e8..5847fc3 100644 --- a/src/routes/dashboard/admin/review/+page.svelte +++ b/src/routes/dashboard/admin/review/+page.svelte @@ -1,7 +1,7 @@ @@ -42,7 +49,7 @@ }; }} > -
+
+ +
{:else}
- {#each projects as project} + {#each displayedProjects as project}
@@ -176,6 +199,9 @@ {:else}
{/if} +

+ Type: {getProjectLinkType(project.project.editorFileType, project.project.editorUrl, project.project.uploadedFileUrl)} +

{project.devlogCount} journal{project.devlogCount !== 1 ? 's' : ''} ∙ {Math.floor( project.timeSpent / 60 diff --git a/src/routes/dashboard/admin/review/[id]/+page.svelte b/src/routes/dashboard/admin/review/[id]/+page.svelte index e7206f5..ac51e4d 100644 --- a/src/routes/dashboard/admin/review/[id]/+page.svelte +++ b/src/routes/dashboard/admin/review/[id]/+page.svelte @@ -3,7 +3,7 @@ import Devlog from '$lib/components/Devlog.svelte'; import Head from '$lib/components/Head.svelte'; import { enhance } from '$app/forms'; - import { projectStatuses } from '$lib/utils.js'; + import { projectStatuses, getProjectLinkType} from '$lib/utils.js'; import ProjectLinks from '$lib/components/ProjectLinks.svelte'; import Spinny3DPreview from '$lib/components/Spinny3DPreview.svelte'; import { Download } from '@lucide/svelte'; @@ -49,6 +49,7 @@ uploadedFileUrl={data.project.project.uploadedFileUrl} />

+

Type: {getProjectLinkType(data.project.project.editorFileType, data.project.project.editorUrl, data.project.project.uploadedFileUrl)}

From e053f2476324a3525c767a91a7a1d2dcf6c624c9 Mon Sep 17 00:00:00 2001 From: Arca Ege Cengiz Date: Sat, 10 Jan 2026 18:26:00 +0000 Subject: [PATCH 2/6] Update filter to be server-side --- src/lib/utils.ts | 6 +- .../dashboard/admin/review/+page.server.ts | 100 ++++++++++-------- .../dashboard/admin/review/+page.svelte | 21 ++-- 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index fc08c9d..046ed1e 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -79,7 +79,11 @@ export function calculateMarketPrice( } } -export function getProjectLinkType(editorFileType: string | null, editorUrl: string | null, uploadedFileUrl: string | null): string { +export function getProjectLinkType( + editorFileType: string | null, + editorUrl: string | null, + uploadedFileUrl: string | null +): string { if (editorFileType === 'url' && editorUrl?.includes('cad.onshape.com')) return 'onshape'; if (editorFileType === 'url' && editorUrl?.includes('autodesk360.com')) return 'fusion-link'; if (editorFileType === 'upload' && uploadedFileUrl?.endsWith('.f3d')) return 'fusion-file'; diff --git a/src/routes/dashboard/admin/review/+page.server.ts b/src/routes/dashboard/admin/review/+page.server.ts index 0a38355..ca29d22 100644 --- a/src/routes/dashboard/admin/review/+page.server.ts +++ b/src/routes/dashboard/admin/review/+page.server.ts @@ -3,6 +3,7 @@ import { project, user, devlog } from '$lib/server/db/schema.js'; import { error } from '@sveltejs/kit'; import { eq, and, sql, ne, inArray } from 'drizzle-orm'; import type { Actions } from './$types'; +import { getProjectLinkType } from '$lib/utils'; export async function load({ locals }) { if (!locals.user) { @@ -63,7 +64,6 @@ export const actions = { const typeFilter = data.getAll('type') as string[]; - const projects = await getProjects(statusFilter, projectFilter, userFilter, typeFilter); return { @@ -84,48 +84,60 @@ async function getProjects( userFilter: number[], typeFilter: string[] ) { - 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 + 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 + ) + ) + .groupBy( + project.id, + project.name, + project.description, + project.url, + project.editorFileType, + project.editorUrl, + project.uploadedFileUrl, + 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/review/+page.svelte b/src/routes/dashboard/admin/review/+page.svelte index 5847fc3..757ccb5 100644 --- a/src/routes/dashboard/admin/review/+page.svelte +++ b/src/routes/dashboard/admin/review/+page.svelte @@ -9,7 +9,6 @@ let projectSearch = $state(''); let userSearch = $state(''); - let typeFilter = $state([]); let projects = $derived(form?.projects ?? data.projects); @@ -21,12 +20,6 @@ let filteredUsers = $derived( data.users.filter((user) => user.name.toLowerCase().includes(userSearch.toLowerCase())) ); - let displayedProjects = $derived( - projects.filter(p => - typeFilter.length === 0 || - typeFilter.includes(getProjectLinkType(p.project.editorFileType, p.project.editorUrl, p.project.uploadedFileUrl)) - ) -); let formPending = $state(false); @@ -110,20 +103,20 @@
+ @@ -170,7 +163,7 @@ {:else}
- {#each displayedProjects as project} + {#each projects as project}
@@ -200,7 +193,11 @@
{/if}

- Type: {getProjectLinkType(project.project.editorFileType, project.project.editorUrl, project.project.uploadedFileUrl)} + Type: {getProjectLinkType( + project.project.editorFileType, + project.project.editorUrl, + project.project.uploadedFileUrl + )}

{project.devlogCount} journal{project.devlogCount !== 1 ? 's' : ''} ∙ {Math.floor( From 05ff7ca4a74932b3682137c000f8369be81af676 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:56:36 +0000 Subject: [PATCH 3/6] Initial plan From 69895b26fde80c16e65438c30eb10723211a8848 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:01:11 +0000 Subject: [PATCH 4/6] Add trust level dropdown to user admin page Co-authored-by: ArcaEge <40526225+ArcaEge@users.noreply.github.com> --- package-lock.json | 28 +----------- .../admin/admin/users/[id]/+page.server.ts | 44 +++++++++++++++++++ .../admin/admin/users/[id]/+page.svelte | 32 ++++++++++++++ 3 files changed, 77 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6c020c..626ab37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -984,7 +984,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -3028,7 +3027,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -3050,7 +3048,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.19.0 || >=20.6.0" }, @@ -3063,7 +3060,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -3079,7 +3075,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.208.0", "import-in-the-middle": "^2.0.0", @@ -3467,7 +3462,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -3484,7 +3478,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", @@ -3502,7 +3495,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" } @@ -5309,7 +5301,6 @@ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.47.0.tgz", "integrity": "sha512-mznN01MBXtr4T7X/E3ENkhF6GzqxTxL6/whG3OzCzUu8G8KYRNiCdoxLMVWAHJx/mDMPP3XAeKCMZHF/Xd/CDw==", "license": "MIT", - "peer": true, "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", @@ -5348,7 +5339,6 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", "license": "MIT", - "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", @@ -5855,7 +5845,6 @@ "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", @@ -6111,7 +6100,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6388,7 +6376,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -7002,7 +6989,6 @@ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -7099,7 +7085,6 @@ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -9399,7 +9384,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -9521,7 +9505,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -9694,7 +9677,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -9711,7 +9693,6 @@ "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" @@ -10017,7 +9998,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -10595,7 +10575,6 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.40.1.tgz", "integrity": "sha512-0R3t2oiLxJNJb2buz61MNfPdkjeyj2qTCM7TtIv/4ZfF12zD7Ig8iIo+C8febroy+9S4QJ7qfijtearSdO/1ww==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -10688,8 +10667,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -10854,7 +10832,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10913,7 +10890,6 @@ "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.21.tgz", "integrity": "sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==", "license": "MIT", - "peer": true, "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", @@ -11064,7 +11040,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz", "integrity": "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -11640,7 +11615,6 @@ "integrity": "sha512-HwaJmXO3M1r4S8x2ea2vy8Rw/y/38HRQuK/gNDRQ7w9cJXn6xSl1sIIqKCffULSUjul3wV3I3Nd/GfbmsRReEA==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "bin": { "workerd": "bin/workerd" }, diff --git a/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts b/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts index a83e6f3..a2f6901 100644 --- a/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts +++ b/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts @@ -214,6 +214,50 @@ export const actions = { }; }, + changeTrust: async ({ locals, request, params }) => { + if (!locals.user) { + throw error(500); + } + if (!locals.user.hasAdmin) { + throw error(403, { message: 'oi get out' }); + } + + const id: number = parseInt(params.id); + + const data = await request.formData(); + const trust = data.get('trust'); + + if (!trust || !['green', 'blue', 'yellow', 'red'].includes(trust.toString())) { + return fail(400, { + changeTrust: { + invalidTrust: true + } + }); + } + + // Log out user if trust is set to red + if (trust === 'red') { + await db.delete(session).where(eq(session.userId, id)); + } + + await db + .update(user) + .set({ + trust: trust.toString() as 'green' | 'blue' | 'yellow' | 'red' + }) + .where(eq(user.id, id)); + + const [queriedUser] = await db.select().from(user).where(eq(user.id, id)); + + if (!queriedUser) { + throw error(404, { message: 'user not found' }); + } + + return { + queriedUser + }; + }, + impersonate: async (event) => { const { locals, params } = event; diff --git a/src/routes/dashboard/admin/admin/users/[id]/+page.svelte b/src/routes/dashboard/admin/admin/users/[id]/+page.svelte index bc69958..3e49332 100644 --- a/src/routes/dashboard/admin/admin/users/[id]/+page.svelte +++ b/src/routes/dashboard/admin/admin/users/[id]/+page.svelte @@ -14,6 +14,7 @@ let impersonatePending = $state(false); let logoutPending = $state(false); let fetchPIIPending = $state(false); + let changeTrustPending = $state(false); @@ -239,6 +240,37 @@

+

Trust Level

+
+
{ + changeTrustPending = true; + return async ({ update }) => { + await update({ reset: false }); + changeTrustPending = false; + }; + }} + > + + {#if form?.changeTrust?.invalidTrust} +

Invalid trust level

+ {/if} + +
+
+

yummy stuff

{#if form?.fetchPII?.success} From 3f85c0ac9f9950905848587c32a10fbb1de82032 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:03:19 +0000 Subject: [PATCH 5/6] Implementation complete - trust level dropdown working Co-authored-by: ArcaEge <40526225+ArcaEge@users.noreply.github.com> --- .devcontainer/devcontainer.json | 6 +- .github/dependabot.yml | 8 +- .prettierrc | 5 +- docker-compose-staging.yaml | 2 +- docker-compose.yaml | 2 +- eslint.config.js | 14 +- src/app.css | 10 +- src/lib/components/Button.svelte | 2 +- src/lib/components/OrpheusFlag.svelte | 1 - src/lib/components/Snowfall.svelte | 220 +++++++++--------- src/lib/server/airtable.ts | 4 +- src/lib/server/auth.ts | 3 +- src/lib/server/db/index.ts | 2 +- src/lib/server/db/schema.ts | 8 +- src/lib/server/slack.ts | 2 +- src/routes/+error.svelte | 12 +- src/routes/+layout.svelte | 2 +- src/routes/+page.server.ts | 2 +- src/routes/Footer.svelte | 5 +- src/routes/Rules.svelte | 19 +- src/routes/Shop.svelte | 6 +- src/routes/approved-editors/+page.svelte | 3 +- .../create-hackatime-account/+page.svelte | 16 +- src/routes/auth/failed/+page.svelte | 14 +- src/routes/auth/ineligible/+page.svelte | 16 +- src/routes/auth/logout/+server.ts | 2 +- src/routes/dashboard/+error.svelte | 6 +- src/routes/dashboard/+layout.svelte | 2 +- src/routes/dashboard/Sidebar.svelte | 14 +- src/routes/dashboard/SidebarButton.svelte | 5 +- .../admin/admin/market/MarketItem.svelte | 2 +- .../admin/admin/stats/+page.server.ts | 16 +- .../admin/admin/users/+page.server.ts | 2 +- .../dashboard/admin/print/+page.server.ts | 16 +- .../dashboard/admin/review/+page.server.ts | 16 +- .../dashboard/admin/review/+page.svelte | 4 +- .../dashboard/admin/review/[id]/+page.svelte | 10 +- .../admin/ysws-review/+page.server.ts | 14 +- src/routes/dashboard/explore/+page.server.ts | 14 +- src/routes/dashboard/explore/+page.svelte | 7 +- .../dashboard/market/MarketTimer.svelte | 2 +- src/routes/dashboard/projects/+page.svelte | 2 +- .../dashboard/projects/[id]/+page.server.ts | 2 +- .../dashboard/projects/[id]/+page.svelte | 4 +- .../projects/[id]/delete/+page.server.ts | 18 +- .../dashboard/projects/create/+page.svelte | 6 +- src/routes/dashboard/users/+page.server.ts | 4 +- wrangler.jsonc | 4 +- 48 files changed, 278 insertions(+), 278 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index fc2fe38..e4e748f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -10,9 +10,7 @@ "ghcr.io/devcontainers/features/github-cli:1": {} }, // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [ - 5173 - ], + "forwardPorts": [5173], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "npm install", // Configure tool-specific properties. @@ -30,4 +28,4 @@ } // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" -} \ No newline at end of file +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f33a02c..3cddc75 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,7 +6,7 @@ version: 2 updates: - - package-ecosystem: "devcontainers" - directory: "/" - schedule: - interval: weekly + - package-ecosystem: 'devcontainers' + directory: '/' + schedule: + interval: weekly diff --git a/.prettierrc b/.prettierrc index 8855237..8103a0b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,10 +3,7 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, - "plugins": [ - "prettier-plugin-svelte", - "prettier-plugin-tailwindcss" - ], + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], "overrides": [ { "files": "*.svelte", diff --git a/docker-compose-staging.yaml b/docker-compose-staging.yaml index e2f656b..5186ed1 100644 --- a/docker-compose-staging.yaml +++ b/docker-compose-staging.yaml @@ -18,4 +18,4 @@ services: image: ghcr.io/hackclub/construct:staging networks: {} volumes: - constructdb: \ No newline at end of file + constructdb: diff --git a/docker-compose.yaml b/docker-compose.yaml index 6497457..8d67fc0 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -18,4 +18,4 @@ services: image: ghcr.io/hackclub/construct:production networks: {} volumes: - constructdb: \ No newline at end of file + constructdb: diff --git a/eslint.config.js b/eslint.config.js index e78afbd..2c49fa6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -21,16 +21,14 @@ export default defineConfig( languageOptions: { globals: { ...globals.browser, ...globals.node } }, - rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. - // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors - "no-undef": 'off' } + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off' + } }, { - files: [ - '**/*.svelte', - '**/*.svelte.ts', - '**/*.svelte.js' - ], + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], languageOptions: { parserOptions: { projectService: true, diff --git a/src/app.css b/src/app.css index b1dd974..0dcd37b 100644 --- a/src/app.css +++ b/src/app.css @@ -254,19 +254,19 @@ } .themed-input-light { - @apply border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 placeholder:text-primary-700 active:ring-3 outline-transparent; + @apply border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 outline-transparent placeholder:text-primary-700 active:ring-3; } .themed-input { - @apply bg-primary-950 border-3 border-primary-900 ring-primary-700 focus:ring-2 transition-shadow rounded-lg placeholder:text-primary-800 outline-transparent; + @apply rounded-lg border-3 border-primary-900 bg-primary-950 ring-primary-700 outline-transparent transition-shadow placeholder:text-primary-800 focus:ring-2; } .themed-input-on-box { - @apply bg-primary-900 border-3 border-primary-800 ring-primary-700 focus:ring-2 transition-shadow rounded-lg placeholder:text-primary-700 outline-transparent; + @apply rounded-lg border-3 border-primary-800 bg-primary-900 ring-primary-700 outline-transparent transition-shadow placeholder:text-primary-700 focus:ring-2; } .checkbox { - @apply border-2 border-primary-600 bg-primary-900 ring-0 h-4 w-4 rounded-sm; + @apply h-4 w-4 rounded-sm border-2 border-primary-600 bg-primary-900 ring-0; } } @@ -276,6 +276,6 @@ } .center { - @apply absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2; + @apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 transform; } } diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index f693cc4..be1604b 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -11,7 +11,7 @@ diff --git a/src/lib/components/OrpheusFlag.svelte b/src/lib/components/OrpheusFlag.svelte index 7ddb956..9ccf5cc 100644 --- a/src/lib/components/OrpheusFlag.svelte +++ b/src/lib/components/OrpheusFlag.svelte @@ -14,4 +14,3 @@ alt="Hack Club" /> - diff --git a/src/lib/components/Snowfall.svelte b/src/lib/components/Snowfall.svelte index 3b83393..18080a5 100644 --- a/src/lib/components/Snowfall.svelte +++ b/src/lib/components/Snowfall.svelte @@ -1,127 +1,129 @@ + + - - diff --git a/src/lib/server/airtable.ts b/src/lib/server/airtable.ts index d84b547..ce5914c 100644 --- a/src/lib/server/airtable.ts +++ b/src/lib/server/airtable.ts @@ -1,4 +1,6 @@ import Airtable from 'airtable'; import { env } from '$env/dynamic/private'; -export const airtableBase = env.AIRTABLE_TOKEN ? new Airtable({ apiKey: env.AIRTABLE_TOKEN }).base(env.AIRTABLE_BASE) : null; +export const airtableBase = env.AIRTABLE_TOKEN + ? new Airtable({ apiKey: env.AIRTABLE_TOKEN }).base(env.AIRTABLE_BASE) + : null; diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index 2e4b954..c1120e6 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -49,7 +49,8 @@ export async function validateSessionToken(token: string) { return { session: null, user: null }; } - const renewSession = Date.now() >= session.expiresAt.getTime() - DAY_IN_MS * (SESSION_EXPIRY_DAYS / 2); + const renewSession = + Date.now() >= session.expiresAt.getTime() - DAY_IN_MS * (SESSION_EXPIRY_DAYS / 2); if (renewSession) { session.expiresAt = new Date(Date.now() + DAY_IN_MS * SESSION_EXPIRY_DAYS); await db diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts index cc98b8d..af71f88 100644 --- a/src/lib/server/db/index.ts +++ b/src/lib/server/db/index.ts @@ -3,7 +3,7 @@ import { Pool } from 'pg'; import * as schema from './schema'; const pool = new Pool({ - connectionString: process.env.DATABASE_URL!, + connectionString: process.env.DATABASE_URL! }); export const db = drizzle(pool, { schema }); diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts index 2f4591e..83eda25 100644 --- a/src/lib/server/db/schema.ts +++ b/src/lib/server/db/schema.ts @@ -236,7 +236,7 @@ export const ovenpheusLog = pgTable('ovenpheus_log', { clay: real().notNull(), bricksReceived: real().notNull(), - timestamp: timestamp().notNull().defaultNow(), + timestamp: timestamp().notNull().defaultNow() }); export const marketOrderStatus = pgEnum('market_order_status', [ @@ -248,14 +248,16 @@ export const marketOrderStatus = pgEnum('market_order_status', [ export const marketItemOrder = pgTable('market_item_order', { id: serial().primaryKey(), - userId: integer().references(() => user.id).notNull(), + userId: integer() + .references(() => user.id) + .notNull(), addressId: text().notNull(), bricksPaid: integer().notNull(), status: marketOrderStatus().notNull().default('awaiting_approval'), userNotes: text().notNull(), - notes: text(), // stuff like tracking code, shown to user + notes: text(), // stuff like tracking code, shown to user deleted: boolean().notNull().default(false), createdAt: timestamp().notNull().defaultNow() diff --git a/src/lib/server/slack.ts b/src/lib/server/slack.ts index dfc0d4e..12962e6 100644 --- a/src/lib/server/slack.ts +++ b/src/lib/server/slack.ts @@ -13,7 +13,7 @@ export async function sendSlackDM(userId: string, message: string) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` + Authorization: `Bearer ${token}` }, body: JSON.stringify({ channel: userId, diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index c378729..dd58336 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -2,10 +2,16 @@ import { page } from '$app/state'; -
+

oh no!!!

Error {page.status}

{page.error?.message}

- {`error - Go back home + {`error + Go back home
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e45cb52..eeeba66 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -23,4 +23,4 @@ :global(body) { position: relative; } - \ No newline at end of file + diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index cb20996..d175818 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -3,6 +3,6 @@ import { env } from '$env/dynamic/private'; export function load({ locals }) { return { loggedIn: locals.session !== null, - idvDomain: env.IDV_DOMAIN, + idvDomain: env.IDV_DOMAIN }; } diff --git a/src/routes/Footer.svelte b/src/routes/Footer.svelte index b411335..f7bf211 100644 --- a/src/routes/Footer.svelte +++ b/src/routes/Footer.svelte @@ -8,7 +8,10 @@ A Hack Club program. Made by teens, for teens! {#if env.PUBLIC_COMMIT} - · Build {env.PUBLIC_COMMIT.slice(0, 7)} + · Build {env.PUBLIC_COMMIT.slice(0, 7)} {/if}

diff --git a/src/routes/Rules.svelte b/src/routes/Rules.svelte index a79d34e..cf3f7b3 100644 --- a/src/routes/Rules.svelte +++ b/src/routes/Rules.svelte @@ -11,10 +11,7 @@
  • You must be 13-18 years old.
  • You cannot be banned from Hackatime.
  • - You must be part of the + You must be part of the Hack Club Slack community .
  • @@ -33,15 +30,13 @@
    • You should spend at least 2 hours on each individual project.
    • - You should use one of our approved editors. -
    • -
    • - You should track your time with the journaling feature. -
    • -
    • - You should upload your project to Printables once done. + You should use one of our approved editors.
    • +
    • You should track your time with the journaling feature.
    • +
    • You should upload your project to Printables once done.
    - \ No newline at end of file + diff --git a/src/routes/Shop.svelte b/src/routes/Shop.svelte index 419c97d..d719baf 100644 --- a/src/routes/Shop.svelte +++ b/src/routes/Shop.svelte @@ -20,11 +20,7 @@ text="Cool rocket but there are better ones ∙ 15 hours" imgsrc={prize02} /> - +

    ...and more!

    diff --git a/src/routes/approved-editors/+page.svelte b/src/routes/approved-editors/+page.svelte index 2e4effd..555dd8c 100644 --- a/src/routes/approved-editors/+page.svelte +++ b/src/routes/approved-editors/+page.svelte @@ -46,7 +46,8 @@

    Want to get something else added here? Ask in #construct-help#construct-help!

    diff --git a/src/routes/auth/create-hackatime-account/+page.svelte b/src/routes/auth/create-hackatime-account/+page.svelte index 62d3c53..2e73338 100644 --- a/src/routes/auth/create-hackatime-account/+page.svelte +++ b/src/routes/auth/create-hackatime-account/+page.svelte @@ -1,13 +1,13 @@ -
    -

    Hackatime account not found

    - -

    Make sure you have a Hackatime account associated with your Slack account.

    - Make one? - Try again -
    \ No newline at end of file +
    +

    Hackatime account not found

    + +

    Make sure you have a Hackatime account associated with your Slack account.

    + Make one? + Try again +
    diff --git a/src/routes/auth/failed/+page.svelte b/src/routes/auth/failed/+page.svelte index 15ec7c7..8186463 100644 --- a/src/routes/auth/failed/+page.svelte +++ b/src/routes/auth/failed/+page.svelte @@ -1,12 +1,12 @@ -
    -

    Authentication failed

    - -

    Authentication failed.

    - Try again? -
    \ No newline at end of file +
    +

    Authentication failed

    + +

    Authentication failed.

    + Try again? +
    diff --git a/src/routes/auth/ineligible/+page.svelte b/src/routes/auth/ineligible/+page.svelte index d882dad..2ffb081 100644 --- a/src/routes/auth/ineligible/+page.svelte +++ b/src/routes/auth/ineligible/+page.svelte @@ -1,14 +1,14 @@ -
    -

    Ineligible

    - -

    Sorry, you're ineligible to take part in this event until you get verified.

    - Get verified -
    \ No newline at end of file +
    +

    Ineligible

    + +

    Sorry, you're ineligible to take part in this event until you get verified.

    + Get verified +
    diff --git a/src/routes/auth/logout/+server.ts b/src/routes/auth/logout/+server.ts index 0f94be2..bd7c790 100644 --- a/src/routes/auth/logout/+server.ts +++ b/src/routes/auth/logout/+server.ts @@ -9,5 +9,5 @@ export async function GET(event) { deleteSessionTokenCookie(event); } - return redirect(302, "/"); + return redirect(302, '/'); } diff --git a/src/routes/dashboard/+error.svelte b/src/routes/dashboard/+error.svelte index c1c00a2..b890f6b 100644 --- a/src/routes/dashboard/+error.svelte +++ b/src/routes/dashboard/+error.svelte @@ -8,6 +8,10 @@

    oh no!!!

    Error {page.status}

    {page.error?.message}

    - {`error + {`error Go back home diff --git a/src/routes/dashboard/+layout.svelte b/src/routes/dashboard/+layout.svelte index fcbefe3..5448dd9 100644 --- a/src/routes/dashboard/+layout.svelte +++ b/src/routes/dashboard/+layout.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/dashboard/Sidebar.svelte b/src/routes/dashboard/Sidebar.svelte index be067c1..750c02a 100644 --- a/src/routes/dashboard/Sidebar.svelte +++ b/src/routes/dashboard/Sidebar.svelte @@ -8,12 +8,8 @@ ClipboardPen, ClipboardPenLine, Store, - ShieldUser, - Box - - } from '@lucide/svelte'; import { page } from '$app/state'; import logo from '$lib/assets/logo.png'; @@ -37,9 +33,7 @@ Explore Market {#if user.isPrinter} - - Print - + Print {/if} {#if user.hasT1Review} @@ -47,9 +41,9 @@ {/if} {#if user.hasT2Review} - - YSWS Review - + + YSWS Review + {/if} {#if user.hasAdmin} diff --git a/src/routes/dashboard/SidebarButton.svelte b/src/routes/dashboard/SidebarButton.svelte index c183908..e740b4f 100644 --- a/src/routes/dashboard/SidebarButton.svelte +++ b/src/routes/dashboard/SidebarButton.svelte @@ -13,9 +13,10 @@ diff --git a/src/routes/dashboard/admin/admin/market/MarketItem.svelte b/src/routes/dashboard/admin/admin/market/MarketItem.svelte index 2e4a587..05bb715 100644 --- a/src/routes/dashboard/admin/admin/market/MarketItem.svelte +++ b/src/routes/dashboard/admin/admin/market/MarketItem.svelte @@ -14,7 +14,7 @@

    {#if showButtons} -
    + diff --git a/src/routes/dashboard/admin/admin/stats/+page.server.ts b/src/routes/dashboard/admin/admin/stats/+page.server.ts index 09cbd08..629993b 100644 --- a/src/routes/dashboard/admin/admin/stats/+page.server.ts +++ b/src/routes/dashboard/admin/admin/stats/+page.server.ts @@ -71,13 +71,15 @@ export async function load({ locals }) { .groupBy(project.id) .as('shippedProjects'); - const [shippedStats] = await db.select({ - count: count(), - totalTimeSpent: sql`sum(${shippedProjects.timeSpent})`, - averageTimeSpent: sql`avg(${shippedProjects.timeSpent})`, - totalDevlogs: sql`sum(${shippedProjects.devlogCount})`, - averageDevlogs: sql`avg(${shippedProjects.devlogCount})`, - }).from(shippedProjects); + const [shippedStats] = await db + .select({ + count: count(), + totalTimeSpent: sql`sum(${shippedProjects.timeSpent})`, + averageTimeSpent: sql`avg(${shippedProjects.timeSpent})`, + totalDevlogs: sql`sum(${shippedProjects.devlogCount})`, + averageDevlogs: sql`avg(${shippedProjects.devlogCount})` + }) + .from(shippedProjects); return { users: users, diff --git a/src/routes/dashboard/admin/admin/users/+page.server.ts b/src/routes/dashboard/admin/admin/users/+page.server.ts index e728b17..0b0492e 100644 --- a/src/routes/dashboard/admin/admin/users/+page.server.ts +++ b/src/routes/dashboard/admin/admin/users/+page.server.ts @@ -28,7 +28,7 @@ export const actions = { } await db.delete(session); - + return {}; } } satisfies Actions; diff --git a/src/routes/dashboard/admin/print/+page.server.ts b/src/routes/dashboard/admin/print/+page.server.ts index 3906a08..131300b 100644 --- a/src/routes/dashboard/admin/print/+page.server.ts +++ b/src/routes/dashboard/admin/print/+page.server.ts @@ -31,15 +31,13 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const legionAgg = db - .$with('legionAgg') - .as( - db - .select({ userId: legionReview.userId, legionCnt: sql`COUNT(*)`.as('legionCnt') }) - .from(legionReview) - .where(eq(legionReview.action, 'print')) - .groupBy(legionReview.userId) - ); + const legionAgg = db.$with('legionAgg').as( + db + .select({ userId: legionReview.userId, legionCnt: sql`COUNT(*)`.as('legionCnt') }) + .from(legionReview) + .where(eq(legionReview.action, 'print')) + .groupBy(legionReview.userId) + ); const totalExpr = sql`COALESCE(${legionAgg.legionCnt}, 0)`; diff --git a/src/routes/dashboard/admin/review/+page.server.ts b/src/routes/dashboard/admin/review/+page.server.ts index f37785c..dceb4bc 100644 --- a/src/routes/dashboard/admin/review/+page.server.ts +++ b/src/routes/dashboard/admin/review/+page.server.ts @@ -31,15 +31,13 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const t1Agg = db - .$with('t1Agg') - .as( - db - .select({ userId: t1Review.userId, t1Cnt: sql`COUNT(*)`.as('t1Cnt') }) - .from(t1Review) - .where(ne(t1Review.action, 'add_comment')) - .groupBy(t1Review.userId) - ); + const t1Agg = db.$with('t1Agg').as( + db + .select({ userId: t1Review.userId, t1Cnt: sql`COUNT(*)`.as('t1Cnt') }) + .from(t1Review) + .where(ne(t1Review.action, 'add_comment')) + .groupBy(t1Review.userId) + ); const totalExpr = sql`COALESCE(${t1Agg.t1Cnt}, 0)`; diff --git a/src/routes/dashboard/admin/review/+page.svelte b/src/routes/dashboard/admin/review/+page.svelte index 4da2eb7..c8e5426 100644 --- a/src/routes/dashboard/admin/review/+page.svelte +++ b/src/routes/dashboard/admin/review/+page.svelte @@ -154,7 +154,9 @@
    -

    Projects ({projects.length})

    +

    + Projects ({projects.length}) +

    {#if projects.length == 0}
    diff --git a/src/routes/dashboard/admin/review/[id]/+page.svelte b/src/routes/dashboard/admin/review/[id]/+page.svelte index 20f96ad..bbfc503 100644 --- a/src/routes/dashboard/admin/review/[id]/+page.svelte +++ b/src/routes/dashboard/admin/review/[id]/+page.svelte @@ -3,7 +3,7 @@ import Devlog from '$lib/components/Devlog.svelte'; import Head from '$lib/components/Head.svelte'; import { enhance } from '$app/forms'; - import { projectStatuses, getProjectLinkType} from '$lib/utils.js'; + import { projectStatuses, getProjectLinkType } from '$lib/utils.js'; import ProjectLinks from '$lib/components/ProjectLinks.svelte'; import Spinny3DPreview from '$lib/components/Spinny3DPreview.svelte'; import { Download } from '@lucide/svelte'; @@ -49,7 +49,13 @@ uploadedFileUrl={data.project.project.uploadedFileUrl} />
    -

    Type: {getProjectLinkType(data.project.project.editorFileType, data.project.project.editorUrl, data.project.project.uploadedFileUrl)}

    +

    + Type: {getProjectLinkType( + data.project.project.editorFileType, + data.project.project.editorUrl, + data.project.project.uploadedFileUrl + )} +

    diff --git a/src/routes/dashboard/admin/ysws-review/+page.server.ts b/src/routes/dashboard/admin/ysws-review/+page.server.ts index 4b06998..78fe29a 100644 --- a/src/routes/dashboard/admin/ysws-review/+page.server.ts +++ b/src/routes/dashboard/admin/ysws-review/+page.server.ts @@ -30,14 +30,12 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const t2Agg = db - .$with('t2Agg') - .as( - db - .select({ userId: t2Review.userId, t2Cnt: sql`COUNT(*)`.as('t2Cnt') }) - .from(t2Review) - .groupBy(t2Review.userId) - ); + const t2Agg = db.$with('t2Agg').as( + db + .select({ userId: t2Review.userId, t2Cnt: sql`COUNT(*)`.as('t2Cnt') }) + .from(t2Review) + .groupBy(t2Review.userId) + ); const totalExpr = sql`COALESCE(${t2Agg.t2Cnt}, 0)`; diff --git a/src/routes/dashboard/explore/+page.server.ts b/src/routes/dashboard/explore/+page.server.ts index 3d2d4de..9e80890 100644 --- a/src/routes/dashboard/explore/+page.server.ts +++ b/src/routes/dashboard/explore/+page.server.ts @@ -1,12 +1,12 @@ import { DEVLOGS_PAGE_SIZE, fetchExploreDevlogs } from './devlogs.js'; export async function load() { - const devlogs = await fetchExploreDevlogs(0); - const nextOffset = devlogs.length; + const devlogs = await fetchExploreDevlogs(0); + const nextOffset = devlogs.length; - return { - devlogs, - nextOffset, - hasMore: devlogs.length === DEVLOGS_PAGE_SIZE - }; + return { + devlogs, + nextOffset, + hasMore: devlogs.length === DEVLOGS_PAGE_SIZE + }; } diff --git a/src/routes/dashboard/explore/+page.svelte b/src/routes/dashboard/explore/+page.svelte index 2ac2c3f..c44bbbb 100644 --- a/src/routes/dashboard/explore/+page.svelte +++ b/src/routes/dashboard/explore/+page.svelte @@ -76,7 +76,6 @@

    Explore

    -
    {#if devlogs.length == 0}
    @@ -107,9 +106,7 @@ {#if loadError}
    {loadError} - +
    {/if} @@ -117,4 +114,4 @@

    You're caught up.

    {/if} {/if} -
    \ No newline at end of file +
    diff --git a/src/routes/dashboard/market/MarketTimer.svelte b/src/routes/dashboard/market/MarketTimer.svelte index 9aa1e6c..3538e3e 100644 --- a/src/routes/dashboard/market/MarketTimer.svelte +++ b/src/routes/dashboard/market/MarketTimer.svelte @@ -54,4 +54,4 @@ SECS
    - \ No newline at end of file + diff --git a/src/routes/dashboard/projects/+page.svelte b/src/routes/dashboard/projects/+page.svelte index d716df8..6945066 100644 --- a/src/routes/dashboard/projects/+page.svelte +++ b/src/routes/dashboard/projects/+page.svelte @@ -35,7 +35,7 @@ {:else} -
    +
    {#each data.projects as project} {data.project.name} -
    +

    Created @@ -109,7 +109,7 @@

    {/if} diff --git a/src/routes/dashboard/projects/[id]/delete/+page.server.ts b/src/routes/dashboard/projects/[id]/delete/+page.server.ts index 2855ef7..8c1a111 100644 --- a/src/routes/dashboard/projects/[id]/delete/+page.server.ts +++ b/src/routes/dashboard/projects/[id]/delete/+page.server.ts @@ -36,7 +36,14 @@ export async function load({ params, locals }) { or(eq(project.status, 'building'), eq(project.status, 'rejected')) ) ) - .groupBy(project.id, project.name, project.description, project.url, project.createdAt, project.status) + .groupBy( + project.id, + project.name, + project.description, + project.url, + project.createdAt, + project.status + ) .limit(1); if (!queriedProject) { @@ -87,7 +94,7 @@ export const actions = { eq(project.deleted, false) ) ); - + // Mark all associated devlogs as deleted await db .update(devlog) @@ -95,12 +102,7 @@ export const actions = { deleted: true, updatedAt: new Date(Date.now()) }) - .where( - and( - eq(devlog.projectId, queriedProject.id), - eq(devlog.userId, locals.user.id), - ) - ); + .where(and(eq(devlog.projectId, queriedProject.id), eq(devlog.userId, locals.user.id))); return redirect(303, '/dashboard/projects'); } diff --git a/src/routes/dashboard/projects/create/+page.svelte b/src/routes/dashboard/projects/create/+page.svelte index ae0afff..bfddeda 100644 --- a/src/routes/dashboard/projects/create/+page.svelte +++ b/src/routes/dashboard/projects/create/+page.svelte @@ -67,9 +67,7 @@
  • The number and quality of your devlogs
  • How polished your project is
  • -

    - A higher market score: -

    +

    A higher market score:

    • Reduces the price of market items
    • Lets you unlock more items in the market
    • @@ -83,7 +81,7 @@
      { formPending = true; return async ({ update }) => { diff --git a/src/routes/dashboard/users/+page.server.ts b/src/routes/dashboard/users/+page.server.ts index 1fccc72..8f8ca5d 100644 --- a/src/routes/dashboard/users/+page.server.ts +++ b/src/routes/dashboard/users/+page.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; export function load({ locals }) { - throw redirect(302, `/dashboard/users/${locals.user?.id}`); -}; \ No newline at end of file + throw redirect(302, `/dashboard/users/${locals.user?.id}`); +} diff --git a/wrangler.jsonc b/wrangler.jsonc index 67ccdf7..011237b 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -4,6 +4,6 @@ "compatibility_date": "2025-01-01", "assets": { "binding": "ASSETS", - "directory": ".svelte-kit/cloudflare", + "directory": ".svelte-kit/cloudflare" } -} \ No newline at end of file +} From 6a87c79c5d9c3343285f0a802013be8f1f5227b4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:07:14 +0000 Subject: [PATCH 6/6] Revert unintended formatter changes Co-authored-by: ArcaEge <40526225+ArcaEge@users.noreply.github.com> --- .devcontainer/devcontainer.json | 6 +- .github/dependabot.yml | 8 +- .prettierrc | 5 +- docker-compose-staging.yaml | 2 +- docker-compose.yaml | 2 +- eslint.config.js | 14 +- src/app.css | 10 +- src/lib/components/Button.svelte | 2 +- src/lib/components/OrpheusFlag.svelte | 1 + src/lib/components/Snowfall.svelte | 220 +++++++++--------- src/lib/server/airtable.ts | 4 +- src/lib/server/auth.ts | 3 +- src/lib/server/db/index.ts | 2 +- src/lib/server/db/schema.ts | 8 +- src/lib/server/slack.ts | 2 +- src/routes/+error.svelte | 12 +- src/routes/+layout.svelte | 2 +- src/routes/+page.server.ts | 2 +- src/routes/Footer.svelte | 5 +- src/routes/Rules.svelte | 19 +- src/routes/Shop.svelte | 6 +- src/routes/approved-editors/+page.svelte | 3 +- .../create-hackatime-account/+page.svelte | 16 +- src/routes/auth/failed/+page.svelte | 14 +- src/routes/auth/ineligible/+page.svelte | 16 +- src/routes/auth/logout/+server.ts | 2 +- src/routes/dashboard/+error.svelte | 6 +- src/routes/dashboard/+layout.svelte | 2 +- src/routes/dashboard/Sidebar.svelte | 14 +- src/routes/dashboard/SidebarButton.svelte | 5 +- .../admin/admin/market/MarketItem.svelte | 2 +- .../admin/admin/stats/+page.server.ts | 16 +- .../admin/admin/users/+page.server.ts | 2 +- .../dashboard/admin/print/+page.server.ts | 16 +- .../dashboard/admin/review/+page.server.ts | 16 +- .../dashboard/admin/review/+page.svelte | 4 +- .../dashboard/admin/review/[id]/+page.svelte | 10 +- .../admin/ysws-review/+page.server.ts | 14 +- src/routes/dashboard/explore/+page.server.ts | 14 +- src/routes/dashboard/explore/+page.svelte | 7 +- .../dashboard/market/MarketTimer.svelte | 2 +- src/routes/dashboard/projects/+page.svelte | 2 +- .../dashboard/projects/[id]/+page.server.ts | 2 +- .../dashboard/projects/[id]/+page.svelte | 4 +- .../projects/[id]/delete/+page.server.ts | 18 +- .../dashboard/projects/create/+page.svelte | 6 +- src/routes/dashboard/users/+page.server.ts | 4 +- wrangler.jsonc | 4 +- 48 files changed, 278 insertions(+), 278 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e4e748f..fc2fe38 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -10,7 +10,9 @@ "ghcr.io/devcontainers/features/github-cli:1": {} }, // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [5173], + "forwardPorts": [ + 5173 + ], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "npm install", // Configure tool-specific properties. @@ -28,4 +30,4 @@ } // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" -} +} \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3cddc75..f33a02c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,7 +6,7 @@ version: 2 updates: - - package-ecosystem: 'devcontainers' - directory: '/' - schedule: - interval: weekly + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/.prettierrc b/.prettierrc index 8103a0b..8855237 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,7 +3,10 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, - "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "plugins": [ + "prettier-plugin-svelte", + "prettier-plugin-tailwindcss" + ], "overrides": [ { "files": "*.svelte", diff --git a/docker-compose-staging.yaml b/docker-compose-staging.yaml index 5186ed1..e2f656b 100644 --- a/docker-compose-staging.yaml +++ b/docker-compose-staging.yaml @@ -18,4 +18,4 @@ services: image: ghcr.io/hackclub/construct:staging networks: {} volumes: - constructdb: + constructdb: \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 8d67fc0..6497457 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -18,4 +18,4 @@ services: image: ghcr.io/hackclub/construct:production networks: {} volumes: - constructdb: + constructdb: \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 2c49fa6..e78afbd 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -21,14 +21,16 @@ export default defineConfig( languageOptions: { globals: { ...globals.browser, ...globals.node } }, - rules: { - // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. - // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors - 'no-undef': 'off' - } + rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + "no-undef": 'off' } }, { - files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + files: [ + '**/*.svelte', + '**/*.svelte.ts', + '**/*.svelte.js' + ], languageOptions: { parserOptions: { projectService: true, diff --git a/src/app.css b/src/app.css index 0dcd37b..b1dd974 100644 --- a/src/app.css +++ b/src/app.css @@ -254,19 +254,19 @@ } .themed-input-light { - @apply border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 outline-transparent placeholder:text-primary-700 active:ring-3; + @apply border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 placeholder:text-primary-700 active:ring-3 outline-transparent; } .themed-input { - @apply rounded-lg border-3 border-primary-900 bg-primary-950 ring-primary-700 outline-transparent transition-shadow placeholder:text-primary-800 focus:ring-2; + @apply bg-primary-950 border-3 border-primary-900 ring-primary-700 focus:ring-2 transition-shadow rounded-lg placeholder:text-primary-800 outline-transparent; } .themed-input-on-box { - @apply rounded-lg border-3 border-primary-800 bg-primary-900 ring-primary-700 outline-transparent transition-shadow placeholder:text-primary-700 focus:ring-2; + @apply bg-primary-900 border-3 border-primary-800 ring-primary-700 focus:ring-2 transition-shadow rounded-lg placeholder:text-primary-700 outline-transparent; } .checkbox { - @apply h-4 w-4 rounded-sm border-2 border-primary-600 bg-primary-900 ring-0; + @apply border-2 border-primary-600 bg-primary-900 ring-0 h-4 w-4 rounded-sm; } } @@ -276,6 +276,6 @@ } .center { - @apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 transform; + @apply absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2; } } diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index be1604b..f693cc4 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -11,7 +11,7 @@ diff --git a/src/lib/components/OrpheusFlag.svelte b/src/lib/components/OrpheusFlag.svelte index 9ccf5cc..7ddb956 100644 --- a/src/lib/components/OrpheusFlag.svelte +++ b/src/lib/components/OrpheusFlag.svelte @@ -14,3 +14,4 @@ alt="Hack Club" /> + diff --git a/src/lib/components/Snowfall.svelte b/src/lib/components/Snowfall.svelte index 18080a5..3b83393 100644 --- a/src/lib/components/Snowfall.svelte +++ b/src/lib/components/Snowfall.svelte @@ -1,129 +1,127 @@ - - + + diff --git a/src/lib/server/airtable.ts b/src/lib/server/airtable.ts index ce5914c..d84b547 100644 --- a/src/lib/server/airtable.ts +++ b/src/lib/server/airtable.ts @@ -1,6 +1,4 @@ import Airtable from 'airtable'; import { env } from '$env/dynamic/private'; -export const airtableBase = env.AIRTABLE_TOKEN - ? new Airtable({ apiKey: env.AIRTABLE_TOKEN }).base(env.AIRTABLE_BASE) - : null; +export const airtableBase = env.AIRTABLE_TOKEN ? new Airtable({ apiKey: env.AIRTABLE_TOKEN }).base(env.AIRTABLE_BASE) : null; diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index c1120e6..2e4b954 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -49,8 +49,7 @@ export async function validateSessionToken(token: string) { return { session: null, user: null }; } - const renewSession = - Date.now() >= session.expiresAt.getTime() - DAY_IN_MS * (SESSION_EXPIRY_DAYS / 2); + const renewSession = Date.now() >= session.expiresAt.getTime() - DAY_IN_MS * (SESSION_EXPIRY_DAYS / 2); if (renewSession) { session.expiresAt = new Date(Date.now() + DAY_IN_MS * SESSION_EXPIRY_DAYS); await db diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts index af71f88..cc98b8d 100644 --- a/src/lib/server/db/index.ts +++ b/src/lib/server/db/index.ts @@ -3,7 +3,7 @@ import { Pool } from 'pg'; import * as schema from './schema'; const pool = new Pool({ - connectionString: process.env.DATABASE_URL! + connectionString: process.env.DATABASE_URL!, }); export const db = drizzle(pool, { schema }); diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts index 83eda25..2f4591e 100644 --- a/src/lib/server/db/schema.ts +++ b/src/lib/server/db/schema.ts @@ -236,7 +236,7 @@ export const ovenpheusLog = pgTable('ovenpheus_log', { clay: real().notNull(), bricksReceived: real().notNull(), - timestamp: timestamp().notNull().defaultNow() + timestamp: timestamp().notNull().defaultNow(), }); export const marketOrderStatus = pgEnum('market_order_status', [ @@ -248,16 +248,14 @@ export const marketOrderStatus = pgEnum('market_order_status', [ export const marketItemOrder = pgTable('market_item_order', { id: serial().primaryKey(), - userId: integer() - .references(() => user.id) - .notNull(), + userId: integer().references(() => user.id).notNull(), addressId: text().notNull(), bricksPaid: integer().notNull(), status: marketOrderStatus().notNull().default('awaiting_approval'), userNotes: text().notNull(), - notes: text(), // stuff like tracking code, shown to user + notes: text(), // stuff like tracking code, shown to user deleted: boolean().notNull().default(false), createdAt: timestamp().notNull().defaultNow() diff --git a/src/lib/server/slack.ts b/src/lib/server/slack.ts index 12962e6..dfc0d4e 100644 --- a/src/lib/server/slack.ts +++ b/src/lib/server/slack.ts @@ -13,7 +13,7 @@ export async function sendSlackDM(userId: string, message: string) { method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${token}` + 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ channel: userId, diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index dd58336..c378729 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -2,16 +2,10 @@ import { page } from '$app/state'; -
      +

      oh no!!!

      Error {page.status}

      {page.error?.message}

      - {`error - Go back home + {`error + Go back home
      diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index eeeba66..e45cb52 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -23,4 +23,4 @@ :global(body) { position: relative; } - + \ No newline at end of file diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index d175818..cb20996 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -3,6 +3,6 @@ import { env } from '$env/dynamic/private'; export function load({ locals }) { return { loggedIn: locals.session !== null, - idvDomain: env.IDV_DOMAIN + idvDomain: env.IDV_DOMAIN, }; } diff --git a/src/routes/Footer.svelte b/src/routes/Footer.svelte index f7bf211..b411335 100644 --- a/src/routes/Footer.svelte +++ b/src/routes/Footer.svelte @@ -8,10 +8,7 @@ A Hack Club program. Made by teens, for teens! {#if env.PUBLIC_COMMIT} - · Build {env.PUBLIC_COMMIT.slice(0, 7)} + · Build {env.PUBLIC_COMMIT.slice(0, 7)} {/if}

      diff --git a/src/routes/Rules.svelte b/src/routes/Rules.svelte index cf3f7b3..a79d34e 100644 --- a/src/routes/Rules.svelte +++ b/src/routes/Rules.svelte @@ -11,7 +11,10 @@
    • You must be 13-18 years old.
    • You cannot be banned from Hackatime.
    • - You must be part of the + You must be part of the Hack Club Slack community .
    • @@ -30,13 +33,15 @@
      • You should spend at least 2 hours on each individual project.
      • - You should use one of our approved editors. + You should use one of our approved editors. +
      • +
      • + You should track your time with the journaling feature. +
      • +
      • + You should upload your project to Printables once done.
      • -
      • You should track your time with the journaling feature.
      • -
      • You should upload your project to Printables once done.
    -
    +
    \ No newline at end of file diff --git a/src/routes/Shop.svelte b/src/routes/Shop.svelte index d719baf..419c97d 100644 --- a/src/routes/Shop.svelte +++ b/src/routes/Shop.svelte @@ -20,7 +20,11 @@ text="Cool rocket but there are better ones ∙ 15 hours" imgsrc={prize02} /> - +

    ...and more!

    diff --git a/src/routes/approved-editors/+page.svelte b/src/routes/approved-editors/+page.svelte index 555dd8c..2e4effd 100644 --- a/src/routes/approved-editors/+page.svelte +++ b/src/routes/approved-editors/+page.svelte @@ -46,8 +46,7 @@

    Want to get something else added here? Ask in #construct-help#construct-help!

    diff --git a/src/routes/auth/create-hackatime-account/+page.svelte b/src/routes/auth/create-hackatime-account/+page.svelte index 2e73338..62d3c53 100644 --- a/src/routes/auth/create-hackatime-account/+page.svelte +++ b/src/routes/auth/create-hackatime-account/+page.svelte @@ -1,13 +1,13 @@ -
    -

    Hackatime account not found

    - -

    Make sure you have a Hackatime account associated with your Slack account.

    - Make one? - Try again -
    +
    +

    Hackatime account not found

    + +

    Make sure you have a Hackatime account associated with your Slack account.

    + Make one? + Try again +
    \ No newline at end of file diff --git a/src/routes/auth/failed/+page.svelte b/src/routes/auth/failed/+page.svelte index 8186463..15ec7c7 100644 --- a/src/routes/auth/failed/+page.svelte +++ b/src/routes/auth/failed/+page.svelte @@ -1,12 +1,12 @@ -
    -

    Authentication failed

    - -

    Authentication failed.

    - Try again? -
    +
    +

    Authentication failed

    + +

    Authentication failed.

    + Try again? +
    \ No newline at end of file diff --git a/src/routes/auth/ineligible/+page.svelte b/src/routes/auth/ineligible/+page.svelte index 2ffb081..d882dad 100644 --- a/src/routes/auth/ineligible/+page.svelte +++ b/src/routes/auth/ineligible/+page.svelte @@ -1,14 +1,14 @@ -
    -

    Ineligible

    - -

    Sorry, you're ineligible to take part in this event until you get verified.

    - Get verified -
    +
    +

    Ineligible

    + +

    Sorry, you're ineligible to take part in this event until you get verified.

    + Get verified +
    \ No newline at end of file diff --git a/src/routes/auth/logout/+server.ts b/src/routes/auth/logout/+server.ts index bd7c790..0f94be2 100644 --- a/src/routes/auth/logout/+server.ts +++ b/src/routes/auth/logout/+server.ts @@ -9,5 +9,5 @@ export async function GET(event) { deleteSessionTokenCookie(event); } - return redirect(302, '/'); + return redirect(302, "/"); } diff --git a/src/routes/dashboard/+error.svelte b/src/routes/dashboard/+error.svelte index b890f6b..c1c00a2 100644 --- a/src/routes/dashboard/+error.svelte +++ b/src/routes/dashboard/+error.svelte @@ -8,10 +8,6 @@

    oh no!!!

    Error {page.status}

    {page.error?.message}

    - {`error + {`error Go back home diff --git a/src/routes/dashboard/+layout.svelte b/src/routes/dashboard/+layout.svelte index 5448dd9..fcbefe3 100644 --- a/src/routes/dashboard/+layout.svelte +++ b/src/routes/dashboard/+layout.svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/dashboard/Sidebar.svelte b/src/routes/dashboard/Sidebar.svelte index 750c02a..be067c1 100644 --- a/src/routes/dashboard/Sidebar.svelte +++ b/src/routes/dashboard/Sidebar.svelte @@ -8,8 +8,12 @@ ClipboardPen, ClipboardPenLine, Store, + ShieldUser, + Box + + } from '@lucide/svelte'; import { page } from '$app/state'; import logo from '$lib/assets/logo.png'; @@ -33,7 +37,9 @@ Explore Market {#if user.isPrinter} - Print + + Print + {/if} {#if user.hasT1Review} @@ -41,9 +47,9 @@ {/if} {#if user.hasT2Review} - - YSWS Review - + + YSWS Review + {/if} {#if user.hasAdmin} diff --git a/src/routes/dashboard/SidebarButton.svelte b/src/routes/dashboard/SidebarButton.svelte index e740b4f..c183908 100644 --- a/src/routes/dashboard/SidebarButton.svelte +++ b/src/routes/dashboard/SidebarButton.svelte @@ -13,10 +13,9 @@ diff --git a/src/routes/dashboard/admin/admin/market/MarketItem.svelte b/src/routes/dashboard/admin/admin/market/MarketItem.svelte index 05bb715..2e4a587 100644 --- a/src/routes/dashboard/admin/admin/market/MarketItem.svelte +++ b/src/routes/dashboard/admin/admin/market/MarketItem.svelte @@ -14,7 +14,7 @@

    {#if showButtons} -
    + diff --git a/src/routes/dashboard/admin/admin/stats/+page.server.ts b/src/routes/dashboard/admin/admin/stats/+page.server.ts index 629993b..09cbd08 100644 --- a/src/routes/dashboard/admin/admin/stats/+page.server.ts +++ b/src/routes/dashboard/admin/admin/stats/+page.server.ts @@ -71,15 +71,13 @@ export async function load({ locals }) { .groupBy(project.id) .as('shippedProjects'); - const [shippedStats] = await db - .select({ - count: count(), - totalTimeSpent: sql`sum(${shippedProjects.timeSpent})`, - averageTimeSpent: sql`avg(${shippedProjects.timeSpent})`, - totalDevlogs: sql`sum(${shippedProjects.devlogCount})`, - averageDevlogs: sql`avg(${shippedProjects.devlogCount})` - }) - .from(shippedProjects); + const [shippedStats] = await db.select({ + count: count(), + totalTimeSpent: sql`sum(${shippedProjects.timeSpent})`, + averageTimeSpent: sql`avg(${shippedProjects.timeSpent})`, + totalDevlogs: sql`sum(${shippedProjects.devlogCount})`, + averageDevlogs: sql`avg(${shippedProjects.devlogCount})`, + }).from(shippedProjects); return { users: users, diff --git a/src/routes/dashboard/admin/admin/users/+page.server.ts b/src/routes/dashboard/admin/admin/users/+page.server.ts index 0b0492e..e728b17 100644 --- a/src/routes/dashboard/admin/admin/users/+page.server.ts +++ b/src/routes/dashboard/admin/admin/users/+page.server.ts @@ -28,7 +28,7 @@ export const actions = { } await db.delete(session); - + return {}; } } satisfies Actions; diff --git a/src/routes/dashboard/admin/print/+page.server.ts b/src/routes/dashboard/admin/print/+page.server.ts index 131300b..3906a08 100644 --- a/src/routes/dashboard/admin/print/+page.server.ts +++ b/src/routes/dashboard/admin/print/+page.server.ts @@ -31,13 +31,15 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const legionAgg = db.$with('legionAgg').as( - db - .select({ userId: legionReview.userId, legionCnt: sql`COUNT(*)`.as('legionCnt') }) - .from(legionReview) - .where(eq(legionReview.action, 'print')) - .groupBy(legionReview.userId) - ); + const legionAgg = db + .$with('legionAgg') + .as( + db + .select({ userId: legionReview.userId, legionCnt: sql`COUNT(*)`.as('legionCnt') }) + .from(legionReview) + .where(eq(legionReview.action, 'print')) + .groupBy(legionReview.userId) + ); const totalExpr = sql`COALESCE(${legionAgg.legionCnt}, 0)`; diff --git a/src/routes/dashboard/admin/review/+page.server.ts b/src/routes/dashboard/admin/review/+page.server.ts index dceb4bc..f37785c 100644 --- a/src/routes/dashboard/admin/review/+page.server.ts +++ b/src/routes/dashboard/admin/review/+page.server.ts @@ -31,13 +31,15 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const t1Agg = db.$with('t1Agg').as( - db - .select({ userId: t1Review.userId, t1Cnt: sql`COUNT(*)`.as('t1Cnt') }) - .from(t1Review) - .where(ne(t1Review.action, 'add_comment')) - .groupBy(t1Review.userId) - ); + const t1Agg = db + .$with('t1Agg') + .as( + db + .select({ userId: t1Review.userId, t1Cnt: sql`COUNT(*)`.as('t1Cnt') }) + .from(t1Review) + .where(ne(t1Review.action, 'add_comment')) + .groupBy(t1Review.userId) + ); const totalExpr = sql`COALESCE(${t1Agg.t1Cnt}, 0)`; diff --git a/src/routes/dashboard/admin/review/+page.svelte b/src/routes/dashboard/admin/review/+page.svelte index c8e5426..4da2eb7 100644 --- a/src/routes/dashboard/admin/review/+page.svelte +++ b/src/routes/dashboard/admin/review/+page.svelte @@ -154,9 +154,7 @@
    -

    - Projects ({projects.length}) -

    +

    Projects ({projects.length})

    {#if projects.length == 0}
    diff --git a/src/routes/dashboard/admin/review/[id]/+page.svelte b/src/routes/dashboard/admin/review/[id]/+page.svelte index bbfc503..20f96ad 100644 --- a/src/routes/dashboard/admin/review/[id]/+page.svelte +++ b/src/routes/dashboard/admin/review/[id]/+page.svelte @@ -3,7 +3,7 @@ import Devlog from '$lib/components/Devlog.svelte'; import Head from '$lib/components/Head.svelte'; import { enhance } from '$app/forms'; - import { projectStatuses, getProjectLinkType } from '$lib/utils.js'; + import { projectStatuses, getProjectLinkType} from '$lib/utils.js'; import ProjectLinks from '$lib/components/ProjectLinks.svelte'; import Spinny3DPreview from '$lib/components/Spinny3DPreview.svelte'; import { Download } from '@lucide/svelte'; @@ -49,13 +49,7 @@ uploadedFileUrl={data.project.project.uploadedFileUrl} />
    -

    - Type: {getProjectLinkType( - data.project.project.editorFileType, - data.project.project.editorUrl, - data.project.project.uploadedFileUrl - )} -

    +

    Type: {getProjectLinkType(data.project.project.editorFileType, data.project.project.editorUrl, data.project.project.uploadedFileUrl)}

    diff --git a/src/routes/dashboard/admin/ysws-review/+page.server.ts b/src/routes/dashboard/admin/ysws-review/+page.server.ts index 78fe29a..4b06998 100644 --- a/src/routes/dashboard/admin/ysws-review/+page.server.ts +++ b/src/routes/dashboard/admin/ysws-review/+page.server.ts @@ -30,12 +30,14 @@ export async function load({ locals }) { .from(user) .where(and(ne(user.trust, 'red'), ne(user.hackatimeTrust, 'red'))); // hide banned users - const t2Agg = db.$with('t2Agg').as( - db - .select({ userId: t2Review.userId, t2Cnt: sql`COUNT(*)`.as('t2Cnt') }) - .from(t2Review) - .groupBy(t2Review.userId) - ); + const t2Agg = db + .$with('t2Agg') + .as( + db + .select({ userId: t2Review.userId, t2Cnt: sql`COUNT(*)`.as('t2Cnt') }) + .from(t2Review) + .groupBy(t2Review.userId) + ); const totalExpr = sql`COALESCE(${t2Agg.t2Cnt}, 0)`; diff --git a/src/routes/dashboard/explore/+page.server.ts b/src/routes/dashboard/explore/+page.server.ts index 9e80890..3d2d4de 100644 --- a/src/routes/dashboard/explore/+page.server.ts +++ b/src/routes/dashboard/explore/+page.server.ts @@ -1,12 +1,12 @@ import { DEVLOGS_PAGE_SIZE, fetchExploreDevlogs } from './devlogs.js'; export async function load() { - const devlogs = await fetchExploreDevlogs(0); - const nextOffset = devlogs.length; + const devlogs = await fetchExploreDevlogs(0); + const nextOffset = devlogs.length; - return { - devlogs, - nextOffset, - hasMore: devlogs.length === DEVLOGS_PAGE_SIZE - }; + return { + devlogs, + nextOffset, + hasMore: devlogs.length === DEVLOGS_PAGE_SIZE + }; } diff --git a/src/routes/dashboard/explore/+page.svelte b/src/routes/dashboard/explore/+page.svelte index c44bbbb..2ac2c3f 100644 --- a/src/routes/dashboard/explore/+page.svelte +++ b/src/routes/dashboard/explore/+page.svelte @@ -76,6 +76,7 @@

    Explore

    +
    {#if devlogs.length == 0}
    @@ -106,7 +107,9 @@ {#if loadError}
    {loadError} - +
    {/if} @@ -114,4 +117,4 @@

    You're caught up.

    {/if} {/if} -
    +
    \ No newline at end of file diff --git a/src/routes/dashboard/market/MarketTimer.svelte b/src/routes/dashboard/market/MarketTimer.svelte index 3538e3e..9aa1e6c 100644 --- a/src/routes/dashboard/market/MarketTimer.svelte +++ b/src/routes/dashboard/market/MarketTimer.svelte @@ -54,4 +54,4 @@ SECS
    - + \ No newline at end of file diff --git a/src/routes/dashboard/projects/+page.svelte b/src/routes/dashboard/projects/+page.svelte index 6945066..d716df8 100644 --- a/src/routes/dashboard/projects/+page.svelte +++ b/src/routes/dashboard/projects/+page.svelte @@ -35,7 +35,7 @@ {:else} -
    +
    {#each data.projects as project} {data.project.name} -
    +

    Created @@ -109,7 +109,7 @@

    {/if} diff --git a/src/routes/dashboard/projects/[id]/delete/+page.server.ts b/src/routes/dashboard/projects/[id]/delete/+page.server.ts index 8c1a111..2855ef7 100644 --- a/src/routes/dashboard/projects/[id]/delete/+page.server.ts +++ b/src/routes/dashboard/projects/[id]/delete/+page.server.ts @@ -36,14 +36,7 @@ export async function load({ params, locals }) { or(eq(project.status, 'building'), eq(project.status, 'rejected')) ) ) - .groupBy( - project.id, - project.name, - project.description, - project.url, - project.createdAt, - project.status - ) + .groupBy(project.id, project.name, project.description, project.url, project.createdAt, project.status) .limit(1); if (!queriedProject) { @@ -94,7 +87,7 @@ export const actions = { eq(project.deleted, false) ) ); - + // Mark all associated devlogs as deleted await db .update(devlog) @@ -102,7 +95,12 @@ export const actions = { deleted: true, updatedAt: new Date(Date.now()) }) - .where(and(eq(devlog.projectId, queriedProject.id), eq(devlog.userId, locals.user.id))); + .where( + and( + eq(devlog.projectId, queriedProject.id), + eq(devlog.userId, locals.user.id), + ) + ); return redirect(303, '/dashboard/projects'); } diff --git a/src/routes/dashboard/projects/create/+page.svelte b/src/routes/dashboard/projects/create/+page.svelte index bfddeda..ae0afff 100644 --- a/src/routes/dashboard/projects/create/+page.svelte +++ b/src/routes/dashboard/projects/create/+page.svelte @@ -67,7 +67,9 @@
  • The number and quality of your devlogs
  • How polished your project is
  • -

    A higher market score:

    +

    + A higher market score: +

    • Reduces the price of market items
    • Lets you unlock more items in the market
    • @@ -81,7 +83,7 @@ { formPending = true; return async ({ update }) => { diff --git a/src/routes/dashboard/users/+page.server.ts b/src/routes/dashboard/users/+page.server.ts index 8f8ca5d..1fccc72 100644 --- a/src/routes/dashboard/users/+page.server.ts +++ b/src/routes/dashboard/users/+page.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; export function load({ locals }) { - throw redirect(302, `/dashboard/users/${locals.user?.id}`); -} + throw redirect(302, `/dashboard/users/${locals.user?.id}`); +}; \ No newline at end of file diff --git a/wrangler.jsonc b/wrangler.jsonc index 011237b..67ccdf7 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -4,6 +4,6 @@ "compatibility_date": "2025-01-01", "assets": { "binding": "ASSETS", - "directory": ".svelte-kit/cloudflare" + "directory": ".svelte-kit/cloudflare", } -} +} \ No newline at end of file