@ -10,6 +10,7 @@ import LeStorage
struct GroupStageView : View {
@ EnvironmentObject var dataStore : DataStore
@ Environment ( Tournament . self ) private var tournament
@ Bindable var groupStage : GroupStage
@ State private var confirmGroupStageStart : Bool = false
@ State private var sortingMode : GroupStageSortingMode = . auto
@ -190,8 +191,9 @@ struct GroupStageView: View {
Menu {
NavigationLink {
GroupStageNameEditionView ( groupStage : groupStage )
. environment ( tournament )
} label : {
Label ( " Renommer " , systemImage : " pencil " )
Label ( " Modifier le nom et la taille " , systemImage : " pencil " )
}
Button ( " Retirer tout le monde " , role : . destructive ) {
confirmRemoveAll = true
@ -236,9 +238,18 @@ struct GroupStageView: View {
struct GroupStageNameEditionView : View {
@ Environment ( \ . dismiss ) private var dismiss
@ Environment ( Tournament . self ) private var tournament
@ EnvironmentObject var dataStore : DataStore
let groupStage : GroupStage
@ State private var groupStageName : String = " "
@ Bindable var groupStage : GroupStage
@ State private var groupStageName : String
@ State private var presentConfirmationButton : Bool = false
@ State private var size : Int
init ( groupStage : GroupStage ) {
_groupStage = Bindable ( groupStage )
_groupStageName = . init ( wrappedValue : groupStage . name ? ? " " )
_size = . init ( wrappedValue : groupStage . size )
}
var body : some View {
Form {
@ -246,30 +257,90 @@ struct GroupStageNameEditionView: View {
TextField ( " Nom de la poule " , text : $ groupStageName )
. keyboardType ( . alphabet )
. frame ( maxWidth : . infinity )
. onAppear ( perform : {
groupStageName = groupStage . name ? ? " "
} )
. onSubmit {
groupStageName = groupStageName . trimmed
groupStage . name = groupStageName
_save ( )
dismiss ( )
if groupStageName . isEmpty = = false {
groupStage . name = groupStageName
_save ( )
dismiss ( )
}
}
} footer : {
HStack {
Spacer ( )
FooterButtonView ( " retirer le nom " ) {
groupStage . name = nil
groupStageName = groupStage . groupStageTitle ( )
if groupStage . name != nil {
HStack {
Spacer ( )
FooterButtonView ( " retirer le nom " ) {
groupStage . name = nil
groupStageName = " "
_save ( )
}
}
}
}
Section {
LabeledContent {
StepperView ( count : $ size , minimum : minimumSize ( ) , maximum : maximumSize ( ) )
} label : {
Text ( " Taille de la poule " )
}
if presentConfirmationButton {
RowButtonView ( " Confirmer " , role : . destructive , confirmationMessage : " Tous les matchs et les équipes de cette poule seront ré-initialisés " ) {
let teams = groupStage . teams ( )
teams . forEach { team in
team . groupStagePosition = nil
team . groupStage = nil
groupStage . _matches ( ) . forEach ( { $0 . updateTeamScores ( ) } )
}
do {
try dataStore . teamRegistrations . addOrUpdate ( contentOfs : teams )
} catch {
Logger . error ( error )
}
groupStage . size = size
groupStage . buildMatches ( )
tournament . shouldVerifyGroupStage = true
_save ( )
presentConfirmationButton = false
}
}
} footer : {
Text ( " Vous ne pouvez réduire la taille qu'à partir de la dernière poule et augmentez la taille qu'à partir de la première poule. Une poule ne peut pas avoir moins de 3 équipes et plus d'une équipe de différence par rapport aux autres poules. " )
}
}
. onChange ( of : size ) {
presentConfirmationButton = true
}
. navigationTitle ( groupStage . groupStageTitle ( ) )
. toolbarBackground ( . visible , for : . navigationBar )
}
private func maximumSize ( ) -> Int {
if groupStage . index = = 0 {
return tournament . teamsPerGroupStage + 1
}
if let previousGroupStage = tournament . groupStages ( ) . first ( where : { $0 . index = = groupStage . index - 1 } ) , previousGroupStage . size > groupStage . size {
return tournament . teamsPerGroupStage + 1
}
return tournament . teamsPerGroupStage
}
private func minimumSize ( ) -> Int {
if groupStage . index = = tournament . groupStageCount - 1 {
return max ( 3 , tournament . teamsPerGroupStage - 1 )
}
if let nextGroupStage = tournament . groupStages ( ) . first ( where : { $0 . index = = groupStage . index + 1 } ) , nextGroupStage . size < groupStage . size {
return max ( 3 , tournament . teamsPerGroupStage - 1 )
}
return tournament . teamsPerGroupStage
}
private func _save ( ) {
do {
try dataStore . groupStages . addOrUpdate ( instance : groupStage )