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:
@@ -0,0 +1,171 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user