Outsource many methods from MemberAdminWindow to abstract classes
This commit is contained in:
261
Elwig/Windows/AdministrationWindow.cs
Normal file
261
Elwig/Windows/AdministrationWindow.cs
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
namespace Elwig.Windows {
|
||||||
|
public abstract class AdministrationWindow : ContextWindow {
|
||||||
|
protected Control[] ExemptInputs { private get; set; }
|
||||||
|
protected Control[] RequiredInputs { private get; set; }
|
||||||
|
private TextBox[] TextBoxInputs;
|
||||||
|
private ComboBox[] ComboBoxInputs;
|
||||||
|
private CheckBox[] CheckBoxInputs;
|
||||||
|
private RadioButton[] RadioButtonInputs;
|
||||||
|
private readonly Dictionary<Control, bool> Valid;
|
||||||
|
private readonly Dictionary<Control, object?> OriginalValues;
|
||||||
|
|
||||||
|
public AdministrationWindow() : base() {
|
||||||
|
ExemptInputs = Array.Empty<Control>();
|
||||||
|
RequiredInputs = Array.Empty<Control>();
|
||||||
|
TextBoxInputs = Array.Empty<TextBox>();
|
||||||
|
ComboBoxInputs = Array.Empty<ComboBox>();
|
||||||
|
CheckBoxInputs = Array.Empty<CheckBox>();
|
||||||
|
RadioButtonInputs = Array.Empty<RadioButton>();
|
||||||
|
Valid = new();
|
||||||
|
OriginalValues = new();
|
||||||
|
Loaded += OnLoaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLoaded(object sender, RoutedEventArgs evt) {
|
||||||
|
TextBoxInputs = Utils.FindVisualChilds<TextBox>(this, ExemptInputs).ToArray();
|
||||||
|
ComboBoxInputs = Utils.FindVisualChilds<ComboBox>(this, ExemptInputs).ToArray();
|
||||||
|
CheckBoxInputs = Utils.FindVisualChilds<CheckBox>(this, ExemptInputs).ToArray();
|
||||||
|
RadioButtonInputs = Utils.FindVisualChilds<RadioButton>(this, ExemptInputs).ToArray();
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
Valid[tb] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract protected void UpdateButtons();
|
||||||
|
|
||||||
|
protected void ValidateInput(Control input, bool valid) {
|
||||||
|
Valid[input] = valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool SenderIsRequired(object sender) {
|
||||||
|
return (sender is Control c) && RequiredInputs.Contains(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ClearInputStates() {
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
Utils.ClearInputState(tb);
|
||||||
|
foreach (var cb in ComboBoxInputs)
|
||||||
|
Utils.ClearInputState(cb);
|
||||||
|
foreach (var cb in CheckBoxInputs)
|
||||||
|
Utils.ClearInputState(cb);
|
||||||
|
foreach (var rb in RadioButtonInputs)
|
||||||
|
Utils.ClearInputState(rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ValidateRequiredInputs() {
|
||||||
|
foreach (var input in RequiredInputs) {
|
||||||
|
if (input is TextBox tb && tb.Text.Length == 0) {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
Valid[input] = false;
|
||||||
|
} else if (input is ComboBox cb && cb.SelectedItem == null) {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var cb in ComboBoxInputs) {
|
||||||
|
if (cb.ItemsSource != null && cb.SelectedItem == null)
|
||||||
|
Utils.SetInputInvalid(cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void LockInputs() {
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
tb.IsReadOnly = true;
|
||||||
|
foreach (var cb in ComboBoxInputs)
|
||||||
|
cb.IsEnabled = false;
|
||||||
|
foreach (var cb in CheckBoxInputs)
|
||||||
|
cb.IsEnabled = false;
|
||||||
|
foreach (var rb in RadioButtonInputs)
|
||||||
|
rb.IsEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UnlockInputs() {
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
tb.IsReadOnly = false;
|
||||||
|
foreach (var cb in ComboBoxInputs)
|
||||||
|
cb.IsEnabled = true;
|
||||||
|
foreach (var cb in CheckBoxInputs)
|
||||||
|
cb.IsEnabled = true;
|
||||||
|
foreach (var rb in RadioButtonInputs)
|
||||||
|
rb.IsEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ClearOriginalValues() {
|
||||||
|
OriginalValues.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void FillOriginalValues() {
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
OriginalValues[tb] = tb.Text;
|
||||||
|
foreach (var cb in ComboBoxInputs)
|
||||||
|
OriginalValues[cb] = cb.SelectedItem;
|
||||||
|
foreach (var cb in CheckBoxInputs)
|
||||||
|
OriginalValues[cb] = (cb.IsChecked ?? false) ? bool.TrueString : null;
|
||||||
|
foreach (var rb in RadioButtonInputs)
|
||||||
|
OriginalValues[rb] = (rb.IsChecked ?? false) ? bool.TrueString : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ClearInputs() {
|
||||||
|
foreach (var tb in TextBoxInputs)
|
||||||
|
tb.Text = "";
|
||||||
|
foreach (var cb in ComboBoxInputs)
|
||||||
|
cb.SelectedItem = null;
|
||||||
|
foreach (var cb in CheckBoxInputs)
|
||||||
|
cb.IsChecked = false;
|
||||||
|
foreach (var rb in RadioButtonInputs)
|
||||||
|
rb.IsChecked = false;
|
||||||
|
ValidateRequiredInputs();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool IsValid() {
|
||||||
|
return Valid.All(kv => kv.Value) && ComboBoxInputs.All(cb => cb.ItemsSource == null || cb.SelectedItem != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool InputHasChanged(Control input) {
|
||||||
|
if (!OriginalValues.ContainsKey(input)) {
|
||||||
|
return false;
|
||||||
|
} else if (input is TextBox tb) {
|
||||||
|
return OriginalValues[tb]?.ToString() != tb.Text;
|
||||||
|
} else if (input is ComboBox sb) {
|
||||||
|
return OriginalValues[sb] != sb.SelectedItem;
|
||||||
|
} else if (input is CheckBox cb) {
|
||||||
|
return (OriginalValues[cb] != null) != (cb.IsChecked ?? false);
|
||||||
|
} else if (input is RadioButton rb) {
|
||||||
|
return (OriginalValues[rb] != null) != (rb.IsChecked ?? false);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool HasChanged() {
|
||||||
|
return !IsValid() ||
|
||||||
|
TextBoxInputs.Any(InputHasChanged) ||
|
||||||
|
ComboBoxInputs.Any(InputHasChanged) ||
|
||||||
|
CheckBoxInputs.Any(InputHasChanged) ||
|
||||||
|
RadioButtonInputs.Any(InputHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UpdatePlz(TextBox plzInput, ComboBox ortInput) {
|
||||||
|
if (plzInput.Text.Length == 4) {
|
||||||
|
int plz = int.Parse(plzInput.Text);
|
||||||
|
ortInput.ItemsSource = Context.Postleitzahlen.Where(p => p.Plz == plz).ToHashSet();
|
||||||
|
} else {
|
||||||
|
ortInput.ItemsSource = null;
|
||||||
|
}
|
||||||
|
ortInput.SelectedItem = null;
|
||||||
|
if (ortInput.ItemsSource != null) {
|
||||||
|
Utils.SetInputInvalid(ortInput);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(ortInput);
|
||||||
|
}
|
||||||
|
ValidateInput(plzInput, SenderIsRequired(plzInput) || (ortInput.ItemsSource != null));
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputTextChanged(TextBox input, Func<TextBox, bool, ValidationResult> checker) {
|
||||||
|
InputTextChanged(input, (tb, required, ctx) => checker(tb, required));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AppDbContext, ValidationResult> checker) {
|
||||||
|
InputTextChanged(input, checker(input, SenderIsRequired(input), Context));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputTextChanged(TextBox input, ValidationResult res) {
|
||||||
|
ValidateInput(input, res.IsValid);
|
||||||
|
if (res.IsValid) {
|
||||||
|
if (InputHasChanged(input)) {
|
||||||
|
Utils.SetInputChanged(input);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(input);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
}
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputLostFocus(TextBox input, Func<TextBox, bool, ValidationResult> checker, string? msg = null) {
|
||||||
|
InputLostFocus(input, (tb, requiered, ctx) => checker(tb, requiered), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AppDbContext, ValidationResult> checker, string? msg = null) {
|
||||||
|
InputLostFocus(input, checker(input, SenderIsRequired(input), Context), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void InputLostFocus(TextBox input, ValidationResult res, string? msg = null) {
|
||||||
|
if (!res.IsValid)
|
||||||
|
MessageBox.Show(res.ErrorContent.ToString(), msg ?? res.ErrorContent.ToString(), MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void CheckBox_Changed(object sender, RoutedEventArgs evt) {
|
||||||
|
var input = (CheckBox)sender;
|
||||||
|
if (SenderIsRequired(input) && input.IsChecked != true) {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
} else if (InputHasChanged(input)) {
|
||||||
|
Utils.SetInputChanged(input);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(input);
|
||||||
|
}
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void RadioButton_Changed(object sender, RoutedEventArgs evt) {
|
||||||
|
var input = (RadioButton)sender;
|
||||||
|
if (SenderIsRequired(input) && input.IsChecked != true) {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
} else if (InputHasChanged(input)) {
|
||||||
|
Utils.SetInputChanged(input);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(input);
|
||||||
|
}
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void TextBox_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
|
var input = (TextBox)sender;
|
||||||
|
if (SenderIsRequired(input) && input.Text.Length == 0) {
|
||||||
|
ValidateInput(input, false);
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
} else {
|
||||||
|
ValidateInput(input, true);
|
||||||
|
if (InputHasChanged(input)) {
|
||||||
|
Utils.SetInputChanged(input);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ComboBox_SelectionChanged(object sender, RoutedEventArgs evt) {
|
||||||
|
var input = (ComboBox)sender;
|
||||||
|
if (input.ItemsSource != null && input.SelectedItem == null) {
|
||||||
|
Utils.SetInputInvalid(input);
|
||||||
|
} else if (InputHasChanged(input)) {
|
||||||
|
Utils.SetInputChanged(input);
|
||||||
|
} else {
|
||||||
|
Utils.ClearInputState(input);
|
||||||
|
}
|
||||||
|
UpdateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
23
Elwig/Windows/ContextWindow.cs
Normal file
23
Elwig/Windows/ContextWindow.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace Elwig.Windows {
|
||||||
|
public abstract class ContextWindow : Window {
|
||||||
|
protected readonly AppDbContext Context;
|
||||||
|
|
||||||
|
public ContextWindow() : base() {
|
||||||
|
Context = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnClosing(CancelEventArgs evt) {
|
||||||
|
Context.Dispose();
|
||||||
|
base.OnClosing(evt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
<Window x:Class="Elwig.Windows.MemberAdminWindow"
|
<local:AdministrationWindow x:Class="Elwig.Windows.MemberAdminWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@ -305,4 +305,4 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</local:AdministrationWindow>
|
||||||
|
@ -13,20 +13,11 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class MemberAdminWindow : Window {
|
public partial class MemberAdminWindow : AdministrationWindow {
|
||||||
private bool IsEditing = false;
|
private bool IsEditing = false;
|
||||||
private bool IsCreating = false;
|
private bool IsCreating = false;
|
||||||
private List<string> TextFilter = new();
|
private List<string> TextFilter = new();
|
||||||
private readonly Control[] ExemptInputs;
|
|
||||||
private readonly Control[] RequiredInputs;
|
|
||||||
private IEnumerable<TextBox> TextBoxInputs = Array.Empty<TextBox>();
|
|
||||||
private IEnumerable<ComboBox> ComboBoxInputs = Array.Empty<ComboBox>();
|
|
||||||
private IEnumerable<CheckBox> CheckBoxInputs = Array.Empty<CheckBox>();
|
|
||||||
private IEnumerable<RadioButton> RadioButtonInputs = Array.Empty<RadioButton>();
|
|
||||||
private readonly Dictionary<Control, bool> Valid = new();
|
|
||||||
private readonly Dictionary<Control, object?> OriginalValues = new();
|
|
||||||
private readonly RoutedCommand CtrlF = new();
|
private readonly RoutedCommand CtrlF = new();
|
||||||
private readonly AppDbContext Context = new();
|
|
||||||
|
|
||||||
public MemberAdminWindow() {
|
public MemberAdminWindow() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@ -48,21 +39,6 @@ namespace Elwig.Windows {
|
|||||||
ActiveMemberInput.IsChecked = true;
|
ActiveMemberInput.IsChecked = true;
|
||||||
BranchInput.ItemsSource = Context.Branches.OrderBy(b => b.Name).ToList();
|
BranchInput.ItemsSource = Context.Branches.OrderBy(b => b.Name).ToList();
|
||||||
DefaultKgInput.ItemsSource = Context.WbKgs.Select(k => k.Kg).OrderBy(k => k.Name).ToList();
|
DefaultKgInput.ItemsSource = Context.WbKgs.Select(k => k.Kg).OrderBy(k => k.Name).ToList();
|
||||||
TextBoxInputs = Utils.FindVisualChilds<TextBox>(this, ExemptInputs).ToList();
|
|
||||||
ComboBoxInputs = Utils.FindVisualChilds<ComboBox>(this, ExemptInputs).ToList();
|
|
||||||
CheckBoxInputs = Utils.FindVisualChilds<CheckBox>(this, ExemptInputs).ToList();
|
|
||||||
RadioButtonInputs = Utils.FindVisualChilds<RadioButton>(this, ExemptInputs).ToList();
|
|
||||||
foreach (var tb in TextBoxInputs)
|
|
||||||
Valid[tb] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnClosing(CancelEventArgs evt) {
|
|
||||||
Context.Dispose();
|
|
||||||
base.OnClosing(evt);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool SenderIsRequired(object sender) {
|
|
||||||
return (sender is Control c) && RequiredInputs.Contains(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshMemberList() {
|
private async Task RefreshMemberList() {
|
||||||
@ -100,17 +76,6 @@ namespace Elwig.Windows {
|
|||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearInputStates() {
|
|
||||||
foreach (var tb in TextBoxInputs)
|
|
||||||
Utils.ClearInputState(tb);
|
|
||||||
foreach (var cb in ComboBoxInputs)
|
|
||||||
Utils.ClearInputState(cb);
|
|
||||||
foreach (var cb in CheckBoxInputs)
|
|
||||||
Utils.ClearInputState(cb);
|
|
||||||
foreach (var rb in RadioButtonInputs)
|
|
||||||
Utils.ClearInputState(rb);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RefreshInputs(bool validate = false) {
|
private void RefreshInputs(bool validate = false) {
|
||||||
ClearInputStates();
|
ClearInputStates();
|
||||||
Member m = (Member)MemberList.SelectedItem;
|
Member m = (Member)MemberList.SelectedItem;
|
||||||
@ -137,14 +102,7 @@ namespace Elwig.Windows {
|
|||||||
ActiveInput.IsChecked = true;
|
ActiveInput.IsChecked = true;
|
||||||
ContactPostInput.IsChecked = true;
|
ContactPostInput.IsChecked = true;
|
||||||
FillOriginalValues();
|
FillOriginalValues();
|
||||||
foreach (var input in RequiredInputs) {
|
ValidateRequiredInputs();
|
||||||
if (input is TextBox tb && tb.Text.Length == 0) {
|
|
||||||
Utils.SetInputInvalid(input);
|
|
||||||
Valid[input] = false;
|
|
||||||
} else if (input is ComboBox cb && cb.SelectedItem == null) {
|
|
||||||
Utils.SetInputInvalid(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
private void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
||||||
@ -288,28 +246,6 @@ namespace Elwig.Windows {
|
|||||||
DeleteMemberButton.Visibility = Visibility.Hidden;
|
DeleteMemberButton.Visibility = Visibility.Hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LockInputs() {
|
|
||||||
foreach (var tb in TextBoxInputs)
|
|
||||||
tb.IsReadOnly = true;
|
|
||||||
foreach (var cb in ComboBoxInputs)
|
|
||||||
cb.IsEnabled = false;
|
|
||||||
foreach (var cb in CheckBoxInputs)
|
|
||||||
cb.IsEnabled = false;
|
|
||||||
foreach (var rb in RadioButtonInputs)
|
|
||||||
rb.IsEnabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UnlockInputs() {
|
|
||||||
foreach (var tb in TextBoxInputs)
|
|
||||||
tb.IsReadOnly = false;
|
|
||||||
foreach (var cb in ComboBoxInputs)
|
|
||||||
cb.IsEnabled = true;
|
|
||||||
foreach (var cb in CheckBoxInputs)
|
|
||||||
cb.IsEnabled = true;
|
|
||||||
foreach (var rb in RadioButtonInputs)
|
|
||||||
rb.IsEnabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LockSearchInputs() {
|
private void LockSearchInputs() {
|
||||||
SearchInput.IsEnabled = false;
|
SearchInput.IsEnabled = false;
|
||||||
ActiveMemberInput.IsEnabled = false;
|
ActiveMemberInput.IsEnabled = false;
|
||||||
@ -386,7 +322,7 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void FillInputs(Member m) {
|
private void FillInputs(Member m) {
|
||||||
OriginalValues.Clear();
|
ClearOriginalValues();
|
||||||
|
|
||||||
MgNrInput.Text = m.MgNr.ToString();
|
MgNrInput.Text = m.MgNr.ToString();
|
||||||
PredecessorMgNrInput.Text = m.PredecessorMgNr.ToString();
|
PredecessorMgNrInput.Text = m.PredecessorMgNr.ToString();
|
||||||
@ -459,267 +395,122 @@ namespace Elwig.Windows {
|
|||||||
FillOriginalValues();
|
FillOriginalValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FillOriginalValues() {
|
protected void ClearInputs() {
|
||||||
foreach (var tb in TextBoxInputs)
|
|
||||||
OriginalValues[tb] = tb.Text;
|
|
||||||
foreach (var cb in ComboBoxInputs)
|
|
||||||
OriginalValues[cb] = cb.SelectedItem;
|
|
||||||
foreach (var cb in CheckBoxInputs)
|
|
||||||
OriginalValues[cb] = (cb.IsChecked ?? false) ? bool.TrueString : null;
|
|
||||||
foreach (var rb in RadioButtonInputs)
|
|
||||||
OriginalValues[rb] = (rb.IsChecked ?? false) ? bool.TrueString : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ClearInputs() {
|
|
||||||
Menu_Member_SendEmail.IsEnabled = false;
|
Menu_Member_SendEmail.IsEnabled = false;
|
||||||
AreaCommitment.Text = "- m²";
|
AreaCommitment.Text = "- m²";
|
||||||
OriginalValues.Clear();
|
ClearOriginalValues();
|
||||||
foreach (var tb in TextBoxInputs) {
|
base.ClearInputs();
|
||||||
tb.Text = " ";
|
|
||||||
tb.Text = "";
|
|
||||||
}
|
|
||||||
foreach (var cb in ComboBoxInputs) {
|
|
||||||
cb.SelectedItem = null;
|
|
||||||
if (cb.ItemsSource != null)
|
|
||||||
Utils.SetInputInvalid(cb);
|
|
||||||
}
|
|
||||||
foreach (var cb in CheckBoxInputs)
|
|
||||||
cb.IsChecked = false;
|
|
||||||
foreach (var rb in RadioButtonInputs)
|
|
||||||
rb.IsChecked = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsValid() {
|
override protected void UpdateButtons() {
|
||||||
return Valid.All(kv => kv.Value) && ComboBoxInputs.All(cb => cb.ItemsSource == null || cb.SelectedItem != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateButtons() {
|
|
||||||
if (!IsEditing && !IsCreating) return;
|
if (!IsEditing && !IsCreating) return;
|
||||||
bool ch = HasChanged(), v = IsValid();
|
bool ch = HasChanged(), v = IsValid();
|
||||||
ResetButton.IsEnabled = (ch);
|
ResetButton.IsEnabled = (ch);
|
||||||
SaveButton.IsEnabled = (v && ch);
|
SaveButton.IsEnabled = (v && ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool InputHasChanged(Control input) {
|
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AppDbContext, Member?, ValidationResult> checker) {
|
||||||
if (!OriginalValues.ContainsKey(input)) {
|
InputTextChanged(input, checker(input, SenderIsRequired(input), Context, (Member)MemberList.SelectedItem));
|
||||||
return false;
|
|
||||||
} else if (input is TextBox tb) {
|
|
||||||
return OriginalValues[tb]?.ToString() != tb.Text;
|
|
||||||
} else if (input is ComboBox sb) {
|
|
||||||
return OriginalValues[sb] != sb.SelectedItem;
|
|
||||||
} else if (input is CheckBox cb) {
|
|
||||||
return (OriginalValues[cb] != null) != (cb.IsChecked ?? false);
|
|
||||||
} else if (input is RadioButton rb) {
|
|
||||||
return (OriginalValues[rb] != null) != (rb.IsChecked ?? false);
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool HasChanged() {
|
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AppDbContext, Member?, ValidationResult> checker, string? msg = null) {
|
||||||
return !IsValid() ||
|
InputLostFocus(input, checker(input, SenderIsRequired(input), Context, (Member)MemberList.SelectedItem), msg);
|
||||||
TextBoxInputs.Any(InputHasChanged) ||
|
|
||||||
ComboBoxInputs.Any(InputHasChanged) ||
|
|
||||||
CheckBoxInputs.Any(InputHasChanged) ||
|
|
||||||
RadioButtonInputs.Any(InputHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdatePlz(TextBox plzInput, ComboBox ortInput, bool required) {
|
|
||||||
if (plzInput.Text.Length == 4) {
|
|
||||||
int plz = int.Parse(plzInput.Text);
|
|
||||||
ortInput.ItemsSource = Context.Postleitzahlen.Where(p => p.Plz == plz).ToHashSet();
|
|
||||||
} else {
|
|
||||||
ortInput.ItemsSource = null;
|
|
||||||
}
|
|
||||||
ortInput.SelectedItem = null;
|
|
||||||
if (ortInput.ItemsSource != null) {
|
|
||||||
Utils.SetInputInvalid(ortInput);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(ortInput);
|
|
||||||
}
|
|
||||||
Valid[plzInput] = !required || (ortInput.ItemsSource != null);
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputTextChanged(TextBox input, bool required, Func<TextBox, bool, ValidationResult> checker) {
|
|
||||||
InputTextChanged(input, required, (tb, opt, ctx) => checker(tb, opt));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputTextChanged(TextBox input, bool required, Func<TextBox, bool, AppDbContext, ValidationResult> checker) {
|
|
||||||
InputTextChanged(input, required, (tb, opt, ctx, m) => checker(tb, opt, ctx));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputTextChanged(TextBox input, bool required, Func<TextBox, bool, AppDbContext, Member, ValidationResult> checker) {
|
|
||||||
var res = checker(input, required, Context, (Member)MemberList.SelectedItem);
|
|
||||||
Valid[input] = res.IsValid;
|
|
||||||
if (res.IsValid) {
|
|
||||||
if (InputHasChanged(input)) {
|
|
||||||
Utils.SetInputChanged(input);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(input);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Utils.SetInputInvalid(input);
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputLostFocus(TextBox input, bool required, Func<TextBox, bool, ValidationResult> checker, string? msg = null) {
|
|
||||||
InputLostFocus(input, required, (tb, required, ctx) => checker(tb, required), msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputLostFocus(TextBox input, bool required, Func<TextBox, bool, AppDbContext, ValidationResult> checker, string? msg = null) {
|
|
||||||
InputLostFocus(input, required, (tb, required, ctx, m) => checker(tb, required, ctx), msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InputLostFocus(TextBox input, bool required, Func<TextBox, bool, AppDbContext, Member?, ValidationResult> checker, string? msg = null) {
|
|
||||||
var res = checker(input, required, Context, (Member)MemberList.SelectedItem);
|
|
||||||
if (!res.IsValid)
|
|
||||||
MessageBox.Show(res.ErrorContent.ToString(), msg ?? res.ErrorContent.ToString(), MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckBox_Changed(object sender, RoutedEventArgs evt) {
|
|
||||||
var input = (CheckBox)sender;
|
|
||||||
if (InputHasChanged(input)) {
|
|
||||||
Utils.SetInputChanged(input);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(input);
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RadioButton_Changed(object sender, RoutedEventArgs evt) {
|
|
||||||
var input = (RadioButton)sender;
|
|
||||||
if (InputHasChanged(input)) {
|
|
||||||
Utils.SetInputChanged(input);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(input);
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TextBox_TextChanged(object sender, RoutedEventArgs evt) {
|
|
||||||
var input = (TextBox)sender;
|
|
||||||
if (SenderIsRequired(input) && input.Text.Length == 0) {
|
|
||||||
Valid[input] = false;
|
|
||||||
Utils.SetInputInvalid(input);
|
|
||||||
} else {
|
|
||||||
Valid[input] = true;
|
|
||||||
if (InputHasChanged(input)) {
|
|
||||||
Utils.SetInputChanged(input);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ComboBox_SelectionChanged(object sender, RoutedEventArgs evt) {
|
|
||||||
var input = (ComboBox)sender;
|
|
||||||
if (input.ItemsSource != null && input.SelectedItem == null) {
|
|
||||||
Utils.SetInputInvalid(input);
|
|
||||||
} else if (InputHasChanged(input)) {
|
|
||||||
Utils.SetInputChanged(input);
|
|
||||||
} else {
|
|
||||||
Utils.ClearInputState(input);
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void NumericInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void NumericInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckNumeric);
|
InputTextChanged((TextBox)sender, Validator.CheckNumeric);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MgNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void MgNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckMgNr);
|
InputTextChanged((TextBox)sender, Validator.CheckMgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void MgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckMgNr);
|
InputLostFocus((TextBox)sender, Validator.CheckMgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PredecessorMgNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void PredecessorMgNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckPredecessorMgNr);
|
InputTextChanged((TextBox)sender, Validator.CheckPredecessorMgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckPredecessorMgNr);
|
InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BirthdayInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void BirthdayInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckPartialDate);
|
InputTextChanged((TextBox)sender, Validator.CheckPartialDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PlzInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void PlzInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckPlz);
|
InputTextChanged((TextBox)sender, Validator.CheckPlz);
|
||||||
UpdatePlz((TextBox)sender, OrtInput, SenderIsRequired(sender));
|
UpdatePlz((TextBox)sender, OrtInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PlzInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void PlzInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckPlz);
|
InputLostFocus((TextBox)sender, Validator.CheckPlz);
|
||||||
UpdatePlz((TextBox)sender, OrtInput, SenderIsRequired(sender));
|
UpdatePlz((TextBox)sender, OrtInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PhoneNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void PhoneNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckPhoneNumber);
|
InputTextChanged((TextBox)sender, Validator.CheckPhoneNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PhoneNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void PhoneNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckPhoneNumber);
|
InputLostFocus((TextBox)sender, Validator.CheckPhoneNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EmailInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void EmailInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckEmailAddress);
|
InputTextChanged((TextBox)sender, Validator.CheckEmailAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EmailInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void EmailInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckEmailAddress);
|
InputLostFocus((TextBox)sender, Validator.CheckEmailAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IbanInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void IbanInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckIban);
|
InputTextChanged((TextBox)sender, Validator.CheckIban);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IbanInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void IbanInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckIban);
|
InputLostFocus((TextBox)sender, Validator.CheckIban);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BicInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void BicInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckBic);
|
InputTextChanged((TextBox)sender, Validator.CheckBic);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BicInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void BicInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckBic);
|
InputLostFocus((TextBox)sender, Validator.CheckBic);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UstIdInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void UstIdInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckUstId);
|
InputTextChanged((TextBox)sender, Validator.CheckUstId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UstIdInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void UstIdInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckUstId);
|
InputLostFocus((TextBox)sender, Validator.CheckUstId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LfbisNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void LfbisNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckLfbisNr);
|
InputTextChanged((TextBox)sender, Validator.CheckLfbisNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LfbisNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void LfbisNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckLfbisNr);
|
InputLostFocus((TextBox)sender, Validator.CheckLfbisNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BillingPlzInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void BillingPlzInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckPlz);
|
InputTextChanged((TextBox)sender, Validator.CheckPlz);
|
||||||
UpdatePlz((TextBox)sender, BillingOrtInput, SenderIsRequired(sender));
|
UpdatePlz((TextBox)sender, BillingOrtInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BillingPlzInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void BillingPlzInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, SenderIsRequired(sender), Validator.CheckPlz);
|
InputLostFocus((TextBox)sender, Validator.CheckPlz);
|
||||||
UpdatePlz((TextBox)sender, BillingOrtInput, SenderIsRequired(sender));
|
UpdatePlz((TextBox)sender, BillingOrtInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DateInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void DateInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
InputTextChanged((TextBox)sender, SenderIsRequired(sender), Validator.CheckDate);
|
InputTextChanged((TextBox)sender, Validator.CheckDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user