From 85248e8c914d0ac8dc651fe2b9621d9b6125c870 Mon Sep 17 00:00:00 2001 From: schreifuchs Date: Wed, 19 Feb 2025 14:59:12 +0100 Subject: [PATCH] export functitionality --- app.go | 37 +++++++++++++++++++-- frontend/src/routes/Home.svelte | 6 ++-- frontend/src/routes/Matches.svelte | 41 ++++++++++++------------ frontend/src/routes/Participants.svelte | 5 ++- tournament.db | Bin 57344 -> 49152 bytes 5 files changed, 59 insertions(+), 30 deletions(-) diff --git a/app.go b/app.go index 9460bc4..bb463bd 100644 --- a/app.go +++ b/app.go @@ -2,10 +2,11 @@ package main import ( "context" - "fmt" + "encoding/csv" "gegio-ue1/model" "os" "slices" + "strconv" "github.com/wailsapp/wails/v2/pkg/runtime" "gorm.io/gorm" @@ -92,9 +93,39 @@ func (a *App) ExportTournament(t model.Tournament) { dirname, _ := os.UserHomeDir() str, err := runtime.SaveFileDialog(a.ctx, runtime.SaveDialogOptions{DefaultDirectory: dirname, DefaultFilename: "tournament.csv"}) if err != nil { - fmt.Println(err) + panic(err) + } + file, err := os.Create(str) + if err != nil { + panic(err) + } + defer file.Close() + // Create a CSV writer + writer := csv.NewWriter(file) + defer writer.Flush() + + var matches []model.Match + + a.db.Where("tournament_id = ?", t.ID).Order("stage ASC").Order("`order` ASC").Preload("Participant1").Preload("Participant2").Preload("WinnerParticipant").Find(&matches) + + // Write header + header := []string{"Stage", "Order", "Winner", "Looser"} + if err := writer.Write(header); err != nil { + panic(err) + } + + for _, m := range matches { + record := []string{strconv.Itoa(m.Stage), strconv.Itoa(m.Order), m.WinnerParticipant.Name} + if m.WinnerParticipantID == m.Participant1ID { + record = append(record, m.Participant2.Name) + } else { + + record = append(record, m.Participant1.Name) + } + if err := writer.Write(record); err != nil { + panic(err) + } } - println(str) } diff --git a/frontend/src/routes/Home.svelte b/frontend/src/routes/Home.svelte index ebcdd31..76937ca 100644 --- a/frontend/src/routes/Home.svelte +++ b/frontend/src/routes/Home.svelte @@ -13,7 +13,7 @@ Modal, } from "flowbite-svelte"; import TourCreator from "./TourCreator.svelte"; - import { Link } from "svelte-routing"; + import { Link, navigate } from "svelte-routing"; let thingsList: model.Tournament[] = $state([]); let newThing: boolean = $state(false); @@ -46,9 +46,7 @@ {t.WinnerParticipant.Name} - Edit + {/each} diff --git a/frontend/src/routes/Matches.svelte b/frontend/src/routes/Matches.svelte index 4ba14d2..1113b42 100644 --- a/frontend/src/routes/Matches.svelte +++ b/frontend/src/routes/Matches.svelte @@ -28,7 +28,7 @@ function saveMatch(m: model.Match): Promise { if (matches[matches.length - 1].length == 1) { - tournament.WinnerParticipantID = m.WinnerParticipantID; + tournament.WinnerParticipant = m.WinnerParticipant; SaveTournament(tournament).then(update); } return SaveMatch(m); @@ -71,32 +71,33 @@ {#each ms as m} - + {m.Participant1.Name} {m.Participant2.Name} - + {#if m.WinnerParticipant.Name == ""} - - +
+ + +
{:else} {m.WinnerParticipant.Name} {/if} diff --git a/frontend/src/routes/Participants.svelte b/frontend/src/routes/Participants.svelte index 0f6b628..4fd22cd 100644 --- a/frontend/src/routes/Participants.svelte +++ b/frontend/src/routes/Participants.svelte @@ -67,7 +67,6 @@ Name - {#each participants as p} @@ -75,7 +74,7 @@ {p.Name} - + {#if tournament.Participants.find((pa) => pa.ID == p.ID)} diff --git a/tournament.db b/tournament.db index 75dc330af94cfba0b494b8cb564280dd9441482e..2e07c3814fe1c0391522820a610763a72c3f41e1 100644 GIT binary patch literal 49152 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 j7Cr~D#-RO%-xWkaRnS%|w+Q