You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
8.7 KiB
222 lines
8.7 KiB
//
|
|
// InscriptionInfoView.swift
|
|
// PadelClub
|
|
//
|
|
// Created by Razmig Sarkissian on 27/03/2024.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct InscriptionInfoView: View {
|
|
@EnvironmentObject var dataStore: DataStore
|
|
@Environment(Tournament.self) var tournament
|
|
|
|
@State private var players : [PlayerRegistration] = []
|
|
@State private var selectedTeams : [TeamRegistration] = []
|
|
@State private var callDateIssue : [TeamRegistration] = []
|
|
@State private var waitingList : [TeamRegistration] = []
|
|
@State private var duplicates : [PlayerRegistration] = []
|
|
@State private var problematicPlayers : [PlayerRegistration] = []
|
|
@State private var inadequatePlayers : [PlayerRegistration] = []
|
|
@State private var playersWithoutValidLicense : [PlayerRegistration] = []
|
|
@State private var entriesFromBeachPadel : [TeamRegistration] = []
|
|
@State private var playersMissing : [TeamRegistration] = []
|
|
|
|
var body: some View {
|
|
List {
|
|
Section {
|
|
let footerString = "via [beach-padel.app.fft.fr](\(URLs.beachPadel.rawValue))"
|
|
|
|
LabeledContent {
|
|
Text(entriesFromBeachPadel.count.formatted())
|
|
} label: {
|
|
Text("Paires importées")
|
|
Text(.init(footerString))
|
|
}
|
|
.listRowView(color: .indigo)
|
|
|
|
LabeledContent {
|
|
Text(selectedTeams.filter { $0.called() }.count.formatted())
|
|
} label: {
|
|
Text("Paires convoquées")
|
|
Text("Vous avez envoyé une convocation par sms ou email")
|
|
}
|
|
.listRowView(color: .cyan)
|
|
|
|
// LabeledContent {
|
|
// Text(selectedTeams.filter { $0.confirmed() }.count.formatted())
|
|
// } label: {
|
|
// Text("Paires ayant confirmées")
|
|
// Text("Vous avez noté la confirmation de l'équipe")
|
|
// }
|
|
// .listRowView(color: .green)
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(callDateIssue) { team in
|
|
CallView.TeamView(team: team)
|
|
if let groupStage = team.groupStageObject(), let callDate = groupStage.startDate {
|
|
CallView(teams: [team], callDate: callDate, matchFormat: groupStage.matchFormat, roundLabel: "poule")
|
|
} else if let initialRound = team.initialRound(),
|
|
let initialMatch = team.initialMatch(),
|
|
let callDate = initialMatch.startDate {
|
|
CallView(teams: [team], callDate: callDate, matchFormat: initialMatch.matchFormat, roundLabel: initialRound.roundTitle())
|
|
}
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(callDateIssue.count.formatted())
|
|
} label: {
|
|
Text("Erreur de convocation")
|
|
}
|
|
}
|
|
.listRowView(color: .brown)
|
|
} footer: {
|
|
Text("L'horaire de la convocation est différente du match initial")
|
|
}
|
|
|
|
let waitingListInBracket = waitingList.filter({ $0.bracketPosition != nil })
|
|
let waitingListInGroupStage = waitingList.filter({ $0.groupStage != nil })
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(waitingListInBracket) { team in
|
|
TeamDetailView(team: team)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(waitingListInBracket.count.formatted())
|
|
} label: {
|
|
Text("Dans le tableau")
|
|
}
|
|
}
|
|
.listRowView(color: .red)
|
|
|
|
DisclosureGroup {
|
|
ForEach(waitingListInGroupStage) { team in
|
|
TeamDetailView(team: team)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(waitingListInGroupStage.count.formatted())
|
|
} label: {
|
|
Text("En poule")
|
|
}
|
|
}
|
|
.listRowView(color: .red)
|
|
} header: {
|
|
Text("Équipes non sélectionnées")
|
|
} footer: {
|
|
Text("Il s'agit des équipes déjà placé en poule ou tableau qui sont actuellement en attente à cause de l'arrivée d'une nouvelle équipe ou une modification de classement.")
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(duplicates) { player in
|
|
ImportedPlayerView(player: player)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(duplicates.count.formatted())
|
|
} label: {
|
|
Text("Doublons")
|
|
}
|
|
}
|
|
.listRowView(color: .red)
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(problematicPlayers) { player in
|
|
PlayerSexPickerView(player: player)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(problematicPlayers.count.formatted())
|
|
} label: {
|
|
Text("Joueurs problématiques")
|
|
}
|
|
}
|
|
.listRowView(color: .purple)
|
|
} footer: {
|
|
Text("Il s'agit des joueurs ou joueuses dont le sexe n'a pas pu être déterminé")
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(inadequatePlayers) { player in
|
|
ImportedPlayerView(player: player)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(inadequatePlayers.count.formatted())
|
|
} label: {
|
|
Text("Joueurs trop bien classés")
|
|
}
|
|
}
|
|
.listRowView(color: .red)
|
|
} footer: {
|
|
Text("Il s'agit des joueurs ou joueuses dont le rang est inférieur à la limite fédérale.")
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(playersWithoutValidLicense) {
|
|
EditablePlayerView(player: $0, editingOptions: [.licenceId])
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(playersWithoutValidLicense.count.formatted())
|
|
} label: {
|
|
Text("Joueurs sans licence valide")
|
|
}
|
|
}
|
|
.listRowView(color: .orange)
|
|
} footer: {
|
|
Text("importé du fichier beach-padel sans licence valide ou créé sans licence")
|
|
}
|
|
|
|
Section {
|
|
DisclosureGroup {
|
|
ForEach(playersMissing) {
|
|
TeamDetailView(team: $0)
|
|
}
|
|
} label: {
|
|
LabeledContent {
|
|
Text(playersMissing.count.formatted())
|
|
} label: {
|
|
Text("Paires incomplètes")
|
|
}
|
|
}
|
|
.listRowView(color: .pink)
|
|
}
|
|
}
|
|
.task {
|
|
await _getIssues()
|
|
}
|
|
.navigationTitle("Synthèse")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbarBackground(.visible, for: .navigationBar)
|
|
}
|
|
|
|
private func _getIssues() async {
|
|
Task {
|
|
players = tournament.unsortedPlayers()
|
|
selectedTeams = tournament.selectedSortedTeams()
|
|
callDateIssue = selectedTeams.filter { $0.callDate != nil && tournament.isStartDateIsDifferentThanCallDate($0) }
|
|
waitingList = tournament.waitingListTeams(in: selectedTeams)
|
|
duplicates = tournament.duplicates(in: players)
|
|
problematicPlayers = players.filter({ $0.sex == nil })
|
|
inadequatePlayers = tournament.inadequatePlayers(in: players)
|
|
playersWithoutValidLicense = tournament.playersWithoutValidLicense(in: players)
|
|
entriesFromBeachPadel = tournament.unsortedTeams().filter({ $0.isImported() })
|
|
playersMissing = selectedTeams.filter({ $0.unsortedPlayers().count < 2 })
|
|
}
|
|
}
|
|
}
|
|
|
|
//#Preview {
|
|
// InscriptionInfoView()
|
|
// .environment(Tournament.mock())
|
|
//}
|
|
|