@ -57,6 +57,7 @@ class CashierViewModel: ObservableObject {
let id : UUID = UUID ( )
let id : UUID = UUID ( )
@ Published var sortOption : SortOption = . callDate
@ Published var sortOption : SortOption = . callDate
@ Published var filterOption : FilterOption = . all
@ Published var filterOption : FilterOption = . all
@ Published var presenceFilterOption : PresenceFilterOption = . all
@ Published var sortOrder : SortOrder = . ascending
@ Published var sortOrder : SortOrder = . ascending
@ Published var searchText : String = " "
@ Published var searchText : String = " "
@ Published var isSearching : Bool = false
@ Published var isSearching : Bool = false
@ -69,9 +70,14 @@ class CashierViewModel: ObservableObject {
func _shouldDisplayPlayer ( _ player : PlayerRegistration ) -> Bool {
func _shouldDisplayPlayer ( _ player : PlayerRegistration ) -> Bool {
if searchText . isEmpty = = false {
if searchText . isEmpty = = false {
sortOption . shouldDisplayPlayer ( player ) && filterOption . shouldDisplayPlayer ( player ) && player . contains ( searchText )
sortOption . shouldDisplayPlayer ( player )
&& filterOption . shouldDisplayPlayer ( player )
&& presenceFilterOption . shouldDisplayPlayer ( player )
&& player . contains ( searchText )
} else {
} else {
sortOption . shouldDisplayPlayer ( player ) && filterOption . shouldDisplayPlayer ( player )
sortOption . shouldDisplayPlayer ( player )
&& filterOption . shouldDisplayPlayer ( player )
&& presenceFilterOption . shouldDisplayPlayer ( player )
}
}
}
}
@ -183,6 +189,37 @@ class CashierViewModel: ObservableObject {
}
}
}
}
enum PresenceFilterOption : Int , Identifiable , CaseIterable {
case all
case hasArrived
case hasNotArrived
var id : Int { self . rawValue }
func localizedLabel ( ) -> String {
switch self {
case . all :
return " Tous "
case . hasArrived :
return " Présent "
case . hasNotArrived :
return " Absent "
}
}
func shouldDisplayPlayer ( _ player : PlayerRegistration ) -> Bool {
switch self {
case . all :
return true
case . hasArrived :
return player . hasArrived
case . hasNotArrived :
return player . hasArrived = = false
}
}
}
}
}
struct CashierView : View {
struct CashierView : View {
@ -201,10 +238,35 @@ struct CashierView: View {
_players = . init ( wrappedValue : teams . flatMap ( { $0 . unsortedPlayers ( ) } ) )
_players = . init ( wrappedValue : teams . flatMap ( { $0 . unsortedPlayers ( ) } ) )
}
}
private func _isFree ( ) -> Bool {
if tournaments . count = = 1 {
return tournaments . first ? . isFree ( ) = = true
} else {
return false
}
}
private func _editingOptions ( ) -> [ EditablePlayerView . PlayerEditingOption ] {
if _isFree ( ) {
return [ . licenceId , . name , . presence ]
} else {
return [ . licenceId , . name , . payment ]
}
}
var body : some View {
var body : some View {
List {
List {
if cashierViewModel . isSearching = = false {
if cashierViewModel . isSearching = = false {
Section {
Section {
Picker ( selection : $ cashierViewModel . presenceFilterOption ) {
ForEach ( CashierViewModel . PresenceFilterOption . allCases ) { filterOption in
Text ( filterOption . localizedLabel ( ) ) . tag ( filterOption )
}
} label : {
Text ( " Présence " )
}
if _isFree ( ) = = false {
Picker ( selection : $ cashierViewModel . filterOption ) {
Picker ( selection : $ cashierViewModel . filterOption ) {
ForEach ( CashierViewModel . FilterOption . allCases ) { filterOption in
ForEach ( CashierViewModel . FilterOption . allCases ) { filterOption in
Text ( filterOption . localizedLabel ( ) ) . tag ( filterOption )
Text ( filterOption . localizedLabel ( ) ) . tag ( filterOption )
@ -212,6 +274,7 @@ struct CashierView: View {
} label : {
} label : {
Text ( " Statut du règlement " )
Text ( " Statut du règlement " )
}
}
}
Picker ( selection : $ cashierViewModel . sortOption ) {
Picker ( selection : $ cashierViewModel . sortOption ) {
ForEach ( CashierViewModel . SortOption . allCases ) { sortOption in
ForEach ( CashierViewModel . SortOption . allCases ) { sortOption in
@ -239,12 +302,12 @@ struct CashierView: View {
switch cashierViewModel . sortOption {
switch cashierViewModel . sortOption {
case . teamRank :
case . teamRank :
TeamRankView ( teams : teams , displayTournamentTitle : tournaments . count > 1 )
TeamRankView ( teams : teams , displayTournamentTitle : tournaments . count > 1 , editingOptions : _editingOptions ( ) )
case . alphabeticalLastName , . alphabeticalFirstName , . playerRank , . age :
case . alphabeticalLastName , . alphabeticalFirstName , . playerRank , . age :
PlayerCashierView ( players : filteredPlayers , displayTournamentTitle : tournaments . count > 1 )
PlayerCashierView ( players : filteredPlayers , displayTournamentTitle : tournaments . count > 1 , editingOptions : _editingOptions ( ) )
case . callDate :
case . callDate :
let _teams = teams . filter ( { $0 . callDate != nil } )
let _teams = teams . filter ( { $0 . callDate != nil } )
TeamCallDateView ( teams : _teams , displayTournamentTitle : tournaments . count > 1 )
TeamCallDateView ( teams : _teams , displayTournamentTitle : tournaments . count > 1 , editingOptions : _editingOptions ( ) )
}
}
}
}
. onAppear {
. onAppear {
@ -279,11 +342,12 @@ struct CashierView: View {
@ EnvironmentObject var cashierViewModel : CashierViewModel
@ EnvironmentObject var cashierViewModel : CashierViewModel
let players : [ PlayerRegistration ]
let players : [ PlayerRegistration ]
let displayTournamentTitle : Bool
let displayTournamentTitle : Bool
let editingOptions : [ EditablePlayerView . PlayerEditingOption ]
var body : some View {
var body : some View {
ForEach ( players ) { player in
ForEach ( players ) { player in
Section {
Section {
EditablePlayerView ( player : player , editingOptions : [ . licenceId , . name , . payment ] )
EditablePlayerView ( player : player , editingOptions : editingOptions )
} header : {
} header : {
if displayTournamentTitle , let tournamentTitle = player . tournament ( ) ? . tournamentTitle ( ) {
if displayTournamentTitle , let tournamentTitle = player . tournament ( ) ? . tournamentTitle ( ) {
Text ( tournamentTitle )
Text ( tournamentTitle )
@ -301,6 +365,7 @@ struct CashierView: View {
@ EnvironmentObject var cashierViewModel : CashierViewModel
@ EnvironmentObject var cashierViewModel : CashierViewModel
let teams : [ TeamRegistration ]
let teams : [ TeamRegistration ]
let displayTournamentTitle : Bool
let displayTournamentTitle : Bool
let editingOptions : [ EditablePlayerView . PlayerEditingOption ]
var body : some View {
var body : some View {
ForEach ( teams ) { team in
ForEach ( teams ) { team in
@ -308,12 +373,18 @@ struct CashierView: View {
if players . isEmpty = = false {
if players . isEmpty = = false {
Section {
Section {
ForEach ( players ) { player in
ForEach ( players ) { player in
EditablePlayerView ( player : player , editingOptions : [ . licenceId , . name , . payment ] )
EditablePlayerView ( player : player , editingOptions : editingOptions )
}
}
} header : {
} header : {
HStack {
if let name = team . name {
Text ( name )
}
if displayTournamentTitle , let tournamentTitle = team . tournamentObject ( ) ? . tournamentTitle ( ) {
if displayTournamentTitle , let tournamentTitle = team . tournamentObject ( ) ? . tournamentTitle ( ) {
Spacer ( )
Text ( tournamentTitle )
Text ( tournamentTitle )
}
}
}
} footer : {
} footer : {
if let callDate = team . callDate {
if let callDate = team . callDate {
Text ( " convocation : " ) + Text ( callDate . localizedDate ( ) )
Text ( " convocation : " ) + Text ( callDate . localizedDate ( ) )
@ -329,6 +400,7 @@ struct CashierView: View {
@ EnvironmentObject var cashierViewModel : CashierViewModel
@ EnvironmentObject var cashierViewModel : CashierViewModel
let teams : [ TeamRegistration ]
let teams : [ TeamRegistration ]
let displayTournamentTitle : Bool
let displayTournamentTitle : Bool
let editingOptions : [ EditablePlayerView . PlayerEditingOption ]
var body : some View {
var body : some View {
let groupedTeams = Dictionary ( grouping : teams ) { team in
let groupedTeams = Dictionary ( grouping : teams ) { team in
@ -343,10 +415,15 @@ struct CashierView: View {
if players . isEmpty = = false {
if players . isEmpty = = false {
Section {
Section {
ForEach ( players ) { player in
ForEach ( players ) { player in
EditablePlayerView ( player : player , editingOptions : [ . licenceId , . name , . payment ] )
EditablePlayerView ( player : player , editingOptions : editingOptions )
}
}
} header : {
} header : {
if let name = team . name {
Text ( name )
}
if displayTournamentTitle , let tournamentTitle = team . tournamentObject ( ) ? . tournamentTitle ( ) {
if displayTournamentTitle , let tournamentTitle = team . tournamentObject ( ) ? . tournamentTitle ( ) {
Spacer ( )
Text ( tournamentTitle )
Text ( tournamentTitle )
}
}
} footer : {
} footer : {