Mark input as changed

This commit is contained in:
2023-02-27 23:07:07 +01:00
parent c7bcf2aa00
commit f13896d59a
3 changed files with 119 additions and 11 deletions

View File

@ -32,12 +32,16 @@ namespace WGneu {
{ "423", Array.Empty<string[]>() }, { "423", Array.Empty<string[]>() },
}; };
public static void SetInputInvalid(TextBox input) { public static void SetInputChanged(Control input) {
input.BorderBrush = System.Windows.Media.Brushes.Orange;
}
public static void SetInputInvalid(Control input) {
input.BorderBrush = System.Windows.Media.Brushes.Red; input.BorderBrush = System.Windows.Media.Brushes.Red;
} }
public static void SetInputValid(TextBox input) { public static void ClearInputStatus(Control input) {
input.ClearValue(TextBox.BorderBrushProperty); input.ClearValue(Control.BorderBrushProperty);
} }
public static ValidationResult CheckNumericInput(TextBox input, bool optional) { public static ValidationResult CheckNumericInput(TextBox input, bool optional) {

View File

@ -91,18 +91,22 @@
<Label Content="Vorname:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/> <Label Content="Vorname:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/>
<TextBox x:Name="GivenNameInput" IsReadOnly="True" <TextBox x:Name="GivenNameInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,40,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/> Margin="0,40,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/>
<Label Content="Präfix:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/> <Label Content="Präfix:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/>
<TextBox x:Name="PrefixInput" IsReadOnly="True" <TextBox x:Name="PrefixInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,40,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="3"/> Margin="0,40,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="3"/>
<Label Content="Nachname:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/> <Label Content="Nachname:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/>
<TextBox x:Name="FamilyNameInput" IsReadOnly="True" <TextBox x:Name="FamilyNameInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,70,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/> Margin="0,70,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/>
<Label Content="Suffix:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/> <Label Content="Suffix:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/>
<TextBox x:Name="SuffixInput" IsReadOnly="True" <TextBox x:Name="SuffixInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,70,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="3"/> Margin="0,70,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="3"/>
<Label Content="Geburtstag:" HorizontalAlignment="Left" Margin="10,102,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/> <Label Content="Geburtstag:" HorizontalAlignment="Left" Margin="10,102,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/>
@ -111,6 +115,7 @@
<Label Content="Adresse:" HorizontalAlignment="Left" Margin="10,132,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="Adresse:" HorizontalAlignment="Left" Margin="10,132,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="AddressInput" IsReadOnly="True" <TextBox x:Name="AddressInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,130,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Grid.ColumnSpan="3" Height="25"/> Margin="0,130,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Grid.ColumnSpan="3" Height="25"/>
<Label Content="PLZ/Ort:" HorizontalAlignment="Left" Margin="10,162,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="PLZ/Ort:" HorizontalAlignment="Left" Margin="10,162,0,0" VerticalAlignment="Top" Padding="2"/>
@ -186,6 +191,7 @@
Margin="0,40,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Height="25" Width="64" HorizontalAlignment="Left" TextAlignment="Right"/> Margin="0,40,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Height="25" Width="64" HorizontalAlignment="Left" TextAlignment="Right"/>
<CheckBox x:Name="BuchführendInput" Content="Buchführend" IsEnabled="False" <CheckBox x:Name="BuchführendInput" Content="Buchführend" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/> Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
@ -198,10 +204,12 @@
<Label Content="Name:" HorizontalAlignment="Left" Margin="10,12,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="Name:" HorizontalAlignment="Left" Margin="10,12,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="BillingName" IsReadOnly="True" <TextBox x:Name="BillingName" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,10,10,10" VerticalAlignment="Top" Grid.ColumnSpan="2" FontSize="14" Padding="2" Grid.Column="1"/> Margin="0,10,10,10" VerticalAlignment="Top" Grid.ColumnSpan="2" FontSize="14" Padding="2" Grid.Column="1"/>
<Label Content="Adresse:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="Adresse:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="BillingAddressInput" IsReadOnly="True" <TextBox x:Name="BillingAddressInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,40,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/> Margin="0,40,10,0" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/>
<Label Content="PLZ/Ort:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="PLZ/Ort:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2"/>
@ -235,15 +243,19 @@
<Label Content="BH-Konto:" HorizontalAlignment="Left" Margin="10,102,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="BH-Konto:" HorizontalAlignment="Left" Margin="10,102,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="AccountingNrInput" IsReadOnly="True" <TextBox x:Name="AccountingNrInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,100,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/> Margin="0,100,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1"/>
<CheckBox x:Name="ActiveInput" Content="Aktiv" IsEnabled="False" <CheckBox x:Name="ActiveInput" Content="Aktiv" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/> Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/>
<CheckBox x:Name="VollLieferantInput" Content="Volllieferant" IsEnabled="False" <CheckBox x:Name="VollLieferantInput" Content="Volllieferant" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="10,45,0,0" VerticalAlignment="Top" IsChecked="False"/> Grid.Column="2" HorizontalAlignment="Left" Margin="10,45,0,0" VerticalAlignment="Top" IsChecked="False"/>
<CheckBox x:Name="FunkionärInput" Content="Funktionär" IsEnabled="False" <CheckBox x:Name="FunkionärInput" Content="Funktionär" IsEnabled="False"
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
Grid.Column="2" HorizontalAlignment="Left" Margin="10,75,0,0" VerticalAlignment="Top" IsChecked="False"/> Grid.Column="2" HorizontalAlignment="Left" Margin="10,75,0,0" VerticalAlignment="Top" IsChecked="False"/>
<Label Content="StammZwst.:" HorizontalAlignment="Left" Margin="10,132,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="StammZwst.:" HorizontalAlignment="Left" Margin="10,132,0,0" VerticalAlignment="Top" Padding="2"/>
@ -258,12 +270,15 @@
<Label Content="Anmerkung:" HorizontalAlignment="Left" Margin="10,192,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="Anmerkung:" HorizontalAlignment="Left" Margin="10,192,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="CommentInput" IsReadOnly="True" <TextBox x:Name="CommentInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
Margin="0,190,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Right"/> Margin="0,190,10,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" Padding="2" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Right"/>
<Label Content="Kontaktart:" HorizontalAlignment="Left" Margin="10,222,0,0" VerticalAlignment="Top" Padding="2"/> <Label Content="Kontaktart:" HorizontalAlignment="Left" Margin="10,222,0,0" VerticalAlignment="Top" Padding="2"/>
<RadioButton x:Name="ContactPostInput" GroupName="DefaultContact" Content="Post" IsEnabled="False" <RadioButton x:Name="ContactPostInput" GroupName="DefaultContact" Content="Post" IsEnabled="False"
Checked="RadioButton_Changed" Unchecked="RadioButton_Changed"
HorizontalAlignment="Left" Margin="0,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/> HorizontalAlignment="Left" Margin="0,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
<RadioButton x:Name="ContactEmailInput" GroupName="DefaultContact" Content="E-Mail" IsEnabled="False" <RadioButton x:Name="ContactEmailInput" GroupName="DefaultContact" Content="E-Mail" IsEnabled="False"
Checked="RadioButton_Changed" Unchecked="RadioButton_Changed"
HorizontalAlignment="Left" Margin="60,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/> HorizontalAlignment="Left" Margin="60,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
</Grid> </Grid>
</GroupBox> </GroupBox>

View File

@ -24,7 +24,8 @@ namespace WGneu.Windows {
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 Dictionary<TextBox, bool> Valid = new(); private readonly Dictionary<Control, bool> Valid = new();
private readonly Dictionary<Control, object?> OriginalValues = new();
private static readonly RoutedCommand CtrlF = new(); private static readonly RoutedCommand CtrlF = new();
private readonly WgContext Context = new(); private readonly WgContext Context = new();
@ -79,6 +80,17 @@ namespace WGneu.Windows {
RefreshInputs(); RefreshInputs();
} }
private void ClearInputStates() {
foreach (var tb in Utils.FindVisualChilds<TextBox>(this))
if (tb.Name != "SearchInput") Validator.ClearInputStatus(tb);
foreach (var cb in Utils.FindVisualChilds<ComboBox>(this))
Validator.ClearInputStatus(cb);
foreach (var cb in Utils.FindVisualChilds<CheckBox>(this))
Validator.ClearInputStatus(cb);
foreach (var rb in Utils.FindVisualChilds<RadioButton>(this))
Validator.ClearInputStatus(rb);
}
private void RefreshInputs() { private void RefreshInputs() {
Member m = (Member)MemberList.SelectedItem; Member m = (Member)MemberList.SelectedItem;
if (m != null) { if (m != null) {
@ -90,6 +102,7 @@ namespace WGneu.Windows {
DeleteMemberButton.IsEnabled = false; DeleteMemberButton.IsEnabled = false;
ClearInputs(); ClearInputs();
} }
ClearInputStates();
} }
private void InitInputs() { private void InitInputs() {
@ -206,11 +219,13 @@ namespace WGneu.Windows {
} }
private void ResetButton_Click(object sender, RoutedEventArgs e) { private void ResetButton_Click(object sender, RoutedEventArgs e) {
if (IsEditing) if (IsEditing) {
RefreshInputs(); RefreshInputs();
else if (IsCreating) } else if (IsCreating) {
InitInputs(); InitInputs();
} }
UpdateButtons();
}
private void CancelButton_Click(object sender, RoutedEventArgs e) { private void CancelButton_Click(object sender, RoutedEventArgs e) {
IsEditing = false; IsEditing = false;
@ -241,7 +256,7 @@ namespace WGneu.Windows {
} }
private void ShowSaveResetCancelButtons() { private void ShowSaveResetCancelButtons() {
SaveButton.IsEnabled = true; SaveButton.IsEnabled = false;
ResetButton.IsEnabled = false; ResetButton.IsEnabled = false;
CancelButton.IsEnabled = true; CancelButton.IsEnabled = true;
SaveButton.Visibility = Visibility.Visible; SaveButton.Visibility = Visibility.Visible;
@ -299,6 +314,8 @@ namespace WGneu.Windows {
} }
private void FillInputs(Member m) { private void FillInputs(Member m) {
OriginalValues.Clear();
MgNrInput.Text = m.MgNr.ToString(); MgNrInput.Text = m.MgNr.ToString();
PredecessorMgNrInput.Text = m.PredecessorMgNr.ToString(); PredecessorMgNrInput.Text = m.PredecessorMgNr.ToString();
PrefixInput.Text = m.Prefix; PrefixInput.Text = m.Prefix;
@ -346,6 +363,15 @@ namespace WGneu.Windows {
case "post": ContactPostInput.IsChecked = true; break; case "post": ContactPostInput.IsChecked = true; break;
case "email": ContactEmailInput.IsChecked = true; break; case "email": ContactEmailInput.IsChecked = true; break;
} }
foreach (var tb in Utils.FindVisualChilds<TextBox>(this))
if (tb.Name != "SearchInput") OriginalValues[tb] = tb.Text;
foreach (var cb in Utils.FindVisualChilds<ComboBox>(this))
OriginalValues[cb] = cb.SelectedItem;
foreach (var cb in Utils.FindVisualChilds<CheckBox>(this))
OriginalValues[cb] = (cb.IsChecked ?? false) ? bool.TrueString : null;
foreach (var rb in Utils.FindVisualChilds<RadioButton>(this))
OriginalValues[rb] = (rb.IsChecked ?? false) ? bool.TrueString : null;
} }
private void ClearInputs() { private void ClearInputs() {
@ -357,6 +383,7 @@ namespace WGneu.Windows {
cb.IsChecked = false; cb.IsChecked = false;
foreach (var rb in Utils.FindVisualChilds<RadioButton>(this)) foreach (var rb in Utils.FindVisualChilds<RadioButton>(this))
rb.IsChecked = false; rb.IsChecked = false;
OriginalValues.Clear();
} }
private bool IsValid() { private bool IsValid() {
@ -371,8 +398,28 @@ namespace WGneu.Windows {
SaveButton.IsEnabled = (v && ch); SaveButton.IsEnabled = (v && ch);
} }
private 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;
}
}
private bool HasChanged() { private bool HasChanged() {
return true; // TODO return !IsValid() ||
Utils.FindVisualChilds<TextBox>(this).Any(InputHasChanged) ||
Utils.FindVisualChilds<ComboBox>(this).Any(InputHasChanged) ||
Utils.FindVisualChilds<CheckBox>(this).Any(InputHasChanged) ||
Utils.FindVisualChilds<RadioButton>(this).Any(InputHasChanged);
} }
private void UpdatePlz(TextBox plzInput, ComboBox ortInput) { private void UpdatePlz(TextBox plzInput, ComboBox ortInput) {
@ -390,10 +437,15 @@ namespace WGneu.Windows {
private void InputTextChanged(TextBox input, bool optional, Func<TextBox, bool, ValidationResult> checker) { private void InputTextChanged(TextBox input, bool optional, Func<TextBox, bool, ValidationResult> checker) {
var res = checker(input, optional); var res = checker(input, optional);
Valid[input] = res.IsValid; Valid[input] = res.IsValid;
if (res.IsValid) if (res.IsValid) {
Validator.SetInputValid(input); if (InputHasChanged(input)) {
else Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
} else {
Validator.SetInputInvalid(input); Validator.SetInputInvalid(input);
}
UpdateButtons(); UpdateButtons();
} }
@ -403,7 +455,44 @@ namespace WGneu.Windows {
MessageBox.Show(res.ErrorContent.ToString(), msg ?? res.ErrorContent.ToString(), MessageBoxButton.OK, MessageBoxImage.Warning); MessageBox.Show(res.ErrorContent.ToString(), msg ?? res.ErrorContent.ToString(), MessageBoxButton.OK, MessageBoxImage.Warning);
} }
private void CheckBox_Changed(object sender, RoutedEventArgs e) {
var input = (CheckBox)sender;
if (InputHasChanged(input)) {
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
UpdateButtons();
}
private void RadioButton_Changed(object sender, RoutedEventArgs e) {
var input = (RadioButton)sender;
if (InputHasChanged(input)) {
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
UpdateButtons();
}
private void TextBox_TextChanged(object sender, RoutedEventArgs e) {
var input = (TextBox)sender;
if (InputHasChanged(input)) {
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
UpdateButtons();
}
private void ComboBox_SelectionChanged(object sender, RoutedEventArgs e) { private void ComboBox_SelectionChanged(object sender, RoutedEventArgs e) {
var input = (ComboBox)sender;
if (InputHasChanged(input)) {
// TODO not working
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
UpdateButtons(); UpdateButtons();
} }