fix search player stuff

sync2
Raz 1 year ago
parent 03b3e13a36
commit 051065b453
  1. 4
      PadelClub/ViewModel/SearchViewModel.swift
  2. 65
      PadelClub/Views/Tournament/Screen/AddTeamView.swift
  3. 2
      PadelClub/Views/Tournament/Screen/TournamentRankView.swift

@ -168,7 +168,7 @@ class SearchViewModel: ObservableObject, Identifiable {
predicates.append(NSPredicate(format: "license contains[cd] %@", canonicalVersionWithoutPunctuation)) predicates.append(NSPredicate(format: "license contains[cd] %@", canonicalVersionWithoutPunctuation))
} }
predicates.append(NSPredicate(format: "canonicalFullName contains[cd] %@", canonicalVersionWithoutPunctuation)) predicates.append(NSPredicate(format: "canonicalFullName contains[cd] %@", canonicalVersionWithoutPunctuation))
let components = canonicalVersionWithoutPunctuation.split(separator: " ").sorted() let components = canonicalVersionWithoutPunctuation.split(separator: " ")
let pattern = components.joined(separator: ".*") let pattern = components.joined(separator: ".*")
let predicate = NSPredicate(format: "canonicalFullName MATCHES[c] %@", pattern) let predicate = NSPredicate(format: "canonicalFullName MATCHES[c] %@", pattern)
predicates.append(predicate) predicates.append(predicate)
@ -354,7 +354,7 @@ class SearchViewModel: ObservableObject, Identifiable {
orPredicates.append(contentsOf: nameComponents.map { NSPredicate(format: "firstName contains[cd] %@ OR lastName contains[cd] %@", $0,$0) }) orPredicates.append(contentsOf: nameComponents.map { NSPredicate(format: "firstName contains[cd] %@ OR lastName contains[cd] %@", $0,$0) })
} }
let components = text.split(separator: " ").sorted() let components = text.split(separator: " ")
let pattern = components.joined(separator: ".*") let pattern = components.joined(separator: ".*")
print(text, pattern) print(text, pattern)
let canonicalFullNamePredicate = NSPredicate(format: "canonicalFullName MATCHES[c] %@", pattern) let canonicalFullNamePredicate = NSPredicate(format: "canonicalFullName MATCHES[c] %@", pattern)

@ -41,6 +41,7 @@ struct AddTeamView: View {
@State private var homonyms: [PlayerRegistration] = [] @State private var homonyms: [PlayerRegistration] = []
@State private var confirmHomonym: Bool = false @State private var confirmHomonym: Bool = false
@State private var editableTextField: String = "" @State private var editableTextField: String = ""
@State private var textHeight: CGFloat = 100 // Default height
var tournamentStore: TournamentStore { var tournamentStore: TournamentStore {
return self.tournament.tournamentStore return self.tournament.tournamentStore
@ -67,6 +68,7 @@ struct AddTeamView: View {
_fetchPlayers = FetchRequest<ImportedPlayer>(sortDescriptors: [NSSortDescriptor(keyPath: \ImportedPlayer.rank, ascending: true)], predicate: SearchViewModel.pastePredicate(pasteField: pasteString, mostRecentDate: tournament.rankSourceDate, filterOption: tournament.tournamentCategory.playerFilterOption)) _fetchPlayers = FetchRequest<ImportedPlayer>(sortDescriptors: [NSSortDescriptor(keyPath: \ImportedPlayer.rank, ascending: true)], predicate: SearchViewModel.pastePredicate(pasteField: pasteString, mostRecentDate: tournament.rankSourceDate, filterOption: tournament.tournamentCategory.playerFilterOption))
_autoSelect = .init(wrappedValue: true) _autoSelect = .init(wrappedValue: true)
_editableTextField = .init(wrappedValue: pasteString) _editableTextField = .init(wrappedValue: pasteString)
_textHeight = .init(wrappedValue: Self._calculateHeight(text: pasteString))
cancelShouldDismiss = true cancelShouldDismiss = true
} }
} }
@ -121,7 +123,7 @@ struct AddTeamView: View {
selectionSearchField = nil selectionSearchField = nil
}) { }) {
NavigationStack { NavigationStack {
SelectablePlayerListView(allowSelection: -1, filterOption: _filterOption(), showFemaleInMaleAssimilation: tournament.tournamentCategory.showFemaleInMaleAssimilation) { players in SelectablePlayerListView(allowSelection: -1, searchField: searchField, filterOption: _filterOption(), showFemaleInMaleAssimilation: tournament.tournamentCategory.showFemaleInMaleAssimilation) { players in
selectionSearchField = nil selectionSearchField = nil
players.forEach { player in players.forEach { player in
let newPlayer = PlayerRegistration(importedPlayer: player) let newPlayer = PlayerRegistration(importedPlayer: player)
@ -147,7 +149,7 @@ struct AddTeamView: View {
} }
.toolbar { .toolbar {
ToolbarItem(placement: .cancellationAction) { ToolbarItem(placement: .cancellationAction) {
Button("Annuler", role: .cancel) { Button("Terminer", role: .cancel) {
dismiss() dismiss()
} }
} }
@ -166,7 +168,7 @@ struct AddTeamView: View {
} }
.navigationBarBackButtonHidden(true) .navigationBarBackButtonHidden(true)
.toolbarBackground(.visible, for: .navigationBar) .toolbarBackground(.visible, for: .navigationBar)
.toolbarBackground(.visible, for: .bottomBar) .toolbarBackground(.automatic, for: .bottomBar)
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationTitle(editedTeam == nil ? "Ajouter une équipe" : "Modifier l'équipe") .navigationTitle(editedTeam == nil ? "Ajouter une équipe" : "Modifier l'équipe")
.environment(\.editMode, Binding.constant(EditMode.active)) .environment(\.editMode, Binding.constant(EditMode.active))
@ -291,14 +293,16 @@ struct AddTeamView: View {
Logger.error(error) Logger.error(error)
} }
createdPlayers.removeAll() pasteString = nil
createdPlayerIds.removeAll() editableTextField = ""
pasteString = nil
editableTextField = ""
if team.players().count > 1 { if team.players().count > 1 {
dismiss() createdPlayers.removeAll()
} createdPlayerIds.removeAll()
dismiss()
} else {
editedTeam = team
}
} }
private func _updateTeam(checkDuplicates: Bool) { private func _updateTeam(checkDuplicates: Bool) {
@ -320,23 +324,37 @@ struct AddTeamView: View {
} catch { } catch {
Logger.error(error) Logger.error(error)
} }
createdPlayers.removeAll()
createdPlayerIds.removeAll()
pasteString = nil pasteString = nil
editableTextField = "" editableTextField = ""
self.editedTeam = nil
if editedTeam.players().count > 1 { if editedTeam.players().count > 1 {
dismiss() dismiss()
} }
} }
// Calculating the height based on the content of the TextEditor
static private func _calculateHeight(text: String) -> CGFloat {
let size = CGSize(width: UIScreen.main.bounds.width - 32, height: .infinity)
let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 17)]
let boundingRect = text.boundingRect(
with: size,
options: .usesLineFragmentOrigin,
attributes: attributes,
context: nil
)
return max(boundingRect.height + 20, 40) // Add some padding and set a minimum height
}
@ViewBuilder @ViewBuilder
private func _buildingTeamView() -> some View { private func _buildingTeamView() -> some View {
if let pasteString { if let pasteString {
Section { Section {
TextEditor(text: $editableTextField) TextEditor(text: $editableTextField)
.frame(minHeight: 120, maxHeight: .infinity) .frame(height: textHeight)
.onChange(of: editableTextField) {
textHeight = Self._calculateHeight(text: pasteString)
}
.focused($focusedField, equals: .pasteField) .focused($focusedField, equals: .pasteField)
.toolbar { .toolbar {
ToolbarItemGroup(placement: .keyboard) { ToolbarItemGroup(placement: .keyboard) {
@ -360,12 +378,10 @@ struct AddTeamView: View {
self.focusedField = .pasteField self.focusedField = .pasteField
} }
Spacer() Spacer()
FooterButtonView("effacer", role: .destructive) { FooterButtonView("effacer le texte") {
self.focusedField = nil self.focusedField = nil
self.editableTextField = "" self.editableTextField = ""
self.pasteString = nil self.pasteString = nil
self.createdPlayers.removeAll()
self.createdPlayerIds.removeAll()
} }
} }
} }
@ -379,11 +395,12 @@ struct AddTeamView: View {
Text("Déjà inscrit !").foregroundStyle(.logoRed).bold() Text("Déjà inscrit !").foregroundStyle(.logoRed).bold()
} }
PlayerView(player: p).tag(p.id) PlayerView(player: p).tag(p.id)
.environment(tournament)
} }
} }
if let p = fetchPlayers.first(where: { $0.license == id }) { if let p = fetchPlayers.first(where: { $0.license == id }) {
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
if unsortedPlayers.first(where: { $0.licenceId == p.license }) != nil { if pasteString != nil, unsortedPlayers.first(where: { $0.licenceId == p.license }) != nil {
Text("Déjà inscrit !").foregroundStyle(.logoRed).bold() Text("Déjà inscrit !").foregroundStyle(.logoRed).bold()
} }
ImportedPlayerView(player: p).tag(p.license!) ImportedPlayerView(player: p).tag(p.license!)
@ -437,7 +454,9 @@ struct AddTeamView: View {
if let pasteString { if let pasteString {
if fetchPlayers.isEmpty { let sortedPlayers = fetchPlayers.filter({ $0.contains(searchField) || searchField.isEmpty })
if sortedPlayers.isEmpty {
ContentUnavailableView { ContentUnavailableView {
Label("Aucun résultat", systemImage: "person.2.slash") Label("Aucun résultat", systemImage: "person.2.slash")
} description: { } description: {
@ -446,7 +465,11 @@ struct AddTeamView: View {
RowButtonView("Créer un joueur non classé") { RowButtonView("Créer un joueur non classé") {
presentPlayerCreation = true presentPlayerCreation = true
} }
RowButtonView("Chercher dans la base") {
presentPlayerSearch = true
}
RowButtonView("Effacer cette recherche") { RowButtonView("Effacer cette recherche") {
self.pasteString = nil self.pasteString = nil
self.editableTextField = "" self.editableTextField = ""
@ -489,6 +512,7 @@ struct AddTeamView: View {
fetchPlayers.nsSortDescriptors = [NSSortDescriptor(keyPath: \ImportedPlayer.rank, ascending: true)] fetchPlayers.nsSortDescriptors = [NSSortDescriptor(keyPath: \ImportedPlayer.rank, ascending: true)]
pasteString = first pasteString = first
editableTextField = first editableTextField = first
textHeight = Self._calculateHeight(text: first)
autoSelect = true autoSelect = true
} }
} }
@ -503,6 +527,7 @@ struct AddTeamView: View {
Section { Section {
ForEach(sortedPlayers) { player in ForEach(sortedPlayers) { player in
ImportedPlayerView(player: player).tag(player.license!) ImportedPlayerView(player: player).tag(player.license!)
//Text(player.getLastName() + " " + player.getFirstName()).tag(player.license!)
} }
} header: { } header: {
Text(sortedPlayers.count.formatted() + " résultat" + sortedPlayers.count.pluralSuffix) Text(sortedPlayers.count.formatted() + " résultat" + sortedPlayers.count.pluralSuffix)

@ -51,7 +51,7 @@ struct TournamentRankView: View {
Logger.error(error) Logger.error(error)
} }
} }
//affiche l'onglet sur le site, car sur le broadcast c'est dispo automatiquement de toute façon
Toggle(isOn: $tournament.publishRankings) { Toggle(isOn: $tournament.publishRankings) {
Text("Publier sur Padel Club") Text("Publier sur Padel Club")
if let url = tournament.shareURL(.rankings) { if let url = tournament.shareURL(.rankings) {

Loading…
Cancel
Save