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[]>() },
};
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;
}
public static void SetInputValid(TextBox input) {
input.ClearValue(TextBox.BorderBrushProperty);
public static void ClearInputStatus(Control input) {
input.ClearValue(Control.BorderBrushProperty);
}
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"/>
<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"/>
<Label Content="Präfix:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/>
<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"/>
<Label Content="Nachname:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="0"/>
<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"/>
<Label Content="Suffix:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top" Padding="2" Grid.Column="2"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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>
</GroupBox>
@ -198,10 +204,12 @@
<Label Content="Name:" HorizontalAlignment="Left" Margin="10,12,0,0" VerticalAlignment="Top" Padding="2"/>
<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"/>
<Label Content="Adresse:" HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" Padding="2"/>
<TextBox x:Name="BillingAddressInput" IsReadOnly="True"
TextChanged="TextBox_TextChanged"
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"/>
@ -235,15 +243,19 @@
<Label Content="BH-Konto:" HorizontalAlignment="Left" Margin="10,102,0,0" VerticalAlignment="Top" Padding="2"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<Label Content="Kontaktart:" HorizontalAlignment="Left" Margin="10,222,0,0" VerticalAlignment="Top" Padding="2"/>
<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"/>
<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"/>
</Grid>
</GroupBox>

View File

@ -24,7 +24,8 @@ namespace WGneu.Windows {
private bool IsEditing = false;
private bool IsCreating = false;
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 readonly WgContext Context = new();
@ -79,6 +80,17 @@ namespace WGneu.Windows {
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() {
Member m = (Member)MemberList.SelectedItem;
if (m != null) {
@ -90,6 +102,7 @@ namespace WGneu.Windows {
DeleteMemberButton.IsEnabled = false;
ClearInputs();
}
ClearInputStates();
}
private void InitInputs() {
@ -206,11 +219,13 @@ namespace WGneu.Windows {
}
private void ResetButton_Click(object sender, RoutedEventArgs e) {
if (IsEditing)
if (IsEditing) {
RefreshInputs();
else if (IsCreating)
} else if (IsCreating) {
InitInputs();
}
UpdateButtons();
}
private void CancelButton_Click(object sender, RoutedEventArgs e) {
IsEditing = false;
@ -241,7 +256,7 @@ namespace WGneu.Windows {
}
private void ShowSaveResetCancelButtons() {
SaveButton.IsEnabled = true;
SaveButton.IsEnabled = false;
ResetButton.IsEnabled = false;
CancelButton.IsEnabled = true;
SaveButton.Visibility = Visibility.Visible;
@ -299,6 +314,8 @@ namespace WGneu.Windows {
}
private void FillInputs(Member m) {
OriginalValues.Clear();
MgNrInput.Text = m.MgNr.ToString();
PredecessorMgNrInput.Text = m.PredecessorMgNr.ToString();
PrefixInput.Text = m.Prefix;
@ -346,6 +363,15 @@ namespace WGneu.Windows {
case "post": ContactPostInput.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() {
@ -357,6 +383,7 @@ namespace WGneu.Windows {
cb.IsChecked = false;
foreach (var rb in Utils.FindVisualChilds<RadioButton>(this))
rb.IsChecked = false;
OriginalValues.Clear();
}
private bool IsValid() {
@ -371,8 +398,28 @@ namespace WGneu.Windows {
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() {
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) {
@ -390,10 +437,15 @@ namespace WGneu.Windows {
private void InputTextChanged(TextBox input, bool optional, Func<TextBox, bool, ValidationResult> checker) {
var res = checker(input, optional);
Valid[input] = res.IsValid;
if (res.IsValid)
Validator.SetInputValid(input);
else
if (res.IsValid) {
if (InputHasChanged(input)) {
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
} else {
Validator.SetInputInvalid(input);
}
UpdateButtons();
}
@ -403,7 +455,44 @@ namespace WGneu.Windows {
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) {
var input = (ComboBox)sender;
if (InputHasChanged(input)) {
// TODO not working
Validator.SetInputChanged(input);
} else {
Validator.ClearInputStatus(input);
}
UpdateButtons();
}