From c521bf5ffa5be1b9630d95edbaae662b0cd1dc4e Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 21 Mar 2023 20:35:21 +0100 Subject: [PATCH] Move CountMachesInMember to Member --- Elwig/Models/Member.cs | 28 ++++++++++++++++++++++++ Elwig/Windows/MemberAdminWindow.xaml.cs | 29 +++++-------------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/Elwig/Models/Member.cs b/Elwig/Models/Member.cs index 3670d86..4f22268 100644 --- a/Elwig/Models/Member.cs +++ b/Elwig/Models/Member.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; namespace Elwig.Models { [Table("member"), PrimaryKey("MgNr")] @@ -125,5 +126,32 @@ namespace Elwig.Models { [InverseProperty("Member")] public virtual BillingAddress BillingAddress { get; private set; } + + public int SearchScore(IEnumerable keywords) { + keywords = keywords.Where(s => s.Length >= 2 || (s.Length > 0 && s.All(c => char.IsDigit(c)))); + if (!keywords.Any()) + return 0; + + string?[] check = new string?[] { + MgNr.ToString(), + FamilyName.ToLower(), MiddleName?.ToLower(), GivenName.ToLower(), + BillingAddress?.Name.ToLower(), + Comment?.ToLower(), + }; + + int i = 0; + foreach (string? c in check) { + if (c == null) { + continue; + } else if (keywords.Any(f => c == f)) { + i += 100; + } else if (keywords.Any(f => c.Split(" ").Any(a => a == f))) { + i += 99; + } else if (keywords.Any(f => f != null && c.Contains(f))) { + i += 1; + } + } + return i; + } } } diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 6255ad6..c9e5ae7 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -55,24 +55,6 @@ namespace Elwig.Windows { base.OnClosing(evt); } - private int CountMatchesInMember(Member m) { - if (TextFilter.Count == 0) return 0; - string?[] check = new string?[] { - m.MgNr.ToString(), - m.FamilyName.ToLower(), m.MiddleName?.ToLower(), m.GivenName.ToLower(), - m.BillingAddress?.Name.ToLower() - }; - int i = 0; - foreach (string? c in check) { - if (c == null) continue; - if (TextFilter.Any(f => c == f)) - i += 10; - else if (TextFilter.Any(f => c.Contains(f))) - i += 1; - } - return i; - } - private async Task RefreshMemberList() { await Context.Members.LoadAsync(); await RefreshMemberListQuery(); @@ -87,7 +69,7 @@ namespace Elwig.Windows { if (TextFilter.Count > 0) { members = members - .ToDictionary(m => m, m => CountMatchesInMember(m)) + .ToDictionary(m => m, m => m.SearchScore(TextFilter)) .OrderByDescending(a => a.Value) .ThenBy(a => a.Key.FamilyName) .ThenBy(a => a.Key.GivenName) @@ -194,7 +176,8 @@ namespace Elwig.Windows { } private async void SaveButton_Click(object sender, RoutedEventArgs evt) { - Member m = await UpdateMember(IsEditing ? (Member)MemberList.SelectedItem : Context.CreateProxy()); + Member m = IsEditing ? (Member)MemberList.SelectedItem : Context.CreateProxy(); + await UpdateMember(m); IsEditing = false; IsCreating = false; MemberList.IsEnabled = true; @@ -234,7 +217,7 @@ namespace Elwig.Windows { } private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) { - TextFilter = SearchInput.Text.ToLower().Split(" ").ToList().FindAll(s => s.Length >= 2 || s.All(c => char.IsDigit(c))); + TextFilter = SearchInput.Text.ToLower().Split(" ").ToList().FindAll(e => e.Length > 0); await RefreshMemberListQuery(); } @@ -317,7 +300,7 @@ namespace Elwig.Windows { ActiveMemberInput.IsEnabled = true; } - private async Task UpdateMember(Member m) { + private async Task UpdateMember(Member m) { int newMgNr = int.Parse(MgNrInput.Text); m.PredecessorMgNr = (PredecessorMgNrInput.Text == "") ? null : int.Parse(PredecessorMgNrInput.Text); m.Prefix = (PrefixInput.Text == "") ? null : PrefixInput.Text; @@ -375,8 +358,6 @@ namespace Elwig.Windows { if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; MessageBox.Show(str, "Mitglied aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); } - - return m; } private void FillInputs(Member m) {