From 3ced9026139bf89115bca38c2a9d2a4efb88f7a6 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 9 Jul 2024 11:37:33 +0200 Subject: [PATCH 1/2] fix delete dependencies fix structure deletion / rebuilding fix spin draw --- PadelClub/Data/Event.swift | 7 +- PadelClub/Data/GroupStage.swift | 6 +- PadelClub/Data/Match.swift | 6 +- PadelClub/Data/Round.swift | 73 +++++-------- PadelClub/Data/Tournament.swift | 49 +++++---- PadelClub/ViewModel/SeedInterval.swift | 27 ++--- .../Views/Components/FortuneWheelView.swift | 44 +++++--- PadelClub/Views/Round/RoundView.swift | 100 ++++++++---------- 8 files changed, 153 insertions(+), 159 deletions(-) diff --git a/PadelClub/Data/Event.swift b/PadelClub/Data/Event.swift index 85baf07..21a0d91 100644 --- a/PadelClub/Data/Event.swift +++ b/PadelClub/Data/Event.swift @@ -32,7 +32,12 @@ final class Event: ModelObject, Storable { } override func deleteDependencies() throws { - DataStore.shared.tournaments.deleteDependencies(self.tournaments) + let tournaments = self.tournaments + for tournament in tournaments { + try tournament.deleteDependencies() + } + + DataStore.shared.tournaments.deleteDependencies(tournaments) DataStore.shared.dateIntervals.deleteDependencies(self.courtsUnavailability) } diff --git a/PadelClub/Data/GroupStage.swift b/PadelClub/Data/GroupStage.swift index 26d44a0..cba7fb4 100644 --- a/PadelClub/Data/GroupStage.swift +++ b/PadelClub/Data/GroupStage.swift @@ -381,7 +381,11 @@ final class GroupStage: ModelObject, Storable { } override func deleteDependencies() throws { - self.tournamentStore.matches.deleteDependencies(self._matches()) + let matches = self._matches() + for match in matches { + try match.deleteDependencies() + } + self.tournamentStore.matches.deleteDependencies(matches) } func encode(to encoder: Encoder) throws { diff --git a/PadelClub/Data/Match.swift b/PadelClub/Data/Match.swift index 5d4c536..fb20842 100644 --- a/PadelClub/Data/Match.swift +++ b/PadelClub/Data/Match.swift @@ -78,7 +78,11 @@ final class Match: ModelObject, Storable { guard let tournament = self.currentTournament() else { return } - tournament.tournamentStore.teamScores.deleteDependencies(self.teamScores) + let teamScores = self.teamScores + for teamScore in teamScores { + try teamScore.deleteDependencies() + } + tournament.tournamentStore.teamScores.deleteDependencies(teamScores) } func indexInRound(in matches: [Match]? = nil) -> Int { diff --git a/PadelClub/Data/Round.swift b/PadelClub/Data/Round.swift index e10816b..31e805c 100644 --- a/PadelClub/Data/Round.swift +++ b/PadelClub/Data/Round.swift @@ -455,12 +455,12 @@ defer { return nextRound()?.isRankDisabled() == false } - func seedInterval(expanded: Bool = false) -> SeedInterval? { + func seedInterval(initialMode: Bool = false) -> SeedInterval? { #if DEBUG_TIME //DEBUGING TIME let start = Date() defer { let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000) - print("func seedInterval(expanded: Bool = false)", duration.formatted(.units(allowed: [.seconds, .milliseconds]))) + print("func seedInterval(initialMode)", initialMode, duration.formatted(.units(allowed: [.seconds, .milliseconds]))) } #endif @@ -477,24 +477,24 @@ defer { } if let previousRound = previousRound() { - if previousRound.enabledMatches().isEmpty == false && expanded == false { - return previousRound.seedInterval()?.chunks()?.first + if (previousRound.enabledMatches().isEmpty == false || initialMode) { + return previousRound.seedInterval(initialMode: initialMode)?.chunks()?.first } else { - return previousRound.previousRound()?.seedInterval() + return previousRound.previousRound()?.seedInterval(initialMode: initialMode) } } else if let parentRound { - if parentRound.parent == nil && expanded == false { - return parentRound.seedInterval() + if parentRound.parent == nil { + return parentRound.seedInterval(initialMode: initialMode) } - return parentRound.seedInterval()?.chunks()?.last + return parentRound.seedInterval(initialMode: initialMode)?.chunks()?.last } return nil } - func roundTitle(_ displayStyle: DisplayStyle = .wide) -> String { + func roundTitle(_ displayStyle: DisplayStyle = .wide, initialMode: Bool = false) -> String { if parent != nil { - if let seedInterval = seedInterval() { + if let seedInterval = seedInterval(initialMode: initialMode) { return seedInterval.localizedLabel(displayStyle) } print("Round pas trouvé", id, parent, index) @@ -574,7 +574,8 @@ defer { let matches = (0.. String { - let range = [tournamentLevel.points(for: last - 1 - reduce, count: teamsCount), - tournamentLevel.points(for: first - 1 - reduce, count: teamsCount)] + let range = [tournamentLevel.points(for: last - 1, count: teamsCount), + tournamentLevel.points(for: first - 1, count: teamsCount)] return range.map { $0.formatted(.number.sign(strategy: .always())) }.joined(separator: " / ") + " pts" } @@ -38,32 +37,24 @@ struct SeedInterval: Hashable, Comparable { if dimension > 3 { let split = dimension / 2 if split%2 == 0 { - let firstHalf = SeedInterval(first: first, last: first + split - 1, reduce: reduce) - let secondHalf = SeedInterval(first: first + split, last: last, reduce: reduce) + let firstHalf = SeedInterval(first: first, last: first + split - 1) + let secondHalf = SeedInterval(first: first + split, last: last) return [firstHalf, secondHalf] } else { - let firstHalf = SeedInterval(first: first, last: first + split, reduce: reduce) - let secondHalf = SeedInterval(first: first + split + 1, last: last, reduce: reduce) + let firstHalf = SeedInterval(first: first, last: first + split) + let secondHalf = SeedInterval(first: first + split + 1, last: last) return [firstHalf, secondHalf] } } else { return nil } } - - var computedLast: Int { - last - reduce - } - - var computedFirst: Int { - first - reduce - } - + func localizedLabel(_ displayStyle: DisplayStyle = .wide) -> String { if dimension < 2 { - return "#\(first - reduce) / #\(last - reduce)" + return "#\(first) / #\(last)" } else { - return "#\(first - reduce) à #\(last - reduce)" + return "#\(first) à #\(last)" } } } diff --git a/PadelClub/Views/Components/FortuneWheelView.swift b/PadelClub/Views/Components/FortuneWheelView.swift index c30c919..ab8314a 100644 --- a/PadelClub/Views/Components/FortuneWheelView.swift +++ b/PadelClub/Views/Components/FortuneWheelView.swift @@ -62,26 +62,29 @@ struct SpinDrawView: View { let drawees: [any SpinDrawable] @State var segments: [any SpinDrawable] var autoMode: Bool = false - let completion: ([DrawResult]) async -> Void // Completion closure + let completion: ([DrawResult]) -> Void // Completion closure @State private var drawCount: Int = 0 @State private var draws: [DrawResult] = [DrawResult]() @State private var drawOptions: [DrawOption] = [DrawOption]() @State private var selectedIndex: Int? @State private var disabled: Bool = false + @State private var validating: Bool = false + + var scrollDisabled: Bool { + drawCount < drawees.count || selectedIndex != nil + } var body: some View { List { if selectedIndex != nil { Section { - _validationLabelView(drawee: drawCount, result: segments[draws.last!.drawIndex]) + _validationLabelView(drawee: drawCount, result: segments[draws.last!.drawIndex]) if autoMode == false || drawCount == drawees.count { RowButtonView("Valider le tirage") { - await completion(draws) + completion(draws) dismiss() } - } else { - Text("Prochain tirage en préparation") } } } else if drawCount < drawees.count { @@ -135,16 +138,17 @@ struct SpinDrawView: View { } } } else { - Section { - Text("Tous les tirages sont terminés") - ForEach(draws) { drawResult in + ForEach(draws) { drawResult in + Section { _validationLabelView(drawee: drawResult.drawee, result: segments[drawResult.drawIndex]) } } - RowButtonView("Valider les tirages") { - await completion(draws) - dismiss() + Section { + RowButtonView("Valider les tirages") { + await completion(draws) + dismiss() + } } } @@ -164,6 +168,22 @@ struct SpinDrawView: View { } .disabled(disabled || autoMode) } + + if scrollDisabled == false { + ToolbarItem(placement: .topBarTrailing) { + Button { + validating = true + completion(draws) + dismiss() + } label: { + Text("Tout valider") + } + } + + ToolbarItem(placement: .status) { + Text("Tous les tirages sont terminés") + } + } } .navigationBarBackButtonHidden() .navigationTitle("Tirage au sort") @@ -171,7 +191,7 @@ struct SpinDrawView: View { .toolbarBackground(.visible, for: .navigationBar) .toolbar(.hidden, for: .tabBar) .listStyle(.insetGrouped) - .scrollDisabled(true) + .scrollDisabled(scrollDisabled) .interactiveDismissDisabled() .onAppear { for (index, segment) in segments.enumerated() { diff --git a/PadelClub/Views/Round/RoundView.swift b/PadelClub/Views/Round/RoundView.swift index c4c43ce..e848e55 100644 --- a/PadelClub/Views/Round/RoundView.swift +++ b/PadelClub/Views/Round/RoundView.swift @@ -28,7 +28,7 @@ struct RoundView: View { return self.tournament.tournamentStore } - private func _getAvailableSeedGroup() async { + private func _getAvailableSeedGroup() { #if DEBUG_TIME //DEBUGING TIME let start = Date() defer { @@ -40,7 +40,7 @@ struct RoundView: View { availableSeedGroup = tournament.seedGroupAvailable(atRoundIndex: upperRound.round.index) } - private func _getSpaceLeft() async { + private func _getSpaceLeft() { #if DEBUG_TIME //DEBUGING TIME let start = Date() defer { @@ -130,12 +130,11 @@ struct RoundView: View { Section { RowButtonView("Placer \(availableSeedGroup.localizedLabel())" + ((availableSeedGroup.isFixed() == false) ? " au hasard" : "")) { tournament.setSeeds(inRoundIndex: upperRound.round.index, inSeedGroup: availableSeedGroup) - await _save() + _save() if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { self.isEditingTournamentSeed.wrappedValue = false } - await _getSpaceLeft() - await _getAvailableSeedGroup() + _prepareRound() } } footer: { if availableSeedGroup.isFixed() == false { @@ -161,17 +160,14 @@ struct RoundView: View { ForEach(availableQualifiedTeams) { team in NavigationLink { SpinDrawView(drawees: [team], segments: spaceLeft) { results in - Task { - results.forEach { drawResult in - team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true) - } - await _save() - if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { - self.isEditingTournamentSeed.wrappedValue = false - } - await _getSpaceLeft() - await _getAvailableSeedGroup() + results.forEach { drawResult in + team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true) } + _save() + if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { + self.isEditingTournamentSeed.wrappedValue = false + } + _prepareRound() } } label: { TeamRowView(team: team, displayCallDate: false) @@ -193,17 +189,14 @@ struct RoundView: View { ForEach(availableSeeds) { team in NavigationLink { SpinDrawView(drawees: [team], segments: seedSpaceLeft) { results in - Task { - results.forEach { drawResult in - team.setSeedPosition(inSpot: seedSpaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: false) - } - await _save() - if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { - self.isEditingTournamentSeed.wrappedValue = false - } - await _getSpaceLeft() - await _getAvailableSeedGroup() + results.forEach { drawResult in + team.setSeedPosition(inSpot: seedSpaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: false) + } + _save() + if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { + self.isEditingTournamentSeed.wrappedValue = false } + _prepareRound() } } label: { TeamRowView(team: team, displayCallDate: false) @@ -221,17 +214,14 @@ struct RoundView: View { ForEach(availableSeeds) { team in NavigationLink { SpinDrawView(drawees: [team], segments: spaceLeft) { results in - Task { - results.forEach { drawResult in - team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true) - } - await _save() - if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { - self.isEditingTournamentSeed.wrappedValue = false - } - await _getSpaceLeft() - await _getAvailableSeedGroup() + results.forEach { drawResult in + team.setSeedPosition(inSpot: spaceLeft[drawResult.drawIndex], slot: nil, opposingSeeding: true) } + _save() + if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { + self.isEditingTournamentSeed.wrappedValue = false + } + _prepareRound() } } label: { TeamRowView(team: team, displayCallDate: false) @@ -283,9 +273,7 @@ struct RoundView: View { PrintSettingsView(tournament: tournament) } .onAppear { - Task { - await _prepareRound() - } + _prepareRound() let seeds = upperRound.round.seeds() SlideToDeleteSeedTip.seeds = seeds.count PrintTip.seeds = seeds.count @@ -294,17 +282,19 @@ struct RoundView: View { .fullScreenCover(isPresented: showVisualDrawView) { if let availableSeedGroup = selectedSeedGroup { let seeds = tournament.seeds(inSeedGroup: availableSeedGroup) - let availableSeedSpot = tournament.availableSeedSpot(inRoundIndex: upperRound.round.index) + let opposingSeeding = seedSpaceLeft.isEmpty ? true : false + let availableSeedSpot = opposingSeeding ? spaceLeft : seedSpaceLeft NavigationStack { SpinDrawView(drawees: seeds, segments: availableSeedSpot, autoMode: true) { draws in - Task { - draws.forEach { drawResult in - seeds[drawResult.drawee].setSeedPosition(inSpot: availableSeedSpot[drawResult.drawIndex], slot: nil, opposingSeeding: false) - } - await _save() - if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { - self.isEditingTournamentSeed.wrappedValue = false - } + draws.forEach { drawResult in + seeds[drawResult.drawee].setSeedPosition(inSpot: availableSeedSpot[drawResult.drawIndex], slot: nil, opposingSeeding: opposingSeeding) + } + + _save() + _prepareRound() + + if tournament.availableSeeds().isEmpty && tournament.availableQualifiedTeams().isEmpty { + self.isEditingTournamentSeed.wrappedValue = false } } } @@ -315,9 +305,7 @@ struct RoundView: View { ToolbarItem(placement: .topBarTrailing) { Button(isEditingTournamentSeed.wrappedValue == true ? "Valider" : "Modifier") { if isEditingTournamentSeed.wrappedValue == true { - Task { - await _save() - } + _save() } isEditingTournamentSeed.wrappedValue.toggle() } @@ -325,7 +313,7 @@ struct RoundView: View { } } - private func _save() async { + private func _save() { do { try self.tournamentStore.teamRegistrations.addOrUpdate(contentOfs: tournament.unsortedTeams()) } catch { @@ -348,13 +336,9 @@ struct RoundView: View { } } - private func _prepareRound() async { - Task { - await _getSpaceLeft() - } - Task { - await _getAvailableSeedGroup() - } + private func _prepareRound() { + _getSpaceLeft() + _getAvailableSeedGroup() } } From 9f32bf3dbd0e8736d888af3091a995920c24685d Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 9 Jul 2024 15:08:35 +0200 Subject: [PATCH 2/2] fix stuff --- PadelClub.xcodeproj/project.pbxproj | 4 ++-- .../logoRed.colorset/Contents.json | 6 ++--- PadelClub/Data/Round.swift | 6 ++++- PadelClub/Data/Tournament.swift | 24 ++++++++++++------- PadelClub/Utils/PadelRule.swift | 2 +- PadelClub/ViewModel/Selectable.swift | 2 +- .../Views/Components/FortuneWheelView.swift | 2 +- .../GenericDestinationPickerView.swift | 4 ++-- .../Views/Components/RowButtonView.swift | 2 +- .../Components/MatchTeamDetailView.swift | 2 +- .../Views/Navigation/Umpire/UmpireView.swift | 2 +- .../CourtAvailabilitySettingsView.swift | 2 +- .../Team/Components/TeamHeaderView.swift | 3 ++- PadelClub/Views/Team/TeamRowView.swift | 2 +- .../Views/Tournament/FileImportView.swift | 2 +- .../Components/InscriptionInfoView.swift | 8 +++---- .../Screen/InscriptionManagerView.swift | 20 +++++++++++++--- .../Screen/TournamentRankView.swift | 2 +- .../Tournament/TournamentBuildView.swift | 4 ++-- PadelClub/Views/User/ChangePasswordView.swift | 2 +- PadelClub/Views/User/LoginView.swift | 2 +- 21 files changed, 65 insertions(+), 38 deletions(-) diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index 4984739..0b6ee7c 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -1906,7 +1906,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 88; + CURRENT_PROJECT_VERSION = 89; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; @@ -1950,7 +1950,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 88; + CURRENT_PROJECT_VERSION = 89; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; DEVELOPMENT_TEAM = BQ3Y44M3Q6; diff --git a/PadelClub/Assets.xcassets/logoRed.colorset/Contents.json b/PadelClub/Assets.xcassets/logoRed.colorset/Contents.json index 265a4eb..ded2ed9 100644 --- a/PadelClub/Assets.xcassets/logoRed.colorset/Contents.json +++ b/PadelClub/Assets.xcassets/logoRed.colorset/Contents.json @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" + "blue" : "0.220", + "green" : "0.251", + "red" : "0.910" } }, "idiom" : "universal" diff --git a/PadelClub/Data/Round.swift b/PadelClub/Data/Round.swift index 31e805c..3305cb6 100644 --- a/PadelClub/Data/Round.swift +++ b/PadelClub/Data/Round.swift @@ -556,7 +556,11 @@ defer { let currentRoundMatchCount = RoundRule.numberOfMatches(forRoundIndex: index) guard currentRoundMatchCount > 1 else { return } let roundCount = RoundRule.numberOfRounds(forTeams: currentRoundMatchCount) - let loserBracketMatchFormat = tournamentObject()?.loserBracketMatchFormat + + var loserBracketMatchFormat = tournamentObject()?.loserBracketMatchFormat + if let parentRound { + loserBracketMatchFormat = tournamentObject()?.loserBracketSmartMatchFormat(parentRound.index) + } let rounds = (0.. [TeamRegistration] { + let teams = selectedSortedTeams() + return waitingListTeams(in: teams) + } + + func selectedSortedTeams() -> [TeamRegistration] { #if DEBUG_TIME //DEBUGING TIME let start = Date() @@ -875,7 +881,7 @@ defer { return waitingList.filter { $0.walkOut == false }.sorted(using: _defaultSorting(), order: .ascending) + waitingList.filter { $0.walkOut == true }.sorted(using: _defaultSorting(), order: .ascending) } - func bracketCut() -> Int { + func bracketCut(teamCount: Int) -> Int { return max(0, teamCount - groupStageCut()) } @@ -883,10 +889,12 @@ defer { return groupStageSpots() } - func cutLabel(index: Int) -> String { - if index < bracketCut() { + func cutLabel(index: Int, teamCount: Int?) -> String { + let _teamCount = teamCount ?? selectedSortedTeams().count + let bracketCut = bracketCut(teamCount: _teamCount) + if index < bracketCut { return "Tableau" - } else if index - bracketCut() < groupStageCut() { + } else if index - bracketCut < groupStageCut() && _teamCount > 0 { return "Poule" } else { return "Attente" @@ -1543,7 +1551,7 @@ defer { var _groupStages = [GroupStage]() for index in 0..: .offset(x: 3, y: 3) } else if let count, count > 0 { Image(systemName: count <= 50 ? "\(String(count)).circle.fill" : "plus.circle.fill") - .foregroundColor(destination.badgeValueColor() ?? .red) + .foregroundColor(destination.badgeValueColor() ?? .logoRed) .imageScale(.medium) .background ( Color(.systemBackground) @@ -82,7 +82,7 @@ struct GenericDestinationPickerView: .offset(x: 3, y: 3) } else if let count = destination.badgeValue(), count > 0 { Image(systemName: count <= 50 ? "\(String(count)).circle.fill" : "plus.circle.fill") - .foregroundColor(destination.badgeValueColor() ?? .red) + .foregroundColor(destination.badgeValueColor() ?? .logoRed) .imageScale(.medium) .background ( Color(.systemBackground) diff --git a/PadelClub/Views/Components/RowButtonView.swift b/PadelClub/Views/Components/RowButtonView.swift index df2ea2e..6f741ed 100644 --- a/PadelClub/Views/Components/RowButtonView.swift +++ b/PadelClub/Views/Components/RowButtonView.swift @@ -87,7 +87,7 @@ struct RowButtonView: View { .disabled(isLoading) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) - .tint(role == .destructive ? Color.red : Color.master) + .tint(role == .destructive ? Color.logoRed : Color.master) .listRowBackground(Color.clear) .listRowInsets(EdgeInsets(.zero)) .confirmationDialog("Confirmation", diff --git a/PadelClub/Views/Match/Components/MatchTeamDetailView.swift b/PadelClub/Views/Match/Components/MatchTeamDetailView.swift index 1ecdc93..eb4ad82 100644 --- a/PadelClub/Views/Match/Components/MatchTeamDetailView.swift +++ b/PadelClub/Views/Match/Components/MatchTeamDetailView.swift @@ -34,7 +34,7 @@ struct MatchTeamDetailView: View { EditablePlayerView(player: player, editingOptions: [.licenceId, .name, .payment]) } } header: { - TeamHeaderView(team: team, teamIndex: tournament?.indexOf(team: team), tournament: nil) + TeamHeaderView(team: team, teamIndex: tournament?.indexOf(team: team)) } } diff --git a/PadelClub/Views/Navigation/Umpire/UmpireView.swift b/PadelClub/Views/Navigation/Umpire/UmpireView.swift index 1254e6e..649a661 100644 --- a/PadelClub/Views/Navigation/Umpire/UmpireView.swift +++ b/PadelClub/Views/Navigation/Umpire/UmpireView.swift @@ -134,7 +134,7 @@ struct UmpireView: View { } else { LabeledContent { Image(systemName: "xmark.circle.fill") - .tint(.red) + .tint(.logoRed) } label: { if let _mostRecentDateAvailable { Text(_mostRecentDateAvailable.monthYearFormatted) diff --git a/PadelClub/Views/Planning/CourtAvailabilitySettingsView.swift b/PadelClub/Views/Planning/CourtAvailabilitySettingsView.swift index ff9f521..1140880 100644 --- a/PadelClub/Views/Planning/CourtAvailabilitySettingsView.swift +++ b/PadelClub/Views/Planning/CourtAvailabilitySettingsView.swift @@ -67,7 +67,7 @@ struct CourtAvailabilitySettingsView: View { VStack { Image(systemName: "arrowshape.forward.fill") .tint(.master) - Text("indisponible").foregroundStyle(.red).font(.caption) + Text("indisponible").foregroundStyle(.logoRed).font(.caption) } Spacer() VStack(alignment: .trailing, spacing: 0) { diff --git a/PadelClub/Views/Team/Components/TeamHeaderView.swift b/PadelClub/Views/Team/Components/TeamHeaderView.swift index b417e16..3e386cc 100644 --- a/PadelClub/Views/Team/Components/TeamHeaderView.swift +++ b/PadelClub/Views/Team/Components/TeamHeaderView.swift @@ -11,6 +11,7 @@ struct TeamHeaderView: View { var team: TeamRegistration var teamIndex: Int? var tournament: Tournament? + var teamCount: Int? var body: some View { HStack(spacing: 16.0) { @@ -46,7 +47,7 @@ struct TeamHeaderView: View { } else { Text("").font(.caption) } - Text(tournament.cutLabel(index: teamIndex)) + Text(tournament.cutLabel(index: teamIndex, teamCount: teamCount)) } } } diff --git a/PadelClub/Views/Team/TeamRowView.swift b/PadelClub/Views/Team/TeamRowView.swift index e9c97bb..65b0ce0 100644 --- a/PadelClub/Views/Team/TeamRowView.swift +++ b/PadelClub/Views/Team/TeamRowView.swift @@ -26,7 +26,7 @@ struct TeamRowView: View { } if let callDate = team.callDate, displayCallDate { Text("Déjà convoquée \(callDate.localizedDate())") - .foregroundStyle(.red) + .foregroundStyle(.logoRed) .italic() .font(.caption) } diff --git a/PadelClub/Views/Tournament/FileImportView.swift b/PadelClub/Views/Tournament/FileImportView.swift index 4db4bef..939a278 100644 --- a/PadelClub/Views/Tournament/FileImportView.swift +++ b/PadelClub/Views/Tournament/FileImportView.swift @@ -492,7 +492,7 @@ struct FileImportView: View { } if let callDate = team.previousTeam?.callDate, let newDate = tournament.getStartDate(ofSeedIndex: newIndex), callDate != newDate { Text("Attention, cette paire a déjà été convoquée à \(callDate.localizedDate())") - .foregroundStyle(.red) + .foregroundStyle(.logoRed) .italic() .font(.caption) } diff --git a/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift b/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift index 8555e71..72d5b1d 100644 --- a/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift +++ b/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift @@ -91,7 +91,7 @@ struct InscriptionInfoView: View { Text("Dans le tableau") } } - .listRowView(color: .red) + .listRowView(color: .logoRed) DisclosureGroup { ForEach(waitingListInGroupStage) { team in @@ -104,7 +104,7 @@ struct InscriptionInfoView: View { Text("En poule") } } - .listRowView(color: .red) + .listRowView(color: .logoRed) } header: { Text("Équipes ne devant plus être sélectionnées") } footer: { @@ -123,7 +123,7 @@ struct InscriptionInfoView: View { Text("Doublons") } } - .listRowView(color: .red) + .listRowView(color: .logoRed) } Section { @@ -155,7 +155,7 @@ struct InscriptionInfoView: View { Text("Joueurs trop bien classés") } } - .listRowView(color: .red) + .listRowView(color: .logoRed) } footer: { Text("Il s'agit des joueurs ou joueuses dont le rang est inférieur à la limite fédérale.") } diff --git a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift index acc889e..eec62b5 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -98,6 +98,7 @@ struct InscriptionManagerView: View { var id: Int { self.rawValue } case all case walkOut + case waiting func localizedLabel() -> String { switch self { @@ -105,6 +106,8 @@ struct InscriptionManagerView: View { return "Toutes les équipes" case .walkOut: return "Voir les WOs" + case .waiting: + return "Liste d'attente" } } } @@ -468,7 +471,11 @@ struct InscriptionManagerView: View { print("func _prepareTeams", duration.formatted(.units(allowed: [.seconds, .milliseconds]))) } #endif - sortedTeams = tournament.sortedTeams() + if filterMode == .waiting { + sortedTeams = tournament.waitingListSortedTeams() + } else { + sortedTeams = tournament.sortedTeams() + } } var filteredTeams: [TeamRegistration] { @@ -511,12 +518,19 @@ struct InscriptionManagerView: View { private func _teamRegisteredView() -> some View { List { + let selectedSortedTeams = tournament.selectedSortedTeams() if let closedRegistrationDate = tournament.closedRegistrationDate { Section { CloseDatePicker(closedRegistrationDate: closedRegistrationDate) } footer: { Text("Toutes les équipes ayant été inscrites après la date de clôture seront en liste d'attente.") } + + if selectedSortedTeams.isEmpty { + Section { + ContentUnavailableView("Aucune équipe", systemImage: "person.2.slash", description: Text("Vous n'avez aucune équipe inscrite avant la date de clôture.")) + } + } } if presentSearch == false { @@ -560,7 +574,7 @@ struct InscriptionManagerView: View { Section { TeamDetailView(team: team) } header: { - TeamHeaderView(team: team, teamIndex: teamIndex, tournament: tournament) + TeamHeaderView(team: team, teamIndex: teamIndex, tournament: tournament, teamCount: filterMode == .waiting ? 0 : selectedSortedTeams.count) } footer: { _teamFooterView(team) } @@ -722,7 +736,7 @@ struct InscriptionManagerView: View { } Section { - ContentUnavailableView("Aucune équipe", systemImage: "person.2.slash", description: Text("Vous n'avez encore aucune équipe dans votre liste d'attente.")) + ContentUnavailableView("Aucune équipe", systemImage: "person.2.slash", description: Text("Vous n'avez encore aucune équipe inscrite dans votre tournoi.")) } _rankHandlerView() diff --git a/PadelClub/Views/Tournament/Screen/TournamentRankView.swift b/PadelClub/Views/Tournament/Screen/TournamentRankView.swift index 5470062..03386c3 100644 --- a/PadelClub/Views/Tournament/Screen/TournamentRankView.swift +++ b/PadelClub/Views/Tournament/Screen/TournamentRankView.swift @@ -213,7 +213,7 @@ struct TournamentRankView: View { Image(systemName: "arrowtriangle.down.fill") .imageScale(.small) } - .foregroundColor(.red) + .foregroundColor(.logoRed) } else { Text("--") } diff --git a/PadelClub/Views/Tournament/TournamentBuildView.swift b/PadelClub/Views/Tournament/TournamentBuildView.swift index 7fd9163..ace1ac3 100644 --- a/PadelClub/Views/Tournament/TournamentBuildView.swift +++ b/PadelClub/Views/Tournament/TournamentBuildView.swift @@ -102,7 +102,7 @@ struct TournamentBuildView: View { } label: { Text("Classement final des équipes") if tournament.publishRankings == false { - Text("Vérifiez le classement avant de publier").foregroundStyle(.red) + Text("Vérifiez le classement avant de publier").foregroundStyle(.logoRed) } } } @@ -120,7 +120,7 @@ struct TournamentBuildView: View { } label: { Text("Classement final des équipes") if tournament.publishRankings == false { - Text("Vérifiez le classement avant de publier").foregroundStyle(.red) + Text("Vérifiez le classement avant de publier").foregroundStyle(.logoRed) } } } diff --git a/PadelClub/Views/User/ChangePasswordView.swift b/PadelClub/Views/User/ChangePasswordView.swift index a0e47b6..544a27c 100644 --- a/PadelClub/Views/User/ChangePasswordView.swift +++ b/PadelClub/Views/User/ChangePasswordView.swift @@ -46,7 +46,7 @@ struct ChangePasswordView: View { .frame(maxWidth: .infinity) } footer: { if self.errorMessage.count > 0 { - Text(self.errorMessage).foregroundStyle(.red) + Text(self.errorMessage).foregroundStyle(.logoRed) } } } diff --git a/PadelClub/Views/User/LoginView.swift b/PadelClub/Views/User/LoginView.swift index cb36838..61c27fe 100644 --- a/PadelClub/Views/User/LoginView.swift +++ b/PadelClub/Views/User/LoginView.swift @@ -131,7 +131,7 @@ struct LoginView: View { } .disabled(password.isEmpty || username.isEmpty) // if let error = self.errorText { -// Text(error).font(.callout).foregroundStyle(.red) +// Text(error).font(.callout).foregroundStyle(.logoRed) // } }