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.
172 lines
10 KiB
C#
172 lines
10 KiB
C#
using C4IT.F4SD.DisplayFormatting;
|
|
using C4IT.FASD.Base;
|
|
using C4IT.MultiLanguage;
|
|
using FasdCockpitBase.Models.RemoteDesktopConnection;
|
|
using FasdCockpitCommunication.RemoteDesktopCommunication;
|
|
using FasdDesktopUi.Basics.Models;
|
|
using FasdDesktopUi.Basics.Services.RemoteDesktop;
|
|
using FasdDesktopUi.Basics.UserControls;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using static C4IT.Logging.cLogManager;
|
|
|
|
namespace FasdDesktopUi.Basics.UiActions.NativeActions
|
|
{
|
|
internal class RemoteConnectionAction
|
|
{
|
|
internal const string NativeActionName = "StartAgentRemoteConnection";
|
|
|
|
internal static void UpdatePrerequesites(FasdNativeQuickAction nativeQuickAction)
|
|
{
|
|
nativeQuickAction.CheckFilePath = AgentRemoteDesktopService.GetViewerPath();
|
|
}
|
|
|
|
internal static cDataCanvasDataModel GetQuickActionData(cFasdQuickAction quickActionConfig, cQuickActionStatusMonitorModel.RunQuickActionDelegate quickAction)
|
|
{
|
|
var detailedDataQuickActionHistory = new cDetailedDataModel()
|
|
{
|
|
Heading = cMultiLanguageSupport.GetItem("DetailsPage.History"),
|
|
FullDetailedData = new List<object>() { new List<object>() { "Status", cMultiLanguageSupport.GetItem("QuickAction.Revision.ExecutionTime") } }
|
|
};
|
|
|
|
|
|
return new cDataCanvasDataModel()
|
|
{
|
|
RecommendationData = null,
|
|
QuickActionStatusMonitorData = new cQuickActionStatusMonitorModel()
|
|
{
|
|
ActionName = quickActionConfig.Names.GetValue(),
|
|
ActionSteps = new List<cQuickActionStatusMonitorModel.cQuickActionStep>()
|
|
{
|
|
new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Remote.UserAcceptance"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance),
|
|
new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Phoenix.StartViewer"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running)
|
|
},
|
|
QuickActionDefinition = quickActionConfig,
|
|
RunQuickAction = quickAction
|
|
},
|
|
DetailedData = detailedDataQuickActionHistory,
|
|
};
|
|
}
|
|
|
|
private static bool TryGetNamedParameterValue(cNamedParameterList namedParameters, string namedParameterName, string quickActionName, QuickActionStatusMonitor statusMonitor, out int namedParameterValue)
|
|
{
|
|
namedParameterValue = -1;
|
|
bool hasNamedParameterValue = true;
|
|
|
|
if (!namedParameters.TryGetValue(namedParameterName, out var namedParameter))
|
|
{
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
|
|
statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." });
|
|
hasNamedParameterValue = false;
|
|
}
|
|
|
|
if (!int.TryParse(namedParameter.GetValue(), out namedParameterValue))
|
|
{
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
|
|
statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." });
|
|
hasNamedParameterValue = false;
|
|
}
|
|
|
|
return hasNamedParameterValue;
|
|
}
|
|
|
|
private static bool TryGetClientInfo(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, out AgentRemoteClientInfo clientInfo)
|
|
{
|
|
clientInfo = null;
|
|
try
|
|
{
|
|
bool hasClientInfo = true;
|
|
|
|
if (!TryGetNamedParameterValue(namedParameters, "AgentUserId", quickActionName, statusMonitor, out var userId))
|
|
hasClientInfo = false;
|
|
|
|
if (!TryGetNamedParameterValue(namedParameters, "AgentDeviceId", quickActionName, statusMonitor, out var deviceId))
|
|
hasClientInfo = false;
|
|
|
|
|
|
int? organizationId = cCockpitConfiguration.Instance?.agentApiConfiguration?.OrganizationCode;
|
|
|
|
if (organizationId is null)
|
|
{
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
|
|
hasClientInfo = false;
|
|
}
|
|
|
|
clientInfo = new AgentRemoteClientInfo() { AccountCode = userId, DeviceCode = deviceId, OrganisationCode = organizationId.Value };
|
|
|
|
return hasClientInfo;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogException(ex);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
internal static async Task<List<object>> RunQuickAction(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, CancellationToken token)
|
|
{
|
|
try
|
|
{
|
|
statusMonitor.QuickActionOutputs.Clear();
|
|
|
|
var errorOutput = new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
|
|
|
|
if (!TryGetClientInfo(quickActionName, statusMonitor, namedParameters, out var clientInfo))
|
|
return errorOutput;
|
|
|
|
AgentRemoteDesktopService.RemoteConnetionStatusChanged += HandleConnectionStatusChanged;
|
|
RemoteDesktopConnectionStatusResult connectionStatus = await AgentRemoteDesktopService.StartRemoteDesktopConnectionAsync(clientInfo, true, token);
|
|
|
|
switch (connectionStatus.Status)
|
|
{
|
|
case RemoteDesktopConnectionStatus.Accepted:
|
|
case RemoteDesktopConnectionStatus.Connected:
|
|
case RemoteDesktopConnectionStatus.Finished:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull);
|
|
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
|
|
case RemoteDesktopConnectionStatus.Canceled:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps);
|
|
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
|
|
case RemoteDesktopConnectionStatus.Error:
|
|
|
|
foreach (var error in connectionStatus.Errors)
|
|
{
|
|
var quickactionOutput = new cF4sdQuickActionRevision.cOutput() { Values = error };
|
|
statusMonitor.QuickActionOutputs.Add(quickactionOutput);
|
|
}
|
|
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError);
|
|
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
|
|
default:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError);
|
|
return errorOutput;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
AgentRemoteDesktopService.RemoteConnetionStatusChanged -= HandleConnectionStatusChanged;
|
|
}
|
|
|
|
void HandleConnectionStatusChanged(object sender, RemoteDesktopConnectionStatus e)
|
|
{
|
|
switch (e)
|
|
{
|
|
case RemoteDesktopConnectionStatus.Accepted:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull);
|
|
break;
|
|
case RemoteDesktopConnectionStatus.Connected:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.finishedSuccessfull);
|
|
break;
|
|
case RemoteDesktopConnectionStatus.Canceled:
|
|
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|