From aafd1f12deb94d783bd67d500835e339e8c090f1 Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 5 Feb 2026 10:04:19 +0100 Subject: [PATCH] aktueller Stand --- .../Basics/Helper/TicketDeepLinkHelper.cs | 85 +++++++++++++++++++ .../UiProcessSearchRelationAction.cs | 24 +++--- FasdDesktopUi/F4SD-Cockpit-Client.csproj | 5 +- .../Pages/SearchPage/SearchPageView.xaml.cs | 68 +-------------- 4 files changed, 103 insertions(+), 79 deletions(-) create mode 100644 FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs diff --git a/FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs b/FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs new file mode 100644 index 0000000..a712e0a --- /dev/null +++ b/FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs @@ -0,0 +1,85 @@ +using System; +using C4IT.FASD.Base; +using C4IT.Logging; +using FasdDesktopUi.Basics; +using static C4IT.Logging.cLogManager; + +namespace FasdDesktopUi.Basics.Helper +{ + internal static class TicketDeepLinkHelper + { + internal static bool TryOpenTicketRelationExternally(cF4sdApiSearchResultRelation relation) + { + try + { + if (relation == null || relation.Type != enumF4sdSearchResultClass.Ticket) + return false; + + var ticketConfig = cFasdCockpitConfig.Instance?.Global?.TicketConfiguration; + if (ticketConfig == null) + return false; + + var isIncident = IsIncidentRelation(relation, out var activityType); + var openExternally = isIncident + ? ticketConfig.OpenIncidentsExternally + : ticketConfig.OpenTicketsExternally; + + if (!openExternally) + return false; + + var url = BuildTicketDeepLink(relation.id, activityType); + if (string.IsNullOrWhiteSpace(url)) + return false; + + new cBrowsers().Start("default", url); + return true; + } + catch (Exception ex) + { + LogException(ex); + } + + return false; + } + + internal 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; + } + + internal static string BuildTicketDeepLink(Guid ticketId, string activityType) + { + 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}"; + } + } +} diff --git a/FasdDesktopUi/Basics/UiActions/UiProcessSearchRelationAction.cs b/FasdDesktopUi/Basics/UiActions/UiProcessSearchRelationAction.cs index 1a5ed82..f31722a 100644 --- a/FasdDesktopUi/Basics/UiActions/UiProcessSearchRelationAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiProcessSearchRelationAction.cs @@ -1,6 +1,7 @@ using C4IT.FASD.Base; using C4IT.Logging; -using C4IT.MultiLanguage; +using C4IT.MultiLanguage; +using FasdDesktopUi.Basics.Helper; using FasdDesktopUi.Basics.Services.RelationService; using System; using System.Collections.Generic; @@ -60,15 +61,18 @@ namespace FasdDesktopUi.Basics.UiActions return false; } - if (_selectedRelation == null) - { - Debug.Assert(true, "A new support case can't be opend, if we have no selected relation or seach result"); - LogEntry("A new support case can't be opend, if we have no sselected relation or seach result", LogLevels.Error); - return false; - } - - // check, if have an active support case - var supportCaseActive = dataProvider?.IsActive ?? false; + if (_selectedRelation == null) + { + Debug.Assert(true, "A new support case can't be opend, if we have no selected relation or seach result"); + LogEntry("A new support case can't be opend, if we have no sselected relation or seach result", LogLevels.Error); + return false; + } + + if (TicketDeepLinkHelper.TryOpenTicketRelationExternally(_selectedRelation)) + return false; + + // check, if have an active support case + var supportCaseActive = dataProvider?.IsActive ?? false; // create the search histroy entry var _seachHistoryEntry = new cSearchHistoryRelationEntry(Name, _selectedSearchResult, _relations, _selectedRelation, _searchUiProvider); diff --git a/FasdDesktopUi/F4SD-Cockpit-Client.csproj b/FasdDesktopUi/F4SD-Cockpit-Client.csproj index bff7afc..676996b 100644 --- a/FasdDesktopUi/F4SD-Cockpit-Client.csproj +++ b/FasdDesktopUi/F4SD-Cockpit-Client.csproj @@ -218,8 +218,9 @@ - - + + + diff --git a/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs b/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs index 1ca2be2..f3161f6 100644 --- a/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs +++ b/FasdDesktopUi/Pages/SearchPage/SearchPageView.xaml.cs @@ -1035,73 +1035,7 @@ namespace FasdDesktopUi.Pages.SearchPage 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.OverviewOpenIncidentsExternally - : ticketConfig.OverviewOpenTicketsExternally; - - 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}"; + return TicketDeepLinkHelper.TryOpenTicketRelationExternally(relation); } private Task RunTicketSearchAsync(string ticketName, Guid ticketId, string userName, string sids, bool suppressUi = false)