diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index 944edb2..49b391a 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -193,6 +193,7 @@ FF70916E2B9108C600AB08DA /* InscriptionManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF70916D2B9108C600AB08DA /* InscriptionManagerView.swift */; }; FF82CFC52B911F5B00B0CAF2 /* OrganizedTournamentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF82CFC42B911F5B00B0CAF2 /* OrganizedTournamentView.swift */; }; FF82CFC92B9132AF00B0CAF2 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF82CFC82B9132AF00B0CAF2 /* ActivityView.swift */; }; + FF8E1CE62C006E0200184680 /* Alphabet.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8E1CE52C006E0200184680 /* Alphabet.swift */; }; FF8F26382BAD523300650388 /* PadelRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8F26352BAD523300650388 /* PadelRule.swift */; }; FF8F263B2BAD528600650388 /* EventCreationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8F263A2BAD528600650388 /* EventCreationView.swift */; }; FF8F263D2BAD627A00650388 /* TournamentConfiguratorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8F263C2BAD627A00650388 /* TournamentConfiguratorView.swift */; }; @@ -510,6 +511,7 @@ FF70916D2B9108C600AB08DA /* InscriptionManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InscriptionManagerView.swift; sourceTree = ""; }; FF82CFC42B911F5B00B0CAF2 /* OrganizedTournamentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrganizedTournamentView.swift; sourceTree = ""; }; FF82CFC82B9132AF00B0CAF2 /* ActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; + FF8E1CE52C006E0200184680 /* Alphabet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alphabet.swift; sourceTree = ""; }; FF8F26352BAD523300650388 /* PadelRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PadelRule.swift; sourceTree = ""; }; FF8F263A2BAD528600650388 /* EventCreationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventCreationView.swift; sourceTree = ""; }; FF8F263C2BAD627A00650388 /* TournamentConfiguratorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentConfiguratorView.swift; sourceTree = ""; }; @@ -1293,6 +1295,7 @@ FF0EC51D2BB16F680056B6D1 /* SwiftParser.swift */, FF1DC5582BAB767000FD8220 /* Tips.swift */, C49EF01A2BD6A1E80077B5AA /* URLs.swift */, + FF8E1CE52C006E0200184680 /* Alphabet.swift */, FF6EC9072B947A1E00EA7F5A /* Network */, C4EC6F582BE92D88000CEAB4 /* PListReader.swift */, ); @@ -1645,6 +1648,7 @@ C4A47D632B6D3D6500ADC637 /* Club.swift in Sources */, FF6EC90B2B947AC000EA7F5A /* Array+Extensions.swift in Sources */, FF59FFB92B90EFD70061EFF9 /* ToolboxView.swift in Sources */, + FF8E1CE62C006E0200184680 /* Alphabet.swift in Sources */, FFF8ACD92B923F3C008466FA /* String+Extensions.swift in Sources */, FF025AE52BD0EBB800A86CF8 /* TournamentGeneralSettingsView.swift in Sources */, FFC2DCB22BBE75D40046DB9F /* LoserRoundView.swift in Sources */, diff --git a/PadelClub/Data/Club.swift b/PadelClub/Data/Club.swift index 9a5117b..3aeca00 100644 --- a/PadelClub/Data/Club.swift +++ b/PadelClub/Data/Club.swift @@ -36,6 +36,7 @@ class Club : ModelObject, Storable, Hashable { var latitude: Double? var longitude: Double? var courtCount: Int = 2 +// var alphabeticalName: Bool = false internal init(creator: String? = nil, name: String, acronym: String? = nil, phone: String? = nil, code: String? = nil, address: String? = nil, city: String? = nil, zipCode: String? = nil, latitude: Double? = nil, longitude: Double? = nil, courtCount: Int = 2) { self.creator = creator @@ -85,6 +86,7 @@ class Club : ModelObject, Storable, Hashable { case _latitude = "latitude" case _longitude = "longitude" case _courtCount = "courtCount" +// case _alphabeticalName = "alphabeticalName" } func encode(to encoder: Encoder) throws { @@ -144,6 +146,7 @@ class Club : ModelObject, Storable, Hashable { } try container.encode(courtCount, forKey: ._courtCount) + // try container.encode(alphabeticalName, forKey: ._alphabeticalName) } } diff --git a/PadelClub/Utils/Alphabet.swift b/PadelClub/Utils/Alphabet.swift new file mode 100644 index 0000000..af9d9b8 --- /dev/null +++ b/PadelClub/Utils/Alphabet.swift @@ -0,0 +1,21 @@ +// +// Alphabet.swift +// PadelClub +// +// Created by Razmig Sarkissian on 24/05/2024. +// + +import Foundation + +enum Alphabet { + static let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + static func letterForIndex(index: Int) -> String? { + let uppercaseAlphabet = Array(alphabet) + if let letter = uppercaseAlphabet[safe: index] { + return String(letter) + } else { + return nil + } + } +} diff --git a/PadelClub/Views/Club/Shared/ClubCourtSetupView.swift b/PadelClub/Views/Club/Shared/ClubCourtSetupView.swift index 9567202..c7dca61 100644 --- a/PadelClub/Views/Club/Shared/ClubCourtSetupView.swift +++ b/PadelClub/Views/Club/Shared/ClubCourtSetupView.swift @@ -28,6 +28,18 @@ struct ClubCourtSetupView: View { } } } + +// Toggle(isOn: $club.alphabeticalName) { +// Text("Nommer les terrains alphabétiquement") +// } +// .disabled(displayContext == .lockedForEditing) +// .onChange(of: club.alphabeticalName) { +// do { +// try dataStore.clubs.addOrUpdate(instance: club) +// } catch { +// Logger.error(error) +// } +// } } footer: { if displayContext == .lockedForEditing { Text("Édition impossible, vous n'êtes pas le créateur de ce club.").foregroundStyle(.logoRed) diff --git a/PadelClub/Views/GroupStage/GroupStageSettingsView.swift b/PadelClub/Views/GroupStage/GroupStageSettingsView.swift index fc17843..97b4156 100644 --- a/PadelClub/Views/GroupStage/GroupStageSettingsView.swift +++ b/PadelClub/Views/GroupStage/GroupStageSettingsView.swift @@ -13,24 +13,13 @@ struct GroupStageSettingsView: View { @Environment(Tournament.self) var tournament: Tournament @State private var nameAlphabetical: Bool = false @State private var generationDone: Bool = false - - let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - - private func _letterForIndex(index: Int) -> String? { - let uppercaseAlphabet = Array(alphabet) - if let letter = uppercaseAlphabet[safe: index] { - return String(letter) - } else { - return nil - } - } var body: some View { List { if tournament.shouldVerifyGroupStage { Section { - RowButtonView("Valider les poules", role: .destructive) { + RowButtonView("Valider les poules en l'état", role: .destructive) { tournament.shouldVerifyGroupStage = false do { try dataStore.tournaments.addOrUpdate(instance: tournament) @@ -39,7 +28,7 @@ struct GroupStageSettingsView: View { } } } footer: { - Text("Suite à changement dans votre liste d'inscrits, veuillez vérifier l'intégrité de vos poules et valider que tout est ok.") + Text("Suite à un changement dans votre liste d'inscrits, veuillez vérifier l'intégrité de vos poules et valider que tout est ok.") } } @@ -54,31 +43,23 @@ struct GroupStageSettingsView: View { if tournament.unsortedTeams().filter({ $0.groupStagePosition != nil }).isEmpty == false { Section { menuBuildAllGroupStages + } footer: { + Text("efface et recréé les poules, les horaires et les résultats existants seront perdus") } } Section { menuGenerateGroupStage(.random) + } footer: { + Text("Redistribue les équipes par tirage au sort par chapeau") } Section { menuGenerateGroupStage(.snake) + } footer: { + Text("Redistribue les équipes par la méthode du serpentin") } - if tournament.missingQualifiedFromGroupStages().isEmpty == false && tournament.qualifiedTeams().count >= tournament.qualifiedFromGroupStage() && tournament.groupStageAdditionalQualified > 0 { - NavigationLink { - //DrawView(tournament: tournament) - } label: { - LabeledContent { - Text(tournament.moreQualifiedToDraw().formatted() + "/" + tournament.groupStageAdditionalQualified.formatted()) - } label: { - Text("Qualifié\(tournament.groupStageAdditionalQualified.pluralSuffix) supplémentaire\(tournament.groupStageAdditionalQualified.pluralSuffix)") - let message = [tournament.groupStageAdditionalQualified.formatted(), " meilleur", tournament.groupStageAdditionalQualified.pluralSuffix, " ", (tournament.qualifiedPerGroupStage + 1).ordinalFormatted()].joined() - Text(message) - } - } - } - Toggle(isOn: $nameAlphabetical) { Text("Nommer les poules alphabétiquement") } @@ -94,7 +75,7 @@ struct GroupStageSettingsView: View { let groupStages = tournament.groupStages() if nameAlphabetical { groupStages.forEach { groupStage in - groupStage.name = _letterForIndex(index: groupStage.index) + groupStage.name = Alphabet.letterForIndex(index: groupStage.index) } } else { groupStages.forEach { groupStage in diff --git a/PadelClub/Views/Navigation/Toolbox/ToolboxView.swift b/PadelClub/Views/Navigation/Toolbox/ToolboxView.swift index 01d973e..9f18afc 100644 --- a/PadelClub/Views/Navigation/Toolbox/ToolboxView.swift +++ b/PadelClub/Views/Navigation/Toolbox/ToolboxView.swift @@ -17,6 +17,21 @@ struct ToolboxView: View { NavigationStack(path: $navigation.toolboxPath) { List { #if DEBUG +// Section { +// RowButtonView("Reset ALL API Calls") { +// dataStore.courts.resetApiCalls() +// dataStore.matches.resetApiCalls() +// dataStore.tournaments.resetApiCalls() +// dataStore.teamRegistrations.resetApiCalls() +// dataStore.playerRegistrations.resetApiCalls() +// dataStore.teamScores.resetApiCalls() +// dataStore.rounds.resetApiCalls() +// dataStore.groupStages.resetApiCalls() +// dataStore.clubs.resetApiCalls() +// dataStore.events.resetApiCalls() +// dataStore.dateIntervals.resetApiCalls() +// } +// } Section { RowButtonView("Fix Names") { let playerRegistrations = dataStore.playerRegistrations diff --git a/PadelClub/Views/Round/RoundSettingsView.swift b/PadelClub/Views/Round/RoundSettingsView.swift index 5dc9bc5..0d5cc5c 100644 --- a/PadelClub/Views/Round/RoundSettingsView.swift +++ b/PadelClub/Views/Round/RoundSettingsView.swift @@ -17,7 +17,7 @@ struct RoundSettingsView: View { List { if tournament.shouldVerifyBracket { Section { - RowButtonView("Valider le tableau", role: .destructive) { + RowButtonView("Valider l'état du tableau", role: .destructive) { tournament.shouldVerifyBracket = false do { try dataStore.tournaments.addOrUpdate(instance: tournament) @@ -26,7 +26,7 @@ struct RoundSettingsView: View { } } } footer: { - Text("Suite à changement dans votre liste d'inscrits, veuillez vérifier l'intégrité de votre tableau et valider que tout est ok.") + Text("Suite à un changement dans votre liste d'inscrits, veuillez vérifier l'intégrité de votre tableau et valider que tout est ok.") } } diff --git a/PadelClub/Views/Tournament/FileImportView.swift b/PadelClub/Views/Tournament/FileImportView.swift index d27e3cd..dd18356 100644 --- a/PadelClub/Views/Tournament/FileImportView.swift +++ b/PadelClub/Views/Tournament/FileImportView.swift @@ -159,7 +159,9 @@ struct FileImportView: View { Text("Équipe\(_filteredTeams.count.pluralSuffix) \(tournament.tournamentCategory.importingRawValue) détectée\(_filteredTeams.count.pluralSuffix)") } } footer: { - Text("La liste ci-dessous n'est qu'une indication d'évolution par rapport au seul poids d'équipe. Cela ne tient pas compte des dates d'inscriptions, WCs et autres éléments.").foregroundStyle(.logoRed) + if previousTeams.isEmpty == false { + Text("La liste ci-dessous n'est qu'une indication d'évolution par rapport au seul poids d'équipe. Cela ne tient pas compte des dates d'inscriptions, WCs et autres éléments.").foregroundStyle(.logoRed) + } } ForEach(_filteredTeams) { team in