|
|
|
|
@ -338,6 +338,21 @@ struct MySearchView: View { |
|
|
|
|
_players = FetchRequest<ImportedPlayer>(sortDescriptors: searchViewModel.sortDescriptors(), predicate: searchViewModel.predicate()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func searchedPlayers() -> [ImportedPlayer] { |
|
|
|
|
if searchViewModel.searchText.isEmpty { |
|
|
|
|
return Array(players) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if let searchPredicate = searchViewModel.searchTextPredicate() { |
|
|
|
|
let filteredPlayers = players.filter { player in |
|
|
|
|
searchPredicate.evaluate(with: player) |
|
|
|
|
} |
|
|
|
|
return filteredPlayers |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Array(players) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var body: some View { |
|
|
|
|
playersView |
|
|
|
|
.overlay { |
|
|
|
|
@ -371,8 +386,6 @@ struct MySearchView: View { |
|
|
|
|
|
|
|
|
|
@ViewBuilder |
|
|
|
|
var playersView: some View { |
|
|
|
|
let showProgression = true |
|
|
|
|
let showFemaleInMaleAssimilation = searchViewModel.showFemaleInMaleAssimilation |
|
|
|
|
if searchViewModel.allowMultipleSelection { |
|
|
|
|
List(selection: $searchViewModel.selectedPlayers) { |
|
|
|
|
if searchViewModel.filterSelectionEnabled { |
|
|
|
|
@ -423,7 +436,7 @@ struct MySearchView: View { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
.id(UUID()) |
|
|
|
|
} else { |
|
|
|
|
} else if searchViewModel.shouldIncludeSearchTextPredicate() { |
|
|
|
|
Section { |
|
|
|
|
ForEach(players.indices, id: \.self) { index in |
|
|
|
|
let player = players[index] |
|
|
|
|
@ -435,26 +448,45 @@ struct MySearchView: View { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
.id(UUID()) |
|
|
|
|
} else { |
|
|
|
|
let filteredPlayers = searchedPlayers() |
|
|
|
|
|
|
|
|
|
Section { |
|
|
|
|
ForEach(filteredPlayers.indices, id: \.self) { index in |
|
|
|
|
let player = filteredPlayers[index] |
|
|
|
|
let realIndex = searchViewModel.showIndex() ? players.firstIndex(of: player) : nil |
|
|
|
|
let computedIndex = realIndex != nil ? realIndex! + 1 : nil |
|
|
|
|
ImportedPlayerView(player: player, index: computedIndex, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true) |
|
|
|
|
} |
|
|
|
|
} header: { |
|
|
|
|
if filteredPlayers.isEmpty == false { |
|
|
|
|
headerView() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
.id(UUID()) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
let filteredPlayers = searchedPlayers() |
|
|
|
|
Section { |
|
|
|
|
ForEach(players.indices, id: \.self) { index in |
|
|
|
|
let player = players[index] |
|
|
|
|
ForEach(filteredPlayers.indices, id: \.self) { index in |
|
|
|
|
let player = filteredPlayers[index] |
|
|
|
|
let realIndex = searchViewModel.showIndex() ? players.firstIndex(of: player) : nil |
|
|
|
|
let computedIndex = realIndex != nil ? realIndex! + 1 : nil |
|
|
|
|
if searchViewModel.allowSingleSelection { |
|
|
|
|
Button { |
|
|
|
|
searchViewModel.selectedPlayers.insert(player) |
|
|
|
|
} label: { |
|
|
|
|
ImportedPlayerView(player: player, index: searchViewModel.showIndex() ? (index + 1) : nil, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true) |
|
|
|
|
ImportedPlayerView(player: player, index: computedIndex, 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, showProgression: true) |
|
|
|
|
ImportedPlayerView(player: player, index: computedIndex, showFemaleInMaleAssimilation: searchViewModel.showFemaleInMaleAssimilation, showProgression: true) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} header: { |
|
|
|
|
if players.isEmpty == false { |
|
|
|
|
if filteredPlayers.isEmpty == false { |
|
|
|
|
headerView() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|