From c218dbe139856489c28bd3154dd8dac825753ddc Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 13 Nov 2025 11:36:47 +0100 Subject: [PATCH] added pflichtfelder, fix zum roten rand ausstehend --- .../Ticket/CloseCaseDialogWithTicket.xaml | 19 +- .../Ticket/CloseCaseDialogWithTicket.xaml.cs | 166 +++++++++++++----- FasdDesktopUi/Config/LanguageDefinitions.xml | 22 ++- 3 files changed, 149 insertions(+), 58 deletions(-) diff --git a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml index 5c0adf5..f72394f 100644 --- a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml +++ b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml @@ -175,15 +175,16 @@ Margin="0 10 0 0" Foreground="{DynamicResource FontColor.Menu.Categories}" /> - - + + categoryHierarchy = new ObservableCollection(); private readonly Dictionary categoryLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); private bool isCategoryLoading; + private Brush defaultCategoryBorderBrush; + private Brush defaultQuickTicketBorderBrush; + private readonly Brush validationErrorBrush = new SolidColorBrush(Colors.Red); public bool IsTicket { @@ -230,7 +233,10 @@ namespace FasdDesktopUi.Basics.UserControls private static void OnSelectedCategoryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is CloseCaseDialogWithTicket instance) + { instance.LogSelectedCategoryChanged(e.NewValue as HierarchicalSelectionItem); + instance.ValidateProperty("SelectedCategory"); + } } #endregion @@ -403,9 +409,11 @@ namespace FasdDesktopUi.Basics.UserControls me.UpdateTicketComponentVisibility(); await me.InitializeCategorySelectionAsync(); await me.UpdateQuickCallsComboBoxAsync(); - } - catch (Exception E) - { + me.ValidateProperty("SelectedCategory"); + me.ValidateProperty("QuickTicketSelection"); + } + catch (Exception E) + { LogException(E); } @@ -418,14 +426,18 @@ namespace FasdDesktopUi.Basics.UserControls private TicketCompletion parentWindow; - public CloseCaseDialogWithTicket() - { - InitializeComponent(); - this.Unloaded += CloseCaseDialogWithTicket_Unloaded; - this.Loaded += CloseCaseDialogWithTicket_Loaded; - - DependencyPropertyDescriptor dpd = - DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock)); + public CloseCaseDialogWithTicket() + { + InitializeComponent(); + this.Unloaded += CloseCaseDialogWithTicket_Unloaded; + this.Loaded += CloseCaseDialogWithTicket_Loaded; + defaultCategoryBorderBrush = CategorySelectionControl?.BorderBrush?.CloneCurrentValue(); + defaultQuickTicketBorderBrush = QuickTicketSelection?.BorderBrush?.CloneCurrentValue(); + if (validationErrorBrush is Freezable freezableBrush && freezableBrush.CanFreeze) + freezableBrush.Freeze(); + + DependencyPropertyDescriptor dpd = + DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock)); dpd?.AddValueChanged(CaseNotesPreview, TicketCaseNotesTextBlock_TextChanged); @@ -444,10 +456,12 @@ namespace FasdDesktopUi.Basics.UserControls parentWindow.SetButtonStateYes(false, "Initial gesperrt."); parentWindow.SetButtonStateNo(true, cMultiLanguageSupport.GetItem("Dialog.CloseCase.Cancel")); - ValidateProperty("TicketSummaryTextBox"); - ValidateProperty("TicketStatusCombobox"); - ValidateProperty("CaseNotesPreview"); - } + ValidateProperty("TicketSummaryTextBox"); + ValidateProperty("TicketStatusCombobox"); + ValidateProperty("CaseNotesPreview"); + ValidateProperty("SelectedCategory"); + ValidateProperty("QuickTicketSelection"); + } private void CloseCaseDialogWithTicket_Unloaded(object sender, RoutedEventArgs e) { Window parentWindow = Window.GetWindow(this); @@ -937,6 +951,7 @@ namespace FasdDesktopUi.Basics.UserControls finally { isCategoryLoading = false; + ValidateProperty("SelectedCategory"); } } @@ -1125,13 +1140,14 @@ namespace FasdDesktopUi.Basics.UserControls }); } - QuickTicketSelection.ItemsSource = quickCallListe; - - QuickTicketSelection.SelectedItem = quickCallListe - .FirstOrDefault(x => x.ID == "7bbe64e2-94d0-ee11-4285-00155d010a04"); - } - catch (Exception e) - { + QuickTicketSelection.ItemsSource = quickCallListe; + + QuickTicketSelection.SelectedItem = quickCallListe + .FirstOrDefault(x => x.ID == "7bbe64e2-94d0-ee11-4285-00155d010a04"); + ValidateProperty("QuickTicketSelection"); + } + catch (Exception e) + { LogException(e); } } @@ -1980,10 +1996,10 @@ namespace FasdDesktopUi.Basics.UserControls } break; - case "TicketStatusCombobox": - validateComboboxNotEmpty(TicketStatusCombobox); - if (!(TicketStatusCombobox.SelectedItem is ComboBoxItem a)) - break; + case "TicketStatusCombobox": + validateComboboxNotEmpty(TicketStatusCombobox); + if (!(TicketStatusCombobox.SelectedItem is ComboBoxItem a)) + break; enumTicketStatus currenTicketStatus = enumTicketStatus.Unknown; var currentTicketActivityType = SelectedTicket?.Infos.FirstOrDefault(x => x.Key == "ActivityType").Value; @@ -2041,12 +2057,47 @@ namespace FasdDesktopUi.Basics.UserControls else { ShowAssetWarningTicketAction = false; - } - - break; - } - - return new List(_errors.Values); + } + + break; + case "SelectedCategory": + bool categoryIsVisible = CategorySelectionControl?.IsVisible ?? false; + bool categoryHasError = categoryIsVisible && SelectedCategory == null; + UpdateCategoryValidationVisualState(categoryHasError); + + if (categoryHasError) + { + if (!_errors.ContainsKey(propertyName)) + _errors.Add(propertyName, cMultiLanguageSupport.GetItem("Dialog.CloseCase.ValidationErrorCategoryEmpty")); + } + else + { + if (_errors.ContainsKey(propertyName)) + _errors.Remove(propertyName); + } + + break; + case "QuickTicketSelection": + bool quickCallIsVisible = QuickTicketSelection?.IsVisible ?? false; + bool quickCallSelected = QuickTicketSelection?.SelectedItem is QuickCallEntry selectedQuickCall && !string.IsNullOrWhiteSpace(selectedQuickCall.ID); + bool quickCallHasError = quickCallIsVisible && !quickCallSelected; + UpdateQuickTicketValidationVisualState(quickCallHasError); + + if (quickCallHasError) + { + if (!_errors.ContainsKey(propertyName)) + _errors.Add(propertyName, cMultiLanguageSupport.GetItem("Dialog.CloseCase.ValidationErrorQuickCallEmpty")); + } + else + { + if (_errors.ContainsKey(propertyName)) + _errors.Remove(propertyName); + } + + break; + } + + return new List(_errors.Values); } @@ -2388,9 +2439,9 @@ namespace FasdDesktopUi.Basics.UserControls } - private static void setTextboxErrorState(object sender, bool hasError) - { - if (sender is TextBox textBox) + private static void setTextboxErrorState(object sender, bool hasError) + { + if (sender is TextBox textBox) { // Überprüfe den Inhalt und setze die Hintergrundfarbe entsprechend if (hasError) @@ -2403,9 +2454,35 @@ namespace FasdDesktopUi.Basics.UserControls // Setze die ursprüngliche Hintergrundfarbe zurück, wenn die Validierung erfolgreich ist textBox.BorderBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("#DEE2E6"); } - } - } - + } + } + + private void UpdateCategoryValidationVisualState(bool hasError) + { + if (CategorySelectionControl == null) + return; + + if (defaultCategoryBorderBrush == null) + defaultCategoryBorderBrush = CategorySelectionControl.BorderBrush?.CloneCurrentValue(); + + CategorySelectionControl.BorderBrush = hasError + ? validationErrorBrush + : defaultCategoryBorderBrush; + } + + private void UpdateQuickTicketValidationVisualState(bool hasError) + { + if (QuickTicketSelection == null) + return; + + if (defaultQuickTicketBorderBrush == null) + defaultQuickTicketBorderBrush = QuickTicketSelection.BorderBrush?.CloneCurrentValue(); + + QuickTicketSelection.BorderBrush = hasError + ? validationErrorBrush + : defaultQuickTicketBorderBrush; + } + #region DropDown @@ -2453,10 +2530,15 @@ namespace FasdDesktopUi.Basics.UserControls } } - private void ComputerSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - SelectedComputer = (cF4sdApiSearchResultRelation)ComputerSelection.SelectedItem; - } + private void ComputerSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + SelectedComputer = (cF4sdApiSearchResultRelation)ComputerSelection.SelectedItem; + } + + private void QuickTicketSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + ValidateProperty("QuickTicketSelection"); + } private void TransferCaseNotesCheck_Unchecked(object sender, RoutedEventArgs e) { diff --git a/FasdDesktopUi/Config/LanguageDefinitions.xml b/FasdDesktopUi/Config/LanguageDefinitions.xml index 3e862d3..2094394 100644 --- a/FasdDesktopUi/Config/LanguageDefinitions.xml +++ b/FasdDesktopUi/Config/LanguageDefinitions.xml @@ -1578,13 +1578,21 @@ Fehler: - - Fill summary - Zusammenfassung angeben - - - - Fill solution + + Fill summary + Zusammenfassung angeben + + + Select a category + Kategorie auswählen + + + Select a quickcall template + Quickcall auswählen + + + + Fill solution Lösung angeben