diff --git a/src/components/moderator/components/FightEdit.svelte b/src/components/moderator/components/FightEdit.svelte index 4d0e5a0..d84a4da 100644 --- a/src/components/moderator/components/FightEdit.svelte +++ b/src/components/moderator/components/FightEdit.svelte @@ -1,45 +1,36 @@
- + {#snippet child({ props })} + {/snippet} + + + + + + + (createOpen = true)}> + + Neue Gruppe + + { + fightGroup = null; + groupSelectOpen = false; + }} + > + {#if fightGroup === null} + + {:else} + + {/if} + Keine Gruppe + + + {#each groups as group} + { + fightGroup = group.id; + groupSelectOpen = false; + }} + > + + {group.name} + + {/each} + + + + + + + + Neue Gruppe erstellen + Hier kannst du eine neue Gruppe erstellen + + + {#snippet actions(dirty, submit)} + + + + {/snippet} + + + + +
-{@render actions(dirty, submit)} +{@render actions(dirty && !loading, submit)} diff --git a/src/components/moderator/components/GroupEdit.svelte b/src/components/moderator/components/GroupEdit.svelte new file mode 100644 index 0000000..c5087d4 --- /dev/null +++ b/src/components/moderator/components/GroupEdit.svelte @@ -0,0 +1,78 @@ + + +
+ + + + + + + {#if groupType === "GROUP_STAGE" && group !== null} + + + + + + + + + {/if} +
+ +{@render actions(group === null ? canSave : dirty, submit)} diff --git a/src/components/moderator/pages/event/EventFightList.svelte b/src/components/moderator/pages/event/EventFightList.svelte index aa9dcdd..4b73873 100644 --- a/src/components/moderator/pages/event/EventFightList.svelte +++ b/src/components/moderator/pages/event/EventFightList.svelte @@ -22,25 +22,29 @@ import GroupEditRow from "./GroupEditRow.svelte"; - import type { ExtendedEvent } from "@type/event"; + import type { EventFightEdit, ExtendedEvent } from "@type/event"; import { createSvelteTable, FlexRender } from "@components/ui/data-table"; import { type ColumnFiltersState, getCoreRowModel, getFilteredRowModel, getGroupedRowModel, getSortedRowModel, type RowSelectionState, type SortingState } from "@tanstack/table-core"; import { columns } from "./columns"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@components/ui/table"; import { Checkbox } from "@components/ui/checkbox"; import { Menubar, MenubarContent, MenubarItem, MenubarGroup, MenubarGroupHeading, MenubarMenu, MenubarSeparator, MenubarTrigger } from "@components/ui/menubar"; + import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@components/ui/dialog"; + import FightEdit from "@components/moderator/components/FightEdit.svelte"; import { Button } from "@components/ui/button"; - import { MenuIcon } from "lucide-svelte"; + import { eventRepo } from "@components/repo/event"; let { data = $bindable() }: { data: ExtendedEvent } = $props(); + let fights = $state(data.fights); + let sorting = $state([]); let columnFilters = $state([]); let selection = $state({}); const table = createSvelteTable({ get data() { - return data.fights; + return fights; }, initialState: { columnOrder: ["auswahl", "begegnung", "group"], @@ -88,30 +92,58 @@ groupedColumnMode: "remove", getRowId: (row) => row.id.toString(), }); + + let createOpen = $state(false); + + async function handleSave(fight: EventFightEdit) { + await $eventRepo.createFight(data.event.id.toString(), { + ...fight, + blueTeam: fight.blueTeam.id, + redTeam: fight.redTeam.id, + }); + + fights = await $eventRepo.listFights(data.event.id.toString()); + createOpen = false; + }
- - - Mehrfach Bearbeiten - - Gruppe Ändern - Startzeit Verschieben - Spectate Port Ändern - - - - Erstellen - - Fight Erstellen - - Generatoren - Gruppenphase - K.O. Phase - - - - + + + + Mehrfach Bearbeiten + + Gruppe Ändern + Startzeit Verschieben + Spectate Port Ändern + + + + Erstellen + + (createOpen = true)}>Fight Erstellen + + Generatoren + Gruppenphase + K.O. Phase + + + + + + + Fight Erstellen + Hier kannst du einen neuen Fight erstellen + + + {#snippet actions(dirty, submit)} + + + + {/snippet} + + +
@@ -131,7 +163,7 @@ {#each table.getRowModel().rows as groupRow (groupRow.id)} {#if groupRow.getIsGrouped()} - + {/each} - + (fights = fights.map((v) => (v.id === update.id ? update : v)))} + > {/each} diff --git a/src/components/moderator/pages/event/EventView.svelte b/src/components/moderator/pages/event/EventView.svelte index 2f39995..d396b90 100644 --- a/src/components/moderator/pages/event/EventView.svelte +++ b/src/components/moderator/pages/event/EventView.svelte @@ -24,7 +24,7 @@ import RefereesList from "@components/moderator/pages/event/RefereesList.svelte"; import TeamTable from "@components/moderator/pages/event/TeamTable.svelte"; - let { event }: { event: ExtendedEvent } = $props(); + let { event = $bindable() }: { event: ExtendedEvent } = $props();
diff --git a/src/components/moderator/pages/event/FightEditRow.svelte b/src/components/moderator/pages/event/FightEditRow.svelte index 0f44410..974a4b1 100644 --- a/src/components/moderator/pages/event/FightEditRow.svelte +++ b/src/components/moderator/pages/event/FightEditRow.svelte @@ -1,21 +1,32 @@
- + @@ -35,7 +46,4 @@ -
diff --git a/src/components/moderator/pages/event/columns.ts b/src/components/moderator/pages/event/columns.ts index 6c074ce..4f4a855 100644 --- a/src/components/moderator/pages/event/columns.ts +++ b/src/components/moderator/pages/event/columns.ts @@ -77,4 +77,28 @@ export const columns: ColumnDef = [ }); }, }, + { + header: "Spielmodus", + accessorKey: "spielmodus", + }, + { + header: "Map", + accessorKey: "map", + }, + { + header: "Ergebnis", + accessorKey: "ergebnis", + cell: ({ row }) => { + const fight = row.original; + if (fight.ergebnis === 0 && fight.start > Date.now()) { + return "Noch nicht gespielt"; + } else if (fight.ergebnis === 1) { + return fight.blueTeam.name + " hat gewonnen"; + } else if (fight.ergebnis === 2) { + return fight.redTeam.name + " hat gewonnen"; + } else { + return "Unentschieden"; + } + }, + }, ]; diff --git a/src/components/repo/event.ts b/src/components/repo/event.ts index 18d36e7..334f6a3 100644 --- a/src/components/repo/event.ts +++ b/src/components/repo/event.ts @@ -128,6 +128,7 @@ export class EventRepo { .then((value) => z.array(EventFightSchema).parse(value)); } public async createFight(eventId: string, fight: any): Promise { + delete fight.ergebnis; return await fetchWithToken(this.token, `/events/${eventId}/fights`, { method: "POST", body: JSON.stringify(fight), @@ -153,7 +154,10 @@ export class EventRepo { CreateEventGroupSchema.parse(group); return await fetchWithToken(this.token, `/events/${eventId}/groups`, { method: "POST", - body: JSON.stringify(group), + body: JSON.stringify({ + name: group.name, + type: group.type, + }), headers: { "Content-Type": "application/json" }, }) .then((value) => value.json()) diff --git a/src/components/repo/fight.ts b/src/components/repo/fight.ts index a3d3a91..7020217 100644 --- a/src/components/repo/fight.ts +++ b/src/components/repo/fight.ts @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -import type {EventFight} from "@type/event.js"; -import {fetchWithToken, tokenStore} from "./repo"; -import {z} from "zod"; -import {EventFightSchema} from "@type/event.js"; -import type {Dayjs} from "dayjs"; -import {derived} from "svelte/store"; +import type { EventFight } from "@type/event.js"; +import { fetchWithToken, tokenStore } from "./repo"; +import { z } from "zod"; +import { EventFightSchema } from "@type/event.js"; +import type { Dayjs } from "dayjs"; +import { derived } from "svelte/store"; export interface CreateFight { spielmodus: string; @@ -39,23 +39,22 @@ export interface UpdateFight { map: string | null; blueTeam: number | null; redTeam: number | null; - start: Dayjs | null; + start: number | null; spectatePort: number | null; - group: string | null; + group: number | null; } export class FightRepo { - constructor(private token: string) { - } + constructor(private token: string) {} public async listFights(eventId: number): Promise { return await fetchWithToken(this.token, `/events/${eventId}/fights`) - .then(value => value.json()) - .then(value => z.array(EventFightSchema).parse(value)); + .then((value) => value.json()) + .then((value) => z.array(EventFightSchema).parse(value)); } public async createFight(eventId: number, fight: CreateFight): Promise { - return await fetchWithToken(this.token, "/fights", { + return await fetchWithToken(this.token, `/events/${eventId}/fights`, { method: "POST", body: JSON.stringify({ event: eventId, @@ -67,28 +66,25 @@ export class FightRepo { spectatePort: fight.spectatePort, group: fight.group, }), - }).then(value => value.json()) + }) + .then((value) => value.json()) .then(EventFightSchema.parse); } - public async updateFight(fightId: number, fight: UpdateFight): Promise { - return await fetchWithToken(this.token, `/fights/${fightId}`, { + public async updateFight(eventId: number, fightId: number, fight: UpdateFight): Promise { + return await fetchWithToken(this.token, `/events/${eventId}/fights/${fightId}`, { method: "PUT", body: JSON.stringify({ - spielmodus: fight.spielmodus, - map: fight.map, - blueTeam: fight.blueTeam, - redTeam: fight.redTeam, + ...fight, start: fight.start?.valueOf(), - spectatePort: fight.spectatePort, - group: fight.group, }), - }).then(value => value.json()) + }) + .then((value) => value.json()) .then(EventFightSchema.parse); } - public async deleteFight(fightId: number): Promise { - const res = await fetchWithToken(this.token, `/fights/${fightId}`, { + public async deleteFight(eventId: number, fightId: number): Promise { + const res = await fetchWithToken(this.token, `/events/${eventId}/fights/${fightId}`, { method: "DELETE", }); diff --git a/src/components/types/event.ts b/src/components/types/event.ts index e3a9b84..919c615 100644 --- a/src/components/types/event.ts +++ b/src/components/types/event.ts @@ -45,6 +45,15 @@ export const EventFightSchema = z.object({ export type EventFight = z.infer; +export const EventFightEditSchema = EventFightSchema.omit({ + id: true, + group: true, +}).extend({ + group: z.number().nullable(), +}); + +export type EventFightEdit = z.infer; + export type ResponseGroups = z.infer; export const ResponseRelationSchema = z.object({ @@ -111,6 +120,12 @@ export const UpdateEventGroupSchema = z.object({ }); export type UpdateEventGroup = z.infer; +export const GroupEditSchema = ResponseGroupsSchema.omit({ + id: true, + points: true, +}); +export type GroupUpdateEdit = z.infer; + export const CreateEventRelationSchema = z.object({ fightId: z.number(), team: z.enum(["RED", "BLUE"]),