@ -28,8 +28,9 @@ struct FileImportView: View {
@ State private var fileProvider : FileImportManager . FileProvider = . frenchFederation
@ State private var validationInProgress : Bool = false
@ State private var multiImport : Bool = false
private var filteredTeams : [ FileImportManager . TeamHolder ] {
private func filteredTeams ( tournament : Tournament ) -> [ FileImportManager . TeamHolder ] {
return teams . filter { $0 . tournamentCategory = = tournament . tournamentCategory } . sorted ( by : \ . weight )
}
@ -68,6 +69,24 @@ struct FileImportView: View {
Text ( . init ( footerString ) )
}
}
if let tournaments = tournament . eventObject ( ) ? . tournaments , tournaments . count > 1 , fileProvider = = . frenchFederation {
Section {
RowButtonView ( " Importer toutes les épreuves " ) {
multiImport = true
if let fileContent {
do {
try await _startImport ( fileContent : fileContent )
} catch {
errorMessage = error . localizedDescription
}
}
}
} footer : {
Text ( " Ce tournoi possède plusieurs épreuves. Vous pouvez importer les équipes du fichier pour toutes les épreuves d'un coup. " )
}
. disabled ( fileContent = = nil || convertingFile )
}
}
// i f f i l t e r e d T e a m s . i s E m p t y = = f a l s e & & t o u r n a m e n t . u n s o r t e d T e a m s ( ) . i s E m p t y = = f a l s e {
@ -128,7 +147,8 @@ struct FileImportView: View {
// }
// }
if filteredTeams . isEmpty && teams . isEmpty = = false {
let filteredTeams = filteredTeams ( tournament : tournament )
if filteredTeams . isEmpty && teams . isEmpty = = false && multiImport = = false {
@ Bindable var tournament = tournament
Section {
Text ( " Aucune équipe \( tournament . tournamentCategory . importingRawValue ) détectée mais \( teams . count ) équipes sont dans le fichier " )
@ -157,20 +177,38 @@ struct FileImportView: View {
. tipStyle ( tint : nil )
}
}
Section {
LabeledContent {
Text ( _filteredTeams . count . formatted ( ) )
} label : {
Text ( " Équipe \( _filteredTeams . count . pluralSuffix ) \( tournament . tournamentCategory . importingRawValue ) détectée \( _filteredTeams . count . pluralSuffix ) " )
if multiImport , fileProvider = = . frenchFederation , let tournaments = tournament . eventObject ( ) ? . tournaments , tournaments . count > 1 {
ForEach ( tournaments ) { tournament in
let tournamentFilteredTeams = self . filteredTeams ( tournament : tournament )
Section {
RowButtonView ( " Valider " ) {
await _validate ( tournament : tournament )
}
} header : {
Text ( " \( tournamentFilteredTeams . count . formatted ( ) ) équipe \( tournamentFilteredTeams . count . pluralSuffix ) " )
} footer : {
Text ( tournament . tournamentTitle ( ) )
}
}
} footer : {
if previousTeams . isEmpty = = false {
Text ( " La liste ci-dessous n'est qu'une indication d'évolution par rapport au seul poids d'équipe. Cela ne tient pas compte des dates d'inscriptions, WCs et autres éléments. " ) . foregroundStyle ( . logoRed )
. headerProminence ( . increased )
} else {
Section {
LabeledContent {
Text ( _filteredTeams . count . formatted ( ) )
} label : {
Text ( " Équipe \( _filteredTeams . count . pluralSuffix ) \( tournament . tournamentCategory . importingRawValue ) détectée \( _filteredTeams . count . pluralSuffix ) " )
}
} footer : {
if previousTeams . isEmpty = = false {
Text ( " La liste ci-dessous n'est qu'une indication d'évolution par rapport au seul poids d'équipe. Cela ne tient pas compte des dates d'inscriptions, WCs et autres éléments. " ) . foregroundStyle ( . logoRed )
}
}
}
ForEach ( _filteredTeams ) { team in
_teamView ( team : team , inTeams : _filteredTeams , previousTeams : previousTeams )
ForEach ( _filteredTeams ) { team in
_teamView ( team : team , inTeams : _filteredTeams , previousTeams : previousTeams )
}
}
}
}
@ -215,13 +253,13 @@ struct FileImportView: View {
. navigationTitle ( " Importation " )
. navigationBarTitleDisplayMode ( . large )
. toolbar {
ToolbarItem ( placement : . bottomBar ) {
PasteButton ( payloadType : String . self ) { strings i n
guard let string = strings . first else { return }
fileContent = strin g
fil eProvider = . pa del Cl ub
}
}
// T o o l b a r I t e m ( p l a c e m e n t : . b o t t o m B a r ) {
// P a s t e B u t t o n ( p a y l o a d T y p e : S t r i n g . s e l f ) { s t r i n g s i n
// g u a r d l e t s t r i n g = s t r i n g s . f i r s t e l s e { r e t u r n }
// f i l e C o n t e n t = s t r i n g
// f il e P r o v i d e r = .p a d el Cl u b
// }
// }
ToolbarItem ( placement : . cancellationAction ) {
Button ( " Annuler " , role : . cancel ) {
dismiss ( )
@ -232,8 +270,19 @@ struct FileImportView: View {
if validationInProgress {
ProgressView ( )
} else {
ButtonValidateView {
ButtonValidateView ( title : ( multiImport ? " Tout Valider " : " Valider " ) ) {
validationInProgress = true
Task {
if let tournaments = tournament . eventObject ( ) ? . tournaments , tournaments . count > 1 , multiImport {
for tournament in tournaments {
await _validate ( tournament : tournament )
}
dismiss ( )
} else {
await _validate ( tournament : tournament )
}
}
}
. disabled ( teams . isEmpty )
}
@ -241,30 +290,28 @@ struct FileImportView: View {
}
. interactiveDismissDisabled ( validationInProgress )
. disabled ( validationInProgress )
. onChange ( of : validationInProgress ) {
_validate ( )
}
}
private func _validate ( ) {
Task {
let previousTeams = filteredTeams . compactMap ( { $0 . previousTeam } )
private func _validate ( tournament : Tournament ) async {
let filteredTeams = filteredTeams ( tournament : tournament )
let previousTeams = filteredTeams . compactMap ( { $0 . previousTeam } )
let unfound = Set ( tournament . unsortedTeams ( ) ) . subtracting ( Set ( previousTeams ) )
unfound . forEach { team in
team . resetPositions ( )
team . wildCardBracket = false
team . wildCardGroupStage = false
team . walkOut = true
}
let unfound = Set ( tournament . unsortedTeams ( ) ) . subtracting ( Set ( previousTeams ) )
unfound . forEach { team in
team . resetPositions ( )
team . wildCardBracket = false
team . wildCardGroupStage = false
team . walkOut = true
}
do {
try dataStore . teamRegistrations . addOrUpdate ( contentOfs : unfound )
} catch {
Logger . error ( error )
}
do {
try dataStore . teamRegistrations . addOrUpdate ( contentOfs : unfound )
} catch {
Logger . error ( error )
}
tournament . importTeams ( filteredTeams )
tournament . importTeams ( filteredTeams )
if multiImport = = false {
dismiss ( )
}
}