club_update
Razmig Sarkissian 1 year ago
parent b815b210b7
commit 8a3b459ce4
  1. 10
      PadelClub/Utils/FileImportManager.swift
  2. 2
      PadelClub/Views/GroupStage/GroupStageSettingsView.swift
  3. 2
      PadelClub/Views/Round/RoundSettingsView.swift
  4. 82
      PadelClub/Views/Round/RoundView.swift
  5. 12
      PadelClub/Views/Tournament/FileImportView.swift

@ -151,11 +151,11 @@ class FileImportManager {
static let FFT_ASSIMILATION_WOMAN_IN_MAN = "A calculer selon la pondération en vigueur" static let FFT_ASSIMILATION_WOMAN_IN_MAN = "A calculer selon la pondération en vigueur"
func createTeams(from fileContent: String, tournament: Tournament, fileProvider: FileProvider = .frenchFederation) async throws -> [TeamHolder] { func createTeams(from fileContent: String, tournament: Tournament, fileProvider: FileProvider = .frenchFederation, checkingCategoryDisabled: Bool) async throws -> [TeamHolder] {
switch fileProvider { switch fileProvider {
case .frenchFederation: case .frenchFederation:
return try await _getFederalTeams(from: fileContent, tournament: tournament) return try await _getFederalTeams(from: fileContent, tournament: tournament, checkingCategoryDisabled: checkingCategoryDisabled)
case .padelClub: case .padelClub:
return await _getPadelClubTeams(from: fileContent, tournament: tournament) return await _getPadelClubTeams(from: fileContent, tournament: tournament)
case .custom: case .custom:
@ -205,7 +205,7 @@ class FileImportManager {
} }
} }
private func _getFederalTeams(from fileContent: String, tournament: Tournament) async throws -> [TeamHolder] { private func _getFederalTeams(from fileContent: String, tournament: Tournament, checkingCategoryDisabled: Bool = false) async throws -> [TeamHolder] {
let lines = fileContent.components(separatedBy: "\n") let lines = fileContent.components(separatedBy: "\n")
guard let firstLine = lines.first else { return [] } guard let firstLine = lines.first else { return [] }
var separator = "," var separator = ","
@ -268,7 +268,7 @@ class FileImportManager {
case .mix: return 1 case .mix: return 1
} }
} }
if tournamentCategory == tournament.tournamentCategory { if tournamentCategory == tournament.tournamentCategory || checkingCategoryDisabled {
let playerOne = PlayerRegistration(federalData: Array(resultOne[0...7]), sex: sexPlayerOne, sexUnknown: sexUnknown) let playerOne = PlayerRegistration(federalData: Array(resultOne[0...7]), sex: sexPlayerOne, sexUnknown: sexUnknown)
playerOne?.setComputedRank(in: tournament) playerOne?.setComputedRank(in: tournament)
let playerTwo = PlayerRegistration(federalData: Array(resultTwo[0...7]), sex: sexPlayerTwo, sexUnknown: sexUnknown) let playerTwo = PlayerRegistration(federalData: Array(resultTwo[0...7]), sex: sexPlayerTwo, sexUnknown: sexUnknown)
@ -302,7 +302,7 @@ class FileImportManager {
return .men return .men
} }
} }
if tournamentCategory == tournament.tournamentCategory { if tournamentCategory == tournament.tournamentCategory || checkingCategoryDisabled {
let result = Array(data.dropFirst(3).dropLast()) let result = Array(data.dropFirst(3).dropLast())
var sexPlayerOne : Int { var sexPlayerOne : Int {

@ -26,7 +26,7 @@ struct GroupStageSettingsView: View {
let issues = tournament.groupStageTeamPlacementIssue() let issues = tournament.groupStageTeamPlacementIssue()
DisclosureGroup { DisclosureGroup {
ForEach(issues.shouldBeInIt, id: \.self) { id in ForEach(issues.shouldBeInIt, id: \.self) { id in
if let team: TeamRegistration = Store.main.findById(id) { if let team: TeamRegistration = self.tournamentStore.teamRegistrations.findById(id) {
TeamRowView(team: team) TeamRowView(team: team)
} }
} }

@ -25,7 +25,7 @@ struct RoundSettingsView: View {
let issues = tournament.bracketTeamPlacementIssue() let issues = tournament.bracketTeamPlacementIssue()
DisclosureGroup { DisclosureGroup {
ForEach(issues.shouldBeInIt, id: \.self) { id in ForEach(issues.shouldBeInIt, id: \.self) { id in
if let team: TeamRegistration = Store.main.findById(id) { if let team: TeamRegistration = self.tournamentStore.teamRegistrations.findById(id) {
TeamRowView(team: team) TeamRowView(team: team)
} }
} }

@ -17,49 +17,38 @@ struct RoundView: View {
@Environment(NavigationViewModel.self) private var navigation: NavigationViewModel @Environment(NavigationViewModel.self) private var navigation: NavigationViewModel
@State private var selectedSeedGroup: SeedInterval? @State private var selectedSeedGroup: SeedInterval?
@State private var spaceLeft: [Match] = []
@State private var seedSpaceLeft: [Match] = []
@State private var availableSeedGroup: SeedInterval?
@State private var showPrintScreen: Bool = false @State private var showPrintScreen: Bool = false
var upperRound: UpperRound var upperRound: UpperRound
init(upperRound: UpperRound) {
self.upperRound = upperRound
let seeds = upperRound.round.seeds()
SlideToDeleteSeedTip.seeds = seeds.count
PrintTip.seeds = seeds.count
BracketEditTip.matchesHidden = upperRound.round.getDisabledMatches().count
}
var tournamentStore: TournamentStore { var tournamentStore: TournamentStore {
return self.tournament.tournamentStore return self.tournament.tournamentStore
} }
private func _getAvailableSeedGroup() { private var spaceLeft: [Match] {
#if DEBUG_TIME //DEBUGING TIME let displayableMatches: [Match] = self.upperRound.round.displayableMatches()
let start = Date() return displayableMatches.filter { match in
defer { match.teamScores.count == 1
let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000)
print("func _getAvailableSeedGroup of: ", duration.formatted(.units(allowed: [.seconds, .milliseconds])))
} }
#endif
availableSeedGroup = tournament.seedGroupAvailable(atRoundIndex: upperRound.round.index)
} }
private func _getSpaceLeft() { private var seedSpaceLeft: [Match] {
#if DEBUG_TIME //DEBUGING TIME
let start = Date()
defer {
let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000)
print("func _getSpaceLeft of: ", duration.formatted(.units(allowed: [.seconds, .milliseconds])))
}
#endif
self.spaceLeft.removeAll()
self.seedSpaceLeft.removeAll()
let displayableMatches: [Match] = self.upperRound.round.displayableMatches() let displayableMatches: [Match] = self.upperRound.round.displayableMatches()
displayableMatches.forEach { match in return displayableMatches.filter { match in
let count: Int = match.teamScores.count match.teamScores.count == 0
if count == 0 {
seedSpaceLeft.append(match)
} else if count == 1 {
spaceLeft.append(match)
} }
} }
private var availableSeedGroup: SeedInterval? {
tournament.seedGroupAvailable(atRoundIndex: upperRound.round.index)
} }
var showVisualDrawView: Binding<Bool> { Binding( var showVisualDrawView: Binding<Bool> { Binding(
@ -133,10 +122,6 @@ struct RoundView: View {
Task { Task {
tournament.setSeeds(inRoundIndex: upperRound.round.index, inSeedGroup: availableSeedGroup) tournament.setSeeds(inRoundIndex: upperRound.round.index, inSeedGroup: availableSeedGroup)
_save() _save()
if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
self.isEditingTournamentSeed.wrappedValue = false
}
_prepareRound()
} }
} }
} footer: { } footer: {
@ -175,10 +160,6 @@ struct RoundView: View {
} }
} }
_save() _save()
if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
self.isEditingTournamentSeed.wrappedValue = false
}
_prepareRound()
} }
} }
} label: { } label: {
@ -206,10 +187,6 @@ struct RoundView: View {
team.setSeedPosition(inSpot: seedSpaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: false) team.setSeedPosition(inSpot: seedSpaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: false)
} }
_save() _save()
if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
self.isEditingTournamentSeed.wrappedValue = false
}
_prepareRound()
} }
} }
} label: { } label: {
@ -233,10 +210,6 @@ struct RoundView: View {
team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true) team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true)
} }
_save() _save()
if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
self.isEditingTournamentSeed.wrappedValue = false
}
_prepareRound()
} }
} }
} label: { } label: {
@ -288,13 +261,6 @@ struct RoundView: View {
.navigationDestination(isPresented: $showPrintScreen) { .navigationDestination(isPresented: $showPrintScreen) {
PrintSettingsView(tournament: tournament) PrintSettingsView(tournament: tournament)
} }
.onAppear {
_prepareRound()
let seeds = upperRound.round.seeds()
SlideToDeleteSeedTip.seeds = seeds.count
PrintTip.seeds = seeds.count
BracketEditTip.matchesHidden = upperRound.round.getDisabledMatches().count
}
.fullScreenCover(isPresented: showVisualDrawView) { .fullScreenCover(isPresented: showVisualDrawView) {
if let availableSeedGroup = selectedSeedGroup { if let availableSeedGroup = selectedSeedGroup {
let seeds = tournament.seeds(inSeedGroup: availableSeedGroup) let seeds = tournament.seeds(inSeedGroup: availableSeedGroup)
@ -308,11 +274,6 @@ struct RoundView: View {
} }
_save() _save()
_prepareRound()
if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
self.isEditingTournamentSeed.wrappedValue = false
}
} }
} }
} }
@ -352,11 +313,10 @@ struct RoundView: View {
} catch { } catch {
Logger.error(error) Logger.error(error)
} }
}
private func _prepareRound() { if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty {
_getSpaceLeft() self.isEditingTournamentSeed.wrappedValue = false
_getAvailableSeedGroup() }
} }
} }

@ -83,6 +83,7 @@ struct FileImportView: View {
@State private var validationInProgress: Bool = false @State private var validationInProgress: Bool = false
@State private var multiImport: Bool = false @State private var multiImport: Bool = false
@State private var presentFormatHelperView: Bool = false @State private var presentFormatHelperView: Bool = false
@State private var validatedTournamentIds: Set<String> = Set()
var tournamentStore: TournamentStore { var tournamentStore: TournamentStore {
return self.tournament.tournamentStore return self.tournament.tournamentStore
@ -252,7 +253,7 @@ struct FileImportView: View {
} }
} else if teams.isEmpty && didImport == true { } else if teams.isEmpty && didImport == true {
Section { Section {
ContentUnavailableView("Aucune équipe détectée", systemImage: "person.2.slash") ContentUnavailableView("Aucune équipe détectée", systemImage: "person.2.slash", description: Text("Vérifiez si votre fichier correspond à la source."))
} }
} else if didImport { } else if didImport {
let _filteredTeams = filteredTeams let _filteredTeams = filteredTeams
@ -273,6 +274,7 @@ struct FileImportView: View {
RowButtonView("Valider") { RowButtonView("Valider") {
await _validate(tournament: tournament) await _validate(tournament: tournament)
} }
.disabled(validatedTournamentIds.contains(tournament.id))
} header: { } header: {
Text("\(tournamentFilteredTeams.count.formatted()) équipe\(tournamentFilteredTeams.count.pluralSuffix)") Text("\(tournamentFilteredTeams.count.formatted()) équipe\(tournamentFilteredTeams.count.pluralSuffix)")
} footer: { } footer: {
@ -399,8 +401,10 @@ struct FileImportView: View {
Task { Task {
if let tournaments = tournament.eventObject()?.tournaments, tournaments.count > 1, multiImport { if let tournaments = tournament.eventObject()?.tournaments, tournaments.count > 1, multiImport {
for tournament in tournaments { for tournament in tournaments {
if validatedTournamentIds.contains(tournament.id) == false {
await _validate(tournament: tournament) await _validate(tournament: tournament)
} }
}
dismiss() dismiss()
} else { } else {
@ -435,6 +439,8 @@ struct FileImportView: View {
} }
tournament.importTeams(filteredTeams) tournament.importTeams(filteredTeams)
validatedTournamentIds.insert(tournament.id)
if multiImport == false { if multiImport == false {
dismiss() dismiss()
} }
@ -454,7 +460,7 @@ struct FileImportView: View {
var categoriesDone: [TournamentCategory] = [] var categoriesDone: [TournamentCategory] = []
for someTournament in event.tournaments { for someTournament in event.tournaments {
if categoriesDone.contains(someTournament.tournamentCategory) == false { if categoriesDone.contains(someTournament.tournamentCategory) == false {
let _teams = try await FileImportManager.shared.createTeams(from: fileContent, tournament: someTournament, fileProvider: fileProvider) let _teams = try await FileImportManager.shared.createTeams(from: fileContent, tournament: someTournament, fileProvider: fileProvider, checkingCategoryDisabled: false)
self.teams += _teams self.teams += _teams
categoriesDone.append(someTournament.tournamentCategory) categoriesDone.append(someTournament.tournamentCategory)
} else { } else {
@ -462,7 +468,7 @@ struct FileImportView: View {
} }
} }
} else { } else {
self.teams = try await FileImportManager.shared.createTeams(from: fileContent, tournament: tournament, fileProvider: fileProvider) self.teams = try await FileImportManager.shared.createTeams(from: fileContent, tournament: tournament, fileProvider: fileProvider, checkingCategoryDisabled: true)
} }
await MainActor.run { await MainActor.run {

Loading…
Cancel
Save