diff --git a/PadelClub/Extensions/Tournament+Extensions.swift b/PadelClub/Extensions/Tournament+Extensions.swift index b8c3277..10af3ae 100644 --- a/PadelClub/Extensions/Tournament+Extensions.swift +++ b/PadelClub/Extensions/Tournament+Extensions.swift @@ -205,7 +205,7 @@ extension Tournament { } func registrationIssues(selectedTeams: [TeamRegistration]) async -> Int { - let players : [PlayerRegistration] = unsortedPlayers() + let players : [PlayerRegistration] = selectedTeams.flatMap { $0.players() } let callDateIssue : [TeamRegistration] = selectedTeams.filter { $0.callDate != nil && isStartDateIsDifferentThanCallDate($0) } let duplicates : [PlayerRegistration] = duplicates(in: players) let problematicPlayers : [PlayerRegistration] = players.filter({ $0.sex == nil }) diff --git a/PadelClub/Views/Calling/CallSettingsView.swift b/PadelClub/Views/Calling/CallSettingsView.swift index af40ec8..d4c8313 100644 --- a/PadelClub/Views/Calling/CallSettingsView.swift +++ b/PadelClub/Views/Calling/CallSettingsView.swift @@ -96,11 +96,11 @@ struct CallSettingsView: View { //#endif } .sheet(isPresented: $showSendToAllView) { - SendToAllView(addLink: false) + SendToAllView(tournament: tournament, addLink: false) .tint(.master) } .sheet(isPresented: $addLink) { - SendToAllView(addLink: true) + SendToAllView(tournament: tournament, addLink: true) .tint(.master) } } diff --git a/PadelClub/Views/Calling/SendToAllView.swift b/PadelClub/Views/Calling/SendToAllView.swift index 3b464e8..b998321 100644 --- a/PadelClub/Views/Calling/SendToAllView.swift +++ b/PadelClub/Views/Calling/SendToAllView.swift @@ -14,14 +14,16 @@ struct SendToAllView: View { @Environment(\.dismiss) var dismiss @EnvironmentObject var dataStore: DataStore - @Environment(Tournament.self) var tournament: Tournament @EnvironmentObject var networkMonitor: NetworkMonitor @State private var contactType: ContactType? = nil @State private var contactMethod: Int = 1 @State private var contactRecipients: Set = Set() @State private var sentError: ContactManagerError? = nil - let addLink: Bool + var event: Event? + var tournament: Tournament? + var addLink: Bool + // @State var cannotPayForTournament: Bool = false @State private var pageLink: PageLink = .matches @State private var includeWaitingList: Bool = false @@ -33,8 +35,18 @@ struct SendToAllView: View { @State var summonParamByMessage: Bool = false @State var summonParamReSummon: Bool = false + init(event: Event) { + self.event = event + self.addLink = false + } + + init(tournament: Tournament, addLink: Bool) { + self.tournament = tournament + self.addLink = addLink + } + var tournamentStore: TournamentStore? { - return self.tournament.tournamentStore + return self.tournament?.tournamentStore } var messageSentFailed: Binding { @@ -60,40 +72,48 @@ struct SendToAllView: View { .labelsHidden() .pickerStyle(.inline) } - - Section { - ForEach(tournament.groupStages()) { groupStage in - let teams = groupStage.teams() - if teams.isEmpty == false { - LabeledContent { - Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix) - } label: { - Text(groupStage.groupStageTitle()) + if let event { + LabeledContent { + Text(event.selectedTeams().count.formatted()) + } label: { + Text("Participants") + } + + } else if let tournament { + Section { + ForEach(tournament.groupStages()) { groupStage in + let teams = groupStage.teams() + if teams.isEmpty == false { + LabeledContent { + Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix) + } label: { + Text(groupStage.groupStageTitle()) + } + .tag(groupStage.id) } - .tag(groupStage.id) } - } - ForEach(tournament.rounds()) { round in - let teams = round.teams() - if teams.isEmpty == false { - LabeledContent { - Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix) - } label: { - Text(round.roundTitle()) + ForEach(tournament.rounds()) { round in + let teams = round.teams() + if teams.isEmpty == false { + LabeledContent { + Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix) + } label: { + Text(round.roundTitle()) + } + .tag(round.id) } - .tag(round.id) } + + Toggle("Inclure la liste d'attente", isOn: $includeWaitingList) + if includeWaitingList { + Toggle("Seulement la liste d'attente", isOn: $onlyWaitingList) + } + } footer: { + Text("Si vous ne souhaitez pas contacter toutes les équipes, choisissez un ou plusieurs groupes d'équipes manuellement.") } - - Toggle("Inclure la liste d'attente", isOn: $includeWaitingList) - if includeWaitingList { - Toggle("Seulement la liste d'attente", isOn: $onlyWaitingList) - } - } footer: { - Text("Si vous ne souhaitez pas contacter toutes les équipes, choisissez un ou plusieurs groupes d'équipes manuellement.") } - if addLink { + if addLink, event == nil { Section { let links : [PageLink] = [.teams, .summons, .groupStages, .matches, .rankings] Picker(selection: $pageLink) { @@ -135,7 +155,7 @@ struct SendToAllView: View { Button("OK") { } - if case .uncalledTeams(let uncalledTeams) = sentError { + if case .uncalledTeams(let uncalledTeams) = sentError, let tournament { NavigationLink("Voir les équipes non contactées") { TeamsCallingView(teams: uncalledTeams) .environment(tournament) @@ -224,6 +244,11 @@ struct SendToAllView: View { } func _teams() -> [TeamRegistration] { + if let event { + return event.selectedTeams() + } + + guard let tournament else { return [] } let selectedSortedTeams = tournament.selectedSortedTeams() if onlyWaitingList { return tournament.waitingListSortedTeams(selectedSortedTeams: selectedSortedTeams) @@ -258,8 +283,10 @@ struct SendToAllView: View { func finalMessage() -> String { var message = [String?]() message.append("\n\n") - if addLink { + if let tournament, addLink, event == nil { message.append(tournament.shareURL(pageLink)?.absoluteString) + } else if let event { + message.append(event.shareURL()?.absoluteString) } let signature = dataStore.user.getSummonsMessageSignature() ?? dataStore.user.defaultSignature(tournament) @@ -275,7 +302,9 @@ struct SendToAllView: View { if contactMethod == 0 { contactType = .message(date: nil, recipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.phoneNumber, $0.contactPhoneNumber] }.compactMap({ $0 }), body: finalMessage(), tournamentBuild: nil) } else { - contactType = .mail(date: nil, recipients: tournament.umpireMail(), bccRecipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.email, $0.contactEmail] }.compactMap({ $0 }), body: finalMessage(), subject: tournament.mailSubject(), tournamentBuild: nil) + let umpireMail = tournament?.umpireMail() ?? event?.umpireMail() + let subject = tournament?.mailSubject() ?? event?.mailSubject() + contactType = .mail(date: nil, recipients: umpireMail, bccRecipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.email, $0.contactEmail] }.compactMap({ $0 }), body: finalMessage(), subject: subject, tournamentBuild: nil) } } diff --git a/PadelClub/Views/Cashier/Event/EventSettingsView.swift b/PadelClub/Views/Cashier/Event/EventSettingsView.swift index 95706fc..68bf9cd 100644 --- a/PadelClub/Views/Cashier/Event/EventSettingsView.swift +++ b/PadelClub/Views/Cashier/Event/EventSettingsView.swift @@ -16,6 +16,7 @@ struct EventSettingsView: View { @State private var pageLink: PageLink = .teams @State private var tournamentInformation: String = "" @State private var eventStartDate: Date + @State private var showSendToAllView: Bool = false @FocusState private var focusedField: Tournament.CodingKeys? var visibleOnPadelClub: Binding { @@ -92,6 +93,12 @@ struct EventSettingsView: View { _linkLabel() + Section { + RowButtonView("Contactez toutes les équipes") { + showSendToAllView = true + } + } + Section { DatePicker(selection: $eventStartDate) { Text(eventStartDate.formatted(.dateTime.weekday(.wide)).capitalized).lineLimit(1) @@ -172,6 +179,10 @@ struct EventSettingsView: View { } } } + .sheet(isPresented: $showSendToAllView) { + SendToAllView(event: event) + .tint(.master) + } .navigationBarBackButtonHidden(focusedField != nil) .toolbar(content: { if focusedField != nil {