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.
293 lines
12 KiB
C#
293 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using C4IT.FASD.Base;
|
|
using C4IT.MultiLanguage;
|
|
|
|
using F4SD_AdaptableIcon;
|
|
using F4SD_AdaptableIcon.Enums;
|
|
|
|
using FasdDesktopUi.Basics.Converter;
|
|
using FasdDesktopUi.Basics.UiActions;
|
|
|
|
using static C4IT.Logging.cLogManager;
|
|
|
|
namespace FasdDesktopUi.Basics.Models
|
|
{
|
|
//todo: check what properties can/should be set via constructor
|
|
|
|
public class cMenuDataBase
|
|
{
|
|
public string MenuText { get; set; }
|
|
|
|
public string SubMenuText { get; set; }
|
|
|
|
public string TrailingText { get; set; }
|
|
|
|
public MenuIconInfo MenuIcon { get; set; }
|
|
|
|
public double MenuIconSize { get; set; } = 1.0;
|
|
|
|
public int IconPositionIndex { get; set; }
|
|
|
|
public object Data { get; set; }
|
|
|
|
public List<string> MenuSections { get; set; }
|
|
|
|
public cUiActionBase UiAction { get; set; }
|
|
|
|
public class MenuIconInfo
|
|
{
|
|
public readonly IconData Icon;
|
|
public readonly IconData? Overlay;
|
|
public readonly bool IsInactive;
|
|
public readonly string Description;
|
|
|
|
public MenuIconInfo(IconData icon, string Description = null, bool isInactive = false, IconData? overlay = null)
|
|
{
|
|
Icon = icon;
|
|
IsInactive = isInactive;
|
|
this.Description = Description;
|
|
Overlay = overlay;
|
|
}
|
|
}
|
|
|
|
public cMenuDataBase()
|
|
{
|
|
}
|
|
|
|
public cMenuDataBase(cFasdBaseConfigMenuItem menuItem)
|
|
{
|
|
MenuText = menuItem.Names.GetValue(Default: null);
|
|
MenuIcon = new MenuIconInfo(IconDataConverter.Convert(menuItem.Icon));
|
|
MenuSections = menuItem.Sections;
|
|
|
|
if (!string.IsNullOrEmpty(menuItem.Section))
|
|
MenuSections.Add(menuItem.Section);
|
|
|
|
MenuSections = MenuSections.Distinct().ToList();
|
|
}
|
|
|
|
public cMenuDataBase(cFasdQuickAction quickAction, Enums.enumActionDisplayType display) : this(quickAction)
|
|
{
|
|
SetUiActionDisplayType(display);
|
|
}
|
|
|
|
|
|
public cMenuDataBase(cFasdQuickAction quickAction) : this((cFasdBaseConfigMenuItem)quickAction)
|
|
{
|
|
var tempUiAction = cUiActionBase.GetUiAction(quickAction);
|
|
tempUiAction.Name = quickAction.Name;
|
|
tempUiAction.Description = quickAction.Descriptions?.GetValue(Default: null);
|
|
tempUiAction.AlternativeDescription = quickAction.AlternativeDescriptions?.GetValue(Default: null);
|
|
UiAction = tempUiAction;
|
|
}
|
|
|
|
public cMenuDataBase(cCopyTemplate copyTemplate) : this((cFasdBaseConfigMenuItem)copyTemplate)
|
|
{
|
|
UiAction = new cUiCopyAction(copyTemplate) { Name = copyTemplate.Name, Description = copyTemplate.Descriptions.GetValue(Default: null), DisplayType = Enums.enumActionDisplayType.enabled };
|
|
}
|
|
|
|
public cMenuDataBase(cFasdMenuSection menuSection) : this((cFasdBaseConfigMenuItem)menuSection)
|
|
{
|
|
IconPositionIndex = -1;
|
|
}
|
|
|
|
public cMenuDataBase(cFasdQuickTip quickTip) : this((cFasdBaseConfigMenuItem)quickTip)
|
|
{
|
|
UiAction = new cUiQuickTipAction(quickTip) { DisplayType = Enums.enumActionDisplayType.enabled, Name = quickTip.Name };
|
|
}
|
|
|
|
public void SetUiActionDisplayType(Enums.enumActionDisplayType display)
|
|
{
|
|
if (this.UiAction != null)
|
|
this.UiAction.DisplayType = display;
|
|
}
|
|
|
|
}
|
|
|
|
public class cMenuDataContainer : cMenuDataBase
|
|
{
|
|
public string ContainerName { get; private set; }
|
|
public List<cMenuDataBase> SubMenuData { get; set; } = new List<cMenuDataBase>();
|
|
|
|
public cMenuDataContainer()
|
|
{
|
|
UiAction = new cSubMenuAction(true) { Name = MenuText, DisplayType = Enums.enumActionDisplayType.enabled };
|
|
}
|
|
|
|
public cMenuDataContainer(cFasdMenuSection menuSection) : base(menuSection)
|
|
{
|
|
ContainerName = menuSection.TechName;
|
|
UiAction = new cSubMenuAction(true) { Name = MenuText, DisplayType = Enums.enumActionDisplayType.enabled };
|
|
}
|
|
}
|
|
|
|
public class cMenuDataSearchResult : cMenuDataBase
|
|
{
|
|
public cMenuDataSearchResult(string menuText, ISearchUiProvider SearchUiProvider, List<cFasdApiSearchResultEntry> searchResults) : base()
|
|
{
|
|
if (searchResults?.Count <= 0)
|
|
return;
|
|
|
|
MenuText = menuText;
|
|
UiAction = new cUiProcessSearchResultAction(menuText, SearchUiProvider, searchResults);
|
|
var firstSearchResult = searchResults.First();
|
|
MenuIcon = GetMenuIcon(firstSearchResult.Type, firstSearchResult.Infos);
|
|
}
|
|
|
|
static private MenuIconInfo GetTicketIcon(Dictionary<string, string> infos)
|
|
{
|
|
bool isInactive = false;
|
|
if (infos.TryGetValue("StatusId", out var ticketStatusId))
|
|
{
|
|
if (Enum.TryParse(ticketStatusId, true, out enumTicketStatus ticketStatus))
|
|
{
|
|
switch (ticketStatus)
|
|
{
|
|
case enumTicketStatus.Closed:
|
|
isInactive = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
string description = null;
|
|
var overlay = isInactive ? (IconData?)new IconData(enumInternIcons.misc_disabledOverlay) : null;
|
|
if (isInactive)
|
|
{
|
|
}
|
|
if (infos.TryGetValue("TicketType", out var ticketType))
|
|
{
|
|
if (Enum.TryParse(ticketType, true, out enumTicketType parsedTicketType))
|
|
{
|
|
switch (parsedTicketType)
|
|
{
|
|
case enumTicketType.Incident:
|
|
if (isInactive)
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Incident.Closed");
|
|
else
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Incident.Active");
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_bug_report), description, isInactive, overlay);
|
|
case enumTicketType.ServiceRequest:
|
|
if (isInactive)
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.ServiceRequest.Closed");
|
|
else
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.ServiceRequest.Active");
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_room_service), description, isInactive, overlay);
|
|
case enumTicketType.UnclassifiedTicket:
|
|
if (isInactive)
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Unclassified.Closed");
|
|
else
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Unclassified.Active");
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_confirmation_number), description, isInactive, overlay);
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isInactive)
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Ticket.Closed");
|
|
else
|
|
description = cMultiLanguageSupport.GetItem("Searchbar.Item.Ticket.Active");
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_mail_outline), description, isInactive, overlay);
|
|
}
|
|
|
|
static private MenuIconInfo GetVirtualSessionIcon(Dictionary<string, string> infos)
|
|
{
|
|
if (infos.TryGetValue("Status", out string status))
|
|
{
|
|
if (status == nameof(enumCitrixSessionStatus.Active))
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_cloud_queue));
|
|
}
|
|
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_cloud_off));
|
|
}
|
|
|
|
static public MenuIconInfo GetMenuIcon(enumF4sdSearchResultClass searchResultClass, Dictionary<string, string> infos)
|
|
{
|
|
switch (searchResultClass)
|
|
{
|
|
case enumF4sdSearchResultClass.Computer:
|
|
return new MenuIconInfo(new IconData(enumInternIcons.misc_computer));
|
|
case enumF4sdSearchResultClass.User:
|
|
return new MenuIconInfo(new IconData(enumInternIcons.misc_user));
|
|
case enumF4sdSearchResultClass.Phone:
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_phone));
|
|
case enumF4sdSearchResultClass.Ticket:
|
|
return GetTicketIcon(infos);
|
|
case enumF4sdSearchResultClass.MobileDevice:
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_smartphone));
|
|
case enumF4sdSearchResultClass.VirtualSession:
|
|
return GetVirtualSessionIcon(infos);
|
|
default:
|
|
return new MenuIconInfo(new IconData(MaterialIcons.MaterialIconType.ic_more_vert));
|
|
}
|
|
}
|
|
}
|
|
|
|
public sealed class cMenuDataSearchRelation : cMenuDataBase
|
|
{
|
|
public readonly DateTime LastUsed;
|
|
public readonly double UsingLevel = 0;
|
|
public readonly Dictionary<string, string> Infos = null;
|
|
public bool IsMatchingRelation = false;
|
|
public bool IsUsedForCaseEnrichment = false;
|
|
|
|
public readonly cF4sdApiSearchResultRelation searchResultRelation = null;
|
|
|
|
public cMenuDataSearchRelation(cF4sdApiSearchResultRelation searchResultRelation)
|
|
{
|
|
try
|
|
{
|
|
UiAction = null;
|
|
|
|
if (searchResultRelation is null)
|
|
return;
|
|
|
|
this.searchResultRelation = searchResultRelation;
|
|
MenuText = searchResultRelation.DisplayName;
|
|
Data = searchResultRelation;
|
|
LastUsed = searchResultRelation.LastUsed;
|
|
UsingLevel = searchResultRelation.UsingLevel;
|
|
Infos = searchResultRelation.Infos;
|
|
MenuIcon = cMenuDataSearchResult.GetMenuIcon(searchResultRelation.Type, searchResultRelation.Infos);
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
}
|
|
|
|
public sealed class cMenuDataLoading : cMenuDataBase
|
|
{
|
|
public cMenuDataLoading(string LoadingText)
|
|
{
|
|
MenuText = LoadingText;
|
|
}
|
|
}
|
|
|
|
public class cFilteredResults
|
|
{
|
|
public bool AutoContinue { get; set; } = false;
|
|
public cFasdApiSearchResultCollection Results { get; set; }
|
|
|
|
public cF4sdApiSearchResultRelation PreSelectedRelation { get; set; }
|
|
|
|
public cFilteredResults()
|
|
{
|
|
|
|
}
|
|
|
|
public cFilteredResults(cFasdApiSearchResultCollection _results)
|
|
{
|
|
Results = _results ?? new cFasdApiSearchResultCollection();
|
|
}
|
|
}
|
|
}
|