diff --git a/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs b/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs index a5f352e..ecf0448 100644 --- a/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs +++ b/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs @@ -1010,6 +1010,9 @@ namespace FasdDesktopUi.Pages.SearchPage if (relation == null || relation.Type != enumF4sdSearchResultClass.Ticket) return Task.CompletedTask; + if (TryOpenTicketOverviewRelationExternally(relation)) + return Task.CompletedTask; + var ticketName = string.IsNullOrWhiteSpace(relation.DisplayName) ? relation.Name : relation.DisplayName; var ticketId = relation.id; if (ticketId == Guid.Empty) @@ -1030,6 +1033,77 @@ namespace FasdDesktopUi.Pages.SearchPage return RunTicketSearchAsync(ticketName, ticketId, userName, sids, suppressUi: true); } + private bool TryOpenTicketOverviewRelationExternally(cF4sdApiSearchResultRelation relation) + { + try + { + var ticketConfig = cFasdCockpitConfig.Instance?.Global?.TicketConfiguration; + if (ticketConfig == null) + return false; + + var isIncident = IsIncidentRelation(relation, out var activityType); + var openExternally = isIncident + ? ticketConfig.TicketOverviewOpenIncidentsExternally + : ticketConfig.TicketOverviewOpenTicketsExternally; + + if (!openExternally) + return false; + + var url = BuildTicketOverviewDeepLink(relation.id, activityType, isIncident); + if (string.IsNullOrWhiteSpace(url)) + return false; + + new cBrowsers().Start("default", url); + return true; + } + catch (Exception ex) + { + LogException(ex); + } + + return false; + } + + private static bool IsIncidentRelation(cF4sdApiSearchResultRelation relation, out string activityType) + { + activityType = null; + + if (relation?.Infos != null && relation.Infos.TryGetValue("ActivityType", out var activityTypeValue)) + activityType = activityTypeValue; + + if (string.IsNullOrWhiteSpace(activityType)) + return false; + + return activityType.IndexOf("Incident", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private static string BuildTicketOverviewDeepLink(Guid ticketId, string activityType, bool isIncident) + { + if (ticketId == Guid.Empty) + return null; + + var server = cCockpitConfiguration.Instance?.m42ServerConfiguration?.Server; + if (string.IsNullOrWhiteSpace(server)) + return null; + + var baseUrl = server.TrimEnd('/'); + if (!baseUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) && + !baseUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) + { + baseUrl = "https://" + baseUrl; + } + if (!baseUrl.EndsWith("/wm", StringComparison.OrdinalIgnoreCase)) + baseUrl += "/wm"; + + if (string.IsNullOrWhiteSpace(activityType)) + return null; + + var viewOptionsJson = $"{{\"embedded\":false,\"objectId\":\"{ticketId}\",\"type\":\"{activityType}\",\"viewType\":\"preview\",\"archived\":0}}"; + var viewOptionsEncoded = Uri.EscapeDataString(viewOptionsJson); + + return $"{baseUrl}/app-ServiceDesk/?view-options={viewOptionsEncoded}"; + } + private Task RunTicketSearchAsync(string ticketName, Guid ticketId, string userName, string sids, bool suppressUi = false) { if (ticketId == Guid.Empty)