From 456cdaf3e066ed6f84b3aef2af54f8fbf985c3fd Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 21 Mar 2023 16:47:13 +0100 Subject: [PATCH] Add more async stuff to MemberAdminWindow --- Elwig/Windows/MemberAdminWindow.xaml.cs | 167 +++++++++++++----------- 1 file changed, 91 insertions(+), 76 deletions(-) diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 62ba62e..6255ad6 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -9,7 +9,8 @@ using System.Windows.Controls; using System.Windows.Input; using Elwig.Helpers; using Elwig.Models; - +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.ChangeTracking; namespace Elwig.Windows { public partial class MemberAdminWindow : Window { @@ -72,27 +73,34 @@ namespace Elwig.Windows { return i; } - private void RefreshMemberList() { - Context.Members.Load(); - RefreshMemberListQuery(); + private async Task RefreshMemberList() { + await Context.Members.LoadAsync(); + await RefreshMemberListQuery(); } - private void RefreshMemberListQuery() { + private async Task RefreshMemberListQuery() { IQueryable memberQuery = Context.Members; if (ActiveMemberInput.IsChecked == true) memberQuery = memberQuery.Where(m => m.IsActive); - List members = memberQuery.ToList(); + List members = await memberQuery.ToListAsync(); if (TextFilter.Count > 0) { members = members .ToDictionary(m => m, m => CountMatchesInMember(m)) .OrderByDescending(a => a.Value) + .ThenBy(a => a.Key.FamilyName) + .ThenBy(a => a.Key.GivenName) .Where(a => a.Value > 0) .Select(a => a.Key) .ToList(); + } else { + members = members + .OrderBy(m => m.FamilyName) + .ThenBy(m => m.GivenName) + .ToList(); } - members = members.OrderBy(m => m.FamilyName + " " + m.GivenName).ToList(); + MemberList.ItemsSource = members; if (members.Count == 1) MemberList.SelectedIndex = 0; @@ -141,8 +149,8 @@ namespace Elwig.Windows { RefreshInputs(); } - private void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) { - RefreshMemberListQuery(); + private async void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) { + await RefreshMemberListQuery(); } private void NewMemberButton_Click(object sender, RoutedEventArgs evt) { @@ -169,81 +177,24 @@ namespace Elwig.Windows { LockSearchInputs(); } - private void DeleteMemberButton_Click(object sender, RoutedEventArgs evt) { + private async void DeleteMemberButton_Click(object sender, RoutedEventArgs evt) { Member m = (Member)MemberList.SelectedItem; if (m == null) return; + DeleteMemberButton.IsEnabled = false; + EditMemberButton.IsEnabled = false; var r = MessageBox.Show( $"Soll das Mitglied \"{m.FamilyName} {m.GivenName}\" (MgNr. {m.MgNr}) wirklich unwiderruflich gelöscht werden?", "Mitglied löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); if (r == MessageBoxResult.Yes) { Context.Remove(m); - Context.SaveChanges(); - RefreshMemberList(); + await Context.SaveChangesAsync(); + await RefreshMemberList(); } } - private void SaveButton_Click(object sender, RoutedEventArgs evt) { - Member? m = new(); - if (IsEditing) - m = (Member)MemberList.SelectedItem; - else if (IsCreating) - m = new(); - - int newMgNr = int.Parse(MgNrInput.Text); - m.PredecessorMgNr = (PredecessorMgNrInput.Text == "") ? null : int.Parse(PredecessorMgNrInput.Text); - m.Prefix = (PrefixInput.Text == "") ? null : PrefixInput.Text; - m.GivenName = GivenNameInput.Text; - m.FamilyName = FamilyNameInput.Text; - m.Suffix = (SuffixInput.Text == "") ? null : SuffixInput.Text; - m.Birthday = (BirthdayInput.Text == "") ? null : string.Join("-", BirthdayInput.Text.Split(".").Reverse()); - m.CountryCode = "AT"; - m.PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id; - m.Address = AddressInput.Text; - - m.Email = (EmailInput.Text == "") ? null : EmailInput.Text; - m.PhoneLandline = (PhoneLandlineInput.Text == "") ? null : PhoneLandlineInput.Text.Replace(" ", ""); - m.PhoneMobile1 = (PhoneMobile1Input.Text == "") ? null : PhoneMobile1Input.Text.Replace(" ", ""); - m.PhoneMobile2 = (PhoneMobile2Input.Text == "") ? null : PhoneMobile2Input.Text.Replace(" ", ""); - - m.Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", ""); - m.Bic = (BicInput.Text == "") ? null : BicInput.Text; - - m.UstId = (UstIdInput.Text == "") ? null : UstIdInput.Text; - m.LfbisNr = (LfbisNrInput.Text == "") ? null : LfbisNrInput.Text; - m.IsBuchführend = BuchführendInput.IsChecked ?? false; - - // TODO Rechnungsadresse - - m.EntryDate = (EntryDateInput.Text == "") ? null : string.Join("-", EntryDateInput.Text.Split(".").Reverse()); - m.ExitDate = (ExitDateInput.Text == "") ? null : string.Join("-", ExitDateInput.Text.Split(".").Reverse()); - m.BusinessShares = (BusinessSharesInput.Text == "") ? 0 : int.Parse(BusinessSharesInput.Text); - m.AccountingNr = (AccountingNrInput.Text == "") ? null : AccountingNrInput.Text; - m.IsActive = ActiveInput.IsChecked ?? false; - m.IsVollLieferant = VollLieferantInput.IsChecked ?? false; - m.IsFunktionär = FunkionärInput.IsChecked ?? false; - m.ZwstId = ((Branch)BranchInput.SelectedItem).ZwstId; - m.DefaultKgNr = ((AT_Kg)DefaultKgInput.SelectedItem).KgNr; - m.Comment = (CommentInput.Text == "") ? null : CommentInput.Text; - m.DefaultContact = "post"; - if (ContactPostInput.IsChecked ?? false) m.DefaultContact = "post"; - if (ContactEmailInput.IsChecked ?? false) m.DefaultContact = "email"; - - try { - if (IsEditing) - Context.Update(m); - else if (IsCreating) - Context.Add(m); - Context.SaveChanges(); - - if (newMgNr != m.MgNr) - Context.Database.ExecuteSql($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {m.MgNr}"); - } catch (Exception exc) { - var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - MessageBox.Show(str, "Mitglied aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); - } - + private async void SaveButton_Click(object sender, RoutedEventArgs evt) { + Member m = await UpdateMember(IsEditing ? (Member)MemberList.SelectedItem : Context.CreateProxy()); IsEditing = false; IsCreating = false; MemberList.IsEnabled = true; @@ -251,7 +202,9 @@ namespace Elwig.Windows { ShowNewEditDeleteButtons(); LockInputs(); UnlockSearchInputs(); - RefreshMemberList(); + await RefreshMemberList(); + SearchInput.Text = ""; + MemberList.SelectedItem = m; } private void ResetButton_Click(object sender, RoutedEventArgs evt) { @@ -280,9 +233,9 @@ namespace Elwig.Windows { w.Show(); } - private void SearchInput_TextChanged(object sender, RoutedEventArgs evt) { + 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))); - RefreshMemberListQuery(); + await RefreshMemberListQuery(); } private void Menu_Member_SendEmail_Click(object sender, RoutedEventArgs evt) { @@ -364,6 +317,68 @@ namespace Elwig.Windows { ActiveMemberInput.IsEnabled = true; } + 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; + m.GivenName = GivenNameInput.Text; + m.FamilyName = FamilyNameInput.Text; + m.Suffix = (SuffixInput.Text == "") ? null : SuffixInput.Text; + m.Birthday = (BirthdayInput.Text == "") ? null : string.Join("-", BirthdayInput.Text.Split(".").Reverse()); + m.CountryCode = "AT"; + m.PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id; + m.Address = AddressInput.Text; + + m.Email = (EmailInput.Text == "") ? null : EmailInput.Text; + m.PhoneLandline = (PhoneLandlineInput.Text == "") ? null : PhoneLandlineInput.Text.Replace(" ", ""); + m.PhoneMobile1 = (PhoneMobile1Input.Text == "") ? null : PhoneMobile1Input.Text.Replace(" ", ""); + m.PhoneMobile2 = (PhoneMobile2Input.Text == "") ? null : PhoneMobile2Input.Text.Replace(" ", ""); + + m.Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", ""); + m.Bic = (BicInput.Text == "") ? null : BicInput.Text; + + m.UstId = (UstIdInput.Text == "") ? null : UstIdInput.Text; + m.LfbisNr = (LfbisNrInput.Text == "") ? null : LfbisNrInput.Text; + m.IsBuchführend = BuchführendInput.IsChecked ?? false; + + // TODO Rechnungsadresse + + m.EntryDate = (EntryDateInput.Text == "") ? null : string.Join("-", EntryDateInput.Text.Split(".").Reverse()); + m.ExitDate = (ExitDateInput.Text == "") ? null : string.Join("-", ExitDateInput.Text.Split(".").Reverse()); + m.BusinessShares = (BusinessSharesInput.Text == "") ? 0 : int.Parse(BusinessSharesInput.Text); + m.AccountingNr = (AccountingNrInput.Text == "") ? null : AccountingNrInput.Text; + m.IsActive = ActiveInput.IsChecked ?? false; + m.IsVollLieferant = VollLieferantInput.IsChecked ?? false; + m.IsFunktionär = FunkionärInput.IsChecked ?? false; + m.ZwstId = ((Branch)BranchInput.SelectedItem).ZwstId; + m.DefaultKgNr = ((AT_Kg)DefaultKgInput.SelectedItem).KgNr; + m.Comment = (CommentInput.Text == "") ? null : CommentInput.Text; + m.DefaultContact = "post"; + if (ContactPostInput.IsChecked ?? false) m.DefaultContact = "post"; + if (ContactEmailInput.IsChecked ?? false) m.DefaultContact = "email"; + + try { + EntityEntry? tr = null; + if (IsEditing) { + tr = Context.Update(m); + } else if (IsCreating) { + m.MgNr = newMgNr; + await Context.AddAsync(m); + } + await Context.SaveChangesAsync(); + + if (newMgNr != m.MgNr) { + await Context.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {m.MgNr}"); + } + } catch (Exception exc) { + var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; + 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) { OriginalValues.Clear();