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.
 
 
PadelClub/PadelClub/Views/Team/TeamPickerView.swift

171 lines
7.5 KiB

//
// TeamPickerView.swift
// PadelClub
//
// Created by Razmig Sarkissian on 23/03/2024.
//
import SwiftUI
struct TeamPickerView: View {
@EnvironmentObject var dataStore: DataStore
@Environment(Tournament.self) var tournament: Tournament
@Environment(\.dismiss) private var dismiss
@State private var confirmTeam: TeamRegistration?
@State private var presentTeamPickerView: Bool = false
@State private var searchField: String = ""
@State private var sortOrder: SortOrder = .ascending
var shouldConfirm: Bool = false
var groupStagePosition: Int? = nil
var round: Round? = nil
var matchTypeContext: MatchType = .bracket
var luckyLosers: [TeamRegistration] = []
let teamPicked: ((TeamRegistration) -> (Void))
var confirmationRequest: Binding<Bool> {
Binding {
confirmTeam != nil
} set: { _ in
}
}
var body: some View {
ConfirmButtonView(shouldConfirm: shouldConfirm, message: MatchSetupView.confirmationMessage) {
presentTeamPickerView = true
} label: {
Text("Choisir")
.underline()
}
.sheet(isPresented: $presentTeamPickerView) {
NavigationStack {
List {
if matchTypeContext == .loserBracket, let losers = round?.parentRound?.losers() {
_sectionView(losers.sorted(by: \.weight, order: sortOrder), title: "Perdant du tour précédent")
}
if matchTypeContext == .loserBracket, let losers = round?.previousRound()?.winners() {
_sectionView(losers.sorted(by: \.weight, order: sortOrder), title: "Gagnant du tour précédent")
}
if let groupStagePosition, let replacementRangeExtended = tournament.replacementRangeExtended(groupStagePosition: groupStagePosition) {
Section {
GroupStageTeamReplacementView.TeamRangeView(teamRange: replacementRangeExtended, playerWeight: 0)
} header: {
Text("Même ligne en poule")
}
}
_sectionView(luckyLosers.sorted(by: \.weight, order: sortOrder), title: "Repêchage")
let qualified = tournament.availableQualifiedTeams()
_sectionView(qualified.sorted(by: \.weight, order: sortOrder), title: "Qualifiées entrants")
let teams = tournament.selectedSortedTeams()
if matchTypeContext == .loserBracket {
_sectionView(teams.filter({ $0.inGroupStage() && $0.qualified == false }).sorted(by: \.weight, order: sortOrder), title: "Non qualifié de poules")
}
_sectionView(teams.filter({ $0.availableForSeedPick() }).sorted(by: \.weight, order: sortOrder), title: "Disponible")
_sectionView(teams.filter({ $0.inGroupStage() }).sorted(by: \.weight, order: sortOrder), title: "Déjà placée en poule")
_sectionView(teams.filter({ $0.inRound() }).sorted(by: \.weight, order: sortOrder), title: "Déjà placée dans le tableau")
}
.searchable(text: $searchField, placement: .navigationBarDrawer(displayMode: .always))
.keyboardType(.alphabet)
.autocorrectionDisabled()
.navigationTitle("Choisir une équipe")
.toolbarBackground(.visible, for: .navigationBar)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button("Annuler", role: .cancel) {
presentTeamPickerView = false
}
}
ToolbarItem(placement: .topBarTrailing) {
Menu {
Section {
Picker(selection: $sortOrder) {
Label("Trier les équipes par poids croissant", systemImage: "chevron.up").tag(SortOrder.ascending)
.labelStyle(.titleAndIcon)
Label("Trier les équipes par poids décroissant", systemImage: "chevron.down").tag(SortOrder.descending)
.labelStyle(.titleAndIcon)
} label: {
Text("Trier les équipes par poids")
}
.pickerStyle(.inline)
} header: {
Text("Trier les équipes par poids")
}
} label: {
HStack {
Text("Poids")
Image(systemName: sortOrder == .ascending ? "chevron.up" : "chevron.down")
}
}
}
}
}
.tint(.master)
}
}
@ViewBuilder
private func _sectionView(_ teams: [TeamRegistration], title: String) -> some View {
if teams.isEmpty == false {
Section {
_teamListView(teams)
} header: {
Text(title)
}
}
}
@ViewBuilder
private func _teamListView(_ teams: [TeamRegistration]) -> some View {
let selectedSortedTeams = tournament.selectedSortedTeams()
ForEach(teams) { team in
if searchField.isEmpty || team.contains(searchField) {
Button {
teamPicked(team)
presentTeamPickerView = false
// if team.inRound() {
// confirmTeam = team
// } else {
// teamPicked(team)
// presentTeamPickerView = false
// }
} label: {
let teamIndex = team.index(in: selectedSortedTeams)
TeamRowView(team: team, teamIndex: teamIndex)
.environment(\.isEditingTournamentSeed, .constant(false))
.contentShape(Rectangle())
}
.frame(maxWidth: .infinity)
.buttonStyle(.plain)
.id(team.id)
.listRowView(isActive: matchTypeContext == .loserBracket && round?.teams().map({ $0.id }).contains(team.id) == true, color: .green, hideColorVariation: true)
// .confirmationDialog("Attention", isPresented: confirmationRequest, titleVisibility: .visible) {
// Button("Retirer du tableau", role: .destructive) {
// teamPicked(confirmTeam!)
// presentTeamPickerView = false
// }
//
// Button("Annuler", role: .cancel) {
// confirmTeam = nil
// }
// } message: {
// Text("Vous êtes sur le point de retirer cette équipe du tableau pour le replacer, cela effacera les résultats des matchs déjà joués par cette équipe dans le tableau.")
// }
}
}
}
}
//#Preview {
// TeamPickerView(teamPicked: { team in
// })
// .environment(Tournament.mock())
// .environmentObject(DataStore.shared)
//
//}