diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index fe72117..0b18a82 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -51,7 +51,8 @@ class Tournament : ModelObject, Storable { var shouldVerifyGroupStage: Bool = false var shouldVerifyBracket: Bool = false var hideTeamsWeight: Bool = false - + var publishTournament: Bool = false + @ObservationIgnored var navigationPath: [Screen] = [] @@ -96,9 +97,10 @@ class Tournament : ModelObject, Storable { case _shouldVerifyGroupStage = "shouldVerifyGroupStage" case _shouldVerifyBracket = "shouldVerifyBracket" case _hideTeamsWeight = "hideTeamsWeight" + case _publishTournament = "publishTournament" } - internal init(event: String? = nil, name: String? = nil, startDate: Date = Date(), endDate: Date? = nil, creationDate: Date = Date(), isPrivate: Bool = false, groupStageFormat: MatchFormat? = nil, roundFormat: MatchFormat? = nil, loserRoundFormat: MatchFormat? = nil, groupStageSortMode: GroupStageOrderingMode, groupStageCount: Int = 4, rankSourceDate: Date? = nil, dayDuration: Int = 1, teamCount: Int = 24, teamSorting: TeamSortingType? = nil, federalCategory: TournamentCategory, federalLevelCategory: TournamentLevel, federalAgeCategory: FederalTournamentAge, closedRegistrationDate: Date? = nil, groupStageAdditionalQualified: Int = 0, courtCount: Int = 2, prioritizeClubMembers: Bool = false, qualifiedPerGroupStage: Int = 1, teamsPerGroupStage: Int = 4, entryFee: Double? = nil, additionalEstimationDuration: Int = 0, isDeleted: Bool = false, publishTeams: Bool = false, publishSummons: Bool = false, publishGroupStages: Bool = false, publishBrackets: Bool = false, shouldVerifyBracket: Bool = false, shouldVerifyGroupStage: Bool = false, hideTeamsWeight: Bool = false) { + internal init(event: String? = nil, name: String? = nil, startDate: Date = Date(), endDate: Date? = nil, creationDate: Date = Date(), isPrivate: Bool = false, groupStageFormat: MatchFormat? = nil, roundFormat: MatchFormat? = nil, loserRoundFormat: MatchFormat? = nil, groupStageSortMode: GroupStageOrderingMode, groupStageCount: Int = 4, rankSourceDate: Date? = nil, dayDuration: Int = 1, teamCount: Int = 24, teamSorting: TeamSortingType? = nil, federalCategory: TournamentCategory, federalLevelCategory: TournamentLevel, federalAgeCategory: FederalTournamentAge, closedRegistrationDate: Date? = nil, groupStageAdditionalQualified: Int = 0, courtCount: Int = 2, prioritizeClubMembers: Bool = false, qualifiedPerGroupStage: Int = 1, teamsPerGroupStage: Int = 4, entryFee: Double? = nil, additionalEstimationDuration: Int = 0, isDeleted: Bool = false, publishTeams: Bool = false, publishSummons: Bool = false, publishGroupStages: Bool = false, publishBrackets: Bool = false, shouldVerifyBracket: Bool = false, shouldVerifyGroupStage: Bool = false, hideTeamsWeight: Bool = false, publishTournament: Bool = false) { self.event = event self.name = name self.startDate = startDate @@ -133,6 +135,7 @@ class Tournament : ModelObject, Storable { self.shouldVerifyBracket = shouldVerifyBracket self.shouldVerifyGroupStage = shouldVerifyGroupStage self.hideTeamsWeight = hideTeamsWeight + self.publishTournament = publishTournament } required init(from decoder: Decoder) throws { @@ -174,6 +177,7 @@ class Tournament : ModelObject, Storable { shouldVerifyBracket = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyBracket) ?? false shouldVerifyGroupStage = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyGroupStage) ?? false hideTeamsWeight = try container.decodeIfPresent(Bool.self, forKey: ._hideTeamsWeight) ?? false + publishTournament = try container.decodeIfPresent(Bool.self, forKey: ._publishTournament) ?? false } fileprivate static let _numberFormatter: NumberFormatter = NumberFormatter() @@ -286,6 +290,7 @@ class Tournament : ModelObject, Storable { try container.encode(shouldVerifyBracket, forKey: ._shouldVerifyBracket) try container.encode(shouldVerifyGroupStage, forKey: ._shouldVerifyGroupStage) try container.encode(hideTeamsWeight, forKey: ._hideTeamsWeight) + try container.encode(publishTournament, forKey: ._publishTournament) } fileprivate func _encodePayment(container: inout KeyedEncodingContainer) throws { @@ -378,10 +383,19 @@ class Tournament : ModelObject, Storable { } } + func publishedTournamentDate() -> Date { + let publishedTournamentDate = Calendar.current.date(byAdding: .day, value: 1, to: creationDate)! + return publishedTournamentDate + } + func publishedTeamsDate() -> Date { startDate } + func isTournamentPublished() -> Bool { + Date() >= publishedTournamentDate() || publishTournament + } + func areTeamsPublished() -> Bool { Date() >= startDate || publishTeams } diff --git a/PadelClub/Views/Tournament/Screen/BroadcastView.swift b/PadelClub/Views/Tournament/Screen/BroadcastView.swift index c7e1235..7d33725 100644 --- a/PadelClub/Views/Tournament/Screen/BroadcastView.swift +++ b/PadelClub/Views/Tournament/Screen/BroadcastView.swift @@ -41,6 +41,34 @@ struct BroadcastView: View { } if tournament.isPrivate == false { + Section { + LabeledContent { + if tournament.isTournamentPublished() { + Image(systemName:"checkmark").foregroundStyle(.green) + } else { + Text(tournament.publishedTournamentDate().formatted()) + } + } label: { + if tournament.isTournamentPublished() { + Text("Publiée") + } else { + Text("Publication prévue") + } + } + } header: { + Text("Information sur le tournoi") + } footer: { + if Date() < tournament.publishedTournamentDate() { + HStack { + Spacer() + FooterButtonView(tournament.publishTournament ? "masquer sur le site" : "publier maintenant") { + tournament.publishTournament.toggle() + _save() + } + } + } + } + Section { LabeledContent { if tournament.areTeamsPublished() { @@ -67,6 +95,7 @@ struct BroadcastView: View { Spacer() FooterButtonView(tournament.publishTeams ? "masquer sur le site" : "publier maintenant") { tournament.publishTeams.toggle() + _save() } } } @@ -94,6 +123,7 @@ struct BroadcastView: View { Spacer() FooterButtonView(tournament.publishSummons ? "masquer sur le site" : "publier maintenant") { tournament.publishSummons.toggle() + _save() } } } @@ -123,6 +153,7 @@ struct BroadcastView: View { Spacer() FooterButtonView(tournament.publishGroupStages ? "masquer sur le site" : "publier maintenant") { tournament.publishGroupStages.toggle() + _save() } } } @@ -153,6 +184,7 @@ struct BroadcastView: View { Spacer() FooterButtonView(tournament.publishBrackets ? "masquer sur le site" : "publier maintenant") { tournament.publishBrackets.toggle() + _save() } } } @@ -233,13 +265,23 @@ struct BroadcastView: View { UIPasteboard.general.string = urlToShow } } - .onChange(of: [tournament.hideTeamsWeight, tournament.isPrivate, tournament.publishTeams, tournament.publishSummons, tournament.publishBrackets, tournament.publishGroupStages]) { + .onChange(of: [tournament.hideTeamsWeight, tournament.isPrivate]) { _save() } } private func _save() { do { + if [tournament.publishTeams, tournament.publishSummons, tournament.publishBrackets, tournament.publishGroupStages].anySatisfy({ $0 == true }) { + tournament.publishTournament = true + } + + if tournament.publishTournament == false { + tournament.publishTeams = false + tournament.publishSummons = false + tournament.publishBrackets = false + tournament.publishGroupStages = false + } try dataStore.tournaments.addOrUpdate(instance: tournament) } catch { Logger.error(error) diff --git a/PadelClubTests/ServerDataTests.swift b/PadelClubTests/ServerDataTests.swift index 6b92cc5..eb8c438 100644 --- a/PadelClubTests/ServerDataTests.swift +++ b/PadelClubTests/ServerDataTests.swift @@ -96,7 +96,7 @@ final class ServerDataTests: XCTestCase { return } - let tournament = Tournament(event: eventId, name: "RG Homme", startDate: Date(), endDate: nil, creationDate: Date(), isPrivate: false, groupStageFormat: MatchFormat.megaTie, roundFormat: MatchFormat.nineGames, loserRoundFormat: MatchFormat.nineGamesDecisivePoint, groupStageSortMode: GroupStageOrderingMode.snake, groupStageCount: 2, rankSourceDate: Date(), dayDuration: 5, teamCount: 3, teamSorting: TeamSortingType.rank, federalCategory: TournamentCategory.mix, federalLevelCategory: TournamentLevel.p1000, federalAgeCategory: FederalTournamentAge.a45, closedRegistrationDate: Date(), groupStageAdditionalQualified: 4, courtCount: 9, prioritizeClubMembers: true, qualifiedPerGroupStage: 1, teamsPerGroupStage: 2, entryFee: 30.0, additionalEstimationDuration: 5, isDeleted: true, publishTeams: true, publishSummons: true, publishGroupStages: true, publishBrackets: true, shouldVerifyBracket: true, shouldVerifyGroupStage: true, hideTeamsWeight: false) + let tournament = Tournament(event: eventId, name: "RG Homme", startDate: Date(), endDate: nil, creationDate: Date(), isPrivate: false, groupStageFormat: MatchFormat.megaTie, roundFormat: MatchFormat.nineGames, loserRoundFormat: MatchFormat.nineGamesDecisivePoint, groupStageSortMode: GroupStageOrderingMode.snake, groupStageCount: 2, rankSourceDate: Date(), dayDuration: 5, teamCount: 3, teamSorting: TeamSortingType.rank, federalCategory: TournamentCategory.mix, federalLevelCategory: TournamentLevel.p1000, federalAgeCategory: FederalTournamentAge.a45, closedRegistrationDate: Date(), groupStageAdditionalQualified: 4, courtCount: 9, prioritizeClubMembers: true, qualifiedPerGroupStage: 1, teamsPerGroupStage: 2, entryFee: 30.0, additionalEstimationDuration: 5, isDeleted: true, publishTeams: true, publishSummons: true, publishGroupStages: true, publishBrackets: true, shouldVerifyBracket: true, shouldVerifyGroupStage: true, hideTeamsWeight: true, publishTournament: true) let t = try await Store.main.service().post(tournament) assert(t.event == tournament.event) @@ -133,6 +133,7 @@ final class ServerDataTests: XCTestCase { assert(t.shouldVerifyBracket == tournament.shouldVerifyBracket) assert(t.shouldVerifyGroupStage == tournament.shouldVerifyGroupStage) assert(t.hideTeamsWeight == tournament.hideTeamsWeight) + assert(t.publishTournament == tournament.publishTournament) } func testGroupStage() async throws {