Compare commits

..

4 Commits

Author SHA1 Message Date
Meik
7392454a63 aktueller stand 2026-02-10 16:53:06 +01:00
Meik
f89e2de60d fixed fallabschluss höhe 2026-02-10 11:29:57 +01:00
Meik
764a8cffb8 generic hierarchical control 2026-02-09 21:07:39 +01:00
Meik
e8584c1453 kategorie fix highlight current value 2026-02-09 20:43:47 +01:00
12 changed files with 562 additions and 156 deletions

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<F4SD-Global-Configuration>
<ShouldSkipSlimView Policy="Default" Value="true" />
<SmallViewAlignment Policy="Default" Value="Right" />
<FavouriteBarAlignment Policy="Default" Value="Right" />
<InformationClassSearchPriority Policy="Hidden">
<InformationClass Type="User" />
<InformationClass Type="Computer" />
<InformationClass Type="VirtualSession" />
<InformationClass Type="Ticket" />
</InformationClassSearchPriority>
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="IfRequired" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="true" />
<OpenActivitiesExternally Policy="Mandatory" Value="false">
<OpenActivityOverride ActivityType="SPSActivityTypeTicket" Value="false" />
<OpenActivityOverride ActivityType="SPSActivityTypeServiceRequest" Value="true" />
</OpenActivitiesExternally>
<OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration>
</F4SD-Global-Configuration>

View File

@@ -119,6 +119,9 @@
<Content Include="Config\F4SD-MenuSection-Configuration.xml"> <Content Include="Config\F4SD-MenuSection-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Include="Config\F4SD-Global-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Config\F4SD-QuickAction-Configuration.xml"> <Content Include="Config\F4SD-QuickAction-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>

View File

@@ -6,11 +6,13 @@ using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Threading; using System.Threading;
using System.Diagnostics; using System.Diagnostics;
using System.Xml;
using Newtonsoft.Json; using Newtonsoft.Json;
using FasdCockpitBase.Models; using FasdCockpitBase.Models;
using FasdCockpitCommunicationDemo; using FasdCockpitCommunicationDemo;
using C4IT.Configuration;
using C4IT.FASD.Base; using C4IT.FASD.Base;
using static C4IT.Logging.cLogManager; using static C4IT.Logging.cLogManager;
using FasdCockpitBase; using FasdCockpitBase;
@@ -252,6 +254,7 @@ namespace C4IT.FASD.Cockpit.Communication
TicketId = record.TicketId, TicketId = record.TicketId,
UserId = record.UserId, UserId = record.UserId,
DisplayName = record.DisplayName, DisplayName = record.DisplayName,
ActivityType = record.ActivityType,
Summary = record.Summary, Summary = record.Summary,
StatusId = record.StatusId, StatusId = record.StatusId,
UserDisplayName = record.UserDisplayName, UserDisplayName = record.UserDisplayName,
@@ -490,6 +493,9 @@ namespace C4IT.FASD.Cockpit.Communication
var summary = definition.Summary ?? string.Empty; var summary = definition.Summary ?? string.Empty;
if (detailTicket != null && !string.IsNullOrWhiteSpace(detailTicket.Summary)) if (detailTicket != null && !string.IsNullOrWhiteSpace(detailTicket.Summary))
summary = detailTicket.Summary; summary = detailTicket.Summary;
var activityType = string.IsNullOrWhiteSpace(definition.ActivityType)
? null
: definition.ActivityType.Trim();
var relation = new cF4sdApiSearchResultRelation var relation = new cF4sdApiSearchResultRelation
{ {
@@ -504,7 +510,8 @@ namespace C4IT.FASD.Cockpit.Communication
["StatusId"] = definition.StatusId ?? string.Empty, ["StatusId"] = definition.StatusId ?? string.Empty,
["UserDisplayName"] = definition.UserDisplayName ?? string.Empty, ["UserDisplayName"] = definition.UserDisplayName ?? string.Empty,
["UserAccount"] = definition.UserAccount ?? string.Empty, ["UserAccount"] = definition.UserAccount ?? string.Empty,
["UserDomain"] = definition.UserDomain ?? string.Empty ["UserDomain"] = definition.UserDomain ?? string.Empty,
["ActivityType"] = activityType
}, },
Identities = new cF4sdIdentityList Identities = new cF4sdIdentityList
{ {
@@ -555,6 +562,129 @@ namespace C4IT.FASD.Cockpit.Communication
return fallbackData.Tickets.FirstOrDefault(ticket => ticket.Id == definition.TicketId); return fallbackData.Tickets.FirstOrDefault(ticket => ticket.Id == definition.TicketId);
} }
private static string ResolveTicketActivityType(string displayName, cF4SDTicket detailTicket = null)
{
var linkType = TryGetActivityTypeFromTicketLinks(detailTicket);
if (!string.IsNullOrWhiteSpace(linkType))
return linkType;
var ticketName = displayName ?? detailTicket?.Name;
if (string.IsNullOrWhiteSpace(ticketName))
return "SPSActivityTypeTicket";
if (ticketName.StartsWith("INC", StringComparison.OrdinalIgnoreCase))
return "SPSActivityTypeIncident";
if (ticketName.StartsWith("SRQ", StringComparison.OrdinalIgnoreCase))
return "SPSActivityTypeServiceRequest";
if (ticketName.StartsWith("PRB", StringComparison.OrdinalIgnoreCase))
return "SPSActivityTypeGroupTicket";
if (ticketName.StartsWith("ALT", StringComparison.OrdinalIgnoreCase))
return "SPSActivityTypeAlert";
if (ticketName.StartsWith("CHG", StringComparison.OrdinalIgnoreCase))
return "SVMChangeRequestType";
if (ticketName.StartsWith("TSK", StringComparison.OrdinalIgnoreCase))
return "SPSActivityTypeBase";
return "SPSActivityTypeTicket";
}
private static string TryGetActivityTypeFromTicketLinks(cF4SDTicket ticket)
{
if (ticket?.DirectLinks == null || ticket.DirectLinks.Count == 0)
return null;
foreach (var link in ticket.DirectLinks.Values)
{
var type = TryGetActivityTypeFromUrl(link);
if (!string.IsNullOrWhiteSpace(type))
return type;
}
return null;
}
private static string TryGetActivityTypeFromUrl(string url)
{
if (string.IsNullOrWhiteSpace(url))
return null;
var markerList = new[] { "preview-object/", "edit-object/", "create-object/" };
foreach (var marker in markerList)
{
var markerIndex = url.IndexOf(marker, StringComparison.OrdinalIgnoreCase);
if (markerIndex < 0)
continue;
var start = markerIndex + marker.Length;
var end = url.IndexOf('/', start);
if (end < 0)
end = url.IndexOf('?', start);
if (end < 0)
end = url.Length;
if (end <= start)
continue;
var activityType = url.Substring(start, end - start).Trim();
if (!string.IsNullOrWhiteSpace(activityType))
return activityType;
}
// Fallback for view-options based deeplinks.
var decodedUrl = Uri.UnescapeDataString(url);
const string queryTypeToken = "\"type\":\"";
var typeStart = decodedUrl.IndexOf(queryTypeToken, StringComparison.OrdinalIgnoreCase);
if (typeStart < 0)
return null;
typeStart += queryTypeToken.Length;
var typeEnd = decodedUrl.IndexOf('"', typeStart);
if (typeEnd <= typeStart)
return null;
var parsedType = decodedUrl.Substring(typeStart, typeEnd - typeStart).Trim();
return string.IsNullOrWhiteSpace(parsedType) ? null : parsedType;
}
private string ResolveDemoM42Server()
{
foreach (var sampleData in MockupData)
{
if (sampleData?.Tickets == null)
continue;
foreach (var ticket in sampleData.Tickets)
{
if (ticket?.DirectLinks == null)
continue;
foreach (var link in ticket.DirectLinks.Values)
{
if (TryExtractServerBase(link, out var serverBase))
return serverBase;
}
}
}
return "https://srvwsm001.imagoverum.com";
}
private static bool TryExtractServerBase(string url, out string serverBase)
{
serverBase = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out var uri))
return false;
serverBase = uri.GetLeftPart(UriPartial.Authority);
return !string.IsNullOrWhiteSpace(serverBase);
}
private static Task SimulateTicketOverviewLatencyAsync(int count) private static Task SimulateTicketOverviewLatencyAsync(int count)
{ {
int baseMs = 420; int baseMs = 420;
@@ -1128,7 +1258,7 @@ namespace C4IT.FASD.Cockpit.Communication
foreach (var demoTicket in demoTickets) foreach (var demoTicket in demoTickets)
{ {
output.Add(new cF4sdApiSearchResultRelation() { id = demoTicket.Id, Name = demoTicket.Name, DisplayName = demoTicket.Name, Infos = new Dictionary<string, string>() { ["Summary"] = demoTicket.Summary, ["Status"] = demoTicket.Status.ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(), ["Asset"] = demoTicket.Asset }, Type = enumF4sdSearchResultClass.Ticket, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Ticket, Id = demoTicket.Id } } }); output.Add(new cF4sdApiSearchResultRelation() { id = demoTicket.Id, Name = demoTicket.Name, DisplayName = demoTicket.Name, Infos = new Dictionary<string, string>() { ["Summary"] = demoTicket.Summary, ["Status"] = demoTicket.Status.ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(), ["Asset"] = demoTicket.Asset, ["ActivityType"] = ResolveTicketActivityType(demoTicket.Name, demoTicket) }, Type = enumF4sdSearchResultClass.Ticket, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Ticket, Id = demoTicket.Id } } });
} }
break; break;
@@ -1187,7 +1317,8 @@ namespace C4IT.FASD.Cockpit.Communication
["Summary"] = demoTicket.Summary ?? string.Empty, ["Summary"] = demoTicket.Summary ?? string.Empty,
["Status"] = demoTicket.Status.ToString(), ["Status"] = demoTicket.Status.ToString(),
["StatusId"] = ((int)demoTicket.Status).ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(),
["Asset"] = demoTicket.Asset ?? string.Empty ["Asset"] = demoTicket.Asset ?? string.Empty,
["ActivityType"] = ResolveTicketActivityType(demoTicket.Name, demoTicket)
}, },
Identities = new cF4sdIdentityList() Identities = new cF4sdIdentityList()
{ {
@@ -2011,11 +2142,38 @@ namespace C4IT.FASD.Cockpit.Communication
{ {
cCockpitConfiguration.Instance = new cCockpitConfiguration(); cCockpitConfiguration.Instance = new cCockpitConfiguration();
cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 }; cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 };
cCockpitConfiguration.Instance.m42ServerConfiguration = new cM42ServerConfiguration() { Server = "" }; cCockpitConfiguration.Instance.m42ServerConfiguration = new cM42ServerConfiguration() { Server = ResolveDemoM42Server() };
cCockpitConfiguration.Instance.GlobalConfig = LoadDemoGlobalConfig();
await Task.CompletedTask; await Task.CompletedTask;
return true; return true;
} }
private static cConfigHelperParameterList LoadDemoGlobalConfig()
{
try
{
var executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var filePath = Path.Combine(executingDirectory, "Config", "F4SD-Global-Configuration.xml");
if (!File.Exists(filePath))
return null;
var xmlDocument = new XmlDocument();
xmlDocument.Load(filePath);
var root = xmlDocument.DocumentElement;
if (root == null || !string.Equals(root.Name, "F4SD-Global-Configuration", StringComparison.OrdinalIgnoreCase))
return null;
return cF4sdGlobalConfigParameterParser.Parse(root);
}
catch (Exception E)
{
LogException(E);
}
return null;
}
public override Task<bool> GetAgentOnlineStatus(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(true); public override Task<bool> GetAgentOnlineStatus(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(true);
public override Task<cF4sdAgentScript> GetQuickActionOfAgent(int ScriptId) => Task.FromResult(new cF4sdAgentScript() { Id = ScriptId, Name = "AgentScript", Type = enumAgentScriptType.user, UserPermissionRequired = false }); public override Task<cF4sdAgentScript> GetQuickActionOfAgent(int ScriptId) => Task.FromResult(new cF4sdAgentScript() { Id = ScriptId, Name = "AgentScript", Type = enumAgentScriptType.user, UserPermissionRequired = false });

View File

@@ -3,6 +3,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Neue Störung: VPN trennt nach wenigen Minuten", "Summary": "Neue Störung: VPN trennt nach wenigen Minuten",
@@ -30,6 +31,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Teams-Meldungen kommen verzögert an", "Summary": "Teams-Meldungen kommen verzögert an",
@@ -57,6 +59,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Anfrage: Gerät startet nicht zuverlässig", "Summary": "Anfrage: Gerät startet nicht zuverlässig",
@@ -84,6 +87,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Bitte um Rückmeldung: Ticketsystem reagiert langsam", "Summary": "Bitte um Rückmeldung: Ticketsystem reagiert langsam",
@@ -111,6 +115,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Passwort-Reset für AD-Benutzer erforderlich", "Summary": "Passwort-Reset für AD-Benutzer erforderlich",
@@ -138,6 +143,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Netzwerkdrucker druckt nur leere Seiten", "Summary": "Netzwerkdrucker druckt nur leere Seiten",
@@ -165,6 +171,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Outlook: Speicherlimit erreicht Postfach voll", "Summary": "Outlook: Speicherlimit erreicht Postfach voll",
@@ -192,6 +199,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Softwareanfrage: Microsoft Visio Standard", "Summary": "Softwareanfrage: Microsoft Visio Standard",
@@ -219,6 +227,7 @@
{ {
"TileKey": "TicketsNew", "TileKey": "TicketsNew",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK", "DisplayNamePrefix": "TCK",
"Summary": "Konto gesperrt nach mehrfachen Fehlversuchen", "Summary": "Konto gesperrt nach mehrfachen Fehlversuchen",
@@ -250,6 +259,7 @@
"UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2",
"TileKey": "UnassignedTickets", "TileKey": "UnassignedTickets",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00414", "DisplayName": "TCK00414",
"Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt",
"StatusId": "New", "StatusId": "New",
@@ -278,6 +288,7 @@
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"TileKey": "UnassignedTickets", "TileKey": "UnassignedTickets",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00415", "DisplayName": "TCK00415",
"Summary": "Etikettendrucker im Lager meldet Papierstau", "Summary": "Etikettendrucker im Lager meldet Papierstau",
"StatusId": "New", "StatusId": "New",
@@ -306,6 +317,7 @@
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"TileKey": "UnassignedTicketsCritical", "TileKey": "UnassignedTicketsCritical",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00416", "DisplayName": "TCK00416",
"Summary": "WLAN Controller im Werk startet zyklisch neu", "Summary": "WLAN Controller im Werk startet zyklisch neu",
"StatusId": "InProgress", "StatusId": "InProgress",
@@ -334,6 +346,7 @@
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"TileKey": "UnassignedTicketsCritical", "TileKey": "UnassignedTicketsCritical",
"UseRoleScope": false, "UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00417", "DisplayName": "TCK00417",
"Summary": "SAP Buchungsjob bricht nachts wiederholt ab", "Summary": "SAP Buchungsjob bricht nachts wiederholt ab",
"StatusId": "InProgress", "StatusId": "InProgress",

View File

@@ -5,6 +5,7 @@
"TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f", "TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00186", "DisplayName": "TCK00186",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Mein OneDrive synchronisiert nicht mehr", "Summary": "Mein OneDrive synchronisiert nicht mehr",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -17,6 +18,7 @@
"TicketId": "bb2e4a9d-2c1e-4b32-8f75-6e7c9f99f2d4", "TicketId": "bb2e4a9d-2c1e-4b32-8f75-6e7c9f99f2d4",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00761", "DisplayName": "TCK00761",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "VPN-Verbindung bricht nach wenigen Minuten ab", "Summary": "VPN-Verbindung bricht nach wenigen Minuten ab",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -27,6 +29,7 @@
"TicketId": "d63e5ea1-0785-4998-82ad-9a9e5a0f8c37", "TicketId": "d63e5ea1-0785-4998-82ad-9a9e5a0f8c37",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00765", "DisplayName": "TCK00765",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Teams-Benachrichtigungen kommen verzögert an", "Summary": "Teams-Benachrichtigungen kommen verzögert an",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -37,6 +40,7 @@
"TicketId": "f7771fde-33ba-421a-8d9b-cdf468e7541c", "TicketId": "f7771fde-33ba-421a-8d9b-cdf468e7541c",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "TCK00403", "DisplayName": "TCK00403",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Neuer Monitor fuer Hotline Arbeitsplatz", "Summary": "Neuer Monitor fuer Hotline Arbeitsplatz",
"UserDisplayName": "Busch, Andrea", "UserDisplayName": "Busch, Andrea",
"UserAccount": "AB014", "UserAccount": "AB014",
@@ -47,6 +51,7 @@
"TicketId": "6294eec7-fb80-42f3-8ce8-7f7982ae200c", "TicketId": "6294eec7-fb80-42f3-8ce8-7f7982ae200c",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "TCK00404", "DisplayName": "TCK00404",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Monitor flackert seit Firmware Update", "Summary": "Monitor flackert seit Firmware Update",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -61,6 +66,7 @@
"TicketId": "75e08a29-4103-41d6-962c-009c3342bc46", "TicketId": "75e08a29-4103-41d6-962c-009c3342bc46",
"UserId": "6180aa17-ba2d-455a-bf2f-ec4a075c2d64", "UserId": "6180aa17-ba2d-455a-bf2f-ec4a075c2d64",
"DisplayName": "TCK00406", "DisplayName": "TCK00406",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "CAD Software startet nach Update nicht mehr", "Summary": "CAD Software startet nach Update nicht mehr",
"UserDisplayName": "Kohl, Carlos", "UserDisplayName": "Kohl, Carlos",
"UserAccount": "CK102", "UserAccount": "CK102",
@@ -73,6 +79,7 @@
"TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f", "TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00405", "DisplayName": "TCK00405",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Mein OneDrive synchronisiert nicht mehr", "Summary": "Mein OneDrive synchronisiert nicht mehr",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -83,6 +90,7 @@
"TicketId": "ff62a3e2-5004-4a8c-b71c-7ebb1877d1a4", "TicketId": "ff62a3e2-5004-4a8c-b71c-7ebb1877d1a4",
"UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694", "UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694",
"DisplayName": "TCK00407", "DisplayName": "TCK00407",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Netzlaufwerk Projekt X nicht erreichbar", "Summary": "Netzlaufwerk Projekt X nicht erreichbar",
"UserDisplayName": "Hanova, Hans", "UserDisplayName": "Hanova, Hans",
"UserAccount": "HH101", "UserAccount": "HH101",
@@ -97,6 +105,7 @@
"TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246", "TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00408", "DisplayName": "TCK00408",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "VPN Konzentrator in Aussenstelle offline", "Summary": "VPN Konzentrator in Aussenstelle offline",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -107,6 +116,7 @@
"TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7", "TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "TCK00409", "DisplayName": "TCK00409",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "SAP Produktionsauftrag bricht ab", "Summary": "SAP Produktionsauftrag bricht ab",
"UserDisplayName": "Boss, Bernd", "UserDisplayName": "Boss, Bernd",
"UserAccount": "BB003", "UserAccount": "BB003",
@@ -119,6 +129,7 @@
"TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246", "TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00408", "DisplayName": "TCK00408",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "VPN Konzentrator in Aussenstelle offline", "Summary": "VPN Konzentrator in Aussenstelle offline",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -129,6 +140,7 @@
"TicketId": "9b7710d4-72da-4b2a-9d0c-be02575d2c52", "TicketId": "9b7710d4-72da-4b2a-9d0c-be02575d2c52",
"UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155", "UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155",
"DisplayName": "TCK00410", "DisplayName": "TCK00410",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "WLAN im Lager faellt minutenweise aus", "Summary": "WLAN im Lager faellt minutenweise aus",
"UserDisplayName": "Kiefer, Maximilian", "UserDisplayName": "Kiefer, Maximilian",
"UserAccount": "MK009", "UserAccount": "MK009",
@@ -139,6 +151,7 @@
"TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7", "TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "TCK00409", "DisplayName": "TCK00409",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "SAP Produktionsauftrag bricht ab", "Summary": "SAP Produktionsauftrag bricht ab",
"UserDisplayName": "Boss, Bernd", "UserDisplayName": "Boss, Bernd",
"UserAccount": "BB003", "UserAccount": "BB003",
@@ -153,6 +166,7 @@
"TicketId": "de403992-98cb-4476-9e04-d645ab22e6de", "TicketId": "de403992-98cb-4476-9e04-d645ab22e6de",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00411", "DisplayName": "TCK00411",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Passwort muss zur\u00fcckgesetzt werden", "Summary": "Passwort muss zur\u00fcckgesetzt werden",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -163,6 +177,7 @@
"TicketId": "7c29dd33-1247-453c-9db6-f7a59107d276", "TicketId": "7c29dd33-1247-453c-9db6-f7a59107d276",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "TCK00412", "DisplayName": "TCK00412",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Techniker bittet um Rueckmeldung zum Notebook", "Summary": "Techniker bittet um Rueckmeldung zum Notebook",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -175,6 +190,7 @@
"TicketId": "de403992-98cb-4476-9e04-d645ab22e6de", "TicketId": "de403992-98cb-4476-9e04-d645ab22e6de",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayName": "TCK00411", "DisplayName": "TCK00411",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Passwort muss zur\u00fcckgesetzt werden", "Summary": "Passwort muss zur\u00fcckgesetzt werden",
"UserDisplayName": "Ticket, Timo", "UserDisplayName": "Ticket, Timo",
"UserAccount": "TT007", "UserAccount": "TT007",
@@ -185,6 +201,7 @@
"TicketId": "b207822d-7e1c-42a7-b8c9-4246f711dd18", "TicketId": "b207822d-7e1c-42a7-b8c9-4246f711dd18",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00413", "DisplayName": "TCK00413",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Wartungsfenster fuer Firewall verschieben", "Summary": "Wartungsfenster fuer Firewall verschieben",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -199,6 +216,7 @@
"TicketId": "e0ba7c81-f9b1-4e99-a4d6-efecc5e4312e", "TicketId": "e0ba7c81-f9b1-4e99-a4d6-efecc5e4312e",
"UserId": "f69dd1a9-591f-4004-b950-264238663bf0", "UserId": "f69dd1a9-591f-4004-b950-264238663bf0",
"DisplayName": "INC00401", "DisplayName": "INC00401",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Teams Telefonie ist fuer Standort Sued offline", "Summary": "Teams Telefonie ist fuer Standort Sued offline",
"UserDisplayName": "Ottmann, Thomas", "UserDisplayName": "Ottmann, Thomas",
"UserAccount": "TO011", "UserAccount": "TO011",
@@ -209,6 +227,7 @@
"TicketId": "a8deb50d-9f15-4371-9ebc-a28791f27d5c", "TicketId": "a8deb50d-9f15-4371-9ebc-a28791f27d5c",
"UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2",
"DisplayName": "INC00402", "DisplayName": "INC00402",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "SharePoint Bereich Vertrieb laedt extrem langsam", "Summary": "SharePoint Bereich Vertrieb laedt extrem langsam",
"UserDisplayName": "Virtual, Vera", "UserDisplayName": "Virtual, Vera",
"UserAccount": "VV004", "UserAccount": "VV004",
@@ -221,6 +240,7 @@
"TicketId": "fe15284f-f553-4434-8b59-7d8b9f481bf7", "TicketId": "fe15284f-f553-4434-8b59-7d8b9f481bf7",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "INC00403", "DisplayName": "INC00403",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Firewall Cluster meldet Sync Fehler", "Summary": "Firewall Cluster meldet Sync Fehler",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -231,6 +251,7 @@
"TicketId": "9cdddacf-9395-476b-811a-09c5f1491d4b", "TicketId": "9cdddacf-9395-476b-811a-09c5f1491d4b",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "INC00404", "DisplayName": "INC00404",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "CRM Anmeldung liefert Timeout fuer Kundencenter", "Summary": "CRM Anmeldung liefert Timeout fuer Kundencenter",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -245,6 +266,7 @@
"TicketId": "7e852bb9-420b-4caa-b79a-9178d793fc06", "TicketId": "7e852bb9-420b-4caa-b79a-9178d793fc06",
"UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155", "UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155",
"DisplayName": "INC00405", "DisplayName": "INC00405",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Windows Rollout haengt auf mehreren Clients", "Summary": "Windows Rollout haengt auf mehreren Clients",
"UserDisplayName": "Kiefer, Maximilian", "UserDisplayName": "Kiefer, Maximilian",
"UserAccount": "MK009", "UserAccount": "MK009",
@@ -255,6 +277,7 @@
"TicketId": "3c3c70cf-5c60-4ecc-9313-b5f9c1968fc7", "TicketId": "3c3c70cf-5c60-4ecc-9313-b5f9c1968fc7",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "INC00406", "DisplayName": "INC00406",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Remotedesktop Sitzung trennt nach wenigen Minuten", "Summary": "Remotedesktop Sitzung trennt nach wenigen Minuten",
"UserDisplayName": "Busch, Andrea", "UserDisplayName": "Busch, Andrea",
"UserAccount": "AB014", "UserAccount": "AB014",
@@ -267,6 +290,7 @@
"TicketId": "486df93d-15b6-41d4-b902-2c1e1838c74b", "TicketId": "486df93d-15b6-41d4-b902-2c1e1838c74b",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "INC00407", "DisplayName": "INC00407",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Firewall Cluster meldet weiterhin Sync Fehler", "Summary": "Firewall Cluster meldet weiterhin Sync Fehler",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -277,6 +301,7 @@
"TicketId": "86da28b0-013b-4542-bcff-175044d5bb02", "TicketId": "86da28b0-013b-4542-bcff-175044d5bb02",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "INC00408", "DisplayName": "INC00408",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Produktionslinie meldet keine Sensordaten", "Summary": "Produktionslinie meldet keine Sensordaten",
"UserDisplayName": "Zufall, Rainer", "UserDisplayName": "Zufall, Rainer",
"UserAccount": "RZ011", "UserAccount": "RZ011",
@@ -287,6 +312,7 @@
"TicketId": "a1cf6635-a5c4-4401-b4f0-60b9c65b4d75", "TicketId": "a1cf6635-a5c4-4401-b4f0-60b9c65b4d75",
"UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694", "UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694",
"DisplayName": "INC00409", "DisplayName": "INC00409",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Exchange Transportdienst setzt Mails in Warteschlange", "Summary": "Exchange Transportdienst setzt Mails in Warteschlange",
"UserDisplayName": "Hanova, Hans", "UserDisplayName": "Hanova, Hans",
"UserAccount": "HH101", "UserAccount": "HH101",
@@ -301,6 +327,7 @@
"TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8", "TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "INC00410", "DisplayName": "INC00410",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Kuehlung im Rechenzentrum U3 ausgefallen", "Summary": "Kuehlung im Rechenzentrum U3 ausgefallen",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -313,6 +340,7 @@
"TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8", "TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "INC00410", "DisplayName": "INC00410",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Kuehlung im Rechenzentrum U3 ausgefallen", "Summary": "Kuehlung im Rechenzentrum U3 ausgefallen",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -323,6 +351,7 @@
"TicketId": "130ec52f-dac3-427d-803e-e7cf67e4a744", "TicketId": "130ec52f-dac3-427d-803e-e7cf67e4a744",
"UserId": "f69dd1a9-591f-4004-b950-264238663bf0", "UserId": "f69dd1a9-591f-4004-b950-264238663bf0",
"DisplayName": "INC00411", "DisplayName": "INC00411",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Kartenzahlung in den Filialen nicht moeglich", "Summary": "Kartenzahlung in den Filialen nicht moeglich",
"UserDisplayName": "Ottmann, Thomas", "UserDisplayName": "Ottmann, Thomas",
"UserAccount": "TO011", "UserAccount": "TO011",
@@ -333,6 +362,7 @@
"TicketId": "b7d22b65-c11e-459c-ac31-5b1c08e4118d", "TicketId": "b7d22b65-c11e-459c-ac31-5b1c08e4118d",
"UserId": "8c3ca0fb-f18c-4893-ad83-290e6e02f352", "UserId": "8c3ca0fb-f18c-4893-ad83-290e6e02f352",
"DisplayName": "INC00412", "DisplayName": "INC00412",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Datenbank Cluster benoetigt manuellen Failover", "Summary": "Datenbank Cluster benoetigt manuellen Failover",
"UserDisplayName": "Perschmann, Paul", "UserDisplayName": "Perschmann, Paul",
"UserAccount": "PP201", "UserAccount": "PP201",
@@ -347,6 +377,7 @@
"TicketId": "d1a2c544-4f59-4f2b-875f-3621a23d4228", "TicketId": "d1a2c544-4f59-4f2b-875f-3621a23d4228",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "INC00413", "DisplayName": "INC00413",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Backup Team hat Rueckfrage zur Sicherung", "Summary": "Backup Team hat Rueckfrage zur Sicherung",
"UserDisplayName": "Busch, Andrea", "UserDisplayName": "Busch, Andrea",
"UserAccount": "AB014", "UserAccount": "AB014",
@@ -359,6 +390,7 @@
"TicketId": "74846c1b-9a97-420f-8bf2-91e88aa0516a", "TicketId": "74846c1b-9a97-420f-8bf2-91e88aa0516a",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "INC00415", "DisplayName": "INC00415",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Lieferant bittet um Rueckmeldung zu Offsite Backup", "Summary": "Lieferant bittet um Rueckmeldung zu Offsite Backup",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -369,6 +401,7 @@
"TicketId": "1372b3cf-5d87-4099-ab83-ec0cccf7194e", "TicketId": "1372b3cf-5d87-4099-ab83-ec0cccf7194e",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "INC00416", "DisplayName": "INC00416",
"ActivityType": "SPSActivityTypeIncident",
"Summary": "Fernwartung benoetigt Zugangsdaten zur SPS", "Summary": "Fernwartung benoetigt Zugangsdaten zur SPS",
"UserDisplayName": "Zufall, Rainer", "UserDisplayName": "Zufall, Rainer",
"UserAccount": "RZ011", "UserAccount": "RZ011",
@@ -383,6 +416,7 @@
"TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6", "TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6",
"UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2",
"DisplayName": "TCK00414", "DisplayName": "TCK00414",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt",
"UserDisplayName": "Virtual, Vera", "UserDisplayName": "Virtual, Vera",
"UserAccount": "VV004", "UserAccount": "VV004",
@@ -393,6 +427,7 @@
"TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2", "TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "TCK00415", "DisplayName": "TCK00415",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Etikettendrucker im Lager meldet Papierstau", "Summary": "Etikettendrucker im Lager meldet Papierstau",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -405,6 +440,7 @@
"TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6", "TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6",
"UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2",
"DisplayName": "TCK00414", "DisplayName": "TCK00414",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt",
"UserDisplayName": "Virtual, Vera", "UserDisplayName": "Virtual, Vera",
"UserAccount": "VV004", "UserAccount": "VV004",
@@ -415,6 +451,7 @@
"TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2", "TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"DisplayName": "TCK00415", "DisplayName": "TCK00415",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "Etikettendrucker im Lager meldet Papierstau", "Summary": "Etikettendrucker im Lager meldet Papierstau",
"UserDisplayName": "Anwender, Peter", "UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010", "UserAccount": "PA010",
@@ -425,6 +462,7 @@
"TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00416", "DisplayName": "TCK00416",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "WLAN Controller im Werk startet zyklisch neu", "Summary": "WLAN Controller im Werk startet zyklisch neu",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -439,6 +477,7 @@
"TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00416", "DisplayName": "TCK00416",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "WLAN Controller im Werk startet zyklisch neu", "Summary": "WLAN Controller im Werk startet zyklisch neu",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -451,6 +490,7 @@
"TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"DisplayName": "TCK00416", "DisplayName": "TCK00416",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "WLAN Controller im Werk startet zyklisch neu", "Summary": "WLAN Controller im Werk startet zyklisch neu",
"UserDisplayName": "Seifert, Dominik", "UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014", "UserAccount": "DS014",
@@ -461,6 +501,7 @@
"TicketId": "d427dc61-9842-4464-b37a-612878d3de0f", "TicketId": "d427dc61-9842-4464-b37a-612878d3de0f",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"DisplayName": "TCK00417", "DisplayName": "TCK00417",
"ActivityType": "SPSActivityTypeTicket",
"Summary": "SAP Buchungsjob bricht nachts wiederholt ab", "Summary": "SAP Buchungsjob bricht nachts wiederholt ab",
"UserDisplayName": "Boss, Bernd", "UserDisplayName": "Boss, Bernd",
"UserAccount": "BB003", "UserAccount": "BB003",

View File

@@ -34,6 +34,7 @@ namespace FasdCockpitCommunicationDemo
public string TileKey { get; set; } = "TicketsNew"; public string TileKey { get; set; } = "TicketsNew";
public bool UseRoleScope { get; set; } public bool UseRoleScope { get; set; }
public Guid? UserId { get; set; } public Guid? UserId { get; set; }
public string ActivityType { get; set; }
public string DisplayNamePrefix { get; set; } = "TCK"; public string DisplayNamePrefix { get; set; } = "TCK";
public string Summary { get; set; } public string Summary { get; set; }
public string StatusId { get; set; } = "New"; public string StatusId { get; set; } = "New";
@@ -49,6 +50,7 @@ namespace FasdCockpitCommunicationDemo
public Guid UserId { get; set; } public Guid UserId { get; set; }
public string TileKey { get; set; } public string TileKey { get; set; }
public bool UseRoleScope { get; set; } public bool UseRoleScope { get; set; }
public string ActivityType { get; set; }
public string DisplayName { get; set; } public string DisplayName { get; set; }
public string Summary { get; set; } public string Summary { get; set; }
public string StatusId { get; set; } public string StatusId { get; set; }
@@ -167,6 +169,7 @@ namespace FasdCockpitCommunicationDemo
TileKey = source.TileKey, TileKey = source.TileKey,
UseRoleScope = source.UseRoleScope, UseRoleScope = source.UseRoleScope,
UserId = source.UserId, UserId = source.UserId,
ActivityType = source.ActivityType,
DisplayNamePrefix = source.DisplayNamePrefix, DisplayNamePrefix = source.DisplayNamePrefix,
Summary = source.Summary, Summary = source.Summary,
StatusId = source.StatusId, StatusId = source.StatusId,
@@ -188,6 +191,7 @@ namespace FasdCockpitCommunicationDemo
UserId = source.UserId, UserId = source.UserId,
TileKey = source.TileKey, TileKey = source.TileKey,
UseRoleScope = source.UseRoleScope, UseRoleScope = source.UseRoleScope,
ActivityType = source.ActivityType,
DisplayName = source.DisplayName, DisplayName = source.DisplayName,
Summary = source.Summary, Summary = source.Summary,
StatusId = source.StatusId, StatusId = source.StatusId,

View File

@@ -7,6 +7,7 @@ namespace FasdCockpitCommunicationDemo
public Guid TicketId { get; set; } public Guid TicketId { get; set; }
public Guid UserId { get; set; } public Guid UserId { get; set; }
public string DisplayName { get; set; } public string DisplayName { get; set; }
public string ActivityType { get; set; }
public string Summary { get; set; } public string Summary { get; set; }
public string StatusId { get; set; } public string StatusId { get; set; }
public string UserDisplayName { get; set; } public string UserDisplayName { get; set; }

View File

@@ -540,6 +540,7 @@ namespace FasdDesktopUi.Basics.Services
private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record) private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record)
{ {
var activityType = ResolveDemoActivityType(record?.ActivityType);
var relation = new cF4sdApiSearchResultRelation var relation = new cF4sdApiSearchResultRelation
{ {
Type = enumF4sdSearchResultClass.Ticket, Type = enumF4sdSearchResultClass.Ticket,
@@ -553,7 +554,8 @@ namespace FasdDesktopUi.Basics.Services
["StatusId"] = record.StatusId ?? string.Empty, ["StatusId"] = record.StatusId ?? string.Empty,
["UserDisplayName"] = record.UserDisplayName ?? string.Empty, ["UserDisplayName"] = record.UserDisplayName ?? string.Empty,
["UserAccount"] = record.UserAccount ?? string.Empty, ["UserAccount"] = record.UserAccount ?? string.Empty,
["UserDomain"] = record.UserDomain ?? string.Empty ["UserDomain"] = record.UserDomain ?? string.Empty,
["ActivityType"] = activityType
}, },
Identities = new cF4sdIdentityList Identities = new cF4sdIdentityList
{ {
@@ -565,6 +567,13 @@ namespace FasdDesktopUi.Basics.Services
return relation; return relation;
} }
private static string ResolveDemoActivityType(string configuredActivityType)
{
return string.IsNullOrWhiteSpace(configuredActivityType)
? null
: configuredActivityType.Trim();
}
private DemoTicketDetail CloneDetail(DemoTicketDetail source) private DemoTicketDetail CloneDetail(DemoTicketDetail source)
{ {
if (source == null) if (source == null)
@@ -739,6 +748,7 @@ namespace FasdDesktopUi.Basics.Services
TicketId = relationId, TicketId = relationId,
TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey, TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey,
UseRoleScope = template.UseRoleScope, UseRoleScope = template.UseRoleScope,
ActivityType = ResolveDemoActivityType(template.ActivityType),
DisplayName = displayName, DisplayName = displayName,
Summary = summary, Summary = summary,
StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId, StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId,

View File

@@ -105,12 +105,12 @@
Padding="4" Padding="4"
BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}" BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}"
BorderThickness="1"> BorderThickness="1">
<ScrollViewer x:Name="PART_CategoryScrollViewer" <ScrollViewer x:Name="PART_ItemsScrollViewer"
MaxHeight="320" MaxHeight="320"
VerticalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
Background="Transparent" Background="Transparent"
BorderThickness="0" BorderThickness="0"
PreviewMouseWheel="CategoryScrollViewer_PreviewMouseWheel"> PreviewMouseWheel="ItemsScrollViewer_PreviewMouseWheel">
<TreeView x:Name="PART_TreeView" <TreeView x:Name="PART_TreeView"
Background="Transparent" Background="Transparent"
BorderThickness="0" BorderThickness="0"

View File

@@ -8,7 +8,6 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls namespace FasdDesktopUi.Basics.UserControls
{ {
@@ -22,7 +21,7 @@ namespace FasdDesktopUi.Basics.UserControls
private TextBox searchTextBox; private TextBox searchTextBox;
private TreeView treeViewControl; private TreeView treeViewControl;
private ScrollViewer categoryScrollViewer; private ScrollViewer itemsScrollViewer;
public ObservableCollection<HierarchicalSelectionItem> VisibleItems => visibleItems; public ObservableCollection<HierarchicalSelectionItem> VisibleItems => visibleItems;
@@ -41,7 +40,6 @@ namespace FasdDesktopUi.Basics.UserControls
EnsureTemplateParts(); EnsureTemplateParts();
if (treeViewControl != null) if (treeViewControl != null)
treeViewControl.ItemsSource = VisibleItems; treeViewControl.ItemsSource = VisibleItems;
UpdateDisplaySelection();
} }
#region DependencyProperties #region DependencyProperties
@@ -64,7 +62,6 @@ namespace FasdDesktopUi.Basics.UserControls
{ {
control.RebuildLookup(); control.RebuildLookup();
control.ApplyFilter(control.lastSearchText); control.ApplyFilter(control.lastSearchText);
control.TryExpandToSelectedItem();
} }
} }
@@ -84,8 +81,8 @@ namespace FasdDesktopUi.Basics.UserControls
{ {
if (d is HierarchicalSelectionControl control) if (d is HierarchicalSelectionControl control)
{ {
control.LogSelectedItemChange(e.NewValue as HierarchicalSelectionItem);
control.TryExpandToSelectedItem(); control.TryExpandToSelectedItem();
control.SyncTreeSelectionWithSelectedItem(bringIntoView: false);
} }
} }
@@ -109,13 +106,15 @@ namespace FasdDesktopUi.Basics.UserControls
#endregion #endregion
#region UI Event Handling
private void ComboBoxControl_DropDownOpened(object sender, EventArgs e) private void ComboBoxControl_DropDownOpened(object sender, EventArgs e)
{ {
EnsureTemplateParts(); EnsureTemplateParts();
searchTextBox?.Focus(); searchTextBox?.Focus();
searchTextBox?.SelectAll(); searchTextBox?.SelectAll();
suppressTreeSelectionChanged = false; suppressTreeSelectionChanged = false;
LogEntry($"[CategoryPicker] DropDownOpened. Selected={SelectedItem?.FullPath ?? "<null>"}"); SyncTreeSelectionWithSelectedItem(bringIntoView: true);
DropDownOpened?.Invoke(this, e); DropDownOpened?.Invoke(this, e);
} }
@@ -123,7 +122,6 @@ namespace FasdDesktopUi.Basics.UserControls
{ {
searchDelayTimer.Stop(); searchDelayTimer.Stop();
suppressTreeSelectionChanged = false; suppressTreeSelectionChanged = false;
LogEntry("[CategoryPicker] DropDownClosed");
DropDownClosed?.Invoke(this, e); DropDownClosed?.Invoke(this, e);
} }
@@ -137,7 +135,6 @@ namespace FasdDesktopUi.Basics.UserControls
{ {
searchDelayTimer.Stop(); searchDelayTimer.Stop();
lastSearchText = searchTextBox?.Text ?? string.Empty; lastSearchText = searchTextBox?.Text ?? string.Empty;
LogEntry($"[CategoryPicker] Search text changed: '{lastSearchText}'");
ApplyFilter(lastSearchText); ApplyFilter(lastSearchText);
} }
@@ -152,7 +149,6 @@ namespace FasdDesktopUi.Basics.UserControls
if (original != null && !Equals(SelectedItem, original)) if (original != null && !Equals(SelectedItem, original))
{ {
SelectedItem = original; SelectedItem = original;
LogEntry($"[CategoryPicker] Tree selection changed: {original.FullPath}");
} }
suppressTreeSelectionChanged = true; suppressTreeSelectionChanged = true;
@@ -160,6 +156,10 @@ namespace FasdDesktopUi.Basics.UserControls
} }
} }
#endregion
#region Data Preparation and Filtering
private HierarchicalSelectionItem ResolveOriginalItem(HierarchicalSelectionItem item) private HierarchicalSelectionItem ResolveOriginalItem(HierarchicalSelectionItem item)
{ {
if (item == null) if (item == null)
@@ -203,6 +203,7 @@ namespace FasdDesktopUi.Basics.UserControls
} }
TryExpandToSelectedItem(); TryExpandToSelectedItem();
SyncTreeSelectionWithSelectedItem(bringIntoView: false);
return; return;
} }
@@ -220,6 +221,9 @@ namespace FasdDesktopUi.Basics.UserControls
clone.SetExpandedRecursive(true); clone.SetExpandedRecursive(true);
visibleItems.Add(clone); visibleItems.Add(clone);
} }
// If the selected item is part of current results, keep it visually selected.
SyncTreeSelectionWithSelectedItem(bringIntoView: false);
} }
private void TryExpandToSelectedItem() private void TryExpandToSelectedItem()
@@ -238,6 +242,101 @@ namespace FasdDesktopUi.Basics.UserControls
} }
} }
#endregion
#region Tree Selection Sync
private void SyncTreeSelectionWithSelectedItem(bool bringIntoView)
{
if (SelectedItem == null || string.IsNullOrWhiteSpace(SelectedItem.Id))
return;
EnsureTemplateParts();
if (treeViewControl == null)
return;
// Wait for popup/template layout to finish so item containers are generated.
Dispatcher.BeginInvoke(new Action(() =>
{
var target = FindVisibleItemById(VisibleItems, SelectedItem.Id);
if (target == null)
return;
var ancestor = target.Parent;
while (ancestor != null)
{
ancestor.IsExpanded = true;
ancestor = ancestor.Parent;
}
treeViewControl.UpdateLayout();
var targetContainer = GetTreeViewItemContainer(treeViewControl, target);
if (targetContainer == null)
return;
suppressTreeSelectionChanged = true;
try
{
targetContainer.IsSelected = true;
if (bringIntoView)
targetContainer.BringIntoView();
}
finally
{
suppressTreeSelectionChanged = false;
}
}), DispatcherPriority.Loaded);
}
private static HierarchicalSelectionItem FindVisibleItemById(IEnumerable<HierarchicalSelectionItem> items, string id)
{
if (items == null || string.IsNullOrWhiteSpace(id))
return null;
foreach (var item in items)
{
if (item == null)
continue;
if (string.Equals(item.Id, id, StringComparison.OrdinalIgnoreCase))
return item;
var childMatch = FindVisibleItemById(item.Children, id);
if (childMatch != null)
return childMatch;
}
return null;
}
private static TreeViewItem GetTreeViewItemContainer(ItemsControl root, object targetItem)
{
if (root == null || targetItem == null)
return null;
var directContainer = root.ItemContainerGenerator.ContainerFromItem(targetItem) as TreeViewItem;
if (directContainer != null)
return directContainer;
foreach (var child in root.Items)
{
var childContainer = root.ItemContainerGenerator.ContainerFromItem(child) as TreeViewItem;
if (childContainer == null)
continue;
childContainer.UpdateLayout();
var result = GetTreeViewItemContainer(childContainer, targetItem);
if (result != null)
return result;
}
return null;
}
#endregion
#region Template and Scroll Handling
private void EnsureTemplateParts() private void EnsureTemplateParts()
{ {
if (treeViewControl == null) if (treeViewControl == null)
@@ -257,15 +356,15 @@ namespace FasdDesktopUi.Basics.UserControls
searchTextBox.TextChanged += SearchTextBox_TextChanged; searchTextBox.TextChanged += SearchTextBox_TextChanged;
} }
if (categoryScrollViewer == null) if (itemsScrollViewer == null)
{ {
categoryScrollViewer = ComboBoxControl.Template.FindName("PART_CategoryScrollViewer", ComboBoxControl) as ScrollViewer; itemsScrollViewer = ComboBoxControl.Template.FindName("PART_ItemsScrollViewer", ComboBoxControl) as ScrollViewer;
} }
} }
private void CategoryScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) private void ItemsScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{ {
var scroller = categoryScrollViewer ?? sender as ScrollViewer; var scroller = itemsScrollViewer ?? sender as ScrollViewer;
if (scroller == null || scroller.ScrollableHeight <= 0) if (scroller == null || scroller.ScrollableHeight <= 0)
return; return;
@@ -300,23 +399,9 @@ namespace FasdDesktopUi.Basics.UserControls
e.Handled = true; e.Handled = true;
} }
private void UpdateDisplaySelection() #endregion
{
// Display handled by template TextBlock bound to SelectedItem.FullPath.
}
private void LogSelectedItemChange(HierarchicalSelectionItem newValue) #region Keyboard
{
var description = "<null>";
if (newValue != null)
{
var fullPath = string.IsNullOrWhiteSpace(newValue.FullPath) ? newValue.DisplayName : newValue.FullPath;
var id = string.IsNullOrWhiteSpace(newValue.Id) ? "<null>" : newValue.Id;
description = $"{fullPath} (Id={id})";
}
LogEntry($"[CategoryPicker] DependencyProperty SelectedItem updated -> {description}");
}
protected override void OnPreviewKeyDown(KeyEventArgs e) protected override void OnPreviewKeyDown(KeyEventArgs e)
{ {
@@ -338,5 +423,7 @@ namespace FasdDesktopUi.Basics.UserControls
e.Handled = true; e.Handled = true;
} }
} }
#endregion
} }
} }

View File

@@ -1,5 +1,4 @@
<settingspagebase:SettingsPageBase <settingspagebase:SettingsPageBase xmlns:settingspagebase="clr-namespace:FasdDesktopUi.Pages.SettingsPage"
xmlns:settingspagebase="clr-namespace:FasdDesktopUi.Pages.SettingsPage"
x:Class="FasdDesktopUi.Pages.SettingsPage.SettingsPageView" x:Class="FasdDesktopUi.Pages.SettingsPage.SettingsPageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
@@ -23,7 +22,9 @@
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Initialized="Window_Initialized" Initialized="Window_Initialized"
x:Name="SettingsWindow" x:Name="SettingsWindow"
KeyDown="SettingsWindow_KeyDown" Closed="SettingsWindow_Closed" IsVisibleChanged="SettingsWindow_IsVisibleChanged"> KeyDown="SettingsWindow_KeyDown"
Closed="SettingsWindow_Closed"
IsVisibleChanged="SettingsWindow_IsVisibleChanged">
<settingspagebase:SettingsPageBase.Resources> <settingspagebase:SettingsPageBase.Resources>
<vc:LanguageDefinitionsConverter x:Key="LanguageConverter" /> <vc:LanguageDefinitionsConverter x:Key="LanguageConverter" />
@@ -203,25 +204,39 @@
SelectedCountryCode="GB" /> SelectedCountryCode="GB" />
</StackPanel> </StackPanel>
<StackPanel x:Name="ShouldSkipSlimViewLabel" Orientation="Horizontal"> <StackPanel x:Name="ShouldSkipSlimViewLabel"
Orientation="Horizontal">
<TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.ShouldSkipSlimView}" /> <TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.ShouldSkipSlimView}" />
<ico:AdaptableIcon x:Name="ShouldSkipSlimViewPolicy" SelectedInternIcon="lock_closed" Margin="-25,-5,0,0" IconWidth="23" IconHeight="23" Visibility="Collapsed"/> <ico:AdaptableIcon x:Name="ShouldSkipSlimViewPolicy"
SelectedInternIcon="lock_closed"
PrimaryIconColor="{DynamicResource Color.Menu.Icon}"
Margin="-25,-5,0,0"
IconWidth="23"
IconHeight="23"
Visibility="Collapsed" />
</StackPanel> </StackPanel>
<CheckBox x:Name="ShouldSkipSlimViewCheckBox" <CheckBox x:Name="ShouldSkipSlimViewCheckBox"
Style="{DynamicResource ToggleSwitch}" Style="{DynamicResource ToggleSwitch}"
IsChecked="{Binding ElementName=SettingsWindow, Path=ShouldSkipSlimView}" IsChecked="{Binding ElementName=SettingsWindow, Path=ShouldSkipSlimView}"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Margin="0,3,0,10" Margin="0,3,0,10">
>
</CheckBox> </CheckBox>
<StackPanel x:Name="PositionOfSmallViewsLabel" Orientation="Horizontal"> <StackPanel x:Name="PositionOfSmallViewsLabel"
Orientation="Horizontal">
<TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.PositionOfSmallViews}" /> <TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.PositionOfSmallViews}" />
<ico:AdaptableIcon x:Name="PositionOfSmallViewsPolicy" SelectedInternIcon="lock_closed" Margin="-25,-5,0,0" IconWidth="23" IconHeight="23" Visibility="Collapsed"/> <ico:AdaptableIcon x:Name="PositionOfSmallViewsPolicy"
SelectedInternIcon="lock_closed"
PrimaryIconColor="{DynamicResource Color.Menu.Icon}"
Margin="-25,-5,0,0"
IconWidth="23"
IconHeight="23"
Visibility="Collapsed" />
</StackPanel> </StackPanel>
<Grid x:Name="PositionOfSmallViewsInput" Grid.IsSharedSizeScope="True" <Grid x:Name="PositionOfSmallViewsInput"
Grid.IsSharedSizeScope="True"
HorizontalAlignment="Left"> HorizontalAlignment="Left">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" <ColumnDefinition Width="Auto"
@@ -269,12 +284,20 @@
</Grid> </Grid>
<StackPanel x:Name="PositionOfFavouriteBarLabel" Orientation="Horizontal"> <StackPanel x:Name="PositionOfFavouriteBarLabel"
Orientation="Horizontal">
<TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.PositionOfFavouriteBar}" /> <TextBlock Text="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Menu.PositionOfFavouriteBar}" />
<ico:AdaptableIcon x:Name="PositionOfFavouriteBarPolicy" SelectedInternIcon="lock_closed" Margin="-25,-5,0,0" IconWidth="23" IconHeight="23" Visibility="Collapsed"/> <ico:AdaptableIcon x:Name="PositionOfFavouriteBarPolicy"
SelectedInternIcon="lock_closed"
PrimaryIconColor="{DynamicResource Color.Menu.Icon}"
Margin="-25,-5,0,0"
IconWidth="23"
IconHeight="23"
Visibility="Collapsed" />
</StackPanel> </StackPanel>
<Grid x:Name="PositionOfFavouriteBarInput" Grid.IsSharedSizeScope="True" <Grid x:Name="PositionOfFavouriteBarInput"
Grid.IsSharedSizeScope="True"
HorizontalAlignment="Left"> HorizontalAlignment="Left">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" <ColumnDefinition Width="Auto"

View File

@@ -18,8 +18,10 @@ namespace FasdDesktopUi.Pages.TicketCompletion
{ {
public partial class TicketCompletion : Window, IBlurInvoker, INotifyPropertyChanged public partial class TicketCompletion : Window, IBlurInvoker, INotifyPropertyChanged
{ {
private const double MinWindowHeightDip = 220d;
private const double WindowWorkingAreaMarginDip = 12d; private const double WindowWorkingAreaMarginDip = 12d;
private const double DialogNonContentReserveDip = 180d; private const double DialogNonContentReserveDip = 180d;
private bool isUpdatingDialogBounds;
private bool isCanceled = false; private bool isCanceled = false;
private bool _WaitForClosing = false; private bool _WaitForClosing = false;
@@ -53,6 +55,8 @@ namespace FasdDesktopUi.Pages.TicketCompletion
cFocusInvoker.GotFocus += ElementGotFocus; cFocusInvoker.GotFocus += ElementGotFocus;
cFocusInvoker.LostFocus += ElementLostFocus; cFocusInvoker.LostFocus += ElementLostFocus;
SizeChanged += TicketCompletion_SizeChanged;
Loaded += TicketCompletion_Loaded;
} }
protected override void OnSourceInitialized(EventArgs e) protected override void OnSourceInitialized(EventArgs e)
@@ -67,6 +71,10 @@ namespace FasdDesktopUi.Pages.TicketCompletion
UpdateDialogMaxHeightToScreen(); UpdateDialogMaxHeightToScreen();
} }
private void TicketCompletion_Loaded(object sender, RoutedEventArgs e) => UpdateDialogMaxHeightToScreen();
private void TicketCompletion_SizeChanged(object sender, SizeChangedEventArgs e) => UpdateDialogMaxHeightToScreen();
#region ClosingBusy #region ClosingBusy
public bool IsClosingBusy public bool IsClosingBusy
@@ -145,6 +153,10 @@ namespace FasdDesktopUi.Pages.TicketCompletion
private void UpdateDialogMaxHeightToScreen() private void UpdateDialogMaxHeightToScreen()
{ {
if (isUpdatingDialogBounds)
return;
isUpdatingDialogBounds = true;
try try
{ {
WinForms.Screen screen = null; WinForms.Screen screen = null;
@@ -164,15 +176,45 @@ namespace FasdDesktopUi.Pages.TicketCompletion
screen = screen ?? WinForms.Screen.PrimaryScreen; screen = screen ?? WinForms.Screen.PrimaryScreen;
var workingArea = screen?.WorkingArea ?? WinForms.Screen.PrimaryScreen.WorkingArea; var workingArea = screen?.WorkingArea ?? WinForms.Screen.PrimaryScreen.WorkingArea;
var dpiScaleY = VisualTreeHelper.GetDpi(this).DpiScaleY; var dpiScaleY = VisualTreeHelper.GetDpi(this).DpiScaleY;
var maxHeightDip = (workingArea.Height / Math.Max(0.1, dpiScaleY)) - WindowWorkingAreaMarginDip; var safeDpiScaleY = Math.Max(0.1, dpiScaleY);
var workingAreaTopDip = workingArea.Top / safeDpiScaleY;
var workingAreaBottomDip = workingArea.Bottom / safeDpiScaleY;
var workingAreaHeightDip = workingArea.Height / safeDpiScaleY;
var availableWindowHeightDip = workingAreaHeightDip - (WindowWorkingAreaMarginDip * 2);
MaxHeight = Math.Max(220, maxHeightDip); MaxHeight = Math.Max(MinWindowHeightDip, availableWindowHeightDip);
CloseCaseDialogUc?.SetDialogContentMaxHeight(MaxHeight - DialogNonContentReserveDip);
if (!double.IsNaN(Top))
{
var minTop = workingAreaTopDip + WindowWorkingAreaMarginDip;
var maxBottom = workingAreaBottomDip - WindowWorkingAreaMarginDip;
if (Top < minTop)
Top = minTop;
var currentBottom = Top + ActualHeight;
if (currentBottom > maxBottom)
Top = Math.Max(minTop, maxBottom - ActualHeight);
}
double nonDialogReserve = DialogNonContentReserveDip;
if (CloseCaseDialogUc != null && CloseCaseDialogUc.IsLoaded)
{
var estimatedReserve = ActualHeight - CloseCaseDialogUc.ActualHeight;
if (estimatedReserve > 0)
nonDialogReserve = Math.Max(nonDialogReserve, estimatedReserve + WindowWorkingAreaMarginDip);
}
CloseCaseDialogUc?.SetDialogContentMaxHeight(MaxHeight - nonDialogReserve);
} }
catch (Exception ex) catch (Exception ex)
{ {
LogException(ex); LogException(ex);
} }
finally
{
isUpdatingDialogBounds = false;
}
} }
#region Internal Focus Events #region Internal Focus Events