(cherry picked from commit 0860fb5bca)
release
Raz 1 year ago
parent f03621124a
commit 888672cc9b
  1. 8
      PadelClub/Data/TeamRegistration.swift
  2. 2
      PadelClub/Data/Tournament.swift
  3. 47
      PadelClub/Views/Calling/TeamsCallingView.swift
  4. 2
      PadelClub/Views/Navigation/Umpire/UmpireView.swift
  5. 5
      PadelClub/Views/Shared/ImportedPlayerView.swift
  6. 12
      PadelClub/Views/Shared/SelectablePlayerListView.swift
  7. 16
      PadelClub/Views/Team/EditingTeamView.swift
  8. 8
      PadelClub/Views/Tournament/Screen/BroadcastView.swift

@ -498,6 +498,14 @@ final class TeamRegistration: ModelObject, Storable {
return self.tournamentStore.matches.first(where: { $0.round == initialRoundObject.id && $0.index == bracketPosition / 2 })
}
func toggleSummonConfirmation() {
if confirmationDate == nil { confirmationDate = Date() }
else { confirmationDate = nil }
}
func didConfirmSummon() -> Bool {
confirmationDate != nil
}
func tournamentObject() -> Tournament? {
return Store.main.findById(tournament)

@ -113,7 +113,7 @@ final class Tournament : ModelObject, Storable {
self.startDate = startDate
self.endDate = endDate
self.creationDate = creationDate
self.isPrivate = isPrivate
self.isPrivate = Guard.main.purchasedTransactions.isEmpty
self.groupStageFormat = groupStageFormat
self.roundFormat = roundFormat
self.loserRoundFormat = loserRoundFormat

@ -6,6 +6,7 @@
//
import SwiftUI
import LeStorage
struct TeamsCallingView: View {
@Environment(Tournament.self) var tournament: Tournament
@ -15,7 +16,23 @@ struct TeamsCallingView: View {
let teams = tournament.selectedSortedTeams()
Section {
ForEach(teams) { team in
Menu {
_menuOptions(team: team)
} label: {
HStack {
TeamRowView(team: team, displayCallDate: true)
if team.called() {
Spacer()
Menu {
_menuOptions(team: team)
} label: {
LabelOptions().labelStyle(.iconOnly)
}
}
}
}
.buttonStyle(.plain)
.listRowView(isActive: team.didConfirmSummon(), color: .green, hideColorVariation: true)
}
}
}
@ -25,4 +42,34 @@ struct TeamsCallingView: View {
.toolbarBackground(.visible, for: .navigationBar)
}
@ViewBuilder
func _menuOptions(team: TeamRegistration) -> some View {
Button {
team.toggleSummonConfirmation()
do {
try self.tournament.tournamentStore.teamRegistrations.addOrUpdate(instance: team)
} catch {
Logger.error(error)
}
} label: {
if team.didConfirmSummon() {
Label("Confirmation reçue", systemImage: "checkmark.circle.fill").foregroundStyle(.green)
} else {
Label("Confirmation reçue", systemImage: "circle").foregroundStyle(.logoRed)
}
}
Divider()
Button(role: .destructive) {
team.callDate = nil
do {
try self.tournament.tournamentStore.teamRegistrations.addOrUpdate(instance: team)
} catch {
Logger.error(error)
}
} label: {
Text("Effacer la date de convocation")
}
}
}

@ -56,7 +56,7 @@ struct UmpireView: View {
Section {
if let currentPlayerData {
//todo palmares
ImportedPlayerView(player: currentPlayerData)
ImportedPlayerView(player: currentPlayerData, showProgression: true)
// NavigationLink {
//
// } label: {

@ -11,7 +11,7 @@ struct ImportedPlayerView: View {
let player: PlayerHolder
var index: Int? = nil
var showFemaleInMaleAssimilation: Bool = false
@State var showProgression: Bool = false
var showProgression: Bool = false
var body: some View {
VStack(alignment: .leading) {
@ -54,7 +54,7 @@ struct ImportedPlayerView: View {
}
}
if player.getProgression() != 0 {
if showProgression, player.getProgression() != 0 {
HStack(alignment: .top, spacing: 2) {
Text("(")
Text(player.getProgression().formatted(.number.sign(strategy: .always())))
@ -77,6 +77,7 @@ struct ImportedPlayerView: View {
}
}
}
.lineLimit(1)
if showFemaleInMaleAssimilation, let assimilatedAsMaleRank = player.getAssimilatedAsMaleRank() {
HStack(alignment: .top, spacing: 2) {

@ -364,7 +364,7 @@ struct MySearchView: View {
let array = Array(searchViewModel.selectedPlayers)
Section {
ForEach(array) { player in
ImportedPlayerView(player: player, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
}
.onDelete { indexSet in
for index in indexSet {
@ -379,7 +379,7 @@ struct MySearchView: View {
} else {
Section {
ForEach(players, id: \.self) { player in
ImportedPlayerView(player: player, index: nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, index: nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
}
} header: {
if players.isEmpty == false {
@ -398,7 +398,7 @@ struct MySearchView: View {
Button {
searchViewModel.selectedPlayers.insert(player)
} label: {
ImportedPlayerView(player: player, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
}
.buttonStyle(.plain)
}
@ -412,7 +412,7 @@ struct MySearchView: View {
Section {
ForEach(players.indices, id: \.self) { index in
let player = players[index]
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
}
} header: {
if players.isEmpty == false {
@ -429,13 +429,13 @@ struct MySearchView: View {
Button {
searchViewModel.selectedPlayers.insert(player)
} label: {
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
.contentShape(Rectangle())
}
.frame(maxWidth: .infinity)
.buttonStyle(.plain)
} else {
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation)
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true)
}
}
} header: {

@ -76,6 +76,22 @@ struct EditingTeamView: View {
} label: {
Text("Convocation")
}
Button {
team.toggleSummonConfirmation()
do {
try self.tournament.tournamentStore.teamRegistrations.addOrUpdate(instance: team)
} catch {
Logger.error(error)
}
} label: {
if team.didConfirmSummon() {
Label("Confirmation reçue", systemImage: "checkmark.circle.fill").foregroundStyle(.green)
} else {
Label("Confirmation reçue", systemImage: "circle").foregroundStyle(.logoRed)
}
}
} else {
Text("Cette équipe n'a pas été convoquée")
}

@ -108,9 +108,15 @@ struct BroadcastView: View {
Section {
Toggle(isOn: $tournament.isPrivate) {
Text("Tournoi privé")
if (tournament.isPrivate && Guard.main.purchasedTransactions.isEmpty) {
Text("Vous devez disposer d'une offre pour rendre publique ce tournoi.")
.foregroundStyle(.logoRed)
}
}
.disabled((tournament.isPrivate && Guard.main.purchasedTransactions.isEmpty))
} footer: {
let footerString = "Le tournoi sera masqué sur le site [Padel Club](\(URLs.main.rawValue))"
let verb : String = tournament.isPrivate ? "est" : "sera"
let footerString = " Le tournoi \(verb) masqué sur le site [Padel Club](\(URLs.main.rawValue))"
Text(.init(footerString))
}

Loading…
Cancel
Save