From 46059bcfb5d749e83d5890d32a99aaa61b80f32c Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Sun, 15 Dec 2024 00:55:37 +0100 Subject: [PATCH] Implement data/season races page --- src/routes/data/season/+page.server.ts | 64 ++++++++++++++++++++++++-- src/routes/data/season/+page.svelte | 15 ++++-- 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/routes/data/season/+page.server.ts b/src/routes/data/season/+page.server.ts index a4aa8e0..3181eda 100644 --- a/src/routes/data/season/+page.server.ts +++ b/src/routes/data/season/+page.server.ts @@ -1,5 +1,10 @@ import type { Actions, PageServerLoad } from "./$types"; -import { form_data_clean, form_data_ensure_keys, form_data_get_and_remove_id } from "$lib/form"; +import { + form_data_clean, + form_data_ensure_keys, + form_data_fix_dates, + form_data_get_and_remove_id, +} from "$lib/form"; import type { Team, Driver, Race, Substitution, Graphic } from "$lib/schema"; // These "actions" run serverside only, as they're located inside +page.server.ts @@ -43,8 +48,6 @@ export const actions = { const data: FormData = form_data_clean(await request.formData()); form_data_ensure_keys(data, ["firstname", "lastname", "code", "team", "headshot", "active"]); - console.log(data); - const record: Driver = await locals.pb.collection("drivers").create(data); return { tab: 1 }; @@ -73,22 +76,59 @@ export const actions = { }, create_race: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + + const data: FormData = form_data_clean(await request.formData()); + form_data_ensure_keys(data, ["name", "step", "pictogram", "pxx", "qualidate", "racedate"]); + form_data_fix_dates(data, ["sprintqualidate", "sprintdate", "qualidate", "racedate"]); + + const record: Race = await locals.pb.collection("races").create(data); + return { tab: 2 }; }, + update_race: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + + // Do not remove empty sprint dates so they can be cleared by updating the record + const data: FormData = form_data_clean(await request.formData(), [ + "sprintqualidate", + "sprintdate", + ]); + form_data_fix_dates(data, ["sprintqualidate", "sprintdate", "qualidate", "racedate"]); + const id: string = form_data_get_and_remove_id(data); + + const record: Race = await locals.pb.collection("races").update(id, data); + return { tab: 2 }; }, + delete_race: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + + const data: FormData = form_data_clean(await request.formData()); + const id: string = form_data_get_and_remove_id(data); + + await locals.pb.collection("races").delete(id); + return { tab: 2 }; }, create_substitution: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + return { tab: 2 }; }, + update_substitution: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + return { tab: 2 }; }, + delete_substitution: async ({ request, locals }) => { + if (!locals.admin) return { unauthorized: true }; + return { tab: 2 }; }, } satisfies Actions; @@ -134,11 +174,25 @@ export const load: PageServerLoad = async ({ fetch, locals }) => { }; const fetch_races = async (): Promise => { - return []; + const races: Race[] = await locals.pb.collection("races").getFullList({ + sort: "+step", + fetch: fetch, + }); + + races.map((race: Race) => { + race.pictogram_url = locals.pb.files.getURL(race, race.pictogram); + }); + + return races; }; const fetch_substitutions = async (): Promise => { - return []; + // TODO: Sort by race step (does the race need to be expanded for this?) + const substitutions: Substitution[] = await locals.pb.collection("substitutions").getFullList({ + fetch: fetch, + }); + + return substitutions; }; return { diff --git a/src/routes/data/season/+page.svelte b/src/routes/data/season/+page.svelte index 366ab62..f6a6e09 100644 --- a/src/routes/data/season/+page.svelte +++ b/src/routes/data/season/+page.svelte @@ -10,6 +10,7 @@ import { get_by_value } from "$lib/database"; import TeamCard from "$lib/components/TeamCard.svelte"; import DriverCard from "$lib/components/DriverCard.svelte"; + import RaceCard from "$lib/components/RaceCard.svelte"; let { data, form }: { data: PageData; form: ActionData } = $props(); @@ -74,7 +75,6 @@ -
{#each data.drivers as driver} @@ -100,13 +100,22 @@ +
+ {#each data.races as race} + + {/each} - Races + {#if data.admin} + + {/if} +
{:else if current_tab === 3} - Substitutions {/if}