From 55bdf0fa1801b93f0c50680f8ed40377d538a431 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Thu, 12 Dec 2024 04:41:36 +0100 Subject: [PATCH] Data/Season: Implement seasondata/teams page + creation/deletion/updating --- .../admin/seasondata/teams/+page.server.ts | 66 +++++++++ .../admin/seasondata/teams/+page.svelte | 129 ++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 src/routes/admin/seasondata/teams/+page.server.ts create mode 100644 src/routes/admin/seasondata/teams/+page.svelte diff --git a/src/routes/admin/seasondata/teams/+page.server.ts b/src/routes/admin/seasondata/teams/+page.server.ts new file mode 100644 index 0000000..70c076c --- /dev/null +++ b/src/routes/admin/seasondata/teams/+page.server.ts @@ -0,0 +1,66 @@ +import type { Actions, PageServerLoad } from "./$types"; +import { + form_data_clean, + form_data_ensure_keys, + form_data_get_and_remove_id, +} from "$lib/forms"; + +// These "actions" run serverside only, as they're located inside +page.server.ts +export const actions = { + // We destructure the RequestEvent with ({cookies, request}). + // Alternatively use (event) and event.cookies or event.request to access. + create: async ({ cookies, request, locals }) => { + if (!locals.admin) return { success: false }; + + const data = form_data_clean(await request.formData()); + form_data_ensure_keys(data, ["name", "logo"]); + + const record = await locals.pb.collection("teams").create(data); + + return { success: true }; + }, + + update: async ({ cookies, request, locals }) => { + if (!locals.admin) return { success: false }; + + const data = form_data_clean(await request.formData()); + const id = form_data_get_and_remove_id(data); + + // Destructure the FormData object + const record = await locals.pb.collection("teams").update(id, data); + + return { success: true }; + }, + + delete: async ({ cookies, request, locals }) => { + if (!locals.admin) return { success: false }; + + const data: FormData = form_data_clean(await request.formData()); + const id = form_data_get_and_remove_id(data); + + await locals.pb.collection("teams").delete(id); + + return { success: true }; + }, +} satisfies Actions; + +// This "load" function runs serverside only, as it's located inside +page.server.ts +export const load: PageServerLoad = async ({ fetch, locals }) => { + const fetch_teams = async () => { + const teams = await locals.pb.collection("teams").getFullList({ + sort: "+name", + fetch: fetch, + }); + + // Fill in the file URLs + teams.map((team) => { + team.logo_url = locals.pb.files.getURL(team, team.logo); + }); + + return teams; + }; + + return { + teams: await fetch_teams(), + }; +}; diff --git a/src/routes/admin/seasondata/teams/+page.svelte b/src/routes/admin/seasondata/teams/+page.svelte new file mode 100644 index 0000000..b4771ce --- /dev/null +++ b/src/routes/admin/seasondata/teams/+page.svelte @@ -0,0 +1,129 @@ + + + + F11 - Teams + + + + +

Season Data

+ +
+ Teams + Drivers + Races +
+ + +
+ + {#each data.teams as team} +
+ +
+ Logo of {team.name} F1 team. +
+ +
+ + +
+ + + + + + +
+
+
+
+
+ {/each} + + + {#if data.admin} +
+ +
+ +
+
+
+

Add a New Team

+ + + + + + + + +
+ + + + +
+
+
+
+ {/if} +