feat: expand cockpit integrations and support workflows

Add Phoenix remote desktop, action connector, documentation engine, and gamification support. Refactor support-case processing and search/action UI, and update installer assets and dependencies.
This commit is contained in:
Meik
2026-07-13 11:16:53 +02:00
parent bbedbf71c8
commit 0b52999b1d
303 changed files with 11235 additions and 3580 deletions

View File

@@ -26,8 +26,8 @@
Style="{DynamicResource SettingsPage.Close.Icon}"
BorderPadding="5"
SelectedMaterialIcon="ic_remove"
MouseLeftButtonUp="CollapseButton_MouseLeftButtonUp"
TouchDown="CollapseButton_TouchDown" />
MouseLeftButtonUp="CollapseButton_Click"
TouchDown="CollapseButton_Click" />
<TextBlock Style="{DynamicResource DetailsPage.DataHistory.TitleColumn.OverviewTitle}"
Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=QuickAction.Parameter}" />

View File

@@ -1,23 +1,12 @@
using C4IT.FASD.Base;
using C4IT.Logging;
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls
@@ -104,13 +93,13 @@ namespace FasdDesktopUi.Basics.UserControls
switch (parameterValue)
{
case cAdjustableParameterBoolean booleanParameter:
AddBooleanParameter(parameter.Key, booleanParameter);
AddBooleanParameter(booleanParameter);
break;
case cAdjustableParameterNumerical numericalParameter:
AddNumericalParameter(parameter.Key, numericalParameter);
AddNumericalParameter(numericalParameter);
break;
case cAdjustableParameterDropDown dropDownParameter:
AddDropDownParameter(parameter.Key, dropDownParameter);
AddDropDownParameter(dropDownParameter);
break;
default:
break;
@@ -140,7 +129,7 @@ namespace FasdDesktopUi.Basics.UserControls
#region Helper
private void AddBooleanParameter(string parameterKey, cAdjustableParameterBoolean booleanParameter)
private void AddBooleanParameter(cAdjustableParameterBoolean booleanParameter)
{
try
{
@@ -157,7 +146,7 @@ namespace FasdDesktopUi.Basics.UserControls
outerPanel.Children.Add(valueCheckBox);
TextBlock parameterNameTextBlock = new TextBlock() { Text = booleanParameter.Names.GetValue(), Margin = new Thickness(0, 0, 7.5, 0) };
if(!string.IsNullOrEmpty(booleanParameter.Descriptions.GetValue()))
if (!string.IsNullOrEmpty(booleanParameter.Descriptions.GetValue()))
{
parameterNameTextBlock.ToolTip = booleanParameter.Descriptions.GetValue();
}
@@ -172,7 +161,7 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
private void AddNumericalParameter(string parameterKey, cAdjustableParameterNumerical numericalParameter)
private void AddNumericalParameter(cAdjustableParameterNumerical numericalParameter)
{
try
{
@@ -185,20 +174,11 @@ namespace FasdDesktopUi.Basics.UserControls
valueTextBox.SetResourceReference(BackgroundProperty, "BackgroundColor.DetailsPage.DataHistory.TitleColumn");
valueTextBox.SetResourceReference(BorderBrushProperty, "BackgroundColor.DetailsPage.DataHistory.ValueColumn");
valueTextBox.PreviewKeyDown += ((sender, e) =>
valueTextBox.TextChanged += (sender, e) =>
{
if (double.TryParse(valueTextBox.Text, out var parsedValue))
ParameterValues[numericalParameter] = parsedValue;
});
valueTextBox.PreviewTextInput += new TextCompositionEventHandler((sender, e) =>
{
var plannedValue = valueTextBox.Text.Insert(valueTextBox.CaretIndex, e.Text);
if (double.TryParse(plannedValue, out var parsedValue))
ParameterValues[numericalParameter] = parsedValue;
else
e.Handled = true;
});
};
DockPanel.SetDock(valueTextBox, Dock.Right);
outerPanel.Children.Add(valueTextBox);
@@ -219,7 +199,7 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
private void AddDropDownParameter(string parameterKey, cAdjustableParameterDropDown dropDownParameter)
private void AddDropDownParameter(cAdjustableParameterDropDown dropDownParameter)
{
try
{
@@ -227,8 +207,12 @@ namespace FasdDesktopUi.Basics.UserControls
ParameterValues[dropDownParameter] = dropDownParameter.Default;
ComboBox valueComboBox = new ComboBox() { SelectedItem = dropDownParameter.Default, MinWidth = 125 };
valueComboBox.Style = (Style)FindResource("DarkComboBox");
ComboBox valueComboBox = new ComboBox
{
SelectedItem = dropDownParameter.Default,
MinWidth = 125,
Style = (Style)FindResource("DarkComboBox")
};
valueComboBox.DropDownOpened += (sender, e) => cFocusInvoker.InvokeGotFocus(this, e);
valueComboBox.DropDownClosed += (sender, e) => cFocusInvoker.InvokeLostFocus(this, e);
@@ -346,9 +330,7 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
#region CollapseButton_Click
private void CollapseButton_Click()
private void CollapseButton_Click(object sender, InputEventArgs e)
{
try
{
@@ -360,17 +342,5 @@ namespace FasdDesktopUi.Basics.UserControls
LogException(E);
}
}
private void CollapseButton_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
CollapseButton_Click();
}
private void CollapseButton_TouchDown(object sender, TouchEventArgs e)
{
CollapseButton_Click();
}
#endregion
}
}

View File

@@ -23,12 +23,12 @@
Visibility="{Binding ElementName=DataCanvasUc, Path=IsDetailedLayout, Converter={StaticResource BoolToVisibility}}"
IsCloseButtonVisible="{Binding ElementName=DataCanvasUc, Path=DataCanvasData, Converter={StaticResource IsCloseButtonVisible}, ConverterParameter={x:Static converter:enumDataCanvasTypes.detailedData} }" />
<local:DynamicChart x:Name="DynamicChartUc"
HorizontalAlignment="Stretch"
<local:DynamicChart x:Name="DynamicChartUc"
HorizontalAlignment="Stretch"
Width="385"
Visibility="{Binding ElementName=DataCanvasUc, Path=IsDetailedLayout, Converter={StaticResource BoolToVisibility}}"
IsCloseButtonVisible="{Binding ElementName=DataCanvasUc, Path=DataCanvasData, Converter={StaticResource IsCloseButtonVisible}, ConverterParameter={x:Static converter:enumDataCanvasTypes.detailedData} }" />
<local:DetailedRecommendation x:Name="RecommendationUc"
Width="{Binding ElementName=DetailedDataUc, Path=ActualWidth, UpdateSourceTrigger=PropertyChanged}"
MinWidth="300"

View File

@@ -1,22 +1,9 @@
using C4IT.Logging;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Pages.DetailsPage.Models;
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls
@@ -63,7 +50,9 @@ namespace FasdDesktopUi.Basics.UserControls
_me.dataProvider.HealthCardDataHelper.LoadingHelper.DataRefreshed += _me.HealthCardDataHelper_DataRefreshed;
}
_me.QuickActionStatusUc.CancelQuickAction();
bool isSameQuickAction = oldData?.QuickActionStatusMonitorData?.QuickActionDefinition?.Id == newData?.QuickActionStatusMonitorData?.QuickActionDefinition?.Id;
if (!isSameQuickAction && newData?.QuickActionStatusMonitorData?.QuickActionDefinition?.RunImmediate != true)
_me.QuickActionStatusUc.CancelQuickAction();
_me.RecommendationUc.RecommendationData = _me.DataCanvasData.RecommendationData;
_me.RecommendationUc.CloseButtonClickedAction = _me.CloseDataCanvas;

View File

@@ -2,21 +2,10 @@
using F4SD_AdaptableIcon.Enums;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Pages.DetailsPage.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FasdDesktopUi.Basics.UserControls
{
@@ -27,7 +16,18 @@ namespace FasdDesktopUi.Basics.UserControls
#region RecommendationData
public static readonly DependencyProperty RecommendationDataProperty =
DependencyProperty.Register("RecommendationData", typeof(cRecommendationDataModel), typeof(DetailedRecommendation), new PropertyMetadata(new cRecommendationDataModel()));
DependencyProperty.Register("RecommendationData", typeof(cRecommendationDataModel), typeof(DetailedRecommendation), new PropertyMetadata(new cRecommendationDataModel(), new PropertyChangedCallback(HandleRecommendationDataChanged)));
private static void HandleRecommendationDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is DetailedRecommendation recommendationUc))
return;
if (string.IsNullOrWhiteSpace(recommendationUc.RecommendationData?.Recommendation))
recommendationUc.Visibility = Visibility.Collapsed;
else
recommendationUc.Visibility = Visibility.Visible;
}
public cRecommendationDataModel RecommendationData
{
@@ -66,7 +66,7 @@ namespace FasdDesktopUi.Basics.UserControls
if (d is DetailedRecommendation recommendation && e.NewValue is IconData iconData)
{
IconHelper.SetIconValue(recommendation.RecommendationIcon, iconData);
}
}
}
public string PrimaryIconColorResourceName
@@ -99,8 +99,7 @@ namespace FasdDesktopUi.Basics.UserControls
private void CloseButton_Click()
{
if (CloseButtonClickedAction != null)
CloseButtonClickedAction.Invoke();
CloseButtonClickedAction?.Invoke();
}
private void CloseButton_MouseUp(object sender, MouseButtonEventArgs e)

View File

@@ -3,6 +3,7 @@ using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using F4SD_AdaptableIcon.Enums;
using F4SD.Gamification;
using FasdDesktopUi.Basics.Converter;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.Services.ProtocollService;
@@ -21,6 +22,7 @@ using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using static C4IT.Logging.cLogManager;
using F4SD.Gamification.Services;
namespace FasdDesktopUi.Basics.UserControls
{
@@ -30,6 +32,16 @@ namespace FasdDesktopUi.Basics.UserControls
private bool secretsAreShown = false;
private readonly IRawValueFormatter _rawValueFormatter = new RawValueFormatter();
private static object _currentQuickActionLock = new object();
private Guid _currentRunningQuickActionId;
public Guid CurrentRunningQuickActionId
{
get { lock (_currentQuickActionLock) { return _currentRunningQuickActionId; } }
set { lock (_currentQuickActionLock) { _currentRunningQuickActionId = value; } }
}
#region Helperclasses QuickAction Output
public abstract class cQuickActionOutput
@@ -38,7 +50,7 @@ namespace FasdDesktopUi.Basics.UserControls
public cQuickActionOutput(cF4sdQuickActionRevision.cOutput scriptOutput)
{
_rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
_rawValueFormatter.SetDefaultCulture(cFasdCockpitConfig.Instance.SelectedCulture);
_rawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
ErrorCode = scriptOutput.ErrorCode;
ErrorDescription = scriptOutput.ErrorDescription;
@@ -804,7 +816,7 @@ namespace FasdDesktopUi.Basics.UserControls
if (measureValues?.Count <= 0)
return;
_rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
_rawValueFormatter.SetDefaultCulture(cFasdCockpitConfig.Instance.SelectedCulture);
_rawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
for (int i = 0; i < measureValues.Count; i++)
@@ -1006,7 +1018,7 @@ namespace FasdDesktopUi.Basics.UserControls
else if (QuickActionData.ActionSteps.All(step => step.Status == enumQuickActionRevisionStatus.finishedSuccessfull))
status = enumQuickActionRevisionStatus.finishedSuccessfull;
RaiseEvent(new QuickActionEventArgs(QuickActionFinishedEvent, this) { QuickActionResult = result, QuickActionStatus = status, QuickAction = QuickActionData.QuickActionDefinition});
RaiseEvent(new QuickActionEventArgs(QuickActionFinishedEvent, this) { QuickActionResult = result, QuickActionStatus = status, QuickAction = QuickActionData.QuickActionDefinition });
CopyButton.Visibility = Visibility.Visible;
@@ -1022,6 +1034,7 @@ namespace FasdDesktopUi.Basics.UserControls
finally
{
VisualizeQuickActionFinish(status);
GamificationService.TrackAction(CockpitAction.QuickActionExecuted);
}
}