add publish tournament

multistore
Razmig Sarkissian 1 year ago
parent 1315f54af3
commit 91dc91a8d1
  1. 16
      PadelClub/Data/Tournament.swift
  2. 44
      PadelClub/Views/Tournament/Screen/BroadcastView.swift
  3. 3
      PadelClubTests/ServerDataTests.swift

@ -51,6 +51,7 @@ class Tournament : ModelObject, Storable {
var shouldVerifyGroupStage: Bool = false var shouldVerifyGroupStage: Bool = false
var shouldVerifyBracket: Bool = false var shouldVerifyBracket: Bool = false
var hideTeamsWeight: Bool = false var hideTeamsWeight: Bool = false
var publishTournament: Bool = false
@ObservationIgnored @ObservationIgnored
var navigationPath: [Screen] = [] var navigationPath: [Screen] = []
@ -96,9 +97,10 @@ class Tournament : ModelObject, Storable {
case _shouldVerifyGroupStage = "shouldVerifyGroupStage" case _shouldVerifyGroupStage = "shouldVerifyGroupStage"
case _shouldVerifyBracket = "shouldVerifyBracket" case _shouldVerifyBracket = "shouldVerifyBracket"
case _hideTeamsWeight = "hideTeamsWeight" 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.event = event
self.name = name self.name = name
self.startDate = startDate self.startDate = startDate
@ -133,6 +135,7 @@ class Tournament : ModelObject, Storable {
self.shouldVerifyBracket = shouldVerifyBracket self.shouldVerifyBracket = shouldVerifyBracket
self.shouldVerifyGroupStage = shouldVerifyGroupStage self.shouldVerifyGroupStage = shouldVerifyGroupStage
self.hideTeamsWeight = hideTeamsWeight self.hideTeamsWeight = hideTeamsWeight
self.publishTournament = publishTournament
} }
required init(from decoder: Decoder) throws { required init(from decoder: Decoder) throws {
@ -174,6 +177,7 @@ class Tournament : ModelObject, Storable {
shouldVerifyBracket = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyBracket) ?? false shouldVerifyBracket = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyBracket) ?? false
shouldVerifyGroupStage = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyGroupStage) ?? false shouldVerifyGroupStage = try container.decodeIfPresent(Bool.self, forKey: ._shouldVerifyGroupStage) ?? false
hideTeamsWeight = try container.decodeIfPresent(Bool.self, forKey: ._hideTeamsWeight) ?? 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() fileprivate static let _numberFormatter: NumberFormatter = NumberFormatter()
@ -286,6 +290,7 @@ class Tournament : ModelObject, Storable {
try container.encode(shouldVerifyBracket, forKey: ._shouldVerifyBracket) try container.encode(shouldVerifyBracket, forKey: ._shouldVerifyBracket)
try container.encode(shouldVerifyGroupStage, forKey: ._shouldVerifyGroupStage) try container.encode(shouldVerifyGroupStage, forKey: ._shouldVerifyGroupStage)
try container.encode(hideTeamsWeight, forKey: ._hideTeamsWeight) try container.encode(hideTeamsWeight, forKey: ._hideTeamsWeight)
try container.encode(publishTournament, forKey: ._publishTournament)
} }
fileprivate func _encodePayment(container: inout KeyedEncodingContainer<CodingKeys>) throws { fileprivate func _encodePayment(container: inout KeyedEncodingContainer<CodingKeys>) 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 { func publishedTeamsDate() -> Date {
startDate startDate
} }
func isTournamentPublished() -> Bool {
Date() >= publishedTournamentDate() || publishTournament
}
func areTeamsPublished() -> Bool { func areTeamsPublished() -> Bool {
Date() >= startDate || publishTeams Date() >= startDate || publishTeams
} }

@ -41,6 +41,34 @@ struct BroadcastView: View {
} }
if tournament.isPrivate == false { 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 { Section {
LabeledContent { LabeledContent {
if tournament.areTeamsPublished() { if tournament.areTeamsPublished() {
@ -67,6 +95,7 @@ struct BroadcastView: View {
Spacer() Spacer()
FooterButtonView(tournament.publishTeams ? "masquer sur le site" : "publier maintenant") { FooterButtonView(tournament.publishTeams ? "masquer sur le site" : "publier maintenant") {
tournament.publishTeams.toggle() tournament.publishTeams.toggle()
_save()
} }
} }
} }
@ -94,6 +123,7 @@ struct BroadcastView: View {
Spacer() Spacer()
FooterButtonView(tournament.publishSummons ? "masquer sur le site" : "publier maintenant") { FooterButtonView(tournament.publishSummons ? "masquer sur le site" : "publier maintenant") {
tournament.publishSummons.toggle() tournament.publishSummons.toggle()
_save()
} }
} }
} }
@ -123,6 +153,7 @@ struct BroadcastView: View {
Spacer() Spacer()
FooterButtonView(tournament.publishGroupStages ? "masquer sur le site" : "publier maintenant") { FooterButtonView(tournament.publishGroupStages ? "masquer sur le site" : "publier maintenant") {
tournament.publishGroupStages.toggle() tournament.publishGroupStages.toggle()
_save()
} }
} }
} }
@ -153,6 +184,7 @@ struct BroadcastView: View {
Spacer() Spacer()
FooterButtonView(tournament.publishBrackets ? "masquer sur le site" : "publier maintenant") { FooterButtonView(tournament.publishBrackets ? "masquer sur le site" : "publier maintenant") {
tournament.publishBrackets.toggle() tournament.publishBrackets.toggle()
_save()
} }
} }
} }
@ -233,13 +265,23 @@ struct BroadcastView: View {
UIPasteboard.general.string = urlToShow 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() _save()
} }
} }
private func _save() { private func _save() {
do { 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) try dataStore.tournaments.addOrUpdate(instance: tournament)
} catch { } catch {
Logger.error(error) Logger.error(error)

@ -96,7 +96,7 @@ final class ServerDataTests: XCTestCase {
return 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) let t = try await Store.main.service().post(tournament)
assert(t.event == tournament.event) assert(t.event == tournament.event)
@ -133,6 +133,7 @@ final class ServerDataTests: XCTestCase {
assert(t.shouldVerifyBracket == tournament.shouldVerifyBracket) assert(t.shouldVerifyBracket == tournament.shouldVerifyBracket)
assert(t.shouldVerifyGroupStage == tournament.shouldVerifyGroupStage) assert(t.shouldVerifyGroupStage == tournament.shouldVerifyGroupStage)
assert(t.hideTeamsWeight == tournament.hideTeamsWeight) assert(t.hideTeamsWeight == tournament.hideTeamsWeight)
assert(t.publishTournament == tournament.publishTournament)
} }
func testGroupStage() async throws { func testGroupStage() async throws {

Loading…
Cancel
Save