multistore
Razmig Sarkissian 1 year ago
parent 4fb8297512
commit ce235319ba
  1. 29
      PadelClub/Data/Tournament.swift
  2. 15
      PadelClub/Views/Match/Components/MatchDateView.swift
  3. 10
      PadelClub/Views/Shared/TournamentFilterView.swift
  4. 123
      PadelClub/Views/Tournament/TournamentBuildView.swift
  5. 2
      PadelClub/Views/Tournament/TournamentView.swift

@ -1346,38 +1346,43 @@ class Tournament : ModelObject, Storable {
return TournamentStatus(label: label, completion: completionLabel) return TournamentStatus(label: label, completion: completionLabel)
} }
func bracketStatus() async -> String { func bracketStatus() async -> (status: String, cut: TeamRegistration.TeamRange?) {
let availableSeeds = availableSeeds() let availableSeeds = availableSeeds()
let cut = TeamRegistration.TeamRange(availableSeeds.first, availableSeeds.last)
if availableSeeds.isEmpty == false { if availableSeeds.isEmpty == false {
return "placer \(availableSeeds.count) tête\(availableSeeds.count.pluralSuffix) de série" return ("placer \(availableSeeds.count) tête\(availableSeeds.count.pluralSuffix) de série", cut)
} }
let availableQualifiedTeams = availableQualifiedTeams() let availableQualifiedTeams = availableQualifiedTeams()
if availableQualifiedTeams.isEmpty == false { if availableQualifiedTeams.isEmpty == false {
return "placer \(availableQualifiedTeams.count) qualifié" + availableQualifiedTeams.count.pluralSuffix return ("placer \(availableQualifiedTeams.count) qualifié" + availableQualifiedTeams.count.pluralSuffix, cut)
} }
if let round = getActiveRound() { if let round = getActiveRound() {
return [round.roundTitle(.short), round.roundStatus()].joined(separator: " ") return ([round.roundTitle(.short), round.roundStatus()].joined(separator: " "), cut)
} else { } else {
return "à construire" return ("à construire", nil)
} }
} }
func groupStageStatus() async -> String { func groupStageStatus() async -> (status: String, cut: TeamRegistration.TeamRange?) {
let groupStageTeamsCount = groupStageTeams().count let groupStageTeams = groupStageTeams()
let groupStageTeamsCount = groupStageTeams.count
if groupStageTeamsCount == 0 || groupStageTeamsCount != groupStageSpots() { if groupStageTeamsCount == 0 || groupStageTeamsCount != groupStageSpots() {
return "à faire" return ("à faire", nil)
} }
let cut = TeamRegistration.TeamRange(groupStageTeams.first, groupStageTeams.last)
let runningGroupStages = groupStages().filter({ $0.isRunning() }) let runningGroupStages = groupStages().filter({ $0.isRunning() })
if groupStagesAreOver() { return "terminées" } if groupStagesAreOver() { return ("terminées", cut) }
if runningGroupStages.isEmpty { if runningGroupStages.isEmpty {
let ongoingGroupStages = runningGroupStages.filter({ $0.hasStarted() && $0.hasEnded() == false }) let ongoingGroupStages = runningGroupStages.filter({ $0.hasStarted() && $0.hasEnded() == false })
if ongoingGroupStages.isEmpty == false { if ongoingGroupStages.isEmpty == false {
return "Poule" + ongoingGroupStages.count.pluralSuffix + " " + ongoingGroupStages.map { ($0.index + 1).formatted() }.joined(separator: ", ") + " en cours" return ("Poule" + ongoingGroupStages.count.pluralSuffix + " " + ongoingGroupStages.map { ($0.index + 1).formatted() }.joined(separator: ", ") + " en cours", cut)
} }
return groupStages().count.formatted() + " poule" + groupStages().count.pluralSuffix return (groupStages().count.formatted() + " poule" + groupStages().count.pluralSuffix, cut)
} else { } else {
return "Poule" + runningGroupStages.count.pluralSuffix + " " + runningGroupStages.map { ($0.index + 1).formatted() }.joined(separator: ", ") + " en cours" return ("Poule" + runningGroupStages.count.pluralSuffix + " " + runningGroupStages.map { ($0.index + 1).formatted() }.joined(separator: ", ") + " en cours", cut)
} }
} }

@ -26,17 +26,28 @@ struct MatchDateView: View {
var body: some View { var body: some View {
Menu { Menu {
let estimatedDuration = match.getDuration()
if match.startDate == nil && isReady { if match.startDate == nil && isReady {
Button("Démarrer") { Button("Démarrer") {
match.startDate = Date() match.startDate = Date()
match.confirmed = true match.confirmed = true
_save() _save()
} }
Button("Échauffement") { Button("Démarrer dans 5 minutes") {
match.startDate = Calendar.current.date(byAdding: .minute, value: 5, to: Date()) match.startDate = Calendar.current.date(byAdding: .minute, value: 5, to: Date())
match.confirmed = true match.confirmed = true
_save() _save()
} }
Button("Démarrer dans 15 minutes") {
match.startDate = Calendar.current.date(byAdding: .minute, value: 15, to: Date())
match.confirmed = true
_save()
}
Button("Démarrer dans \(estimatedDuration.formatted()) minutes") {
match.startDate = Calendar.current.date(byAdding: .minute, value: estimatedDuration, to: Date())
match.confirmed = true
_save()
}
} else { } else {
if isReady { if isReady {
Button("Démarrer maintenant") { Button("Démarrer maintenant") {
@ -46,8 +57,6 @@ struct MatchDateView: View {
_save() _save()
} }
} else { } else {
let tournament = match.currentTournament()
let estimatedDuration = tournament != nil ? match.matchFormat.getEstimatedDuration(tournament!.additionalEstimationDuration) : match.matchFormat.getEstimatedDuration()
Button("Décaler de \(estimatedDuration) minutes") { Button("Décaler de \(estimatedDuration) minutes") {
match.cleanScheduleAndSave(match.startDate?.addingTimeInterval(Double(estimatedDuration) * 60.0)) match.cleanScheduleAndSave(match.startDate?.addingTimeInterval(Double(estimatedDuration) * 60.0))
} }

@ -66,7 +66,7 @@ struct TournamentFilterView: View {
} }
} }
} label: { } label: {
Text(level.localizedLabel()) Text(level.localizedLabel(.title))
} }
} }
} header: { } header: {
@ -88,7 +88,7 @@ struct TournamentFilterView: View {
} }
} }
} label: { } label: {
Text(category.localizedLabel()) Text(category.localizedLabel(.title))
} }
} }
} header: { } header: {
@ -110,7 +110,7 @@ struct TournamentFilterView: View {
} }
} }
} label: { } label: {
Text(category.localizedLabel()) Text(category.localizedLabel(.title))
} }
} }
} header: { } header: {
@ -124,6 +124,10 @@ struct TournamentFilterView: View {
federalDataViewModel.removeFilters() federalDataViewModel.removeFilters()
dismiss() dismiss()
} }
} else {
Button("Fermer", role: .cancel) {
dismiss()
}
} }
} }
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {

@ -9,8 +9,8 @@ import SwiftUI
struct TournamentBuildView: View { struct TournamentBuildView: View {
var tournament: Tournament var tournament: Tournament
@State private var bracketStatus: String? @State private var bracketStatus: (status: String, cut: TeamRegistration.TeamRange?)?
@State private var groupStageStatus: String? @State private var groupStageStatus: (String, TeamRegistration.TeamRange?)?
@State private var callStatus: Tournament.TournamentStatus? @State private var callStatus: Tournament.TournamentStatus?
@State private var scheduleStatus: Tournament.TournamentStatus? @State private var scheduleStatus: Tournament.TournamentStatus?
@State private var cashierStatus: Tournament.TournamentStatus? @State private var cashierStatus: Tournament.TournamentStatus?
@ -20,36 +20,82 @@ struct TournamentBuildView: View {
let state = tournament.state() let state = tournament.state()
Section { Section {
if tournament.hasEnded() { if tournament.groupStageCount > 0 {
NavigationLink(value: Screen.rankings) { NavigationLink(value: Screen.groupStage) {
Text("Classement final des équipes") LabeledContent {
if let groupStageStatus {
Text(groupStageStatus.0).lineLimit(1)
.multilineTextAlignment(.trailing)
} else {
ProgressView()
} }
} label: {
Text("Poules")
if tournament.shouldVerifyGroupStage {
Text("Vérifier les poules").foregroundStyle(.logoRed)
} else if let range = groupStageStatus?.1 {
HStack {
if let left = range.left {
Text(left.weight.formatted())
} }
if state == .running || state == .finished { if let right = range.right {
TournamentInscriptionView(tournament: tournament) Image(systemName: "arrowshape.forward.fill")
TournamentBroadcastRowView(tournament: tournament) Text(right.weight.formatted())
}
}
}
}
}
.task {
groupStageStatus = await tournament.groupStageStatus()
}
} }
NavigationLink(value: Screen.cashier) { if tournament.rounds().isEmpty == false {
let tournamentStatus = cashierStatus NavigationLink(value: Screen.round) {
LabeledContent { LabeledContent {
if let tournamentStatus { if let bracketStatus {
Text(tournamentStatus.completion) Text(bracketStatus.0).lineLimit(1)
.multilineTextAlignment(.trailing)
} else { } else {
ProgressView() ProgressView()
} }
} label: { } label: {
Text("Encaissement") Text("Tableau")
if let tournamentStatus { if tournament.shouldVerifyBracket {
Text(tournamentStatus.label).lineLimit(1) Text("Vérifier la tableau").foregroundStyle(.logoRed)
} else { } else if let range = bracketStatus?.1 {
Text(" ") HStack {
if let left = range.left {
Text(left.weight.formatted())
}
if let right = range.right {
Image(systemName: "arrowshape.forward.fill")
Text(right.weight.formatted())
}
}
} }
} }
} }
.task { .task {
cashierStatus = await tournament.cashierStatus() bracketStatus = await tournament.bracketStatus()
}
}
}
Section {
if tournament.hasEnded() {
NavigationLink(value: Screen.rankings) {
Text("Classement final des équipes")
}
}
if state == .running || state == .finished {
TournamentInscriptionView(tournament: tournament)
TournamentBroadcastRowView(tournament: tournament)
} }
if state != .finished { if state != .finished {
@ -95,49 +141,26 @@ struct TournamentBuildView: View {
callStatus = await tournament.callStatus() callStatus = await tournament.callStatus()
} }
} }
}
Section { NavigationLink(value: Screen.cashier) {
if tournament.groupStageCount > 0 { let tournamentStatus = cashierStatus
NavigationLink(value: Screen.groupStage) {
LabeledContent { LabeledContent {
if let groupStageStatus { if let tournamentStatus {
Text(groupStageStatus).lineLimit(1) Text(tournamentStatus.completion)
.multilineTextAlignment(.trailing)
} else { } else {
ProgressView() ProgressView()
} }
} label: { } label: {
Text("Poules") Text("Encaissement")
if tournament.shouldVerifyGroupStage { if let tournamentStatus {
Text("Vérifier les poules").foregroundStyle(.logoRed) Text(tournamentStatus.label).lineLimit(1)
}
}
}
.task {
groupStageStatus = await tournament.groupStageStatus()
}
}
if tournament.rounds().isEmpty == false {
NavigationLink(value: Screen.round) {
LabeledContent {
if let bracketStatus {
Text(bracketStatus).lineLimit(1)
.multilineTextAlignment(.trailing)
} else { } else {
ProgressView() Text(" ")
}
} label: {
Text("Tableau")
if tournament.shouldVerifyBracket {
Text("Vérifier la tableau").foregroundStyle(.logoRed)
} }
} }
} }
.task { .task {
bracketStatus = await tournament.bracketStatus() cashierStatus = await tournament.cashierStatus()
}
} }
} }
} }

@ -64,8 +64,8 @@ struct TournamentView: View {
Section { Section {
TournamentInscriptionView(tournament: tournament) TournamentInscriptionView(tournament: tournament)
} }
TournamentInitView(tournament: tournament)
TournamentBuildView(tournament: tournament) TournamentBuildView(tournament: tournament)
TournamentInitView(tournament: tournament)
case .running: case .running:
TournamentBuildView(tournament: tournament) TournamentBuildView(tournament: tournament)
TournamentRunningView(tournament: tournament) TournamentRunningView(tournament: tournament)

Loading…
Cancel
Save