Add more async stuff to MemberAdminWindow

This commit is contained in:
2023-03-21 16:47:13 +01:00
parent 914deb778b
commit 456cdaf3e0

View File

@ -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<Member> memberQuery = Context.Members;
if (ActiveMemberInput.IsChecked == true)
memberQuery = memberQuery.Where(m => m.IsActive);
List<Member> members = memberQuery.ToList();
List<Member> 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<Member>());
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<Member> 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<Member>? 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();