389 lines
17 KiB
C#
389 lines
17 KiB
C#
using C4IT.FASD.Base;
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using static C4IT.Logging.cLogManager;
|
|
using static FasdDesktopUi.Basics.UserControls.QuickActionStatusMonitor;
|
|
|
|
namespace FasdDesktopUi.Basics.UserControls
|
|
{
|
|
public partial class QuickActionStatusMonitorResultElement : UserControl
|
|
{
|
|
private const string secretTag = "Secret";
|
|
private const string veiledTextTag = "ClearText";
|
|
|
|
public QuickActionStatusMonitorResultElement()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
public void SetQuickActionOutputData(cF4sdQuickActionRevision.cOutput output, cSupportCaseDataProvider dataProvider, cFasdQuickAction quickActionDefinition)
|
|
{
|
|
try
|
|
{
|
|
ResetQuickActionResultGrid();
|
|
|
|
if (output is null)
|
|
return;
|
|
|
|
if (output.ResultCode == enumQuickActionSuccess.successfull)
|
|
PartyPopperGif.Visibility = Visibility.Visible;
|
|
|
|
if (cQuickActionOutput.HasError(output))
|
|
SetErrorOutput(output);
|
|
else
|
|
QuickActionErrorContainer.Visibility = Visibility.Collapsed;
|
|
|
|
var quickActionOutput = cQuickActionOutput.GetQuickActionOutput(output, dataProvider);
|
|
|
|
switch (quickActionOutput)
|
|
{
|
|
case cQuickActionOutputSingle singleOutput:
|
|
SetSingleOutput(singleOutput, quickActionDefinition);
|
|
break;
|
|
case cQuickActionOutputList listOutput:
|
|
SetListOutput(listOutput, quickActionDefinition);
|
|
break;
|
|
case cQuickActionOutputObject objectOutput:
|
|
SetObjectOutput(objectOutput, quickActionDefinition);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void ResetQuickActionResultGrid()
|
|
{
|
|
QuickActionResultGrid.Children.Clear();
|
|
QuickActionResultGrid.RowDefinitions.Clear();
|
|
QuickActionResultGrid.ColumnDefinitions.Clear();
|
|
}
|
|
|
|
private void SetErrorOutput(cF4sdQuickActionRevision.cOutput output)
|
|
{
|
|
try
|
|
{
|
|
if (output is null)
|
|
return;
|
|
|
|
if (output.ResultCode != null
|
|
&& output.ResultCode.Value != enumQuickActionSuccess.unknown
|
|
&& output.ResultCode.Value != enumQuickActionSuccess.error)
|
|
{
|
|
ResultCodeLabel.Visibility = Visibility.Collapsed;
|
|
ResultCodeText.Visibility = Visibility.Collapsed;
|
|
}
|
|
else
|
|
{
|
|
ResultCodeLabel.Visibility = Visibility.Visible;
|
|
ResultCodeText.Visibility = Visibility.Visible;
|
|
ResultCodeText.Text = output?.ResultCode?.ToString();
|
|
}
|
|
|
|
if (output?.ErrorCode != null && output?.ErrorCode != 0)
|
|
{
|
|
ErrorCodeLabel.Visibility = Visibility.Visible;
|
|
ErrorCodeText.Visibility = Visibility.Visible;
|
|
var strErr = output?.ErrorCode?.ToString() ?? "";
|
|
|
|
var unsigned = (uint)(output.ErrorCode);
|
|
var strHex = unsigned.ToString("X");
|
|
strErr += " (0x" + strHex + ")";
|
|
|
|
ErrorCodeText.Text = strErr;
|
|
}
|
|
else
|
|
{
|
|
ErrorCodeLabel.Visibility = Visibility.Collapsed;
|
|
ErrorCodeText.Visibility = Visibility.Collapsed;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(output?.ErrorDescription))
|
|
{
|
|
ErrorDescrLabel.Visibility = Visibility.Visible;
|
|
ErrorDescrText.Visibility = Visibility.Visible;
|
|
ErrorDescrText.Text = output?.ErrorDescription;
|
|
}
|
|
else
|
|
{
|
|
ErrorDescrLabel.Visibility = Visibility.Collapsed;
|
|
ErrorDescrText.Visibility = Visibility.Collapsed;
|
|
}
|
|
|
|
QuickActionErrorContainer.Visibility = Visibility.Visible;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
}
|
|
|
|
private void SetSingleOutput(cQuickActionOutputSingle output, cFasdQuickAction quickActionDefinition)
|
|
{
|
|
try
|
|
{
|
|
if (output.Value is null)
|
|
return;
|
|
|
|
string displayValue = output.GetDisplayValue(quickActionDefinition.ColumnOutputFormattings);
|
|
var resultTextBlock = new TextBlock() { Text = !string.IsNullOrWhiteSpace(displayValue) ? displayValue : null };
|
|
resultTextBlock.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
resultTextBlock.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
resultTextBlock.TouchDown += ValueTextBlock_Click;
|
|
|
|
cColumnOutputFormatting formatting = null;
|
|
if (output.Key != null)
|
|
quickActionDefinition.ColumnOutputFormattings.TryGetValue(output.Key, out formatting);
|
|
formatting = formatting ?? quickActionDefinition.ColumnOutputFormattings?.Values?.FirstOrDefault();
|
|
|
|
if (formatting != null)
|
|
{
|
|
string displayValueSecret = output.GetDisplayValue(quickActionDefinition.ColumnOutputFormattings, true);
|
|
var resultTextBlockSecret = new TextBlock() { Text = !string.IsNullOrWhiteSpace(displayValueSecret) ? displayValueSecret : null, Visibility = Visibility.Collapsed, Tag = secretTag };
|
|
resultTextBlockSecret.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
resultTextBlockSecret.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
resultTextBlockSecret.TouchDown += ValueTextBlock_Click;
|
|
ReplaceClickSenderOf(resultTextBlock, resultTextBlockSecret);
|
|
|
|
resultTextBlock.Tag = veiledTextTag;
|
|
QuickActionResultGrid.Children.Add(resultTextBlockSecret);
|
|
}
|
|
|
|
QuickActionResultGrid.Children.Add(resultTextBlock);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
}
|
|
|
|
private void SetListOutput(cQuickActionOutputList listOutput, cFasdQuickAction quickActionDefinition)
|
|
{
|
|
try
|
|
{
|
|
if (listOutput.Values is null || listOutput.Values.Count <= 0)
|
|
return;
|
|
|
|
var columnFormattings = quickActionDefinition.ColumnOutputFormattings;
|
|
List<KeyValuePair<string, object>> headingValues = listOutput.Values[0];
|
|
|
|
QuickActionResultGrid.RowDefinitions.Add(new RowDefinition());
|
|
|
|
for (int i = 0; i < headingValues.Count; i++)
|
|
{
|
|
QuickActionResultGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(0, GridUnitType.Auto) });
|
|
|
|
string columnKey = headingValues[i].Key;
|
|
|
|
if (cUtility.ShouldHideQuickActionOutput(columnKey, quickActionDefinition))
|
|
continue;
|
|
|
|
string displayValue = columnKey;
|
|
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(columnKey, out var columnFormatting) ?? false)
|
|
displayValue = columnFormatting.Names.GetValue();
|
|
|
|
TextBlock headingTextBlock = new TextBlock() { Text = displayValue };
|
|
Border headingBorder = new Border() { Child = headingTextBlock };
|
|
Grid.SetRow(headingBorder, 0);
|
|
Grid.SetColumn(headingBorder, i);
|
|
QuickActionResultGrid.Children.Add(headingBorder);
|
|
}
|
|
|
|
for (int row = 0; row < listOutput.Values.Count; row++)
|
|
{
|
|
QuickActionResultGrid.RowDefinitions.Add(new RowDefinition());
|
|
|
|
for (int column = 0; column < listOutput.Values[row].Count; column++)
|
|
{
|
|
string columnKey = listOutput.Values[0][column].Key;
|
|
|
|
if (cUtility.ShouldHideQuickActionOutput(columnKey, quickActionDefinition))
|
|
continue;
|
|
|
|
string displayValue = listOutput.GetDisplayValue(row, column, columnFormattings);
|
|
|
|
if (string.IsNullOrEmpty(displayValue))
|
|
continue;
|
|
|
|
TextBlock valueTextBlock = new TextBlock { FontWeight = FontWeights.Normal, Text = displayValue };
|
|
valueTextBlock.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
valueTextBlock.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
valueTextBlock.TouchDown += ValueTextBlock_Click;
|
|
Border valueBorder = new Border() { Child = valueTextBlock };
|
|
Grid.SetRow(valueBorder, row + 1);
|
|
Grid.SetColumn(valueBorder, column);
|
|
|
|
bool hasSecretValue = columnFormattings?[columnKey]?.IsSecret ?? false;
|
|
if (hasSecretValue)
|
|
{
|
|
string displayValueSecret = listOutput.GetDisplayValue(row, column, columnFormattings, true);
|
|
TextBlock valueTextBlockSecret = new TextBlock { FontWeight = FontWeights.Normal, Text = displayValueSecret };
|
|
valueTextBlockSecret.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
valueTextBlockSecret.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
valueTextBlockSecret.TouchDown += ValueTextBlock_Click;
|
|
ReplaceClickSenderOf(valueTextBlock, valueTextBlockSecret);
|
|
|
|
Border valueBorderSecret = new Border() { Child = valueTextBlockSecret, Visibility = Visibility.Collapsed, Tag = secretTag };
|
|
|
|
valueBorder.Tag = veiledTextTag;
|
|
|
|
Grid.SetRow(valueBorderSecret, row + 1);
|
|
Grid.SetColumn(valueBorderSecret, column);
|
|
QuickActionResultGrid.Children.Add(valueBorderSecret);
|
|
}
|
|
|
|
QuickActionResultGrid.Children.Add(valueBorder);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
}
|
|
|
|
private void SetObjectOutput(cQuickActionOutputObject objectOutput, cFasdQuickAction quickActionDefinition)
|
|
{
|
|
try
|
|
{
|
|
if (objectOutput.Values?.Count <= 0)
|
|
return;
|
|
|
|
QuickActionResultGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(0, GridUnitType.Auto) });
|
|
|
|
for (int i = 0; i < objectOutput.Values.Count; i++)
|
|
{
|
|
string columnKey = objectOutput.Values[i].Key;
|
|
|
|
// Has to be done, no matter if value should be hidden. Else the following Grid.SetRow's affect the wrong row.
|
|
QuickActionResultGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
|
|
|
|
if (cUtility.ShouldHideQuickActionOutput(columnKey, quickActionDefinition))
|
|
continue;
|
|
|
|
string displayValue = columnKey;
|
|
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(columnKey, out var columnFormatting) ?? false)
|
|
displayValue = columnFormatting.Names.GetValue();
|
|
|
|
TextBlock headingTextBlock = new TextBlock() { Text = displayValue };
|
|
|
|
Border headingBorder = new Border() { Child = headingTextBlock };
|
|
Grid.SetColumn(headingBorder, 0);
|
|
Grid.SetRow(headingBorder, i);
|
|
QuickActionResultGrid.Children.Add(headingBorder);
|
|
}
|
|
|
|
QuickActionResultGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(0, GridUnitType.Auto) });
|
|
|
|
for (int i = 0; i < objectOutput.Values.Count; i++)
|
|
{
|
|
string columnKey = objectOutput.Values[i].Key;
|
|
if (cUtility.ShouldHideQuickActionOutput(columnKey, quickActionDefinition))
|
|
continue;
|
|
|
|
string displayValue = objectOutput.GetDisplayValue(i, quickActionDefinition.ColumnOutputFormattings);
|
|
if (string.IsNullOrWhiteSpace(displayValue))
|
|
continue;
|
|
|
|
TextBlock valueTextBlock = new TextBlock() { FontWeight = FontWeights.Normal, Text = displayValue };
|
|
valueTextBlock.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
valueTextBlock.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
valueTextBlock.TouchDown += ValueTextBlock_Click;
|
|
|
|
Border valueBorder = new Border() { Child = valueTextBlock };
|
|
Grid.SetRow(valueBorder, i);
|
|
Grid.SetColumn(valueBorder, 1);
|
|
QuickActionResultGrid.Children.Add(valueBorder);
|
|
|
|
if (quickActionDefinition.ColumnOutputFormattings is null || string.IsNullOrWhiteSpace(columnKey))
|
|
continue;
|
|
|
|
if (quickActionDefinition.ColumnOutputFormattings.TryGetValue(columnKey, out var formatting) && (formatting?.IsSecret ?? false))
|
|
{
|
|
string displayValueSecret = objectOutput.GetDisplayValue(i, quickActionDefinition.ColumnOutputFormattings, true);
|
|
|
|
TextBlock valueTextBlockSecret = new TextBlock() { FontWeight = FontWeights.Normal, Text = displayValueSecret };
|
|
valueTextBlockSecret.SetResourceReference(Control.CursorProperty, "Cursor.Copy");
|
|
valueTextBlockSecret.MouseLeftButtonUp += ValueTextBlock_Click;
|
|
valueTextBlockSecret.TouchDown += ValueTextBlock_Click;
|
|
ReplaceClickSenderOf(valueTextBlock, valueTextBlockSecret);
|
|
|
|
Border valueBorderSecret = new Border() { Child = valueTextBlockSecret, Visibility = Visibility.Collapsed, Tag = secretTag };
|
|
Grid.SetRow(valueBorderSecret, i);
|
|
Grid.SetColumn(valueBorderSecret, 1);
|
|
QuickActionResultGrid.Children.Add(valueBorderSecret);
|
|
|
|
valueBorder.Tag = veiledTextTag;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
}
|
|
|
|
private void ValueTextBlock_Click(object sender, InputEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (!(sender is TextBlock textBlock))
|
|
return;
|
|
|
|
System.Windows.Forms.Clipboard.SetText(textBlock.Text);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
|
|
}
|
|
|
|
private void ReplaceClickSenderOf(UIElement from, UIElement to)
|
|
{
|
|
try
|
|
{
|
|
from.MouseLeftButtonUp -= ValueTextBlock_Click;
|
|
from.TouchDown -= ValueTextBlock_Click;
|
|
|
|
from.MouseLeftButtonUp += (s, e) => ValueTextBlock_Click(to, e);
|
|
from.TouchDown += (s, e) => ValueTextBlock_Click(to, e);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
}
|
|
|
|
internal void ToggleSecretVisibility(bool secretsAreShown)
|
|
{
|
|
try
|
|
{
|
|
var taggedResultElements = QuickActionResultGrid.Children.OfType<FrameworkElement>().Where(element => element.Tag != null);
|
|
|
|
foreach (var resultElement in taggedResultElements)
|
|
{
|
|
if (resultElement.Tag.Equals(secretTag))
|
|
resultElement.Visibility = secretsAreShown ? Visibility.Visible : Visibility.Collapsed;
|
|
if (resultElement.Tag.Equals(veiledTextTag))
|
|
resultElement.Visibility = secretsAreShown ? Visibility.Collapsed : Visibility.Visible;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|