@ -35,6 +35,7 @@ class SearchViewModel: ObservableObject, Identifiable {
@ Published var selectedPlayers : Set < ImportedPlayer > = Set ( )
@ Published var selectedPlayers : Set < ImportedPlayer > = Set ( )
@ Published var filterSelectionEnabled : Bool = false
@ Published var filterSelectionEnabled : Bool = false
@ Published var isPresented : Bool = false
@ Published var isPresented : Bool = false
@ Published var selectedAgeCategory : FederalTournamentAge = . unlisted
var mostRecentDate : Date ? = nil
var mostRecentDate : Date ? = nil
@ -90,11 +91,15 @@ class SearchViewModel: ObservableObject, Identifiable {
}
}
func showIndex ( ) -> Bool {
func showIndex ( ) -> Bool {
if ( dataSet = = . national || dataSet = = . ligue ) { return false }
if ( dataSet = = . national || dataSet = = . ligue ) { return isFiltering ( ) }
if filterOption = = . all { return false }
if filterOption = = . all { return isFiltering ( ) }
return true
return true
}
}
func isFiltering ( ) -> Bool {
searchText . isEmpty = = false || tokens . isEmpty = = false || hideAssimilation || selectedAgeCategory != . unlisted
}
func prompt ( forDataSet : DataSet ) -> String {
func prompt ( forDataSet : DataSet ) -> String {
switch forDataSet {
switch forDataSet {
case . national :
case . national :
@ -195,6 +200,13 @@ class SearchViewModel: ObservableObject, Identifiable {
} else {
} else {
predicates . append ( NSPredicate ( format : " rank BETWEEN {%@,%@} " , values . first ! , values . last ! ) )
predicates . append ( NSPredicate ( format : " rank BETWEEN {%@,%@} " , values . first ! , values . last ! ) )
}
}
case . age :
if canonicalVersionWithoutPunctuation . isEmpty || Int ( canonicalVersionWithoutPunctuation ) = = 0 {
predicates . append ( NSPredicate ( format : " birthYear == 0 " ) )
} else if let birthYear = Int ( canonicalVersionWithoutPunctuation ) {
predicates . append ( NSPredicate ( format : " birthYear == %@ " , birthYear . formattedAsRawString ( ) ) )
}
}
}
if predicates . isEmpty {
if predicates . isEmpty {
@ -222,6 +234,17 @@ class SearchViewModel: ObservableObject, Identifiable {
predicates . append ( NSPredicate ( format : " assimilation == %@ " , " Non " ) )
predicates . append ( NSPredicate ( format : " assimilation == %@ " , " Non " ) )
}
}
if selectedAgeCategory != . unlisted {
let computedBirthYear = selectedAgeCategory . computedBirthYear ( )
if let left = computedBirthYear . 0 {
predicates . append ( NSPredicate ( format : " birthYear >= %@ " , left . formattedAsRawString ( ) ) )
}
if let right = computedBirthYear . 1 {
predicates . append ( NSPredicate ( format : " birthYear <= %@ " , right . formattedAsRawString ( ) ) )
}
}
switch dataSet {
switch dataSet {
case . national :
case . national :
break
break
@ -267,7 +290,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
case rankMoreThan = " rang > "
case rankMoreThan = " rang > "
case rankLessThan = " rang < "
case rankLessThan = " rang < "
case rankBetween = " rang <> "
case rankBetween = " rang <> "
case age = " âge sportif "
var id : String {
var id : String {
rawValue
rawValue
}
}
@ -284,6 +308,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " Taper un nombre pour chercher les joueurs ayant un classement inférieur ou égale. "
return " Taper un nombre pour chercher les joueurs ayant un classement inférieur ou égale. "
case . rankBetween :
case . rankBetween :
return " Taper deux nombres séparés par une virgule pour chercher les joueurs dans cette intervalle de classement "
return " Taper deux nombres séparés par une virgule pour chercher les joueurs dans cette intervalle de classement "
case . age :
return " Taper une année de naissance "
}
}
}
}
@ -297,6 +323,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " Chercher un rang "
return " Chercher un rang "
case . rankBetween :
case . rankBetween :
return " Chercher une intervalle de classement "
return " Chercher une intervalle de classement "
case . age :
return " Chercher une année de naissance "
}
}
}
}
@ -312,6 +340,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " Rang inférieur ou égale à "
return " Rang inférieur ou égale à "
case . rankBetween :
case . rankBetween :
return " Rang entre deux valeurs "
return " Rang entre deux valeurs "
case . age :
return " Année de naissance "
}
}
}
}
@ -327,6 +357,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " Rang ≤ "
return " Rang ≤ "
case . rankBetween :
case . rankBetween :
return " Rang ≥,≤ "
return " Rang ≥,≤ "
case . age :
return " Né(e) en "
}
}
}
}
@ -342,6 +374,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " figure.racquetball "
return " figure.racquetball "
case . rankBetween :
case . rankBetween :
return " figure.racquetball "
return " figure.racquetball "
case . age :
return " figure.racquetball "
}
}
}
}
@ -357,6 +391,8 @@ enum SearchToken: String, CaseIterable, Identifiable {
return " figure.racquetball "
return " figure.racquetball "
case . rankBetween :
case . rankBetween :
return " figure.racquetball "
return " figure.racquetball "
case . age :
return " figure.racquetball "
}
}
}
}
}
}
@ -387,13 +423,13 @@ enum DataSet: Int, Identifiable {
var tokens : [ SearchToken ] {
var tokens : [ SearchToken ] {
switch self {
switch self {
case . national :
case . national :
return [ . club , . ligue , . rankMoreThan , . rankLessThan , . rankBetween ]
return [ . club , . ligue , . rankMoreThan , . rankLessThan , . rankBetween , . age ]
case . ligue :
case . ligue :
return [ . club , . rankMoreThan , . rankLessThan , . rankBetween ]
return [ . club , . rankMoreThan , . rankLessThan , . rankBetween , . age ]
case . club :
case . club :
return [ . rankMoreThan , . rankLessThan , . rankBetween ]
return [ . rankMoreThan , . rankLessThan , . rankBetween , . age ]
case . favoritePlayers , . favoriteClubs :
case . favoritePlayers , . favoriteClubs :
return [ . rankMoreThan , . rankLessThan , . rankBetween ]
return [ . rankMoreThan , . rankLessThan , . rankBetween , . age ]
}
}
}
}
}
}
@ -403,6 +439,7 @@ enum SortOption: Int, CaseIterable, Identifiable {
case rank
case rank
case tournamentCount
case tournamentCount
case points
case points
case progression
var id : Int { self . rawValue }
var id : Int { self . rawValue }
func localizedLabel ( _ displayStyle : DisplayStyle = . wide ) -> String {
func localizedLabel ( _ displayStyle : DisplayStyle = . wide ) -> String {
@ -415,6 +452,8 @@ enum SortOption: Int, CaseIterable, Identifiable {
return " Tournoi "
return " Tournoi "
case . points :
case . points :
return " Points "
return " Points "
case . progression :
return " Progression "
}
}
}
}
@ -432,6 +471,8 @@ enum SortOption: Int, CaseIterable, Identifiable {
return [ SortDescriptor ( \ ImportedPlayer . tournamentCount , order : ascending ? . forward : . reverse ) , SortDescriptor ( \ ImportedPlayer . rank ) , SortDescriptor ( \ ImportedPlayer . assimilation ) , SortDescriptor ( \ ImportedPlayer . lastName ) ]
return [ SortDescriptor ( \ ImportedPlayer . tournamentCount , order : ascending ? . forward : . reverse ) , SortDescriptor ( \ ImportedPlayer . rank ) , SortDescriptor ( \ ImportedPlayer . assimilation ) , SortDescriptor ( \ ImportedPlayer . lastName ) ]
case . points :
case . points :
return [ SortDescriptor ( \ ImportedPlayer . points , order : ascending ? . forward : . reverse ) , SortDescriptor ( \ ImportedPlayer . rank ) , SortDescriptor ( \ ImportedPlayer . assimilation ) , SortDescriptor ( \ ImportedPlayer . lastName ) ]
return [ SortDescriptor ( \ ImportedPlayer . points , order : ascending ? . forward : . reverse ) , SortDescriptor ( \ ImportedPlayer . rank ) , SortDescriptor ( \ ImportedPlayer . assimilation ) , SortDescriptor ( \ ImportedPlayer . lastName ) ]
case . progression :
return [ SortDescriptor ( \ ImportedPlayer . progression , order : ascending ? . forward : . reverse ) , SortDescriptor ( \ ImportedPlayer . rank ) , SortDescriptor ( \ ImportedPlayer . assimilation ) , SortDescriptor ( \ ImportedPlayer . lastName ) ]
}
}
}
}
}
}