diff --git a/astro/services/Competition.go b/astro/services/Competition.go index 799066f920c0f6b05d7ab1c97561bad444abcb30..c3ad4a60495c59df3667e236c20d5c24393b8e40 100644 --- a/astro/services/Competition.go +++ b/astro/services/Competition.go @@ -43,6 +43,7 @@ func (c *Competition) InitCompetition() bool { var seedingStage = CreateSeedingStage(0, 300, 300) // TODO: Max player number should be dynamic + seedingStage.Register() c.AddStage(seedingStage) c.CompetitionCurrentStageID = 0 diff --git a/astro/services/Seeding.go b/astro/services/Seeding.go index a0119c9a808dae35e3d5f778767e53239089616b..8ddf05b3cfe0a99329e854b559462db090f6cf4a 100644 --- a/astro/services/Seeding.go +++ b/astro/services/Seeding.go @@ -2,8 +2,9 @@ package services // Seeding : Seeding details type Seeding struct { - SeedingPosition uint16 - SeedingPlayer *Player + SeedingPosition uint16 + SeedingPlayer *Player + SeedingPlayerPresent bool } type SeedingStage struct { diff --git a/astro/services/Session.go b/astro/services/Session.go index cc3fd67ac2898a9f2e1b9cc186a84622e280cd57..02a718411b951dc0964585a8b43205f36246e302 100644 --- a/astro/services/Session.go +++ b/astro/services/Session.go @@ -74,7 +74,7 @@ func (s *Session) AddPlayerToCompetition(competitionID uint8, player *Player) bo func (s *Session) RemovePlayerFromCompetition(competitionID uint8, player *Player) bool { competition := s.GetCompetition(competitionID) - if competition.CompetitionName == "" { + if competition == nil { return false } @@ -83,7 +83,7 @@ func (s *Session) RemovePlayerFromCompetition(competitionID uint8, player *Playe func (s *Session) GetAllPlayersFromCompetition(competitionID uint8) []*Player { competition := s.GetCompetition(competitionID) - if competition.CompetitionName == "" { + if competition == nil { return []*Player{} } @@ -96,16 +96,18 @@ func (s *Session) GetAllPlayersFromCompetition(competitionID uint8) []*Player { func (s *Session) UpdateCompetitionPlayer(competitionID uint8, player *Player) bool { competition := s.GetCompetition(competitionID) - if competition.CompetitionName == "" { + if competition == nil { return false } + // TODO: Check if player is in competition + return competition.UpdatePlayer(player) } func (s *Session) GetStageKind(competitionID uint8, stageID uint8) StageKind { competition := s.GetCompetition(competitionID) - if competition.CompetitionName == "" { + if competition == nil { return UNKNOWN } @@ -116,3 +118,45 @@ func (s *Session) GetStageKind(competitionID uint8, stageID uint8) StageKind { return (*stage).GetKind() } + +func (s *Session) AddPlayerToCompetitionStage(competitionID uint8, stageID uint8, player *Player) bool { + competition := s.GetCompetition(competitionID) + if competition == nil { + return false + } + + stage := competition.GetStage(stageID) + if stage == nil { + return false + } + + return s.AddPlayerToCompetition(competitionID, player) && (*stage).AddPlayer(player) +} + +func (s *Session) RemovePlayerFromCompetitionStage(competitionID uint8, stageID uint8, player *Player) bool { + competition := s.GetCompetition(competitionID) + if competition == nil { + return false + } + + stage := competition.GetStage(stageID) + if stage == nil { + return false + } + + return (*stage).RemovePlayer(player) +} + +func (s *Session) GetPlayersFromCompetitionStage(competitionID uint8, stageID uint8) []*Player { + competition := s.GetCompetition(competitionID) + if competition == nil { + return []*Player{} + } + + stage := competition.GetStage(stageID) + if stage == nil { + return []*Player{} + } + + return (*stage).GetPlayers() +} diff --git a/frontend/bindings/changeme/astro/services/session.ts b/frontend/bindings/changeme/astro/services/session.ts index a65a2cb9fccd82a7f491fd173afb2b4dbe801a2a..de8fd51605c06a1c468627937ea52397e713d40f 100644 --- a/frontend/bindings/changeme/astro/services/session.ts +++ b/frontend/bindings/changeme/astro/services/session.ts @@ -24,6 +24,11 @@ export function AddPlayerToCompetition(competitionID: number, player: $models.Pl return $resultPromise; } +export function AddPlayerToCompetitionStage(competitionID: number, stageID: number, player: $models.Player | null): Promise<boolean> & { cancel(): void } { + let $resultPromise = $Call.ByID(2910612480, competitionID, stageID, player) as any; + return $resultPromise; +} + export function GetAllPlayersFromCompetition(competitionID: number): Promise<($models.Player | null)[]> & { cancel(): void } { let $resultPromise = $Call.ByID(3547487506, competitionID) as any; let $typingPromise = $resultPromise.then(($result) => { @@ -51,6 +56,15 @@ export function GetCompetitions(): Promise<$models.Competition[]> & { cancel(): return $typingPromise; } +export function GetPlayersFromCompetitionStage(competitionID: number, stageID: number): Promise<($models.Player | null)[]> & { cancel(): void } { + let $resultPromise = $Call.ByID(145932197, competitionID, stageID) as any; + let $typingPromise = $resultPromise.then(($result) => { + return $$createType2($result); + }) as any; + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + export function GetStageKind(competitionID: number, stageID: number): Promise<$models.StageKind> & { cancel(): void } { let $resultPromise = $Call.ByID(3392771308, competitionID, stageID) as any; return $resultPromise; @@ -66,6 +80,11 @@ export function RemovePlayerFromCompetition(competitionID: number, player: $mode return $resultPromise; } +export function RemovePlayerFromCompetitionStage(competitionID: number, stageID: number, player: $models.Player | null): Promise<boolean> & { cancel(): void } { + let $resultPromise = $Call.ByID(4015938334, competitionID, stageID, player) as any; + return $resultPromise; +} + export function UpdateCompetitionPlayer(competitionID: number, player: $models.Player | null): Promise<boolean> & { cancel(): void } { let $resultPromise = $Call.ByID(3540307881, competitionID, player) as any; return $resultPromise; diff --git a/frontend/src/StageManager.svelte b/frontend/src/StageManager.svelte index 41d34a6b2de97c9ead19f290e640b292bb710bc8..2526104675f29ed4773083f13d8a208955a2bf90 100644 --- a/frontend/src/StageManager.svelte +++ b/frontend/src/StageManager.svelte @@ -1,7 +1,7 @@ <script lang="ts"> import Registrations from "./components/Registrations/Registrations.svelte"; import * as Models from "./../bindings/changeme/astro/services/models"; - import { SelectedCompetition } from "./store"; + import { SelectedCompetition, CurrentStage } from "./store"; import { onMount } from "svelte"; import { GetStageKind } from "./../bindings/changeme/astro/services/session"; @@ -16,6 +16,8 @@ competition.CompetitionStages[ `${competition.CompetitionCurrentStageID}` ]; + CurrentStage.set(currentStage); + GetStageKind( competition.CompetitionID, currentStage.StageID diff --git a/frontend/src/components/Registrations/Registrations.svelte b/frontend/src/components/Registrations/Registrations.svelte index c2ce4346da554eedfec7e6f418e01f88d69918ba..336d881a1058b1e37971a944fa093bbc77d3d5f0 100644 --- a/frontend/src/components/Registrations/Registrations.svelte +++ b/frontend/src/components/Registrations/Registrations.svelte @@ -8,7 +8,7 @@ import { onMount } from "svelte"; import * as Models from "../../../bindings/changeme/astro/services/models"; import * as Session from "../../../bindings/changeme/astro/services/session"; - import { SelectedCompetition } from "../../store"; + import { SelectedCompetition, CurrentStage } from "../../store"; import { GenerateRandomPlayer } from "../../../bindings/changeme/astro/services/player"; import swal from "sweetalert"; import { getNationFlag, getNationFlatAlt } from "../../Util"; @@ -17,12 +17,18 @@ let players: (Models.Player | null)[] = []; let filteredPlayers: (Models.Player | null)[] = []; let competition: Models.Competition | undefined; + let stage: Models.Stage | undefined; let sortBy = { key: "", asc: true }; let searchTerms = ""; // Listen to any change in the selected competition SelectedCompetition.subscribe((value) => { competition = value; + }); + + // Listen to any change in the current stage + CurrentStage.subscribe((value) => { + stage = value; loadPlayers(); }); @@ -32,11 +38,12 @@ return; } - Session.GetAllPlayersFromCompetition(competition.CompetitionID).then( - (result) => { - players = result; - } - ); + Session.GetPlayersFromCompetitionStage( + competition.CompetitionID, + stage?.StageID + ).then((result) => { + players = result; + }); } // When the page is loaded, load the players, and set the default sorting @@ -61,7 +68,11 @@ case "PlayerLastname": return player.PlayerLastname; case "PlayerClub": - return player.PlayerClub; + return player.PlayerClub?.club_name; + case "PlayerRegion": + return player.PlayerRegion?.region_name; + case "PlayerCountry": + return player.PlayerNation?.nation_name; default: return ""; } @@ -74,6 +85,10 @@ if (aValue === null || bValue === null) { return 0; } + if (aValue === undefined || bValue === undefined) { + return 0; + } + if (aValue < bValue) { return sortBy.asc ? -1 : 1; } @@ -119,6 +134,13 @@ <!-- The following code is used to sort the players by the column clicked. --> + <th + on:click={() => { + sortBy = { key: "PlayerPresent", asc: !sortBy.asc }; + }} + > + Present + </th> <th on:click={() => { sortBy = { @@ -169,6 +191,9 @@ class:silver={player.PlayerInitialRank == 2} class:bronze={player.PlayerInitialRank == 3} > + <td> + <!-- TODO: input checkbox --> + </td> <td on:dblclick={async () => { // Show a prompt to the user to change the rank @@ -209,6 +234,7 @@ ).then(() => { loadPlayers(); }); + // TODO: Backend wise, change it } }}>{player.PlayerInitialRank}</td > @@ -238,6 +264,7 @@ ).then(() => { loadPlayers(); }); + // TODO: Backend wise, change it } }} >{player.PlayerLastname.toLocaleUpperCase()}</td @@ -268,6 +295,7 @@ ).then(() => { loadPlayers(); }); + // TODO: Backend wise, change it } }}>{player.PlayerFirstname}</td > @@ -305,8 +333,9 @@ // Add the player to the competition if (competition != undefined) - await Session.AddPlayerToCompetition( + await Session.AddPlayerToCompetitionStage( competition.CompetitionID, + stage?.SeedingStageID, player ).then(() => { loadPlayers(); diff --git a/frontend/src/store.ts b/frontend/src/store.ts index 797b72406ba5162b06d06d5b1ba5f45d541fd388..cb0e2d541bbc03a5ea8fc9b124060640a5feddd7 100644 --- a/frontend/src/store.ts +++ b/frontend/src/store.ts @@ -1,5 +1,7 @@ import { writable } from 'svelte/store'; -import type { Competition } from '../bindings/changeme/astro/services/models'; +import type { Stage } from '../bindings/changeme/astro/services/models'; +import { type Competition } from '../bindings/changeme/astro/services/models'; export const SelectedCompetition = writable<Competition | undefined>(undefined); +export const CurrentStage = writable<Stage | undefined>(undefined); export const Competitions = writable<(Competition | undefined)[]>([]); \ No newline at end of file