Compare commits

..

29 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
Meik
deb8d43911 maximized close case dialog 2026-02-09 20:28:24 +01:00
Meik
bf9d37d7af maximized close case dialog 2026-02-09 20:18:31 +01:00
Meik
9e5a7f7946 added transparent click through region 2026-02-09 20:00:30 +01:00
Meik
ca584d3929 fix dropdown scroll fokus 2026-02-09 19:55:29 +01:00
Meik
820a6ad3f3 fix aktions scroll fokus 2026-02-09 19:48:11 +01:00
Meik
fe49708c2e aktueller Stand 2026-02-09 19:44:23 +01:00
Meik
d6cbbe1ef1 aktueller Stand 2026-02-09 19:36:39 +01:00
Meik
825ddf05d4 aktueller Stand 2026-02-05 13:49:54 +01:00
Meik
7ba20b3aa6 aktueller Stand 2026-02-05 11:21:36 +01:00
Meik
aafd1f12de aktueller Stand 2026-02-05 10:04:19 +01:00
Meik
3d055ac2ba aktueller Stand 2026-02-04 21:39:44 +01:00
Meik
101572d35f aktueller Stand 2026-02-04 21:05:52 +01:00
Meik
a1506f36c9 aktueller Stand 2026-02-04 19:01:24 +01:00
Meik
5a9e58dcfb aktueller Stand 2026-02-04 17:52:39 +01:00
Meik
c1f600bc0d aktueller Stand 2026-02-04 13:27:03 +01:00
Meik
195d5c9188 aktueller Stand 2026-02-04 11:22:55 +01:00
Meik
2670751754 aktueller Stand 2026-02-04 10:11:35 +01:00
Meik
696629b5a8 aktueller Stand 2026-02-03 16:46:49 +01:00
Meik
7192319e1e aktueller Stand 2026-02-03 15:54:56 +01:00
Meik
ee1f54675e aktueller Stand 2026-01-28 12:08:39 +01:00
Meik
1283750829 category added 2025-11-14 15:20:16 +01:00
Meik
4475997a59 refactoring 2025-11-13 19:04:07 +01:00
Meik
7fca608a78 aktueller stand 2025-11-13 18:38:30 +01:00
Meik
8c74bc667d aktueller stand 2025-11-13 18:35:45 +01:00
Meik
ed80f72e81 aktueller stand 2025-11-13 18:00:31 +01:00
152 changed files with 89379 additions and 80621 deletions

BIN
2026-01-28 10_49_55-.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -67,7 +67,7 @@
<HintPath>.\Interop.CLMgr.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net472" />
</packages>

View File

@@ -1,4 +1,5 @@
using C4IT.FASD.Base;
using FasdDesktopUi.Basics.CustomEvents;
using FasdDesktopUi.Basics.Services.RelationService;
using FasdDesktopUi.Basics.Services.SupportCase;
using NSubstitute;
@@ -62,4 +63,90 @@ public class SupportCaseTest
Assert.Equal(_supportCase, raisedEvent.Sender);
Assert.Equal(relations, raisedEvent.Arguments.Relations);
}
[Fact]
public void UpdateSupportCaseDataCache_Raise_SupportCaseDataCacheHasChanged()
{
cF4sdApiSearchResultRelation relation = new()
{
Type = enumF4sdSearchResultClass.Computer,
Name = "My computer",
Identities =
[
new() { Id = Guid.NewGuid(), Class = enumFasdInformationClass.Computer }
]
};
List<cF4SDHealthCardRawData.cHealthCardTable> tables =
[
new() { Name = "TestTable1", Columns = [], TableType = eDataHistoryTableType.History },
];
var raisedEvent = Assert.Raises<SupportCaseDataEventArgs>(
h => _supportCase.SupportCaseDataCacheHasChanged += h,
h => _supportCase.SupportCaseDataCacheHasChanged -= h,
() => _supportCase.UpdateSupportCaseDataCache(relation, tables));
Assert.NotNull(raisedEvent);
Assert.Equal(_supportCase, raisedEvent.Sender);
Assert.Equal(relation, raisedEvent.Arguments.Relation);
Assert.Equal(tables, raisedEvent.Arguments.DataTables);
}
[Fact]
public void GetSupportCaseData_Contains_UpdateSupportCaseDataCacheData()
{
// Arrange
const string columnValue = "Hello world";
const string tableName = "TestTable1";
const string columnName = "TestColumn1";
List<object> expected = [columnValue];
cF4sdApiSearchResultRelation relation = new()
{
Type = enumF4sdSearchResultClass.Computer,
Name = "My computer",
Identities =
[
new() { Id = Guid.NewGuid(), Class = enumFasdInformationClass.Computer }
]
};
cF4SDHealthCardRawData.cHealthCardTable dataTable = new()
{
Name = tableName,
TableType = eDataHistoryTableType.History
};
dataTable.Columns = new()
{
[columnName] = new(dataTable) { Values = expected }
};
// Act
_supportCase.UpdateSupportCaseDataCache(relation, [dataTable]);
// Assert
var actual = _supportCase.GetSupportCaseHealthcardData(relation, new cValueAddress() { ValueTable = tableName, ValueColumn = columnName });
Assert.Equal(expected, actual);
}
[Fact]
public void GetSupportCaseData_ReturnsNull_When_NoDataExists()
{
// Arrange
cF4sdApiSearchResultRelation relation = new()
{
Type = enumF4sdSearchResultClass.Computer,
Name = "My computer",
Identities =
[
new() { Id = Guid.NewGuid(), Class = enumFasdInformationClass.Computer }
]
};
// Act
var actual = _supportCase.GetSupportCaseHealthcardData(relation, new cValueAddress() { ValueTable = "NonExistentTable", ValueColumn = "NonExistentColumn" });
// Assert
Assert.Null(actual);
}
}

View File

@@ -29,7 +29,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="xunit.v3" Version="3.2.0" />
<PackageReference Include="xunit.v3" Version="3.2.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@@ -53,15 +53,49 @@
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="C4IT.F4SD.DisplayFormatting, Version=1.0.9509.21303, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\C4IT.F4SD.DisplayFormatting.1.0.0\lib\netstandard2.0\C4IT.F4SD.DisplayFormatting.dll</HintPath>
</Reference>
<Reference Include="C4IT.F4SD.SupportCaseProtocoll, Version=1.0.9516.21165, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\C4IT.F4SD.SupportCaseProtocoll.1.0.0\lib\netstandard2.0\C4IT.F4SD.SupportCaseProtocoll.dll</HintPath>
</Reference>
<Reference Include="MaterialIcons, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialIcons.1.0.3\lib\MaterialIcons.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.2\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=10.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.10.0.2\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=10.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.10.0.2\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=10.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.10.0.2\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -131,6 +165,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>

View File

@@ -65,7 +65,13 @@ namespace C4IT.FASD.Cockpit.Communication
public abstract Task<cF4sdStagedSearchResultRelations> GetStagedRelations(Guid id, CancellationToken token);
public abstract Task<List<cF4sdApiSearchResultRelation>> GetSearchResultRelations(enumF4sdSearchResultClass resultType, List<cFasdApiSearchResultEntry> searchResults);
#region Ticketübersicht
public abstract Task<List<cF4sdApiSearchResultRelation>> GetTicketOverviewRelations(string key, bool useRoleScope, int count);
public abstract Task<Dictionary<string, int>> GetTicketOverviewCounts(IEnumerable<string> keys, bool useRoleScope);
#endregion
public abstract Task<cF4SDHealthCardRawData> GetHealthCardData(cF4sdHealthCardRawDataRequest requestData);

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,5 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="C4IT.F4SD.DisplayFormatting" version="1.0.0" targetFramework="net472" />
<package id="C4IT.F4SD.SupportCaseProtocoll" version="1.0.0" targetFramework="net472" />
<package id="MaterialIcons" version="1.0.3" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.2" targetFramework="net472" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="10.0.2" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="10.0.2" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net472" />
<package id="System.Buffers" version="4.6.1" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="10.0.2" targetFramework="net472" />
<package id="System.Memory" version="4.6.3" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net472" />
</packages>

View File

@@ -56,7 +56,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -98,6 +98,7 @@
<Compile Include="F4sdCockpitCommunicationM42Web.cs" />
<Compile Include="FasdCockpitCommunicationWeb.cs" />
<Compile Include="FasdCockpitMachineConfiguration.cs" />
<Compile Include="TicketOverview\TicketOverviewCountsResponse.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
@@ -115,6 +116,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -18,6 +18,7 @@ using C4IT.FASD.Communication.Agent;
using FasdCockpitBase.Models;
using FasdCockpitCommunication;
using FasdCockpitCommunication.TicketOverview;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -1095,10 +1096,125 @@ namespace C4IT.FASD.Cockpit.Communication
return output;
}
public override Task<List<cF4sdApiSearchResultRelation>> GetTicketOverviewRelations(string key, bool useRoleScope, int count)
#region Ticketübersicht
public override async Task<Dictionary<string, int>> GetTicketOverviewCounts(IEnumerable<string> keys, bool useRoleScope)
{
return Task.FromResult(new List<cF4sdApiSearchResultRelation>());
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
var apiError = 0;
var timeStart = DateTime.UtcNow;
try
{
var normalizedKeys = (keys ?? Enumerable.Empty<string>())
.Where(k => !string.IsNullOrWhiteSpace(k))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
var http = GetHttpHelper(true);
var scope = useRoleScope ? "role" : "personal";
var urlBuilder = new StringBuilder($"api/TicketOverview/GetCounts?scope={scope}");
if (normalizedKeys.Count > 0)
{
var joinedKeys = HttpUtility.UrlEncode(string.Join(",", normalizedKeys));
urlBuilder.Append($"&keys={joinedKeys}");
}
var url = urlBuilder.ToString();
var result = await http.GetHttpJson(url, 15000, CancellationToken.None);
if (!result.IsOk)
{
apiError = (int)result.Status;
if (CheckConnectionStatus != null)
await CheckConnectionStatus.Invoke();
LogEntry($"Error on requesting ticket overview counts ({scope}). Status: {result.Status}", LogLevels.Warning);
return new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
}
if (Debug_apiValues) SaveApiResultValueJson("TicketOverview.GetCounts", result.Result, url);
var response = JsonConvert.DeserializeObject<TicketOverviewCountsResponse>(result.Result);
return response?.ToDictionary(normalizedKeys) ?? new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
}
catch (Exception E)
{
apiError = E.HResult;
if (CheckConnectionStatus != null)
await CheckConnectionStatus.Invoke();
LogException(E);
}
finally
{
if (Debug_apiTiming) SaveApiTimingEntry("TicketOverview.GetCounts", timeStart, apiError);
LogMethodEnd(CM);
}
return new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
}
public override async Task<List<cF4sdApiSearchResultRelation>> GetTicketOverviewRelations(string key, bool useRoleScope, int count)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
var apiError = 0;
var timeStart = DateTime.UtcNow;
var output = new List<cF4sdApiSearchResultRelation>();
try
{
if (string.IsNullOrWhiteSpace(key))
return output;
var http = GetHttpHelper(true);
var scope = useRoleScope ? "role" : "personal";
var safeKey = HttpUtility.UrlEncode(key);
var url = $"api/TicketOverview/GetRelations?key={safeKey}&scope={scope}&count={Math.Max(0, count)}";
var result = await http.GetHttpJson(url, 20000, CancellationToken.None);
if (!result.IsOk)
{
apiError = (int)result.Status;
if (CheckConnectionStatus != null)
await CheckConnectionStatus.Invoke();
LogEntry($"Error on requesting ticket overview relations for '{key}' ({scope}). Status: {result.Status}", LogLevels.Warning);
return output;
}
if (Debug_apiValues) SaveApiResultValueJson("TicketOverview.GetRelations", result.Result, url);
var relations = JsonConvert.DeserializeObject<List<cF4sdApiSearchResultRelation>>(result.Result);
if (relations != null)
output = relations;
}
catch (Exception E)
{
apiError = E.HResult;
if (CheckConnectionStatus != null)
await CheckConnectionStatus.Invoke();
LogException(E);
}
finally
{
if (Debug_apiTiming) SaveApiTimingEntry("TicketOverview.GetRelations", timeStart, apiError);
LogMethodEnd(CM);
}
return output;
}
#endregion
public override async Task<cF4SDHealthCardRawData> GetHealthCardData(cF4sdHealthCardRawDataRequest requestData)
{
var CM = MethodBase.GetCurrentMethod();

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace FasdCockpitCommunication.TicketOverview
{
internal sealed class TicketOverviewCountsResponse
{
[JsonProperty("counts")]
public Dictionary<string, int> Counts { get; set; } = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
public Dictionary<string, int> ToDictionary(IEnumerable<string> expectedKeys)
{
var comparer = StringComparer.OrdinalIgnoreCase;
var output = new Dictionary<string, int>(comparer);
if (expectedKeys != null)
{
foreach (var key in expectedKeys)
{
if (string.IsNullOrWhiteSpace(key))
continue;
if (Counts != null && Counts.TryGetValue(key, out var count))
output[key] = count;
else
output[key] = 0;
}
return output;
}
if (Counts != null)
{
foreach (var kvp in Counts)
{
if (string.IsNullOrWhiteSpace(kvp.Key))
continue;
output[kvp.Key] = kvp.Value;
}
}
return output;
}
}
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net472" />
</packages>

View File

@@ -1,59 +1,69 @@
<?xml version="1.0" encoding="utf-8" ?>
<F4SD-CopyTemplate-Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="F4SD-CopyTemplate-Configuration.xsd">
<CopyTemplates Default="Ticket Information" >
<CopyTemplate Name="Ticket Information">
<Name Lang="DE">Ticket Information</Name>
<CopyTemplates Default="Ticket-Information-Computer">
<CopyTemplate Name="Ticket-Information-Computer">
<Name Lang="DE">Ticket-Information-Computer</Name>
<Description Lang="EN">Transfers the relevant information for ticket creation to the clipboard.</Description>
<Description Lang="DE">Überträgt die relevanten Informationen für eine Ticket Erstellung in den Zwischenspeicher.</Description>
<Icon Name="misc_ticket" IconType="intern"/>
<CopyContent Format="UNICODE">%DeviceName.Label% %DeviceName.Value%
%UserFullName.Label% %UserFullName.Value%
%UserAccount.Label% %UserAccount.Value%
%DeviceModel.Label% %DeviceModel.Value%
%OsInfo.Label% %OsInfo.Value%
%IpAddress.Label% %IpAddress.Value%
%LastSeenCalc.Label% %LastSeenCalc.Value%</CopyContent>
<CopyContent Format="HTML">&lt;table border=&quot;1&quot; cellpadding=&quot;5,1,5,1&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%DeviceName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td style=&quot;color: #0000ff;&quot;&gt;%DeviceName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%UserFullName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%UserFullName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%UserAccount.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%UserAccount.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%OsInfo.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%OsInfo.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%IpAddress.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%IpAddress.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%LastSeenCalc.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%LastSeenCalc.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</CopyContent>
<CopyContent Format="UNICODE">
%DeviceName.Label% %DeviceName.Value%
%UserFullName.Label% %UserFullName.Value%
%UserAccount.Label% %UserAccount.Value%
%DeviceModel.Label% %DeviceModel.Value%
%OsInfo.Label% %OsInfo.Value%
%IpAddress.Label% %IpAddress.Value%
%LastBoot.Label% %LastBoot.Value%
%LastSeen.Label% %LastSeen.Value%
</CopyContent>
<CopyContent Format="HTML">
&lt;table border=&quot;1&quot; cellpadding=&quot;5,1,5,1&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%DeviceName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td style=&quot;color: #0000ff;&quot;&gt;%DeviceName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%UserFullName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%UserFullName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%UserAccount.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%UserAccount.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%OsInfo.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%OsInfo.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%IpAddress.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%IpAddress.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%LastBoot.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%LastBoot.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%LastSeen.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%LastSeen.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</CopyContent>
</CopyTemplate>
<CopyTemplate Name="Ticket Information-VM">
<Name Lang="DE">Ticket Information-VM</Name>
<Description Lang="EN">Transfers the relevant information for ticket creation to the clipboard.</Description>
<Description Lang="DE">Überträgt die relevanten Informationen für eine Ticket Erstellung in den Zwischenspeicher.</Description>
<Icon Name="misc_ticket" IconType="intern"/>
<CopyContent Format="UNICODE">
%VirtualSessionName.Label% %VirtualSessionName.Value%
%DNSName.Label% %DNSName.Value%
%DomainName.Label% %DomainName.Value%
%HostedMachine.Label% %HostedMachine.Value%
</CopyContent>
<CopyContent Format="HTML">
&lt;table border=&quot;1&quot; cellpadding=&quot;5,1,5,1&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%VirtualSessionName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td style=&quot;color: #0000ff;&quot;&gt;%VirtualSessionName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%DNSName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%DNSName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%DomainName.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%DomainName.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;%HostedMachine.Label%&lt;/em&gt;&lt;/td&gt;&lt;td&gt;%HostedMachine.Value%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</CopyContent>
</CopyTemplate>
<CopyTemplate Name="Computer name">
<Name Lang="DE">Computer Name</Name>
<Section>DemoActions</Section>
<Icon Name="misc_computer" IconType="intern"/>
<CopyContent Format="UNICODE">%DeviceName.Value%</CopyContent>
<CopyContent Format="UNICODE">%DeviceName.Label% %DeviceName.Value%</CopyContent>
</CopyTemplate>
<CopyTemplate Name="User name">
<Name Lang="DE">Anwendername</Name>
<Icon Name="misc_user" IconType="intern"/>
<CopyContent Format="UNICODE">%UserFullName.Value%</CopyContent>
<CopyContent Format="UNICODE">%UserFullName.Label% %UserFullName.Value%</CopyContent>
</CopyTemplate>
<CopyTemplate Name="User account">
<Name Lang="DE">Anwender Account</Name>
<Icon Name="misc_user" IconType="intern"/>
<CopyContent Format="UNICODE">%UserAccount.Value%</CopyContent>
<CopyContent Format="UNICODE">%UserAccount.Label% %UserAccount.Value%</CopyContent>
</CopyTemplate>
<CopyTemplate Name="Copy last Quick Action">
<Name Lang="DE">Letzte Quick Action kopieren</Name>
<Section>Ticket</Section>
<Icon Name="misc_functionBolt" IconType="intern"/>
<CopyContent Format="UNICODE">%F4SD_QuickActionProtocolLast.Value%</CopyContent>
<CopyContent Format="HTML">%F4SD_QuickActionProtocolLast.Value%</CopyContent>
</CopyTemplate>
<CopyTemplate Name="Copy Quick Action history" HiddenInTicketDialog="true">
<Name Lang="DE">Quick Action Historie kopieren</Name>
<Section>Ticket</Section>
<Icon Name="misc_copy_bolt" IconType="intern"/>
<CopyContent Format="UNICODE">%F4SD_QuickActionProtocol.Value%</CopyContent>
<CopyContent Format="HTML">%F4SD_QuickActionProtocol.Value%</CopyContent>
</CopyTemplate>
</CopyTemplates>
</F4SD-CopyTemplate-Configuration>

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

@@ -205,9 +205,6 @@
<NamedParameter ParameterName="ad-dn-User" Name="Distinguished name user" Display="STRING" ValueTable="ad-user" ValueColumn="distinguishedName">
<Name Lang="DE">Distinguished Name User</Name>
</NamedParameter>
<NamedParameter ParameterName="ad-dn-computer" Name="Distinguished name computer" Display="STRING" ValueTable="ad-computer" ValueColumn="distinguishedName">
<Name Lang="DE">Distinguished Name computer</Name>
</NamedParameter>
<NamedParameter ParameterName="IpAddress" Name="IP address" Display="STRING" ValueTable="agnt-computer-event-string-latest" ValueColumn="NetworkIPLast">
<Name Lang="DE">IP Adresse</Name>
</NamedParameter>
@@ -282,8 +279,8 @@
<Computation-Switch-Case ValueId="1">IBM</Computation-Switch-Case>
</Computation-Switch>
<Computation-Format Name="FullDeviceModelName" Format="{0} {1}" ValueTable0="agnt-computer" ValueColumn0="SystemManufacturer" ValueTable1="Computation_DeviceModel" ValueColumn1="default" RemoveDuplicateWords="true" />
<Computation-LinearAddition Name="IntuneMobileDeviceCount" a="1" b="1" c="0" ValueTable0="intune-userDeviceCount" ValueColumn0="iOS" ValueTable1="intune-userDeviceCount" ValueColumn1="android" />
<Computation-LinearAddition Name="IntuneOtherDeviceCount" a="1" b="1" c="0" ValueTable0="intune-userDeviceCount" ValueColumn0="macOs" ValueTable1="intune-userDeviceCount" ValueColumn1="linux" />
<!--<Computation-LinearAddition Name="IntuneMobileDeviceCount" a="1" b="1" c="0" ValueTable0="intune-userDeviceCount" ValueColumn0="iOS" ValueTable1="intune-userDeviceCount" ValueColumn1="android" />
<Computation-LinearAddition Name="IntuneOtherDeviceCount" a="1" b="1" c="0" ValueTable0="intune-userDeviceCount" ValueColumn0="macOs" ValueTable1="intune-userDeviceCount" ValueColumn1="linux" />-->
</Computations>
<Translations>
<Translator Name="true_good">
@@ -470,7 +467,7 @@
<State-Aggregation RefName="Ram_Details_Aggregation" Name="RAM Details">
<State-Link Reference="RAM_Relative" />
<State-Level Name="Free Memory" ValueTable="agnt-computer-event" ValueColumn="MemoryFree" Warning="4294967296" Error="2147483648" Direction="down">
<State-Level Name="Free Memory" ValueTable="agnt-computer-event-numerical" ValueColumn="MemoryFree" Warning="4294967296" Error="2147483648" Direction="down">
<Name Lang="DE">Freier Speicher</Name>
</State-Level>
</State-Aggregation>
@@ -570,7 +567,7 @@
<State-Info Name="Primary user" ValueTable="intune-deviceInfo" ValueColumn="userDisplayName">
<Name Lang="DE">Hauptbenutzer</Name>
</State-Info>
<State-Info Name="Last Sync Date" ValueTable="intune-deviceInfo" ValueColumn="lastSyncDateTime">
<State-Info Name="Last Sync Date" ValueTable="intune-deviceInfo" ValueColumn="lastSyncDateTime" Display="DATETIME">
<Name Lang="DE">Letzte Synchronisation</Name>
</State-Info>
@@ -1065,9 +1062,6 @@
<NamedParameter ParameterName="ad-dn-User" Name="Distinguished name user" Display="STRING" ValueTable="ad-user" ValueColumn="distinguishedName">
<Name Lang="DE">Distinguished Name User</Name>
</NamedParameter>
<NamedParameter ParameterName="ad-dn-computer" Name="Distinguished name computer" Display="STRING" ValueTable="ad-computer" ValueColumn="distinguishedName">
<Name Lang="DE">Distinguished Name computer</Name>
</NamedParameter>
<NamedParameter ParameterName="UserFullName" Name="User name" Display="STRING" ValueTable="ad-user" ValueColumn="name">
<Name Lang="DE">Anwender</Name>
@@ -1295,10 +1289,10 @@
<State-Info Name="Session name" ParameterName="VirtualSessionName">
<Name Lang="DE">Sessionname</Name>
</State-Info>
<State-Info Name="Start Date" ValueTable="citrix-session" ValueColumn="StartDate">
<State-Info Name="Start Date" ValueTable="citrix-session" ValueColumn="StartDate" Display="DATETIME">
<Name Lang="DE">Startdatum</Name>
</State-Info>
<State-Info Name="End Date" ValueTable="citrix-session" ValueColumn="EndDate">
<State-Info Name="End Date" ValueTable="citrix-session" ValueColumn="EndDate" Display="DATETIME">
<Name Lang="DE">Enddatum</Name>
</State-Info>
<State-Translation Name="Connection State" ValueTable="citrix-session" ValueColumn="ConnectionState" Translation ="citrix_connectionState" DefaultState="Ok" >

View File

@@ -32,7 +32,6 @@
<xs:enumeration value="PERCENT" />
<xs:enumeration value="PERCENT100" />
<xs:enumeration value="PERCENT1000" />
<xs:enumeration value="PERCENT10000" />
<xs:enumeration value="TIME" />
<xs:enumeration value="DATE" />
<xs:enumeration value="DATE_CALC" />
@@ -103,6 +102,13 @@
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ValuedFormat">
<xs:restriction base="xs:NCName">
<xs:enumeration value="csv" />
<xs:enumeration value="json" />
</xs:restriction>
</xs:simpleType>
<xs:attributeGroup name="ValuePointer">
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="ParameterName" type="xs:NCName" use="optional" />
@@ -544,7 +550,8 @@
<xs:complexType>
<xs:complexContent>
<xs:extension base="State-Details-Base">
<xs:attribute name="RowSeparator" type="xs:string" use="required"/>
<xs:attribute name="Format" type="ValuedFormat" use="optional"/>
<xs:attribute name="RowSeparator" type="xs:string" use="optional"/>
<xs:attribute name="ColSeparator" type="xs:string" use="optional"/>
<xs:attribute name="StringDecorator" type="Separator" use="optional"/>
</xs:extension>

View File

@@ -54,7 +54,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -119,9 +119,13 @@
<Content Include="Config\F4SD-MenuSection-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Config\F4SD-Global-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Config\F4SD-QuickAction-Configuration.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="app.config" />
<None Include="Config\F4SD-CopyTemplate-Configuration.xsd">
<SubType>Designer</SubType>
</None>
@@ -251,6 +255,9 @@
<None Include="MockupPickup\M42Wpm-Ticket-QuickCalls.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="MockupPickup\M42Wpm-Ticket-Categories.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -486,7 +486,7 @@
{
"ColumnName": "id",
"Values": [
2.0,
2,
null,
null,
null,
@@ -639,7 +639,7 @@
{
"ColumnName": "BootLast",
"Values": [
5.0,
5,
null,
null,
null,
@@ -705,7 +705,7 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224,
null,
null,
null,
@@ -738,7 +738,7 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
3435973836,
null,
null,
null,
@@ -771,7 +771,7 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944,
null,
null,
null,
@@ -804,7 +804,7 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
8589934592,
null,
null,
null,
@@ -837,7 +837,7 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820,
null,
null,
null,
@@ -1056,21 +1056,21 @@
{
"ColumnName": "BootLast",
"Values": [
5.0,
4.0,
3.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
5,
4,
3,
2,
1,
0,
0,
0,
0,
2,
1,
0,
0,
0,
0,
null,
null,
null,
@@ -1094,16 +1094,16 @@
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -1122,14 +1122,14 @@
{
"ColumnName": "NetworkWifiSignal",
"Values": [
60.0,
45.0,
87.0,
60,
45,
87,
null,
null,
null,
92.0,
87.0,
92,
87,
null,
null,
null,
@@ -1155,21 +1155,21 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
null,
null,
null,
@@ -1188,21 +1188,21 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
26843545600.0,
84359738368.0,
105784247808.0,
105884247808.0,
105785247808.0,
105818914474.0,
105819414474.0,
105819914474.0,
105820414474.0,
105820914474.0,
105821414474.0,
105821914474.0,
105822414474.0,
105822914474.0,
3435973836,
26843545600,
84359738368,
105784247808,
105884247808,
105785247808,
105818914474,
105819414474,
105819914474,
105820414474,
105820914474,
105821414474,
105821914474,
105822414474,
105822914474,
null,
null,
null,
@@ -1221,21 +1221,21 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
null,
null,
null,
@@ -1254,21 +1254,21 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
28600000000.0,
71203283968.0,
77893283968.0,
71232283968.0,
81203283968.0,
81217783968.0,
83551683968.0,
85885583968.0,
88219483968.0,
90553383968.0,
92887283968.0,
95221183968.0,
97555083968.0,
99888983968.0,
8589934592,
28600000000,
71203283968,
77893283968,
71232283968,
81203283968,
81217783968,
83551683968,
85885583968,
88219483968,
90553383968,
92887283968,
95221183968,
97555083968,
99888983968,
null,
null,
null,
@@ -1287,21 +1287,21 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
null,
null,
null,
@@ -1320,21 +1320,21 @@
{
"ColumnName": "MemoryFree",
"Values": [
21260088115.0,
21277781150.0,
24837781150.0,
18837781150.0,
26837781150.0,
26377781150.0,
14837781150.0,
24839981150.0,
24837781150.0,
24008141150.0,
24364329720.0,
24720518290.0,
25076706860.0,
25432895430.0,
25789084000.0,
21260088115,
21277781150,
24837781150,
18837781150,
26837781150,
26377781150,
14837781150,
24839981150,
24837781150,
24008141150,
24364329720,
24720518290,
25076706860,
25432895430,
25789084000,
null,
null,
null,
@@ -1353,21 +1353,21 @@
{
"ColumnName": "ProcessorUsage",
"Values": [
12.0,
20.0,
18.0,
15.0,
18.0,
19.0,
20.0,
26.0,
17.0,
11.0,
18.0,
16.0,
16.0,
14.0,
15.0,
12,
20,
18,
15,
18,
19,
20,
26,
17,
11,
18,
16,
16,
14,
15,
null,
null,
null,
@@ -1457,16 +1457,16 @@
null,
null,
null,
88000.0,
14000.0,
16000.0,
17000.0,
88000,
14000,
16000,
17000,
null,
null,
14000.0,
13000.0,
17000.0,
16000.0,
14000,
13000,
17000,
16000,
null,
null,
null,
@@ -1485,21 +1485,21 @@
{
"ColumnName": "NetworkRecievedTraffic",
"Values": [
107374182.0,
6120328396.0,
53687091.0,
193273528.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
107374182,
6120328396,
53687091,
193273528,
193273528,
193273528,
612032839,
193273528,
193273528,
612032839,
612032839,
193273528,
193273528,
612032839,
193273528,
null,
null,
null,
@@ -1518,21 +1518,21 @@
{
"ColumnName": "NetworkSentTraffic",
"Values": [
5368709.0,
5368709.0,
5368709.0,
189273528.0,
189298528.0,
82298528.0,
191530456.0,
223540266.0,
255550077.0,
287559887.0,
319569698.0,
351579509.0,
383589319.0,
415599130.0,
447608941.0,
5368709,
5368709,
5368709,
189273528,
189298528,
82298528,
191530456,
223540266,
255550077,
287559887,
319569698,
351579509,
383589319,
415599130,
447608941,
null,
null,
null,
@@ -1704,7 +1704,7 @@
{
"ColumnName": "Logon",
"Values": [
0.0,
0,
null,
null,
null,
@@ -1923,21 +1923,21 @@
{
"ColumnName": "Logon",
"Values": [
0.0,
0.0,
1.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0,
0,
1,
2,
1,
0,
0,
0,
0,
2,
1,
0,
0,
0,
0,
null,
null,
null,
@@ -1956,21 +1956,21 @@
{
"ColumnName": "LogonCount",
"Values": [
2.0,
1.0,
2,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -2060,7 +2060,7 @@
null,
null,
null,
1.0,
1,
null,
null,
null,
@@ -2093,7 +2093,7 @@
null,
null,
null,
1.0,
1,
null,
null,
null,
@@ -2122,7 +2122,7 @@
"ColumnName": "ApplicationHang",
"Values": [
null,
3.0,
3,
null,
null,
null,
@@ -2154,7 +2154,7 @@
{
"ColumnName": "ApplicationCrash",
"Values": [
2.0,
2,
null,
null,
null,
@@ -2387,57 +2387,57 @@
"5": [
[
"2022-05-24T10:53:57.78",
160000.0
160000
],
[
"2022-05-24T11:22:45.78",
16000.0
16000
]
],
"6": [
[
"2022-05-23T11:22:45.78",
14000.0
14000
]
],
"7": [
[
"2022-05-22T11:22:45.78",
16000.0
16000
]
],
"8": [
[
"2022-05-21T11:22:45.78",
17000.0
17000
]
],
"11": [
[
"2022-05-18T11:08:21.78",
14000.0
14000
],
[
"2022-05-18T13:32:21.78",
14000.0
14000
]
],
"12": [
[
"2022-05-18T15:56:21.78",
13000.0
13000
]
],
"13": [
[
"2022-05-16T13:17:57.78",
17000.0
17000
]
],
"14": [
[
"2022-05-15T13:32:21.78",
16000.0
16000
]
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1089,7 +1089,7 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224,
null,
null,
null,
@@ -1122,7 +1122,7 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
3435973836,
null,
null,
null,
@@ -1155,7 +1155,7 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944,
null,
null,
null,
@@ -1188,7 +1188,7 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
8589934592,
null,
null,
null,
@@ -1221,7 +1221,7 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820,
null,
null,
null,
@@ -1478,16 +1478,16 @@
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -1539,21 +1539,21 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
null,
null,
null,
@@ -1572,21 +1572,21 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
26843545600.0,
84359738368.0,
105784247808.0,
105884247808.0,
105785247808.0,
105818914474.0,
105819414474.0,
105819914474.0,
105820414474.0,
105820914474.0,
105821414474.0,
105821914474.0,
105822414474.0,
105822914474.0,
3435973836,
26843545600,
84359738368,
105784247808,
105884247808,
105785247808,
105818914474,
105819414474,
105819914474,
105820414474,
105820914474,
105821414474,
105821914474,
105822414474,
105822914474,
null,
null,
null,
@@ -1605,21 +1605,21 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
null,
null,
null,
@@ -1638,21 +1638,21 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
28600000000.0,
71203283968.0,
77893283968.0,
71232283968.0,
81203283968.0,
81217783968.0,
83551683968.0,
85885583968.0,
88219483968.0,
90553383968.0,
92887283968.0,
95221183968.0,
97555083968.0,
99888983968.0,
8589934592,
28600000000,
71203283968,
77893283968,
71232283968,
81203283968,
81217783968,
83551683968,
85885583968,
88219483968,
90553383968,
92887283968,
95221183968,
97555083968,
99888983968,
null,
null,
null,
@@ -1671,21 +1671,21 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
null,
null,
null,
@@ -1704,21 +1704,21 @@
{
"ColumnName": "MemoryFree",
"Values": [
21260088115.0,
21277781150.0,
24837781150.0,
18837781150.0,
26837781150.0,
26377781150.0,
14837781150.0,
24839981150.0,
24837781150.0,
24008141150.0,
24364329720.0,
24720518290.0,
25076706860.0,
25432895430.0,
25789084000.0,
21260088115,
21277781150,
24837781150,
18837781150,
26837781150,
26377781150,
14837781150,
24839981150,
24837781150,
24008141150,
24364329720,
24720518290,
25076706860,
25432895430,
25789084000,
null,
null,
null,
@@ -1737,21 +1737,21 @@
{
"ColumnName": "ProcessorUsage",
"Values": [
12.0,
20.0,
18.0,
15.0,
18.0,
19.0,
20.0,
26.0,
17.0,
11.0,
18.0,
16.0,
16.0,
14.0,
15.0,
12,
20,
18,
15,
18,
19,
20,
26,
17,
11,
18,
16,
16,
14,
15,
null,
null,
null,
@@ -1841,16 +1841,16 @@
null,
null,
null,
16000.0,
14000.0,
16000.0,
17000.0,
16000,
14000,
16000,
17000,
null,
null,
14000.0,
13000.0,
17000.0,
16000.0,
14000,
13000,
17000,
16000,
null,
null,
null,
@@ -1869,21 +1869,21 @@
{
"ColumnName": "NetworkRecievedTraffic",
"Values": [
107374182.0,
6120328396.0,
53687091.0,
193273528.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
107374182,
6120328396,
53687091,
193273528,
193273528,
193273528,
612032839,
193273528,
193273528,
612032839,
612032839,
193273528,
193273528,
612032839,
193273528,
null,
null,
null,
@@ -1902,21 +1902,21 @@
{
"ColumnName": "NetworkSentTraffic",
"Values": [
5368709.0,
5368709.0,
5368709.0,
189273528.0,
189298528.0,
82298528.0,
191530456.0,
223540266.0,
255550077.0,
287559887.0,
319569698.0,
351579509.0,
383589319.0,
415599130.0,
447608941.0,
5368709,
5368709,
5368709,
189273528,
189298528,
82298528,
191530456,
223540266,
255550077,
287559887,
319569698,
351579509,
383589319,
415599130,
447608941,
null,
null,
null,
@@ -2340,21 +2340,21 @@
{
"ColumnName": "LogonCount",
"Values": [
2.0,
1.0,
2,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -2440,7 +2440,7 @@
"ColumnName": "HardReset",
"Values": [
null,
1.0,
1,
null,
null,
null,
@@ -2474,7 +2474,7 @@
"Values": [
null,
null,
1.0,
1,
null,
null,
null,
@@ -2506,7 +2506,7 @@
"ColumnName": "ApplicationHang",
"Values": [
null,
3.0,
3,
null,
null,
null,
@@ -2538,7 +2538,7 @@
{
"ColumnName": "ApplicationCrash",
"Values": [
2.0,
2,
null,
null,
null,
@@ -2771,57 +2771,57 @@
"5": [
[
"2022-05-14T00:55:15.34",
16000.0
16000
],
[
"2022-05-14T01:24:03.34",
16000.0
16000
]
],
"6": [
[
"2022-05-13T01:24:03.34",
14000.0
14000
]
],
"7": [
[
"2022-05-12T01:24:03.34",
16000.0
16000
]
],
"8": [
[
"2022-05-11T01:24:03.34",
17000.0
17000
]
],
"11": [
[
"2022-05-08T01:09:39.34",
14000.0
14000
],
[
"2022-05-08T03:33:39.34",
14000.0
14000
]
],
"12": [
[
"2022-05-08T05:57:39.34",
13000.0
13000
]
],
"13": [
[
"2022-05-06T03:19:15.34",
17000.0
17000
]
],
"14": [
[
"2022-05-05T03:33:39.34",
16000.0
16000
]
]
}
@@ -2856,5 +2856,49 @@
]
}
}
],
"Tickets": [
{
"AffectedUser": "Kiefer, Maximilian",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "WLAN im Lager faellt minutenweise aus",
"DescriptionHtml": "<p>WLAN im Lager faellt minutenweise aus</p>",
"Priority": 2,
"Category": "2c6fca4b-a1a0-ed11-5a81-000c299eb325",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "9b7710d4-72da-4b2a-9d0c-be02575d2c52",
"Name": "TCK00410",
"Summary": "WLAN im Lager faellt minutenweise aus",
"Status": 2
},
{
"AffectedUser": "Kiefer, Maximilian",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Windows Rollout haengt auf mehreren Clients",
"DescriptionHtml": "<p>Windows Rollout haengt auf mehreren Clients</p>",
"Priority": 2,
"Category": "14a23183-337e-e811-b382-000d3a24f586",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "7e852bb9-420b-4caa-b79a-9178d793fc06",
"Name": "INC00405",
"Summary": "Windows Rollout haengt auf mehreren Clients",
"Status": 2
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -936,7 +936,7 @@
{
"ColumnName": "id",
"Values": [
1.0,
1,
null,
null,
null,
@@ -1089,7 +1089,7 @@
{
"ColumnName": "BootLast",
"Values": [
0.0,
0,
null,
null,
null,
@@ -1155,7 +1155,7 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224,
null,
null,
null,
@@ -1188,7 +1188,7 @@
{
"ColumnName": "DiskFree",
"Values": [
193435973836.0,
193435973836,
null,
null,
null,
@@ -1221,7 +1221,7 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944,
null,
null,
null,
@@ -1254,7 +1254,7 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
158993459200.0,
158993459200,
null,
null,
null,
@@ -1287,7 +1287,7 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820,
null,
null,
null,
@@ -1506,21 +1506,21 @@
{
"ColumnName": "BootLast",
"Values": [
0.0,
4.0,
3.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0,
4,
3,
2,
1,
0,
0,
0,
0,
2,
1,
0,
0,
0,
0,
null,
null,
null,
@@ -1540,20 +1540,20 @@
"ColumnName": "BootCount",
"Values": [
null,
1.0,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -1572,14 +1572,14 @@
{
"ColumnName": "NetworkWifiSignal",
"Values": [
85.0,
90.0,
87.0,
85,
90,
87,
null,
null,
null,
92.0,
87.0,
92,
87,
null,
null,
null,
@@ -1605,21 +1605,21 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
null,
null,
null,
@@ -1638,21 +1638,21 @@
{
"ColumnName": "DiskFree",
"Values": [
193435973836.0,
126843545600.0,
184359738368.0,
105784247808.0,
105884247808.0,
105785247808.0,
105818914474.0,
110581941447.0,
110581991447.0,
110582041447.0,
110582091447.0,
110582141447.0,
110582191447.0,
110582241447.0,
110582291447.0,
193435973836,
126843545600,
184359738368,
105784247808,
105884247808,
105785247808,
105818914474,
110581941447,
110581991447,
110582041447,
110582091447,
110582141447,
110582191447,
110582241447,
110582291447,
null,
null,
null,
@@ -1671,21 +1671,21 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
null,
null,
null,
@@ -1704,21 +1704,21 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
158993459200.0,
260000000000.0,
171203283968.0,
177893283968.0,
171232283968.0,
181203283968.0,
181217783968.0,
183551683968.0,
185885583968.0,
188219483968.0,
190553383968.0,
192887283968.0,
195221183968.0,
197555083968.0,
199888983968.0,
158993459200,
260000000000,
171203283968,
177893283968,
171232283968,
181203283968,
181217783968,
183551683968,
185885583968,
188219483968,
190553383968,
192887283968,
195221183968,
197555083968,
199888983968,
null,
null,
null,
@@ -1737,21 +1737,21 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
null,
null,
null,
@@ -1770,21 +1770,21 @@
{
"ColumnName": "MemoryFree",
"Values": [
21260088115.0,
21277781150.0,
24837781150.0,
18837781150.0,
26837781150.0,
26377781150.0,
14837781150.0,
24839981150.0,
24837781150.0,
24008141150.0,
24364329720.0,
24720518290.0,
25076706860.0,
25432895430.0,
25789084000.0,
21260088115,
21277781150,
24837781150,
18837781150,
26837781150,
26377781150,
14837781150,
24839981150,
24837781150,
24008141150,
24364329720,
24720518290,
25076706860,
25432895430,
25789084000,
null,
null,
null,
@@ -1803,21 +1803,21 @@
{
"ColumnName": "ProcessorUsage",
"Values": [
12.0,
14.0,
18.0,
15.0,
18.0,
19.0,
20.0,
26.0,
17.0,
11.0,
18.0,
16.0,
16.0,
14.0,
15.0,
12,
14,
18,
15,
18,
19,
20,
26,
17,
11,
18,
16,
16,
14,
15,
null,
null,
null,
@@ -1903,20 +1903,20 @@
"ColumnName": "BootDuration",
"Values": [
null,
15000.0,
15000,
null,
null,
null,
16000.0,
14000.0,
16000.0,
17000.0,
16000,
14000,
16000,
17000,
null,
null,
14000.0,
13000.0,
17000.0,
16000.0,
14000,
13000,
17000,
16000,
null,
null,
null,
@@ -1935,21 +1935,21 @@
{
"ColumnName": "NetworkRecievedTraffic",
"Values": [
107374182.0,
120328396.0,
53687091.0,
193273528.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
107374182,
120328396,
53687091,
193273528,
193273528,
193273528,
612032839,
193273528,
193273528,
612032839,
612032839,
193273528,
193273528,
612032839,
193273528,
null,
null,
null,
@@ -1968,21 +1968,21 @@
{
"ColumnName": "NetworkSentTraffic",
"Values": [
38654705664.0,
5368709.0,
5368709.0,
189273528.0,
189298528.0,
82298528.0,
191530456.0,
223540266.0,
255550077.0,
287559887.0,
319569698.0,
351579509.0,
383589319.0,
415599130.0,
447608941.0,
38654705664,
5368709,
5368709,
189273528,
189298528,
82298528,
191530456,
223540266,
255550077,
287559887,
319569698,
351579509,
383589319,
415599130,
447608941,
null,
null,
null,
@@ -2154,7 +2154,7 @@
{
"ColumnName": "Logon",
"Values": [
0.0,
0,
null,
null,
null,
@@ -2373,21 +2373,21 @@
{
"ColumnName": "Logon",
"Values": [
0.0,
0.0,
1.0,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
2.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0,
0,
1,
0,
1,
0,
0,
0,
0,
2,
1,
0,
0,
0,
0,
null,
null,
null,
@@ -2406,21 +2406,21 @@
{
"ColumnName": "LogonCount",
"Values": [
2.0,
1.0,
2,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -2572,7 +2572,7 @@
"ColumnName": "ApplicationHang",
"Values": [
null,
2.0,
2,
null,
null,
null,
@@ -2604,7 +2604,7 @@
{
"ColumnName": "ApplicationCrash",
"Values": [
2.0,
2,
null,
null,
null,
@@ -2823,7 +2823,7 @@
{
"ColumnName": "id",
"Values": [
1.0,
1,
null,
null,
null,
@@ -2985,63 +2985,63 @@
"1": [
[
"2022-05-28T17:23:27.93",
15000.0
15000
]
],
"5": [
[
"2022-05-24T10:54:39.93",
16000.0
16000
],
[
"2022-05-24T11:23:27.93",
16000.0
16000
]
],
"6": [
[
"2022-05-23T11:23:27.93",
14000.0
14000
]
],
"7": [
[
"2022-05-22T11:23:27.93",
16000.0
16000
]
],
"8": [
[
"2022-05-21T11:23:27.93",
17000.0
17000
]
],
"11": [
[
"2022-05-18T11:09:03.93",
14000.0
14000
],
[
"2022-05-18T13:33:03.93",
14000.0
14000
]
],
"12": [
[
"2022-05-18T15:57:03.93",
13000.0
13000
]
],
"13": [
[
"2022-05-16T13:18:39.93",
17000.0
17000
]
],
"14": [
[
"2022-05-15T13:33:03.93",
16000.0
16000
]
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -540,7 +540,7 @@
{
"ColumnName": "id",
"Values": [
2.0,
2,
null,
null,
null,
@@ -707,57 +707,57 @@
"5": [
[
"2023-02-18T07:11:30.48",
160000.0
160000
],
[
"2023-02-18T07:40:18.48",
16000.0
16000
]
],
"6": [
[
"2023-02-17T07:40:18.48",
14000.0
14000
]
],
"7": [
[
"2023-02-16T07:40:18.48",
16000.0
16000
]
],
"8": [
[
"2023-02-15T07:40:18.48",
17000.0
17000
]
],
"11": [
[
"2023-02-12T07:25:54.48",
14000.0
14000
],
[
"2023-02-12T09:49:54.48",
14000.0
14000
]
],
"12": [
[
"2023-02-12T12:13:54.48",
13000.0
13000
]
],
"13": [
[
"2023-02-10T09:35:30.48",
17000.0
17000
]
],
"14": [
[
"2023-02-09T09:49:54.48",
16000.0
16000
]
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1089,7 +1089,7 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224,
null,
null,
null,
@@ -1122,7 +1122,7 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
3435973836,
null,
null,
null,
@@ -1155,7 +1155,7 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944,
null,
null,
null,
@@ -1188,7 +1188,7 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
8589934592,
null,
null,
null,
@@ -1221,7 +1221,7 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820,
null,
null,
null,
@@ -1478,16 +1478,16 @@
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -1539,21 +1539,21 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
null,
null,
null,
@@ -1572,21 +1572,21 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
26843545600.0,
84359738368.0,
105784247808.0,
105884247808.0,
105785247808.0,
105818914474.0,
105819414474.0,
105819914474.0,
105820414474.0,
105820914474.0,
105821414474.0,
105821914474.0,
105822414474.0,
105822914474.0,
3435973836,
26843545600,
84359738368,
105784247808,
105884247808,
105785247808,
105818914474,
105819414474,
105819914474,
105820414474,
105820914474,
105821414474,
105821914474,
105822414474,
105822914474,
null,
null,
null,
@@ -1605,21 +1605,21 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
null,
null,
null,
@@ -1638,21 +1638,21 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
28600000000.0,
71203283968.0,
77893283968.0,
71232283968.0,
81203283968.0,
81217783968.0,
83551683968.0,
85885583968.0,
88219483968.0,
90553383968.0,
92887283968.0,
95221183968.0,
97555083968.0,
99888983968.0,
8589934592,
28600000000,
71203283968,
77893283968,
71232283968,
81203283968,
81217783968,
83551683968,
85885583968,
88219483968,
90553383968,
92887283968,
95221183968,
97555083968,
99888983968,
null,
null,
null,
@@ -1671,21 +1671,21 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
null,
null,
null,
@@ -1704,21 +1704,21 @@
{
"ColumnName": "MemoryFree",
"Values": [
21260088115.0,
21277781150.0,
24837781150.0,
18837781150.0,
26837781150.0,
26377781150.0,
14837781150.0,
24839981150.0,
24837781150.0,
24008141150.0,
24364329720.0,
24720518290.0,
25076706860.0,
25432895430.0,
25789084000.0,
21260088115,
21277781150,
24837781150,
18837781150,
26837781150,
26377781150,
14837781150,
24839981150,
24837781150,
24008141150,
24364329720,
24720518290,
25076706860,
25432895430,
25789084000,
null,
null,
null,
@@ -1737,21 +1737,21 @@
{
"ColumnName": "ProcessorUsage",
"Values": [
12.0,
20.0,
18.0,
15.0,
18.0,
19.0,
20.0,
26.0,
17.0,
11.0,
18.0,
16.0,
16.0,
14.0,
15.0,
12,
20,
18,
15,
18,
19,
20,
26,
17,
11,
18,
16,
16,
14,
15,
null,
null,
null,
@@ -1841,16 +1841,16 @@
null,
null,
null,
16000.0,
14000.0,
16000.0,
17000.0,
16000,
14000,
16000,
17000,
null,
null,
14000.0,
13000.0,
17000.0,
16000.0,
14000,
13000,
17000,
16000,
null,
null,
null,
@@ -1869,21 +1869,21 @@
{
"ColumnName": "NetworkRecievedTraffic",
"Values": [
107374182.0,
6120328396.0,
53687091.0,
193273528.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
107374182,
6120328396,
53687091,
193273528,
193273528,
193273528,
612032839,
193273528,
193273528,
612032839,
612032839,
193273528,
193273528,
612032839,
193273528,
null,
null,
null,
@@ -1902,21 +1902,21 @@
{
"ColumnName": "NetworkSentTraffic",
"Values": [
5368709.0,
5368709.0,
5368709.0,
189273528.0,
189298528.0,
82298528.0,
191530456.0,
223540266.0,
255550077.0,
287559887.0,
319569698.0,
351579509.0,
383589319.0,
415599130.0,
447608941.0,
5368709,
5368709,
5368709,
189273528,
189298528,
82298528,
191530456,
223540266,
255550077,
287559887,
319569698,
351579509,
383589319,
415599130,
447608941,
null,
null,
null,
@@ -2340,21 +2340,21 @@
{
"ColumnName": "LogonCount",
"Values": [
2.0,
1.0,
2,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -2440,7 +2440,7 @@
"ColumnName": "HardReset",
"Values": [
null,
1.0,
1,
null,
null,
null,
@@ -2474,7 +2474,7 @@
"Values": [
null,
null,
1.0,
1,
null,
null,
null,
@@ -2506,7 +2506,7 @@
"ColumnName": "ApplicationHang",
"Values": [
null,
3.0,
3,
null,
null,
null,
@@ -2538,7 +2538,7 @@
{
"ColumnName": "ApplicationCrash",
"Values": [
2.0,
2,
null,
null,
null,
@@ -2771,57 +2771,57 @@
"5": [
[
"2022-05-14T00:55:01.18",
16000.0
16000
],
[
"2022-05-14T01:23:49.18",
16000.0
16000
]
],
"6": [
[
"2022-05-13T01:23:49.18",
14000.0
14000
]
],
"7": [
[
"2022-05-12T01:23:49.18",
16000.0
16000
]
],
"8": [
[
"2022-05-11T01:23:49.18",
17000.0
17000
]
],
"11": [
[
"2022-05-08T01:09:25.18",
14000.0
14000
],
[
"2022-05-08T03:33:25.18",
14000.0
14000
]
],
"12": [
[
"2022-05-08T05:57:25.18",
13000.0
13000
]
],
"13": [
[
"2022-05-06T03:19:01.18",
17000.0
17000
]
],
"14": [
[
"2022-05-05T03:33:25.18",
16000.0
16000
]
]
}

View File

@@ -540,7 +540,7 @@
{
"ColumnName": "id",
"Values": [
2.0,
2,
null,
null,
null,
@@ -707,57 +707,57 @@
"5": [
[
"2023-02-17T06:19:38",
160000.0
160000
],
[
"2023-02-17T06:48:26",
16000.0
16000
]
],
"6": [
[
"2023-02-16T06:48:26",
14000.0
14000
]
],
"7": [
[
"2023-02-15T06:48:26",
16000.0
16000
]
],
"8": [
[
"2023-02-14T06:48:26",
17000.0
17000
]
],
"11": [
[
"2023-02-11T06:34:02",
14000.0
14000
],
[
"2023-02-11T08:58:02",
14000.0
14000
]
],
"12": [
[
"2023-02-11T11:22:02",
13000.0
13000
]
],
"13": [
[
"2023-02-09T08:43:38",
17000.0
17000
]
],
"14": [
[
"2023-02-08T08:58:02",
16000.0
16000
]
]
}
@@ -793,5 +793,111 @@
}
}
],
"Tickets": []
"Tickets": [
{
"AffectedUser": "Seifert, Dominik",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "VPN Konzentrator in Aussenstelle offline",
"DescriptionHtml": "<p>VPN Konzentrator in Aussenstelle offline</p>",
"Priority": 2,
"Category": "33b82336-21fb-47bd-b219-9903ed15efc2",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "1507691c-6d47-4ae3-83b3-ef483d84a246",
"Name": "TCK00408",
"Summary": "VPN Konzentrator in Aussenstelle offline",
"Status": 2
},
{
"AffectedUser": "Seifert, Dominik",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Wartungsfenster fuer Firewall verschieben",
"DescriptionHtml": "<p>Wartungsfenster fuer Firewall verschieben</p>",
"Priority": 2,
"Category": "d8d05c5c-63fa-4718-9e06-9228a1afafe9",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "b207822d-7e1c-42a7-b8c9-4246f711dd18",
"Name": "TCK00413",
"Summary": "Wartungsfenster fuer Firewall verschieben",
"Status": 3
},
{
"AffectedUser": "Seifert, Dominik",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Firewall Cluster meldet Sync Fehler",
"DescriptionHtml": "<p>Firewall Cluster meldet Sync Fehler</p>",
"Priority": 2,
"Category": "ece302ae-c844-4336-8718-859a10de6b54",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "fe15284f-f553-4434-8b59-7d8b9f481bf7",
"Name": "INC00403",
"Summary": "Firewall Cluster meldet Sync Fehler",
"Status": 1
},
{
"AffectedUser": "Seifert, Dominik",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Firewall Cluster meldet weiterhin Sync Fehler",
"DescriptionHtml": "<p>Firewall Cluster meldet weiterhin Sync Fehler</p>",
"Priority": 2,
"Category": "d08ff475-e7c4-4dd5-8399-a751f27cc62f",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "486df93d-15b6-41d4-b902-2c1e1838c74b",
"Name": "INC00407",
"Summary": "Firewall Cluster meldet weiterhin Sync Fehler",
"Status": 2
},
{
"AffectedUser": "Seifert, Dominik",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Kuehlung im Rechenzentrum U3 ausgefallen",
"DescriptionHtml": "<p>Kuehlung im Rechenzentrum U3 ausgefallen</p>",
"Priority": 2,
"Category": "d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "9aae7eca-39d7-441e-8b33-5fc6f34765c8",
"Name": "INC00410",
"Summary": "Kuehlung im Rechenzentrum U3 ausgefallen",
"Status": 2
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1089,7 +1089,7 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224,
null,
null,
null,
@@ -1122,7 +1122,7 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
3435973836,
null,
null,
null,
@@ -1155,7 +1155,7 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944,
null,
null,
null,
@@ -1188,7 +1188,7 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
8589934592,
null,
null,
null,
@@ -1221,7 +1221,7 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820,
null,
null,
null,
@@ -1478,16 +1478,16 @@
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -1539,21 +1539,21 @@
{
"ColumnName": "DiskTotal",
"Values": [
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224.0,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
511101108224,
null,
null,
null,
@@ -1572,21 +1572,21 @@
{
"ColumnName": "DiskFree",
"Values": [
3435973836.0,
26843545600.0,
84359738368.0,
105784247808.0,
105884247808.0,
105785247808.0,
105818914474.0,
105819414474.0,
105819914474.0,
105820414474.0,
105820914474.0,
105821414474.0,
105821914474.0,
105822414474.0,
105822914474.0,
3435973836,
26843545600,
84359738368,
105784247808,
105884247808,
105785247808,
105818914474,
105819414474,
105819914474,
105820414474,
105820914474,
105821414474,
105821914474,
105822414474,
105822914474,
null,
null,
null,
@@ -1605,21 +1605,21 @@
{
"ColumnName": "SystemDiskTotal",
"Values": [
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944.0,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
274877906944,
null,
null,
null,
@@ -1638,21 +1638,21 @@
{
"ColumnName": "SystemDiskFree",
"Values": [
8589934592.0,
28600000000.0,
71203283968.0,
77893283968.0,
71232283968.0,
81203283968.0,
81217783968.0,
83551683968.0,
85885583968.0,
88219483968.0,
90553383968.0,
92887283968.0,
95221183968.0,
97555083968.0,
99888983968.0,
8589934592,
28600000000,
71203283968,
77893283968,
71232283968,
81203283968,
81217783968,
83551683968,
85885583968,
88219483968,
90553383968,
92887283968,
95221183968,
97555083968,
99888983968,
null,
null,
null,
@@ -1671,21 +1671,21 @@
{
"ColumnName": "MemoryTotal",
"Values": [
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820.0,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
34037615820,
null,
null,
null,
@@ -1704,21 +1704,21 @@
{
"ColumnName": "MemoryFree",
"Values": [
21260088115.0,
21277781150.0,
24837781150.0,
18837781150.0,
26837781150.0,
26377781150.0,
14837781150.0,
24839981150.0,
24837781150.0,
24008141150.0,
24364329720.0,
24720518290.0,
25076706860.0,
25432895430.0,
25789084000.0,
21260088115,
21277781150,
24837781150,
18837781150,
26837781150,
26377781150,
14837781150,
24839981150,
24837781150,
24008141150,
24364329720,
24720518290,
25076706860,
25432895430,
25789084000,
null,
null,
null,
@@ -1737,21 +1737,21 @@
{
"ColumnName": "ProcessorUsage",
"Values": [
12.0,
20.0,
18.0,
15.0,
18.0,
19.0,
20.0,
26.0,
17.0,
11.0,
18.0,
16.0,
16.0,
14.0,
15.0,
12,
20,
18,
15,
18,
19,
20,
26,
17,
11,
18,
16,
16,
14,
15,
null,
null,
null,
@@ -1841,16 +1841,16 @@
null,
null,
null,
16000.0,
14000.0,
16000.0,
17000.0,
16000,
14000,
16000,
17000,
null,
null,
14000.0,
13000.0,
17000.0,
16000.0,
14000,
13000,
17000,
16000,
null,
null,
null,
@@ -1869,21 +1869,21 @@
{
"ColumnName": "NetworkRecievedTraffic",
"Values": [
107374182.0,
6120328396.0,
53687091.0,
193273528.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
612032839.0,
193273528.0,
193273528.0,
612032839.0,
193273528.0,
107374182,
6120328396,
53687091,
193273528,
193273528,
193273528,
612032839,
193273528,
193273528,
612032839,
612032839,
193273528,
193273528,
612032839,
193273528,
null,
null,
null,
@@ -1902,21 +1902,21 @@
{
"ColumnName": "NetworkSentTraffic",
"Values": [
5368709.0,
5368709.0,
5368709.0,
189273528.0,
189298528.0,
82298528.0,
191530456.0,
223540266.0,
255550077.0,
287559887.0,
319569698.0,
351579509.0,
383589319.0,
415599130.0,
447608941.0,
5368709,
5368709,
5368709,
189273528,
189298528,
82298528,
191530456,
223540266,
255550077,
287559887,
319569698,
351579509,
383589319,
415599130,
447608941,
null,
null,
null,
@@ -2340,21 +2340,21 @@
{
"ColumnName": "LogonCount",
"Values": [
2.0,
1.0,
2,
1,
null,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
2.0,
1.0,
1.0,
1.0,
2,
1,
1,
1,
null,
null,
null,
@@ -2440,7 +2440,7 @@
"ColumnName": "HardReset",
"Values": [
null,
1.0,
1,
null,
null,
null,
@@ -2474,7 +2474,7 @@
"Values": [
null,
null,
1.0,
1,
null,
null,
null,
@@ -2506,7 +2506,7 @@
"ColumnName": "ApplicationHang",
"Values": [
null,
3.0,
3,
null,
null,
null,
@@ -2538,7 +2538,7 @@
{
"ColumnName": "ApplicationCrash",
"Values": [
2.0,
2,
null,
null,
null,
@@ -2771,57 +2771,57 @@
"5": [
[
"2022-05-14T00:56:05.48",
16000.0
16000
],
[
"2022-05-14T01:24:53.48",
16000.0
16000
]
],
"6": [
[
"2022-05-13T01:24:53.48",
14000.0
14000
]
],
"7": [
[
"2022-05-12T01:24:53.48",
16000.0
16000
]
],
"8": [
[
"2022-05-11T01:24:53.48",
17000.0
17000
]
],
"11": [
[
"2022-05-08T01:10:29.48",
14000.0
14000
],
[
"2022-05-08T03:34:29.48",
14000.0
14000
]
],
"12": [
[
"2022-05-08T05:58:29.48",
13000.0
13000
]
],
"13": [
[
"2022-05-06T03:20:05.48",
17000.0
17000
]
],
"14": [
[
"2022-05-05T03:34:29.48",
16000.0
16000
]
]
}
@@ -2856,5 +2856,133 @@
]
}
}
],
"Tickets": [
{
"AffectedUser": "Busch, Andrea",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Neuer Monitor fuer Hotline Arbeitsplatz",
"DescriptionHtml": "<p>Neuer Monitor fuer Hotline Arbeitsplatz</p>",
"Priority": 2,
"Category": "a76f2ae1-4830-ee11-e785-000d3abff293",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "f7771fde-33ba-421a-8d9b-cdf468e7541c",
"Name": "TCK00403",
"Summary": "Neuer Monitor fuer Hotline Arbeitsplatz",
"Status": 1
},
{
"AffectedUser": "Boss, Bernd",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "SAP Produktionsauftrag bricht ab",
"DescriptionHtml": "<p>SAP Produktionsauftrag bricht ab</p>",
"Priority": 2,
"Category": "52811274-7b0e-4cdb-a18a-0843fd663f0c",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "5c6d981e-9e67-4fde-b249-8c6288d325a7",
"Name": "TCK00409",
"Summary": "SAP Produktionsauftrag bricht ab",
"Status": 2
},
{
"AffectedUser": "Busch, Andrea",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Remotedesktop Sitzung trennt nach wenigen Minuten",
"DescriptionHtml": "<p>Remotedesktop Sitzung trennt nach wenigen Minuten</p>",
"Priority": 2,
"Category": "3838d26f-bc49-4065-a29f-b8965b199946",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "3c3c70cf-5c60-4ecc-9313-b5f9c1968fc7",
"Name": "INC00406",
"Summary": "Remotedesktop Sitzung trennt nach wenigen Minuten",
"Status": 2
},
{
"AffectedUser": "Zufall, Rainer",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Produktionslinie meldet keine Sensordaten",
"DescriptionHtml": "<p>Produktionslinie meldet keine Sensordaten</p>",
"Priority": 2,
"Category": "653792bf-ee60-4c57-9d72-4f1fb51c27d0",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "86da28b0-013b-4542-bcff-175044d5bb02",
"Name": "INC00408",
"Summary": "Produktionslinie meldet keine Sensordaten",
"Status": 2
},
{
"AffectedUser": "Busch, Andrea",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Backup Team hat Rueckfrage zur Sicherung",
"DescriptionHtml": "<p>Backup Team hat Rueckfrage zur Sicherung</p>",
"Priority": 2,
"Category": "b05a28a4-a1ae-4cb8-a30d-08fe6873b467",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "d1a2c544-4f59-4f2b-875f-3621a23d4228",
"Name": "INC00413",
"Summary": "Backup Team hat Rueckfrage zur Sicherung",
"Status": 3
},
{
"AffectedUser": "Zufall, Rainer",
"Asset": "C4-NB00015",
"CreationDaysSinceNow": 0,
"CreationDate": "2025-06-20T14:32:52.5790686+02:00",
"ClosingDaysSinceNow": null,
"ClosingDate": null,
"CreationSource": 1,
"Description": "Fernwartung benoetigt Zugangsdaten zur SPS",
"DescriptionHtml": "<p>Fernwartung benoetigt Zugangsdaten zur SPS</p>",
"Priority": 2,
"Category": "b0c38014-e147-e511-0681-0050562f9516",
"Solution": null,
"SolutionHtml": null,
"DirectLinks": {},
"JournalItems": [],
"Id": "1372b3cf-5d87-4099-ab83-ec0cccf7194e",
"Name": "INC00416",
"Summary": "Fernwartung benoetigt Zugangsdaten zur SPS",
"Status": 3
}
]
}

View File

@@ -0,0 +1,714 @@
{
"AlternateStaticTable": null,
"Name": "M42Wpm-Ticket-Categories",
"StartingIndex": 0,
"IsIncomplete": false,
"IsStatic": false,
"TableType": 5,
"TimeFrames": null,
"InformationClass": 3,
"Columns": {
"id": {
"ColumnName": "id",
"Values": [
"9282a500-caea-49bb-944f-9d0274fcc80a",
"8ba5e53d-3b6b-425a-baba-34438845f00d",
"cbbec585-0184-4ae3-ab68-7caeb3d0e5b2",
"fd4ca144-2aca-48c4-b8b9-ce75b07ca3cb",
"70d3cb04-11ab-43cb-a769-368517ba4879",
"9d468c5c-c543-4ee5-9a23-4f9975e5c145",
"b05a28a4-a1ae-4cb8-a30d-08fe6873b467",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"4e7bafad-c49b-432a-b88e-f4bced36e5ed",
"2c6fca4b-a1a0-ed11-5a81-000c299eb325",
"d457c1f4-e4bd-4753-9e02-c8e645d5e342",
"facc2d0f-3216-4ccd-9c81-57cb29150e9e",
"5f385abf-a574-468b-a4ba-feed4fc0c76d",
"ced65ab8-d526-4518-be11-caf68b31d959",
"f5f3e9d2-2e63-4fc4-a00c-0e8d12750a70",
"2ed6c1ac-70ee-4f3d-911a-f4508cdf085c",
"a84abed8-7384-4fd1-8ed1-6f2bd7398e7c",
"c92984c5-6c88-452f-b5eb-17c73cf2f406",
"5ccae795-9ba5-ea11-2ca6-2c6fc9364e44",
"4d51cfdd-ccaa-49a0-89cf-b16666f38de5",
"2533dacc-5a9f-ea11-b083-000d3a24f586",
"3f00c4b0-9ba5-ea11-2ca6-2c6fc9364e44",
"bfbfaff9-30b9-4bab-9472-8203d9c638e7",
"da6a307f-f4ed-ea11-e683-000d3a24f586",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
"54779070-3b79-4bef-abfa-901e35fe6d64",
"8d757427-f2ed-ea11-e683-000d3a24f586",
"9b129a5b-18b2-4489-a889-8496eb975b38",
"dd47d5d9-9fa5-ea11-2ca6-2c6fc9364e44",
"3ee839fa-05cc-ea11-fba7-0c9d921bfedc",
"3838d26f-bc49-4065-a29f-b8965b199946",
"14a23183-337e-e811-b382-000d3a24f586",
"b0c38014-e147-e511-0681-0050562f9516",
"d08ff475-e7c4-4dd5-8399-a751f27cc62f",
"5bd861fd-1dcf-4e48-ac1b-f439295fae88",
"fe30d3d8-32c0-40f2-8205-3519c4b52ddd",
"50e4a6d3-37f9-ec11-3185-000d3abff293",
"3d75c99d-b3e3-eb11-5684-000d3aad24a5",
"d0fe2578-d7e2-4bbf-ad59-58e297fac109",
"b457c1f4-e4bd-4753-9e02-c8e645d5e342",
"5310b2a1-92b9-4627-8478-2a687232e5f3",
"44e88873-4960-41e0-b7eb-3334ec76102c",
"30f73af3-abb7-4d68-876d-9202b24ca3f1",
"bb1fd7f2-0d95-469d-ac83-a2d391eb111b",
"2964fa66-368e-4d92-b322-df51ff25182c",
"3d1f7ff5-f9c5-4f84-8783-e649382666d7",
"ab49d197-b3e3-eb11-5684-000d3aad24a5",
"a198b490-337e-e811-b382-000d3a24f586",
"809dceed-3d2d-ee11-e685-000d3abff293",
"a76f2ae1-4830-ee11-e785-000d3abff293",
"02c7a5f8-6133-4be3-9d63-2687b96a1e72",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"85623dea-dad3-4102-a45a-00f9379fde26",
"0f9f345f-ef08-44a5-bcbf-d7d1087295a3",
"c1e4f87f-a8ab-4acc-a7e8-3e9a78c8f3f9",
"ece302ae-c844-4336-8718-859a10de6b54",
"6870c5ce-464d-41b3-8799-b97b0768f884",
"139d9c55-b636-4feb-a798-39f4cf9e1726",
"4e708c19-5355-41d9-8fd7-45cba87ccf27",
"c08cc910-304b-44c9-8ea8-a12bada124f5",
"e7600b86-4c38-4e66-b1b1-fb2fd7ebf73c",
"5861e772-9c19-e111-4789-005056c00008",
"17ee0029-939b-e211-0084-8c89a56499ca",
"a7e3ba44-f047-ee11-f785-000d3abff293",
"5b76bcda-9566-4131-9fa0-0f579de9c812",
"26661087-5ca8-4721-9cae-3d2ce5f06e4c",
"ee89d782-94c0-46fa-b712-b65503759cfb",
"5c092a0d-e55a-4674-8dab-785f0f2af6a3",
"85f4d1ff-6933-4121-b196-a9e463dedf32",
"4e9cce05-cafb-4724-9bd9-5b5c903d3fb8",
"f0ea9b3d-3f5e-eb11-2081-00505690226c",
"d8d05c5c-63fa-4718-9e06-9228a1afafe9",
"1d33330f-e4e1-4737-8716-c47ab5161266",
"394b1e74-5d60-e511-2681-0050562f9516",
"c3d6a2b1-021a-409a-bd74-9ddf79f84363",
"46240b02-93a5-ea11-2ca6-2c6fc9364e44",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"52811274-7b0e-4cdb-a18a-0843fd663f0c",
"7c67d904-139b-476e-9844-40aea66bf09a",
"653792bf-ee60-4c57-9d72-4f1fb51c27d0",
"958195f1-8717-458f-95e2-ab6656f68069",
"05327149-f029-40be-80cd-b99a1094e6b8",
"b025b1b3-b3b8-44ca-9404-0ab586578451",
"7a74937d-5e48-4430-8936-1b5f501cf305",
"82c0a3f1-1f37-47e6-9d95-2d807750cbbc",
"b2996b4d-86e8-4df2-9e8e-8d3c6fc92ab2",
"303636d7-cfad-4911-be1e-cd9ff2c98542",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"ae9447c6-0901-4cdf-9c39-52576a027406",
"fe57e004-243a-4a9f-bc5b-64794d57cd2b",
"3556a4a5-1419-4edd-8412-86630a5530e7",
"9b6f7c35-076b-475b-abd2-a990ebe7345f",
"f122e1bd-a5d7-4f18-8f65-dbfe65a4360c",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"54f6d721-d0a4-e611-e881-0050562f9516",
"0e0e5d31-ae18-477f-9514-23d23e3009b8",
"7ef2fce4-96a5-ea11-2ca6-2c6fc9364e44",
"82b5d230-9c71-4276-b712-80c33149f5c6",
"f4a559ba-e3a3-4489-8434-a5ebe38d8f7e",
"f40a9704-eba2-4d4a-b93b-29eab11fb1b0",
"6de22308-4704-4c94-89f2-484a5cec8aa0",
"8021fb31-1a36-47cd-b869-62effa8b71ae",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"3fcab71f-db57-4d2f-aec1-e76b850b2372",
"74f41b6f-e21b-4df4-8663-11366be2f3e9",
"27988b9a-56b7-4135-b6cd-32b685cd248d",
"2a749ac4-a143-4ed6-9553-ad185525dbef",
"33b82336-21fb-47bd-b219-9903ed15efc2"
],
"IsIncomplete": false,
"IsWritable": false
},
"SysObjectId": {
"ColumnName": "SysObjectId",
"Values": [
"95f1fe4d-e86e-4f9f-85cc-89747d44273f",
"4fc190b5-8d9b-455e-ad61-8183f1c18a86",
"bcdc65fa-1466-4dd4-9ee4-00dff432f503",
"9ec89038-51ef-4e85-a43b-28c54cb803de",
"ac0d2834-e731-44c1-b8fd-7e88e8689427",
"9e86523e-8107-430e-a225-e4334d0db3b9",
"f471ecfd-e89f-4de6-b706-207aeb951ccf",
"99fe9328-4b5c-4520-935d-5004f31ac396",
"68151e08-959e-4215-a9cd-02cf0738451c",
"4029889e-64ce-cd35-c695-08db02c51bfe",
"a825e856-b789-4030-bd1a-a11cecd7bbbe",
"f1e57c0f-d7da-4fd6-b1ea-781baa12f0b5",
"460d1320-7bdc-4283-8631-bf0a0e51633f",
"d0c53f6d-54b0-413d-8c7a-dae6d4735c83",
"77fd9d09-b8fe-4fcb-a420-61edcc6dee7b",
"54827c82-da2f-45c1-86af-0f8b3c3f3588",
"c63cb394-090b-4708-8faa-91a0562164b9",
"474bae50-e464-450d-a933-5e361f19a1c4",
"24615680-3dc1-cecf-e622-08d807bf677d",
"994aad52-24a2-4cbe-82af-a228c5a7d108",
"8a02482e-6ee4-c1dd-9d42-08d8017e9781",
"84e19468-8d24-ce62-b2c7-08d807bf8e4c",
"3322155e-5992-4f87-a6ff-2d2fa598c7fc",
"6fa18a91-73f0-c88b-6460-08d85017907e",
"2d0209de-1aa7-4d9c-be9d-0260e61f47ed",
"71001502-5eb3-4f17-a82e-87c6486ffe13",
"282c788d-3678-c24a-90d2-08d850160393",
"83e78848-2e09-49f7-8620-541ec2d7f81c",
"7f7d71cc-c6f4-c4ef-665f-08d807bfa037",
"f1f99037-b978-c502-8871-08d82e284a96",
"bff0be05-411d-4f34-a763-5a085842bfba",
"f593ac72-becf-c147-8512-08d5e0576230",
"aac38014-e147-e511-0681-0050562f9516",
"aa1e2465-4b33-4c08-90f3-4ad0398ee6d5",
"9da03209-520c-4645-80fb-d92e7667b629",
"ac794830-0a29-4440-9929-3be9de13857f",
"57a76791-fa99-c94e-5cab-08da5b5bb033",
"f827d84c-364d-c603-91aa-08d945d7822a",
"2b92c49c-fba2-4935-9e56-7464f165f538",
"b825e856-b789-4030-bd1a-a11cecd7bbbe",
"4fa1b861-fbbe-4ba0-aa07-79f8231e137b",
"8c5213ed-cc2c-44db-8e94-261ac6889d16",
"9b8b8713-b67e-46ee-8824-3ae9bb7b5661",
"85004e7d-cc1b-4466-9efa-94c47dda3e2b",
"93612578-4e1f-4b9c-862a-11faf216b2a3",
"80fef6bf-8af7-4312-9ccf-0bac3b6f22bd",
"3d4082b9-1655-c951-cfd4-08d945d77629",
"db86fc24-5529-ce77-4178-08d5e0576ac3",
"5a8abb2f-5520-cccf-598a-08db8f61b225",
"770d895f-cf26-c0bc-35c0-08db926cb92d",
"31606439-93e2-41a2-b348-e2107950801e",
"b4ed335d-9c1d-4cf7-afe8-69a99f8b5804",
"0258ca0c-7749-4746-9877-c979c817fcfd",
"3719b13a-f578-4b74-addf-ecbc219cadb8",
"b8dde1d8-37f6-4950-b3fa-f5c73d89890a",
"3cb2fd90-1f64-47b1-9736-fe5ee44f89c1",
"c808a2ac-b3bf-47a9-8795-25a3d1bb1a3d",
"3cc9d00f-9780-4757-b797-4f64f1ae98c0",
"2e7077c0-3d21-4f08-a562-d49e2efc08cc",
"8e977585-cf06-4b1f-aae3-502a4ea75726",
"27cc9771-dc56-48ad-bc39-02df5939b3f4",
"5261e772-9c19-e111-4789-005056c00008",
"11ee0029-939b-e211-0084-8c89a56499ca",
"3c0f33fa-ac65-c402-d8f4-08dbaa1400f7",
"4be9b8d7-4dc2-4957-b777-6471c1a0c750",
"d45c883f-513b-4373-bb84-719e96d61578",
"33837d5f-7a85-411e-8a01-9ff47d301b00",
"83a43358-2879-4925-b674-04d697c488d0",
"472d4ddc-c761-413e-bebf-491ebdbe9641",
"7077baa4-dfae-4d3a-aaa4-253c7a5f4bff",
"e20c43e9-8da2-c67f-4744-08d8c0631f96",
"9af6450f-3741-4697-bd46-3038db8cb21a",
"46a96916-1e80-4850-8407-b1c872b0ca30",
"334b1e74-5d60-e511-2681-0050562f9516",
"fd9f0cee-b410-4ff1-8b2b-873341f4fe1c",
"c3a3c4b6-c98b-cfb6-b5cb-08d807b4a882",
"24c76522-8edb-4300-8cf4-7cf082ded2bf",
"605449d5-7302-40d5-9607-60032bad49f2",
"b87c4094-6aff-4a42-94bc-a6221d09d942",
"f4419dc7-bd11-4e86-bd3e-4ff6ccdedb09",
"4f005c1b-19de-4373-aad2-aef650c7ea97",
"cb6b8159-c971-47f6-8bdf-7e1a09835dce",
"64dc84b3-ebe4-4bee-85d3-8f9eea5a217a",
"d2c5ed0e-154e-445e-a573-d754c03c5212",
"cb28c887-46e6-40b9-a471-83b0acfe96f6",
"c2335069-0b6f-4823-bfb2-9401bdafa581",
"d4360c64-04ed-4354-a58d-fce0c0dcaaaa",
"f8f00236-c8b1-4121-847a-7dd233438274",
"a7b21eb7-57b9-4931-95b9-32de27d8c42f",
"0e567893-8d4f-422d-92d1-99fa5aeb6008",
"4bf3458d-1dc0-4e67-84e7-3d06330216d6",
"46d853b2-6cb3-45a4-b439-8c031822198d",
"ec635c81-5ba9-426b-9c33-0b6f4736e3b4",
"964419fa-3840-43d9-afa4-151d0d8972e8",
"d6102937-a051-4e2c-8c29-ea91b38caeb7",
"9ff59754-32be-4b12-9aff-d1771d1b66dc",
"4ef6d721-d0a4-e611-e881-0050562f9516",
"69a3f348-f159-440a-980e-0675d035f2c0",
"ef91cb83-867f-c95b-3795-08d807b8d450",
"91544dfb-5afe-4435-97e6-8c1f24e6bdab",
"91a6b9d9-7f51-49b9-a309-e9d4f047e7dd",
"05d1e707-80fc-4f5c-a3cb-d35a7d69ec27",
"0b8c25ee-d951-4be4-a4a1-6c95754e26d0",
"e5d7e59f-fd42-49c9-bee2-a92bdb4fadf9",
"f7d51b56-c3f5-4259-a7ad-2c0fac6cc653",
"dbbad401-7602-4732-ba2b-05a328a4e059",
"6b903456-94b2-48d3-8795-8f6620b48d82",
"e905c92e-e42a-4de8-ae1e-624bc2103d65",
"8a058953-ed70-41cc-aa85-dd6e37a67caa",
"56b2c18c-e2c3-4900-a4c3-312235a97ad2"
],
"IsIncomplete": false,
"IsWritable": false
},
"SysName": {
"ColumnName": "SysName",
"Values": [
"ACT00063",
"ACT00053",
"ACT00055",
"ACT00007",
"ACT00085",
"ACT00083",
"ACT00097",
"ACT00012",
"ACT00058",
"ACT00112",
"ACT00028",
"ACT00047",
"ACT00030",
"ACT00045",
"ACT00080",
"ACT00086",
"ACT00092",
"ACT00049",
"ACT00080",
"ACT00041",
"ACT00095",
"ACT00081",
"ACT00091",
"ACT00102",
"ACT00038",
"ACT00022",
"ACT00101",
"ACT00097",
"ACT00082",
"ACT00078",
"ACT00040",
"ACT00093",
"ACT00078",
"ACT00088",
"ACT00034",
"ACT00044",
"ACT00107",
"ACT00105",
"ACT00019",
"ACT00092",
"ACT00065",
"ACT00069",
"ACT00090",
"ACT00085",
"ACT00073",
"ACT00002",
"ACT00104",
"ACT00094",
"ACT00109",
"ACT00110",
"ACT00078",
"ACT00077",
"ACT00094",
"ACT00093",
"ACT00039",
"ACT00056",
"ACT00059",
"ACT00062",
"ACT00052",
"ACT00013",
"ACT00064",
"ACT00099",
"ACT00077",
"ACT00111",
"ACT00042",
"ACT00018",
"ACT00054",
"ACT00089",
"ACT00050",
"ACT00048",
"ACT00078",
"ACT00060",
"ACT00046",
"ACT00079",
"ACT00096",
"ACT00078",
"ACT00020",
"ACT00015",
"ACT00087",
"ACT00067",
"ACT00083",
"ACT00088",
"ACT00075",
"ACT00071",
"ACT00068",
"ACT00091",
"ACT00072",
"ACT00076",
"ACT00086",
"ACT00079",
"ACT00070",
"ACT00066",
"ACT00074",
"ACT00084",
"ACT00089",
"ACT00033",
"ACT00081",
"ACT00082",
"ACT00079",
"ACT00090",
"ACT00081",
"ACT00087",
"ACT00061",
"ACT00057",
"ACT00008",
"ACT00043",
"ACT00082",
"ACT00095",
"ACT00084",
"ACT00051"
],
"IsIncomplete": false,
"IsWritable": false
},
"Name": {
"ColumnName": "Name",
"Values": [
"Ablage",
"Abschluss",
"Abschluss",
"Active Directory",
"Aktualisierte Software Vorlage",
"Aktualisiertes Lizenzmodell",
"Altiris Client-Installation",
"\u00c4nderungen",
"Angebot",
"Assetleihe",
"Asset-Verwaltung",
"Audit",
"Aufgaben",
"Ausschreibung",
"Bedarfe",
"Bereitstellung",
"Best\u00e4tigung",
"Bestellung",
"Client Lifecycle Management",
"Controlling",
"CRM",
"Data Protection",
"Duplikate",
"EDR",
"Einkauf",
"Empirum Client Installationen",
"Endger\u00e4te",
"Enteo [Centennial] Client Installation",
"Enterprise Mobility Management",
"Enterprise Queue",
"Erf\u00fcllung",
"Facility Management",
"Facility Management",
"Fehlbestand",
"Fehlbestand",
"Finanzbuchhaltung",
"Fleet Management",
"FM",
"Genehmigungen",
"Gesch\u00e4ftsbeziehungen",
"Hardware",
"Hardware",
"Hardware",
"Hardware",
"Hardware",
"Hardwareauslieferung",
"HR",
"Human Resources",
"Human Resources",
"Human Resources",
"Installationen",
"Inventarisierung",
"Katalog Artikelabweichung",
"Katalog Mehrfacheintrag",
"Konformit\u00e4t",
"Korrespondenz",
"Kostenplanung",
"K\u00fcndigung",
"Lieferung",
"Lizenzmanagement",
"Mahnwesen",
"MDM Ger\u00e4teanmeldung",
"Mobile Applikationen",
"Office",
"Organisation",
"Probleme",
"Prognose",
"Pr\u00fcfung",
"Rechnungsstellung",
"Rechtspr\u00fcfung",
"Release Management",
"Revision",
"ROI Pr\u00fcfung",
"SAP",
"SCCM Client Installationen",
"Secure Unified Endpoint Management",
"Service Catalog",
"Service Desk",
"Serviceanfragen",
"Sicherheit",
"Sicherheit",
"Sicherheit",
"Sicherheit",
"Sicherheit",
"Software",
"Software",
"Software",
"Software",
"Software",
"Softwareprodukte",
"Sonstige",
"Sonstige",
"Sonstige",
"Sonstige",
"Sonstige",
"St\u00f6rungen",
"Telefonie",
"Tickets",
"Unified Endpoint Management",
"Validierung",
"Validierung",
"Verf\u00fcgbare Software Vorlage",
"Verhandlung",
"Verl\u00e4ngerung",
"Vertragsverwaltung",
"Vertrieb",
"Wartung",
"Wegfall Lizenzmodell",
"Wegfall Software Vorlage",
"Zahlung"
],
"IsIncomplete": false,
"IsWritable": false
},
"parentValue": {
"ColumnName": "parentValue",
"Values": [
"5b76bcda-9566-4131-9fa0-0f579de9c812",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
"3fcab71f-db57-4d2f-aec1-e76b850b2372",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"3fcab71f-db57-4d2f-aec1-e76b850b2372",
"d457c1f4-e4bd-4753-9e02-c8e645d5e342",
null,
"c1e4f87f-a8ab-4acc-a7e8-3e9a78c8f3f9",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
"c08cc910-304b-44c9-8ea8-a12bada124f5",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"f5f3e9d2-2e63-4fc4-a00c-0e8d12750a70",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
"7ef2fce4-96a5-ea11-2ca6-2c6fc9364e44",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"82c0a3f1-1f37-47e6-9d95-2d807750cbbc",
"46240b02-93a5-ea11-2ca6-2c6fc9364e44",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"05327149-f029-40be-80cd-b99a1094e6b8",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"05327149-f029-40be-80cd-b99a1094e6b8",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"7ef2fce4-96a5-ea11-2ca6-2c6fc9364e44",
null,
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"d457c1f4-e4bd-4753-9e02-c8e645d5e342",
"4d51cfdd-ccaa-49a0-89cf-b16666f38de5",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"3ee839fa-05cc-ea11-fba7-0c9d921bfedc",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"0e0e5d31-ae18-477f-9514-23d23e3009b8",
"26661087-5ca8-4721-9cae-3d2ce5f06e4c",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"3ee839fa-05cc-ea11-fba7-0c9d921bfedc",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"c08cc910-304b-44c9-8ea8-a12bada124f5",
"c08cc910-304b-44c9-8ea8-a12bada124f5",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"5b76bcda-9566-4131-9fa0-0f579de9c812",
"4d51cfdd-ccaa-49a0-89cf-b16666f38de5",
"3838d26f-bc49-4065-a29f-b8965b199946",
"3838d26f-bc49-4065-a29f-b8965b199946",
null,
"3fcab71f-db57-4d2f-aec1-e76b850b2372",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
null,
"82c0a3f1-1f37-47e6-9d95-2d807750cbbc",
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"4d51cfdd-ccaa-49a0-89cf-b16666f38de5",
"f5f3e9d2-2e63-4fc4-a00c-0e8d12750a70",
"3fcab71f-db57-4d2f-aec1-e76b850b2372",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
null,
"c1e4f87f-a8ab-4acc-a7e8-3e9a78c8f3f9",
"4d51cfdd-ccaa-49a0-89cf-b16666f38de5",
"82c0a3f1-1f37-47e6-9d95-2d807750cbbc",
"8fe597cd-9fbf-4552-a061-ca15defb1291",
null,
null,
null,
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"0e0e5d31-ae18-477f-9514-23d23e3009b8",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"26661087-5ca8-4721-9cae-3d2ce5f06e4c",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"26661087-5ca8-4721-9cae-3d2ce5f06e4c",
"0e0e5d31-ae18-477f-9514-23d23e3009b8",
"c08cc910-304b-44c9-8ea8-a12bada124f5",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"26661087-5ca8-4721-9cae-3d2ce5f06e4c",
"0e0e5d31-ae18-477f-9514-23d23e3009b8",
"1d1608c0-c32e-44ec-85af-6d4846752877",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"d0f04f85-458f-40bd-aeb0-e97b08b933b5",
"46240b02-93a5-ea11-2ca6-2c6fc9364e44",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"d457c1f4-e4bd-4753-9e02-c8e645d5e342",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"d4eceb45-34ef-4ffc-905c-7ef91a8ab1a6",
"3838d26f-bc49-4065-a29f-b8965b199946",
null,
"ded1c666-cb2a-45a7-8554-96f1244e3b32",
"d1656ef7-dda6-4227-b8bb-1da5f35eed32",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"f671cdfd-80ad-4d71-afbb-a70fbda242ff",
"3838d26f-bc49-4065-a29f-b8965b199946"
],
"IsIncomplete": false,
"IsWritable": false
},
"parent": {
"ColumnName": "parent",
"Values": [
"Organisation",
"Einkauf",
"Vertrieb",
"Service Catalog",
"Softwareprodukte",
"Softwareprodukte",
"Service Catalog",
"Service Desk",
"Vertrieb",
"Asset-Verwaltung",
null,
"Konformit\u00e4t",
"Service Desk",
"Einkauf",
"Lizenzmanagement",
"Inventarisierung",
"Bedarfe",
"Einkauf",
"Unified Endpoint Management",
"Vertragsverwaltung",
"Software",
"Secure Unified Endpoint Management",
"Softwareprodukte",
"Sicherheit",
"Vertragsverwaltung",
"Service Catalog",
"Sicherheit",
"Service Catalog",
"Unified Endpoint Management",
null,
"Vertragsverwaltung",
"Service Catalog",
"St\u00f6rungen",
"Inventarisierung",
"Asset-Verwaltung",
"Controlling",
"St\u00f6rungen",
"Enterprise Queue",
"Service Catalog",
"Vertragsverwaltung",
"\u00c4nderungen",
"St\u00f6rungen",
"Serviceanfragen",
"Tickets",
"Probleme",
"Service Catalog",
"Enterprise Queue",
"Service Catalog",
"St\u00f6rungen",
"Serviceanfragen",
"Lizenzmanagement",
"Lizenzmanagement",
"Inventarisierung",
"Inventarisierung",
"Vertragsverwaltung",
"Organisation",
"Controlling",
"Erf\u00fcllung",
"Erf\u00fcllung",
null,
"Vertrieb",
"Service Catalog",
null,
"Software",
"Vertragsverwaltung",
"Service Desk",
"Controlling",
"Bedarfe",
"Vertrieb",
"Einkauf",
null,
"Konformit\u00e4t",
"Controlling",
"Software",
"Service Catalog",
null,
null,
null,
"Service Desk",
"\u00c4nderungen",
"Tickets",
"Serviceanfragen",
"Probleme",
"St\u00f6rungen",
"\u00c4nderungen",
"Serviceanfragen",
"St\u00f6rungen",
"Probleme",
"Tickets",
"Lizenzmanagement",
"St\u00f6rungen",
"\u00c4nderungen",
"Probleme",
"Tickets",
"Serviceanfragen",
"Service Desk",
"St\u00f6rungen",
"Service Desk",
"Secure Unified Endpoint Management",
"Inventarisierung",
"Asset-Verwaltung",
"Softwareprodukte",
"Einkauf",
"Erf\u00fcllung",
null,
"Vertragsverwaltung",
"Inventarisierung",
"Softwareprodukte",
"Softwareprodukte",
"Erf\u00fcllung"
],
"IsIncomplete": false,
"IsWritable": false
}
}
}

View File

@@ -77,21 +77,21 @@
"Name": {
"ColumnName": "Name",
"Values": [
"Anmeldung nicht möglich",
"Anmeldung nicht m\u00f6glich",
"Bildschirm bleibt schwarz",
"CRM Störung",
"CRM St\u00f6rung",
"Dateityp kann nicht gelesen werden",
"Druckerstörung",
"E-Mail-Versand nicht mehr möglich",
"F4SD Störung",
"Internetverbindung gestört",
"Druckerst\u00f6rung",
"E-Mail-Versand nicht mehr m\u00f6glich",
"F4SD St\u00f6rung",
"Internetverbindung gest\u00f6rt",
"Jalousiensteuerung defekt",
"Klimatisierungsstörung - Raumtemperatur zu hoch",
"Klimatisierungsst\u00f6rung - Raumtemperatur zu hoch",
"Lampe ist defekt",
"Netzwerklaufwerk nicht erreichbar",
"Passcode vergessen, Mobilgerät ist gesperrt",
"Passcode vergessen, Mobilger\u00e4t ist gesperrt",
"Software-Service arbeitet nicht mehr korrekt",
"Telefonstörung"
"Telefonst\u00f6rung"
],
"IsIncomplete": false,
"IsWritable": false
@@ -101,19 +101,19 @@
"Values": [
"Der Anwender kann sich nicht mehr anmelden",
"Der Bildschirm bleibt schwarz, Computer startet nicht mehr",
"CRM Störung",
"CRM St\u00f6rung",
"Ein bestimmter Dateityp kann nicht verarbeitet werden",
"Ein Drucker arbeitet nicht mehr zufriedenstellend oder ist kaputt",
"Der Versand von E-Mails ist nicht mehr möglich",
"F4SD Störung",
"Der Versand von E-Mails ist nicht mehr m\u00f6glich",
"F4SD St\u00f6rung",
"Der Anwender kommt nicht mehr ins Internet",
"Die automatischen Sonnenschutzvorrichtungen funktionieren nicht mehr",
"Die Raumklimatisierung funktioniert nicht mehr korrekt",
"Lampe ausgefallen oder schwach",
"Ein Netzwerklaufwerk kann vom Anwender nicht mehr erreicht werden",
"Das mobile Endgerät des Anwenders ist gesperrt, der Passcode vergessen",
"Das mobile Endger\u00e4t des Anwenders ist gesperrt, der Passcode vergessen",
"Ein Software-Service funktioniert nicht mehr richtig",
"Das Telefon des Anwenders ist gestört"
"Das Telefon des Anwenders ist gest\u00f6rt"
],
"IsIncomplete": false,
"IsWritable": false
@@ -184,24 +184,24 @@
"IsIncomplete": false,
"IsWritable": false
},
"Classification": {
"ColumnName": "Classification",
"Category": {
"ColumnName": "Category",
"Values": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
"9282a500-caea-49bb-944f-9d0274fcc80a",
"8ba5e53d-3b6b-425a-baba-34438845f00d",
"cbbec585-0184-4ae3-ab68-7caeb3d0e5b2",
"fd4ca144-2aca-48c4-b8b9-ce75b07ca3cb",
"70d3cb04-11ab-43cb-a769-368517ba4879",
"9d468c5c-c543-4ee5-9a23-4f9975e5c145",
"42b49002-fed3-4c9b-9532-cf351df038cf",
"f42521f8-748f-4a24-8084-27867c8ac5d0",
"4e7bafad-c49b-432a-b88e-f4bced36e5ed",
"2c6fca4b-a1a0-ed11-5a81-000c299eb325",
"d457c1f4-e4bd-4753-9e02-c8e645d5e342",
"facc2d0f-3216-4ccd-9c81-57cb29150e9e",
"5f385abf-a574-468b-a4ba-feed4fc0c76d",
"ced65ab8-d526-4518-be11-caf68b31d959",
"f5f3e9d2-2e63-4fc4-a00c-0e8d12750a70"
],
"IsIncomplete": false,
"IsWritable": false

View File

@@ -3,6 +3,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Neue Störung: VPN trennt nach wenigen Minuten",
@@ -13,8 +14,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Ticketsystem",
"Classification": "Incident",
"Category": "9282a500-caea-49bb-944f-9d0274fcc80a",
"Description": "Der Benutzer meldet, dass die VPN-Verbindung spätestens nach zwei Minuten getrennt wird. Eine stabile Remote-Arbeit ist aktuell nicht möglich.",
"DescriptionHtml": "<p>Der Benutzer meldet, dass die VPN-Verbindung spätestens nach zwei Minuten getrennt wird. Eine stabile Remote-Arbeit ist aktuell nicht möglich.</p>",
"Priority": 2,
@@ -31,6 +31,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Teams-Meldungen kommen verzögert an",
@@ -41,8 +42,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Kommunikation",
"Classification": "Incident",
"Category": "8ba5e53d-3b6b-425a-baba-34438845f00d",
"Description": "Teams-Nachrichten und Meetings starten mit deutlicher Verzögerung. Laut Rückmeldung wirkt der Client zeitweise eingefroren.",
"DescriptionHtml": "<p>Teams-Nachrichten und Meetings starten mit deutlicher Verzögerung. Laut Rückmeldung wirkt der Client zeitweise eingefroren.</p>",
"Priority": 2,
@@ -59,6 +59,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Anfrage: Gerät startet nicht zuverlässig",
@@ -69,8 +70,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Hardware",
"Classification": "Request",
"Category": "cbbec585-0184-4ae3-ab68-7caeb3d0e5b2",
"Description": "Das bereitgestellte Notebook startet nur unregelmäßig. An manchen Tagen benötigt es mehrere Versuche bis zur Anmeldung.",
"DescriptionHtml": "<p>Das bereitgestellte Notebook startet nur unregelmäßig. An manchen Tagen benötigt es mehrere Versuche bis zur Anmeldung.</p>",
"Priority": 3,
@@ -87,6 +87,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Bitte um Rückmeldung: Ticketsystem reagiert langsam",
@@ -97,8 +98,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Service",
"Classification": "Incident",
"Category": "fd4ca144-2aca-48c4-b8b9-ce75b07ca3cb",
"Description": "Das Ticketsystem reagiert auffallend träge. Ansichten benötigen bis zu 30 Sekunden zum Laden.",
"DescriptionHtml": "<p>Das Ticketsystem reagiert auffallend träge. Ansichten benötigen bis zu 30 Sekunden zum Laden.</p>",
"Priority": 1,
@@ -112,12 +112,10 @@
]
}
},
/* --- Ab hier: 5 neue Klassiker --- */
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Passwort-Reset für AD-Benutzer erforderlich",
@@ -128,8 +126,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Account",
"Classification": "Request",
"Category": "70d3cb04-11ab-43cb-a769-368517ba4879",
"Description": "Der Benutzer hat sein Passwort vergessen und benötigt einen Reset sowie die Aktualisierung am Diensthandy (Outlook/Teams).",
"DescriptionHtml": "<p>Der Benutzer hat sein Passwort vergessen und benötigt einen Reset sowie die Aktualisierung am Diensthandy (Outlook/Teams).</p>",
"Priority": 3,
@@ -146,6 +143,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Netzwerkdrucker druckt nur leere Seiten",
@@ -156,8 +154,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "PRN-3OG-HP-LJ",
"Category": "Demo / Drucker",
"Classification": "Incident",
"Category": "9d468c5c-c543-4ee5-9a23-4f9975e5c145",
"Description": "Beim Druck auf den HP-LaserJet im 3. OG kommen nur leere Seiten heraus. Testseite aus Windows zeigt dasselbe Verhalten.",
"DescriptionHtml": "<p>Beim Druck auf den HP-LaserJet im 3. OG kommen nur leere Seiten heraus. Testseite aus Windows zeigt dasselbe Verhalten.</p>",
"Priority": 2,
@@ -174,6 +171,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Outlook: Speicherlimit erreicht Postfach voll",
@@ -184,8 +182,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00015",
"Category": "Demo / Mail",
"Classification": "Incident",
"Category": "b05a28a4-a1ae-4cb8-a30d-08fe6873b467",
"Description": "Der Benutzer kann keine E-Mails mehr senden oder empfangen. Outlook meldet, dass das Postfachkontingent überschritten ist.",
"DescriptionHtml": "<p>Der Benutzer kann keine E-Mails mehr senden oder empfangen. Outlook meldet, dass das Postfachkontingent überschritten ist.</p>",
"Priority": 2,
@@ -202,6 +199,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Softwareanfrage: Microsoft Visio Standard",
@@ -212,8 +210,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00016",
"Category": "Demo / Software",
"Classification": "Request",
"Category": "f42521f8-748f-4a24-8084-27867c8ac5d0",
"Description": "Benötigt Visio Standard für Prozessdiagramme. Bitte Installation via Softwareverteilung und Lizenzzuweisung im M365 Admin Center.",
"DescriptionHtml": "<p>Benötigt Visio Standard für Prozessdiagramme. Bitte Installation via Softwareverteilung und Lizenzzuweisung im M365 Admin Center.</p>",
"Priority": 3,
@@ -230,6 +227,7 @@
{
"TileKey": "TicketsNew",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a",
"DisplayNamePrefix": "TCK",
"Summary": "Konto gesperrt nach mehrfachen Fehlversuchen",
@@ -240,8 +238,7 @@
"Detail": {
"AffectedUser": "Ticket, Timo",
"Asset": "C4-NB00016",
"Category": "Demo / Account",
"Classification": "Incident",
"Category": "4e7bafad-c49b-432a-b88e-f4bced36e5ed",
"Description": "Nach mehreren falschen Passworteingaben ist das AD-Konto gesperrt. Benutzer kann sich weder am Notebook noch an M365 anmelden.",
"DescriptionHtml": "<p>Nach mehreren falschen Passworteingaben ist das AD-Konto gesperrt. Benutzer kann sich weder am Notebook noch an M365 anmelden.</p>",
"Priority": 1,
@@ -256,5 +253,122 @@
}
}
],
"Tickets": []
"Tickets": [
{
"TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6",
"UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2",
"TileKey": "UnassignedTickets",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00414",
"Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt",
"StatusId": "New",
"UserDisplayName": "Virtual, Vera",
"UserAccount": "VV004",
"UserDomain": "CONTOSO",
"Detail": {
"AffectedUser": "Virtual, Vera",
"Asset": "C4-NB02014",
"Category": "42b49002-fed3-4c9b-9532-cf351df038cf",
"Description": "Ein Pool-Notebook fuer die morgige Schulung ist nicht auffindbar. Das Ticket wurde noch keinem Bearbeiter zugewiesen.",
"DescriptionHtml": "<p>Ein Pool-Notebook fuer die morgige Schulung ist nicht auffindbar. Das Ticket wurde noch keinem Bearbeiter zugewiesen.</p>",
"Priority": 2,
"Journal": [
{
"Header": "Ticket erstellt",
"Description": "Demodatensatz fuer Ticketuebersicht (Eingang).",
"DescriptionHtml": "<p>Demodatensatz fuer Ticketuebersicht (Eingang).</p>",
"IsVisibleForUser": true
}
]
}
},
{
"TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2",
"UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b",
"TileKey": "UnassignedTickets",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00415",
"Summary": "Etikettendrucker im Lager meldet Papierstau",
"StatusId": "New",
"UserDisplayName": "Anwender, Peter",
"UserAccount": "PA010",
"UserDomain": "CONTOSO",
"Detail": {
"AffectedUser": "Anwender, Peter",
"Asset": "PRN-LAGER-03",
"Category": "42b49002-fed3-4c9b-9532-cf351df038cf",
"Description": "Der Etikettendrucker im Lager zeigt permanent Papierstau, obwohl kein Papier klemmt. Ticket ist neu und noch unzugewiesen.",
"DescriptionHtml": "<p>Der Etikettendrucker im Lager zeigt permanent Papierstau, obwohl kein Papier klemmt. Ticket ist neu und noch unzugewiesen.</p>",
"Priority": 2,
"Journal": [
{
"Header": "Ticket erstellt",
"Description": "Demodatensatz fuer Ticketuebersicht (Eingang).",
"DescriptionHtml": "<p>Demodatensatz fuer Ticketuebersicht (Eingang).</p>",
"IsVisibleForUser": true
}
]
}
},
{
"TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab",
"UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec",
"TileKey": "UnassignedTicketsCritical",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00416",
"Summary": "WLAN Controller im Werk startet zyklisch neu",
"StatusId": "InProgress",
"UserDisplayName": "Seifert, Dominik",
"UserAccount": "DS014",
"UserDomain": "CONTOSO",
"Detail": {
"AffectedUser": "Seifert, Dominik",
"Asset": "NET-WLC-01",
"Category": "42b49002-fed3-4c9b-9532-cf351df038cf",
"Description": "Der WLAN-Controller im Werk rebootet im 5-Minuten-Takt. Das Ticket ist kritisch markiert und noch nicht personell zugewiesen.",
"DescriptionHtml": "<p>Der WLAN-Controller im Werk rebootet im 5-Minuten-Takt. Das Ticket ist kritisch markiert und noch nicht personell zugewiesen.</p>",
"Priority": 1,
"Journal": [
{
"Header": "Stoerung eingegangen",
"Description": "Demodatensatz fuer Ticketuebersicht (Eingang Kritisch).",
"DescriptionHtml": "<p>Demodatensatz fuer Ticketuebersicht (Eingang Kritisch).</p>",
"IsVisibleForUser": true
}
]
}
},
{
"TicketId": "d427dc61-9842-4464-b37a-612878d3de0f",
"UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a",
"TileKey": "UnassignedTicketsCritical",
"UseRoleScope": false,
"ActivityType": "SPSActivityTypeTicket",
"DisplayName": "TCK00417",
"Summary": "SAP Buchungsjob bricht nachts wiederholt ab",
"StatusId": "InProgress",
"UserDisplayName": "Boss, Bernd",
"UserAccount": "BB003",
"UserDomain": "CONTOSO",
"Detail": {
"AffectedUser": "Boss, Bernd",
"Asset": "SAP-PRD-APP02",
"Category": "42b49002-fed3-4c9b-9532-cf351df038cf",
"Description": "Naechtlicher Buchungsjob endet mit Fehlercode. Ticket ist kritisch und liegt im Eingang zur Erstzuweisung.",
"DescriptionHtml": "<p>Naechtlicher Buchungsjob endet mit Fehlercode. Ticket ist kritisch und liegt im Eingang zur Erstzuweisung.</p>",
"Priority": 1,
"Journal": [
{
"Header": "Stoerung eingegangen",
"Description": "Demodatensatz fuer Ticketuebersicht (Eingang Kritisch).",
"DescriptionHtml": "<p>Demodatensatz fuer Ticketuebersicht (Eingang Kritisch).</p>",
"IsVisibleForUser": true
}
]
}
}
]
}

View File

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

View File

@@ -48,7 +48,6 @@ namespace FasdCockpitCommunicationDemo
public string Description { get; set; }
public string DescriptionHtml { get; set; }
public int Priority { get; set; }
public string Classification { get; set; } //todo: replace with enum
public string Category { get; set; } //todo: replace with tree structure
public string Solution { get; set; }
public string SolutionHtml { get; set; }

View File

@@ -21,7 +21,6 @@ namespace FasdCockpitCommunicationDemo
public string AffectedUser { get; set; }
public string Asset { get; set; }
public string Category { get; set; }
public string Classification { get; set; }
public string Description { get; set; }
public string DescriptionHtml { get; set; }
public int? Priority { get; set; }
@@ -35,6 +34,7 @@ namespace FasdCockpitCommunicationDemo
public string TileKey { get; set; } = "TicketsNew";
public bool UseRoleScope { get; set; }
public Guid? UserId { get; set; }
public string ActivityType { get; set; }
public string DisplayNamePrefix { get; set; } = "TCK";
public string Summary { get; set; }
public string StatusId { get; set; } = "New";
@@ -50,6 +50,7 @@ namespace FasdCockpitCommunicationDemo
public Guid UserId { get; set; }
public string TileKey { get; set; }
public bool UseRoleScope { get; set; }
public string ActivityType { get; set; }
public string DisplayName { get; set; }
public string Summary { get; set; }
public string StatusId { get; set; }
@@ -149,7 +150,6 @@ namespace FasdCockpitCommunicationDemo
AffectedUser = source.AffectedUser,
Asset = source.Asset,
Category = source.Category,
Classification = source.Classification,
Description = source.Description,
DescriptionHtml = source.DescriptionHtml,
Priority = source.Priority,
@@ -169,6 +169,7 @@ namespace FasdCockpitCommunicationDemo
TileKey = source.TileKey,
UseRoleScope = source.UseRoleScope,
UserId = source.UserId,
ActivityType = source.ActivityType,
DisplayNamePrefix = source.DisplayNamePrefix,
Summary = source.Summary,
StatusId = source.StatusId,
@@ -190,6 +191,7 @@ namespace FasdCockpitCommunicationDemo
UserId = source.UserId,
TileKey = source.TileKey,
UseRoleScope = source.UseRoleScope,
ActivityType = source.ActivityType,
DisplayName = source.DisplayName,
Summary = source.Summary,
StatusId = source.StatusId,

View File

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

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -43,25 +43,26 @@ namespace C4IT.FASD.Base
if (output.Tables.ContainsKey(table.Name))
continue;
var tableColumns = new Dictionary<string, cF4SDHealthCardRawData.cHealthCardTableColumn>();
foreach (var column in table.Columns)
{
if (tableColumns.ContainsKey(column.ColumnName))
continue;
var values = new List<object>();
values.AddRange(column.Values);
tableColumns.Add(column.ColumnName, new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = column.ColumnName, Values = values });
}
output.Tables.Add(table.Name, new cF4SDHealthCardRawData.cHealthCardTable()
var outputTable = new cF4SDHealthCardRawData.cHealthCardTable()
{
Name = table.Name,
IsStatic = table.IsStatic,
TimeFrames = table.TimeFrames,
Columns = tableColumns
});
};
outputTable.Columns = new Dictionary<string, cF4SDHealthCardRawData.cHealthCardTableColumn>();
foreach (var column in table.Columns)
{
if (outputTable.Columns.ContainsKey(column.ColumnName))
continue;
var values = new List<object>();
values.AddRange(column.Values);
outputTable.Columns.Add(column.ColumnName, new cF4SDHealthCardRawData.cHealthCardTableColumn(outputTable) { ColumnName = column.ColumnName, Values = values });
}
output.Tables.Add(table.Name, outputTable);
}
}
catch (Exception E)

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net472" />
</packages>

View File

@@ -25,7 +25,11 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
<bindingRedirect oldVersion="0.0.0.0-10.0.1.0" newVersion="10.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -7,6 +7,7 @@ using C4IT.MultiLanguage;
using FasdDesktopUi.Basics;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.Services.Models;
using FasdDesktopUi.Pages.CustomMessageBox;
using FasdDesktopUi.Pages.PhoneSettingsPage;
using FasdDesktopUi.Pages.SearchPage;
@@ -38,7 +39,12 @@ namespace FasdDesktopUi
public System.Windows.Forms.NotifyIcon notifyIcon = new System.Windows.Forms.NotifyIcon() { Text = $"First Aid Service Desk" };
public bool UseOsLanguage = string.IsNullOrEmpty(cFasdCockpitConfig.Instance.SelectedLanguage);
#region Ticketübersicht
private TrayTicketNotificationManager _ticketTrayNotification;
private TileScope? _pendingTicketOverviewScope;
#endregion
private async void Application_Startup(object sender, StartupEventArgs e)
{
@@ -179,10 +185,11 @@ namespace FasdDesktopUi
if (searchView == null)
return;
#if isDemo
var hasNotification = HasPendingTicketOverviewNotification();
if (TryHandleTicketOverviewNotificationClick(searchView))
return;
if (searchView.IsVisible && !hasNotification)
#if isDemo
if (searchView.IsVisible)
{
searchView.Hide();
return;
@@ -194,9 +201,6 @@ namespace FasdDesktopUi
searchView.BringToFrontPreserveState();
searchView.ShowTicketOverviewPane();
if (hasNotification)
ClearTicketOverviewTrayNotification();
#else
if (SearchPageView.Instance.IsVisible)
SearchPageView.Instance.Hide();
@@ -271,12 +275,32 @@ namespace FasdDesktopUi
}
}
#region Ticketübersicht
private bool TryHandleTicketOverviewNotificationClick(SearchPageView searchView)
{
if (searchView == null)
return false;
if (!HasPendingTicketOverviewNotification())
return false;
if (!searchView.IsVisible)
searchView.ActivateSearchView();
else
searchView.BringToFrontPreserveState();
searchView.ShowTicketOverviewPaneForScope(PendingTicketOverviewScope);
ClearTicketOverviewTrayNotification();
return true;
}
private void NotifyIcon_BalloonTipClicked(object sender, EventArgs e)
{
try
{
SearchPageView.Instance?.BringToFrontPreserveState();
SearchPageView.Instance?.ShowTicketOverviewPane();
SearchPageView.Instance?.ShowTicketOverviewPaneForScope(PendingTicketOverviewScope);
ClearTicketOverviewTrayNotification();
}
catch (Exception E)
@@ -306,6 +330,7 @@ namespace FasdDesktopUi
{
try
{
_pendingTicketOverviewScope = null;
_ticketTrayNotification?.Clear();
}
catch (Exception ex)
@@ -314,6 +339,15 @@ namespace FasdDesktopUi
}
}
public void SetTicketOverviewNotificationScope(TileScope? scope)
{
_pendingTicketOverviewScope = scope;
}
public TileScope? PendingTicketOverviewScope => _pendingTicketOverviewScope;
#endregion
private System.Windows.Forms.ToolStripItem SetUpNotifyIconLanguageOption()
{
try
@@ -461,9 +495,18 @@ namespace FasdDesktopUi
private async void Application_Exit(object sender, ExitEventArgs e)
{
var closeUserSessionTask = cFasdCockpitCommunicationBase.Instance?.CloseUserSession(cFasdCockpitConfig.SessionId).ConfigureAwait(false);
cF4sdUserInfo userInfo = null;
ConfiguredTaskAwaitable? closeUserSessionTask = null;
lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock)
{
userInfo = cFasdCockpitCommunicationBase.CockpitUserInfo;
}
if (userInfo?.Id.Equals(Guid.Empty) is false)
{
closeUserSessionTask = cFasdCockpitCommunicationBase.Instance?.CloseUserSession(cFasdCockpitConfig.SessionId).ConfigureAwait(false);
}
await cFasdCockpitCommunicationBase.Instance.TerminateAsync();
await cFasdCockpitCommunicationBase.Instance?.TerminateAsync();
if (notifyIcon != null)
{

View File

@@ -0,0 +1,16 @@
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
namespace FasdDesktopUi.Basics.CustomEvents
{
public class HeadingDataEventArgs : EventArgs
{
public IEnumerable<cHeadingDataModel> NewValue { get; }
public HeadingDataEventArgs(IEnumerable<cHeadingDataModel> headingData) : base()
{
NewValue = headingData;
}
}
}

View File

@@ -1,11 +1,8 @@
using C4IT.FASD.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FasdDesktopUi.Basics.Services.RelationService
namespace FasdDesktopUi.Basics.CustomEvents
{
public class RelationEventArgs : EventArgs
{

View File

@@ -0,0 +1,12 @@
using C4IT.FASD.Base;
using System;
using System.Collections.Generic;
namespace FasdDesktopUi.Basics.CustomEvents
{
public class SupportCaseDataEventArgs : EventArgs
{
public cF4sdApiSearchResultRelation Relation { get; set; }
public IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> DataTables { get; set; }
}
}

View File

@@ -15,7 +15,6 @@ using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
using C4IT.MultiLanguage;
using C4IT.XML;
using F4SD_AdaptableIcon.Enums;
@@ -26,6 +25,10 @@ using FasdDesktopUi.Basics.UiActions;
using FasdDesktopUi.Pages.DetailsPage.Models;
using FasdDesktopUi.Pages.SlimPage.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using static C4IT.FASD.Base.cF4SDHealthCardRawData;
using static C4IT.Logging.cLogManager;
@@ -78,6 +81,7 @@ namespace FasdDesktopUi.Basics.Helper
this.dataProvider = dataProvider;
_menuDataProvider = new MenuItemDataProvider(dataProvider);
cUtility.RawValueFormatter.SetDefaultCulture(new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
HistoryData = new cHealthCardHistoryDataHelper(this);
SlimCard = new cHealthCardSlimPageHelper(this);
@@ -246,6 +250,9 @@ namespace FasdDesktopUi.Basics.Helper
{
List<object> output = new List<object>();
if (healthCardColumn?.Values == null)
return output;
try
{
for (int i = 0; i < startingIndex; i++)
@@ -263,6 +270,13 @@ namespace FasdDesktopUi.Basics.Helper
return output;
}
private List<object> GetStateValues(cHealthCardTableColumn tableColumn)
{
if (tableColumn == null)
return new List<object>();
else return GetValuesOfHealthCardTableColumn(tableColumn.Table.StartingIndex, tableColumn);
}
private List<object> GetStateValues(cValueAddress DatabaseInfo, bool isStatic)
{
List<object> output = new List<object>();
@@ -313,9 +327,7 @@ namespace FasdDesktopUi.Basics.Helper
rawValueLeveling = GetStateValueAt(referencedStateDefinition.DatabaseInfo, 0, true);
}
var _color = stateDefinitionForLeveling is cHealthCardStateAggregation aggregation ?
GetSummaryStatusColor(aggregation.States, true) : GetHighlightColor(rawValueLeveling, stateDefinitionForLeveling);
var _color = GetHighlightColor(rawValueLeveling, stateDefinitionForLeveling, 0, true);
return _color;
}
catch (Exception ex)
@@ -325,63 +337,64 @@ namespace FasdDesktopUi.Basics.Helper
return enumHighlightColor.none;
}
private enumHighlightColor GetHighlightColor(object value, cHealthCardStateBase stateDefinition, int referenceDays = 0)
private enumHighlightColor GetHighlightColor(object value, cHealthCardStateBase stateDefinition, int referenceDays, bool isStatic)
{
return GetHighlightColor(new cStateThresholdValues() { Value = value, StateDefinition = stateDefinition, ReferenceDays = referenceDays });
}
if (stateDefinition == null)
return enumHighlightColor.none;
private enumHighlightColor GetHighlightColor(cStateThresholdValues thresholdValues)
{
enumHighlightColor output = enumHighlightColor.none;
if (stateDefinition is cHealthCardStateAggregation _stateAggregation)
return GetSummaryStatusColor(_stateAggregation.States, isStatic, referenceDays) ?? enumHighlightColor.none;
try
{
if (thresholdValues.Value == null)
if (value == null)
return output;
if (thresholdValues.StateDefinition is cHealthCardStateLevel stateLevel)
if (stateDefinition is cHealthCardStateLevel stateLevel)
{
var valueDouble = cF4SDHealthCardRawData.GetDouble(thresholdValues.Value);
var valueDouble = cF4SDHealthCardRawData.GetDouble(value);
if (valueDouble != null)
{
if (stateLevel.IsDirectionUp)
output = valueDouble >= stateLevel.Error ? enumHighlightColor.red : valueDouble >= stateLevel.Warning ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = valueDouble >= stateLevel.Error ? enumHighlightColor.red : valueDouble >= stateLevel.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
else
output = valueDouble <= stateLevel.Error ? enumHighlightColor.red : valueDouble <= stateLevel.Warning ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = valueDouble <= stateLevel.Error ? enumHighlightColor.red : valueDouble <= stateLevel.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
}
}
else if (thresholdValues.StateDefinition is cHealthCardStateVersion stateVersion)
else if (stateDefinition is cHealthCardStateVersion stateVersion)
{
var valueVersion = cF4SDHealthCardRawData.GetVersion(thresholdValues.Value);
var valueVersion = cF4SDHealthCardRawData.GetVersion(value);
if (valueVersion != null)
{
if (stateVersion.IsDirectionUp)
output = valueVersion >= stateVersion.Error ? enumHighlightColor.red : valueVersion >= stateVersion.Warning ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = valueVersion >= stateVersion.Error ? enumHighlightColor.red : valueVersion >= stateVersion.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
else
output = valueVersion <= stateVersion.Error ? enumHighlightColor.red : valueVersion <= stateVersion.Warning ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = valueVersion <= stateVersion.Error ? enumHighlightColor.red : valueVersion <= stateVersion.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
}
}
else if (thresholdValues.StateDefinition is cHealthCardStateDateTime stateDateTime)
else if (stateDefinition is cHealthCardStateDateTime stateDateTime)
{
var valueDateTime = cF4SDHealthCardRawData.GetDateTime(thresholdValues.Value);
var valueDateTime = cF4SDHealthCardRawData.GetDateTime(value);
if (valueDateTime != null)
{
var tempDateTime = valueDateTime ?? DateTime.Now;
var differenceHours = Math.Floor((DateTime.UtcNow.AddDays(-thresholdValues.ReferenceDays) - tempDateTime).TotalHours);
var differenceHours = Math.Floor((DateTime.UtcNow.AddDays(-referenceDays) - tempDateTime).TotalHours);
if (stateDateTime.IsDirectionUp)
output = differenceHours >= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours >= stateDateTime.WarningHours ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = differenceHours >= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours >= stateDateTime.WarningHours ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
else
output = differenceHours <= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours <= stateDateTime.WarningHours ? enumHighlightColor.orange : thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
output = differenceHours <= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours <= stateDateTime.WarningHours ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none;
}
}
else if (thresholdValues.StateDefinition is cHealthCardStateInfo)
else if (stateDefinition is cHealthCardStateInfo)
{
output = thresholdValues.StateDefinition.IsNotTransparent ? enumHighlightColor.blue : enumHighlightColor.none;
output = stateDefinition.IsNotTransparent ? enumHighlightColor.blue : enumHighlightColor.none;
}
else if (thresholdValues.StateDefinition is cHealthCardStateTranslation stateTranslation)
else if (stateDefinition is cHealthCardStateTranslation stateTranslation)
{
var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(stateTranslation, stateTranslation.Translation);
if (abstractTranslation == null || !(abstractTranslation is cHealthCardTranslator translation))
@@ -390,7 +403,7 @@ namespace FasdDesktopUi.Basics.Helper
enumHealthCardStateLevel translationStateLevel = translation.DefaultTranslation?.StateLevel ?? enumHealthCardStateLevel.Info;
foreach (var translationEntry in translation.Translations)
{
if (translationEntry.Values.Any(translationValue => thresholdValues.Value.ToString().Equals(translationValue, StringComparison.InvariantCultureIgnoreCase)))
if (translationEntry.Values.Any(translationValue => value.ToString().Equals(translationValue, StringComparison.InvariantCultureIgnoreCase)))
translationStateLevel = translationEntry.StateLevel;
}
@@ -400,7 +413,7 @@ namespace FasdDesktopUi.Basics.Helper
output = enumHighlightColor.none;
break;
case enumHealthCardStateLevel.Ok:
if (thresholdValues.StateDefinition.IsNotTransparent)
if (stateDefinition.IsNotTransparent)
output = enumHighlightColor.green;
break;
case enumHealthCardStateLevel.Warning:
@@ -410,12 +423,12 @@ namespace FasdDesktopUi.Basics.Helper
output = enumHighlightColor.red;
break;
case enumHealthCardStateLevel.Info:
if (thresholdValues.StateDefinition.IsNotTransparent)
if (stateDefinition.IsNotTransparent)
output = enumHighlightColor.blue;
break;
}
}
else if (thresholdValues.StateDefinition is cHealthCardStateRefLink stateRefLink)
else if (stateDefinition is cHealthCardStateRefLink stateRefLink)
{
//if (cHealthCardPrerequisites.GetReferencableStates(SelectedHealthCard).TryGetValue(stateRefLink.Reference, out var referencedState))
// output = GetHighlightColor(thresholdValues);
@@ -428,9 +441,9 @@ namespace FasdDesktopUi.Basics.Helper
return output;
}
private enumHighlightColor GetSummaryStatusColor(List<cHealthCardStateBase> stateDefinitions, bool isStatic, int dayIndex = 0)
private enumHighlightColor? GetSummaryStatusColor(List<cHealthCardStateBase> stateDefinitions, bool isStatic, int dayIndex = 0)
{
enumHighlightColor output = enumHighlightColor.none;
enumHighlightColor? output = null;
try
{
foreach (var stateDefinition in stateDefinitions)
@@ -438,19 +451,19 @@ namespace FasdDesktopUi.Basics.Helper
if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries))
continue;
var tempColor = enumHighlightColor.none;
var stateValue = GetStateValueAt(stateDefinition.DatabaseInfo, dayIndex, isStatic);
if (stateDefinition is cHealthCardStateAggregation aggregationState)
tempColor = GetSummaryStatusColor(aggregationState.States, isStatic, dayIndex);
else
tempColor = GetHighlightColor(stateValue, stateDefinition, referenceDays: dayIndex);
enumHighlightColor? tempColor = null;
if (stateValue != null)
{
tempColor = GetHighlightColor(stateValue, stateDefinition, dayIndex, isStatic);
if (tempColor == enumHighlightColor.none && stateValue != null)
tempColor = enumHighlightColor.green;
}
if (output == null)
output = tempColor;
else if (tempColor != null)
output = (enumHighlightColor)Math.Max((int)tempColor, (int)output);
}
}
@@ -461,6 +474,134 @@ namespace FasdDesktopUi.Basics.Helper
return output;
}
private cDataHistoryValueModel ProcessSingleStateValue(cProcessStateRequirements Requirements, object value, object thresholdValue, int columnIndex)
{
try
{
var cellContent = new cDataHistoryValueModel() { Content = null, HighlightColor = enumHighlightColor.none, IsLoading = Requirements.valueTableColumn?.IsIncomplete ?? false };
if (Requirements.valueState is cHealthCardStateAggregation stateAggregation)
{
cellContent.Content = "Ø";
cellContent.HighlightColor = GetSummaryStatusColor(stateAggregation.States, Requirements.isStatic, columnIndex);
if (cellContent.HighlightColor == null)
{
cellContent.Content = "-";
cellContent.HighlightColor = enumHighlightColor.none;
}
}
else
{
FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.Date.AddDays(columnIndex), TimeZone = TimeZoneInfo.Local };
var _c = cUtility.RawValueFormatter.GetDisplayValue(value, Requirements.valueState.DisplayType, options);
if (!string.IsNullOrWhiteSpace(_c))
cellContent.Content = _c;
cellContent.ThresholdValues = new cStateThresholdValues() { Value = thresholdValue, StateDefinition = Requirements.valueState.StateProcessingRequirements.tresholdState, ReferenceDays = columnIndex };
cellContent.HighlightColor = GetHighlightColor(cellContent.ThresholdValues.Value, Requirements.valueState.StateProcessingRequirements.tresholdState, columnIndex, Requirements.isStatic);
if (Requirements.valueState.StateProcessingRequirements.translation != null && cellContent.Content != null)
{
var translationValue = Requirements.valueState.StateProcessingRequirements.translation.DefaultTranslation?.Translation.GetValue() ?? cellContent.Content;
foreach (var translationEntry in Requirements.valueState.StateProcessingRequirements.translation.Translations)
{
if (translationEntry.Values.Any(_val => cellContent.Content.Equals(_val, StringComparison.CurrentCultureIgnoreCase)))
translationValue = translationEntry.Translation.GetValue();
}
cellContent.Content = translationValue;
}
if (cellContent.Content == null)
cellContent.Content = "-";
if (!cellContent.IsLoading && Requirements.valueTableColumn?.Table != null)
{
int maxColumnCount = 0;
if (Requirements.valueTableColumn.Table.Columns?.Count > 0)
maxColumnCount = Requirements.valueTableColumn.Table.Columns.Max(column => column.Value?.Values?.Count ?? 1);
if (columnIndex < Requirements.valueTableColumn.Table.StartingIndex || columnIndex >= Requirements.valueTableColumn.Table.StartingIndex + maxColumnCount)
cellContent.IsLoading = Requirements.valueTableColumn.Table.IsIncomplete;
}
}
if (Requirements.valueState.Details != null && value != null)
cellContent.UiAction = new cShowDetailedDataAction(Requirements.valueState, columnIndex);
return cellContent;
}
catch (Exception E)
{
LogException(E);
}
return null;
}
private cProcessStateRequirements CreateProcessStateRequirements(cHealthCardStateBase stateDefinition, bool isStatic)
{
var ProcessRequirements = new cProcessStateRequirements()
{
valueState = stateDefinition,
valueTableColumn = null,
isStatic = isStatic,
Values = new List<object>(),
ThresholdValues = new List<object>()
};
try
{
// get the global requirements one which are not support case dependent
if (stateDefinition.StateProcessingRequirements == null)
{
stateDefinition.StateProcessingRequirements = new cHealthCardStateBase.cStateProcessingRequirements() { tresholdState = stateDefinition, translation = null };
// if we have a ref link, get the referenced stateDefinition and state values
ProcessRequirements.ThresholdValues = ProcessRequirements.Values;
if (stateDefinition is cHealthCardStateRefLink ReferencedLinkState)
{
var refState = cF4SDHealthCardConfig.GetReferencableStateWithName(ReferencedLinkState.ParentNode, ReferencedLinkState.Reference);
if (refState != null)
{
stateDefinition.StateProcessingRequirements.tresholdState = refState;
}
}
//in state is translation state, get the translation
if (stateDefinition is cHealthCardStateTranslation _StateTranslation)
{
var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(_StateTranslation, _StateTranslation.Translation);
if (abstractTranslation is cHealthCardTranslator castedTranslation)
stateDefinition.StateProcessingRequirements.translation = castedTranslation;
}
}
// get the state values
if (stateDefinition.DatabaseInfo != null)
{
var _table = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic);
if (_table != null)
{
_table.Columns.TryGetValue(stateDefinition.DatabaseInfo.ValueColumn, out ProcessRequirements.valueTableColumn);
ProcessRequirements.Values = GetValuesOfHealthCardTableColumn(_table.StartingIndex, ProcessRequirements.valueTableColumn);
}
}
// get the treshold values
if (stateDefinition == stateDefinition.StateProcessingRequirements.tresholdState)
ProcessRequirements.ThresholdValues = ProcessRequirements.Values;
else
ProcessRequirements.ThresholdValues = GetStateValues(stateDefinition.StateProcessingRequirements.tresholdState.DatabaseInfo, isStatic);
}
catch (Exception E)
{
LogException(E);
}
return ProcessRequirements;
}
private cUiActionBase GetUiActionByQuickActionNames(List<string> names, string uiActionName, string uiActionDescription)
{
try
@@ -745,8 +886,8 @@ namespace FasdDesktopUi.Basics.Helper
public string GetInformationObjectHeadingName(enumFasdInformationClass InfoClass)
{
if (HeadingData.TryGetValue(enumFasdInformationClass.Computer, out var computerHeadingData))
return computerHeadingData.HeadingText;
if (HeadingData.TryGetValue(InfoClass, out var infoClassHeadingData))
return infoClassHeadingData.HeadingText;
return null;
}
@@ -945,7 +1086,7 @@ namespace FasdDesktopUi.Basics.Helper
return output;
}
private void UpdateNamedParameterEntries()
internal void UpdateNamedParameterEntries()
{
try
{
@@ -961,10 +1102,10 @@ namespace FasdDesktopUi.Basics.Helper
string namedParameterTitle = namedParameter.Value.Names.GetValue();
var parameterValue = GetStateValueAt(namedParameter.Value.DatabaseInfo, 0, true);
string namedParameterValue = cUtility.RawValueFormatter.GetDisplayValue(parameterValue, cUtility.GetRawValueType(namedParameter.Value.Display));
string namedParameterValue = cUtility.RawValueFormatter.GetDisplayValue(parameterValue, namedParameter.Value.Display);
if (!dataProvider.NamedParameterEntries.ContainsKey(namedParameter.Value.ParameterName))
dataProvider.NamedParameterEntries.Add(namedParameter.Value.ParameterName, new cNamedParameterEntryPointer(dataProvider, namedParameter.Value.DatabaseInfo, cUtility.GetRawValueType(namedParameter.Value.Display)) { Title = namedParameterTitle });
dataProvider.NamedParameterEntries.Add(namedParameter.Value.ParameterName, new cNamedParameterEntryPointer(dataProvider, namedParameter.Value.DatabaseInfo, namedParameter.Value.Display) { Title = namedParameterTitle });
}
catch (Exception ex)
{
@@ -997,6 +1138,15 @@ namespace FasdDesktopUi.Basics.Helper
#endregion
private class cProcessStateRequirements
{
internal cHealthCardStateBase valueState;
internal bool isStatic;
internal cHealthCardTableColumn valueTableColumn;
internal List<object> Values;
internal List<object> ThresholdValues;
}
public abstract class cHealthCardStateSubHelper
{
protected readonly cHealthCardDataHelper parent;
@@ -1055,7 +1205,7 @@ namespace FasdDesktopUi.Basics.Helper
CultureInfo culture = new CultureInfo(cMultiLanguageSupport.CurrentLanguage);
var valueColumnHeader = i != 0 ? DateTime.Today.AddDays(-i).ToString(cMultiLanguageSupport.GetItem("Global.Date.Format.ShortDateWithDay", "ddd. dd.MM."), culture) : cMultiLanguageSupport.GetItem("Global.Date.Today");
var summaryStatusColor = parent.GetSummaryStatusColor(stateCategoryDefinition.States, false, i);
var valueColumn = new DetailsPageDataHistoryColumnModel() { ColumnValues = new List<cDataHistoryValueModel>(), Content = valueColumnHeader, HighlightColor = summaryStatusColor };
var valueColumn = new DetailsPageDataHistoryColumnModel() { ColumnValues = new List<cDataHistoryValueModel>(), Content = valueColumnHeader, HighlightColor = summaryStatusColor ?? enumHighlightColor.none };
historySectionValueColumns.Add(valueColumn);
}
@@ -1115,88 +1265,15 @@ namespace FasdDesktopUi.Basics.Helper
private void ProcessState(cHealthCardStateBase stateDefinition, int valueColumnCount, bool isStatic, List<DetailsPageDataHistoryColumnModel> historySectionValueColumns)
{
var stateValues = parent.GetStateValues(stateDefinition.DatabaseInfo, isStatic);
//in case state is translationstate, get translation to avoid calling GetTranslationWithName method for every column
cHealthCardStateTranslation stateTranslation = null;
cHealthCardTranslator translation = null;
if (stateDefinition is cHealthCardStateTranslation tempStateTranslation)
{
stateTranslation = tempStateTranslation;
var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(tempStateTranslation, stateTranslation.Translation);
if (abstractTranslation is cHealthCardTranslator castedTranslation)
translation = castedTranslation;
}
else
tempStateTranslation = null;
var ProcessRequirements = parent.CreateProcessStateRequirements(stateDefinition, isStatic);
for (int i = 0; i < valueColumnCount; i++)
{
string cellContentString = stateDefinition is cHealthCardStateAggregation ? "Ø" : "-";
enumHighlightColor cellContentColor = enumHighlightColor.none;
cStateThresholdValues thresholdValues = null;
var Value = ProcessRequirements.Values?.Count > i ? ProcessRequirements.Values[i] : null;
var thresholdValue = ProcessRequirements.ThresholdValues?.Count > i ? ProcessRequirements.ThresholdValues[i] : null;
if (stateValues.Count > i)
{
FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.Date.AddDays(i) };
thresholdValues = new cStateThresholdValues() { Value = stateValues[i], StateDefinition = stateDefinition, ReferenceDays = i };
cellContentString = cUtility.RawValueFormatter.GetDisplayValue(stateValues[i], cUtility.GetRawValueType(stateDefinition.DisplayType), options);
if (string.IsNullOrWhiteSpace(cellContentString))
cellContentString = "-";
cellContentColor = parent.GetHighlightColor(thresholdValues);
}
if (stateDefinition is cHealthCardStateAggregation stateAggregation)
{
cellContentColor = parent.GetSummaryStatusColor(stateAggregation.States, isStatic, i);
}
if (stateTranslation != null)
{
if (translation != null && cellContentString != "-")
{
var translationValue = translation.DefaultTranslation?.Translation.GetValue() ?? cellContentString;
foreach (var translationEntry in translation.Translations)
{
if (cellContentString != null)
if (translationEntry.Values.Any(value => cellContentString.Equals(value, StringComparison.CurrentCultureIgnoreCase)))
translationValue = translationEntry.Translation.GetValue();
}
cellContentString = translationValue;
}
}
bool isStateRowLoading = false;
if (stateDefinition.DatabaseInfo != null)
{
var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic);
if (stateTable != null)
{
int maxColumnCount = 0;
if (stateTable?.Columns?.Count > 0)
maxColumnCount = stateTable.Columns.Max(column => column.Value?.Values?.Count ?? 1);
if (i < stateTable.StartingIndex || i >= stateTable.StartingIndex + maxColumnCount)
isStateRowLoading = stateTable.IsIncomplete;
}
}
if (stateDefinition.DatabaseInfo != null)
{
var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic);
if (stateTable != null)
if (stateTable.Columns.TryGetValue(stateDefinition.DatabaseInfo.ValueColumn, out var stateColumn))
isStateRowLoading = stateColumn.IsIncomplete;
}
var cellContent = new cDataHistoryValueModel() { Content = cellContentString, HighlightColor = cellContentColor, IsLoading = isStateRowLoading, ThresholdValues = thresholdValues };
if (stateDefinition.Details != null && stateValues?.Count > i && stateValues[i] != null)
cellContent.UiAction = new cShowDetailedDataAction(stateDefinition, i);
var cellContent = parent.ProcessSingleStateValue(ProcessRequirements, Value, thresholdValue, i);
historySectionValueColumns[i].ColumnValues.Add(cellContent);
}
@@ -1272,15 +1349,16 @@ namespace FasdDesktopUi.Basics.Helper
if (stateDefinition.DatabaseInfo != null)
{
object widgetValue = parent.GetStateValueAt(stateDefinition.DatabaseInfo, 0, true);
widgetValueToAdd.Value = cUtility.RawValueFormatter.GetDisplayValue(widgetValue, cUtility.GetRawValueType(stateDefinition.DisplayType));
widgetValueToAdd.Value = cUtility.RawValueFormatter.GetDisplayValue(widgetValue, stateDefinition.DisplayType);
object stateValue = widgetValue;
if (stateDefinition is cHealthCardStateRefLink refLinkState)
{
stateModel = cF4SDHealthCardConfig.GetReferencableStateWithName(stateDefinition.ParentNode, refLinkState.Reference);
widgetValue = parent.GetStateValueAt(stateModel.DatabaseInfo, 0, true);
stateValue = parent.GetStateValueAt(stateModel.DatabaseInfo, 0, true);
}
var widgetHighlightColor = parent.GetHighlightColor(widgetValue, stateModel);
var widgetHighlightColor = parent.GetHighlightColor(stateValue, stateModel, 0, true);
widgetValueToAdd.HighlightIn = widgetHighlightColor;
widgetValues.Add(widgetValueToAdd);
@@ -1360,7 +1438,7 @@ namespace FasdDesktopUi.Basics.Helper
var tempContent = i != 0 ? DateTime.Today.AddDays(-i).ToString("dd.MM") : cMultiLanguageSupport.GetItem("Global.Date.Today");
var tempHighlightColor = parent.GetSummaryStatusColor(categoryDefinition.States, false, i);
slimPageData.ValueColumns.Add(new cDataHistoryValueModel() { Content = tempContent, HighlightColor = tempHighlightColor, IsLoading = isLoading });
slimPageData.ValueColumns.Add(new cDataHistoryValueModel() { Content = tempContent, HighlightColor = tempHighlightColor ?? enumHighlightColor.none, IsLoading = isLoading });
}
//SummaryValueColumn
@@ -1398,7 +1476,7 @@ namespace FasdDesktopUi.Basics.Helper
}
summaryValueColumnColor = (enumHighlightColor)Math.Max((int)summaryValueColumnColor, (int)parent.GetSummaryStatusColor(categoryDefinition.States, false, i));
summaryValueColumnColor = (enumHighlightColor)Math.Max((int)summaryValueColumnColor, (int)(parent.GetSummaryStatusColor(categoryDefinition.States, false, i) ?? enumHighlightColor.none));
}
var summaryValueColumn = new cDataHistoryValueModel() { Content = summaryValueColumnContent, HighlightColor = summaryValueColumnColor, IsLoading = isSummaryLoading };
@@ -1476,24 +1554,15 @@ namespace FasdDesktopUi.Basics.Helper
internal cHealthCardDetailPageHelper(cHealthCardDataHelper parent) : base(parent) { }
private cHealthCardDetailsTable GetDetailTableValued(object _value, cHealthCardDetailsValued StateDetailsValued)
private List<object[]> getDetailsValuesCsv(string Data, cHealthCardDetailsValued StateDetailsValued)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var _values = new List<object[]>();
try
{
if (_value == null)
return null;
var _strData = cUtility.RawValueFormatter.GetDisplayValue(_value, RawValueType.STRING);
if (_strData == null)
return null;
var _cols = new List<string>();
foreach (var _colConfig in StateDetailsValued)
_cols.Add(_colConfig.Names.GetValue());
var _arrRow = _strData.Split(StateDetailsValued.RowSeparator);
var _values = new List<object[]>();
var _arrRow = Data.Split(StateDetailsValued.RowSeparator);
foreach (var _row in _arrRow)
{
if (string.IsNullOrEmpty(_row))
@@ -1504,21 +1573,109 @@ namespace FasdDesktopUi.Basics.Helper
_entry.Add(_row.Trim());
else
{
var _arrCol = _strData.Split((char)StateDetailsValued.ColSeparator);
var _arrCol = Data.Split((char)StateDetailsValued.ColSeparator);
foreach (var _col in _arrCol)
_entry.Add(_col.Trim());
}
while (_entry.Count < _cols.Count)
while (_entry.Count < StateDetailsValued.Count)
_entry.Add(null);
_values.Add(_entry.ToArray());
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return _values;
}
private List<object[]> getDetailsValuesJson(string Data, cHealthCardDetailsValued StateDetailsValued)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _rawVals = JsonConvert.DeserializeObject<List<JObject>>(Data);
if (_rawVals?.Count > 0)
{
var _values = new List<object[]>();
foreach (JObject _row in _rawVals)
{
var _props = _row.Children();
var _valRow = new object[StateDetailsValued.Count];
for (int i = 0; i < StateDetailsValued.Count; i++) _valRow[i] = null;
foreach (var _token in _props)
{
if (!(_token is JProperty jProp))
continue;
var _name = jProp.Name;
var _i = StateDetailsValued.FindIndex(v => v.Column.Equals(_name, StringComparison.InvariantCultureIgnoreCase));
if (_i < 0)
continue;
var _col = StateDetailsValued[_i];
if (jProp.Value is JValue jValue)
{
var _value = jValue.Value;
var _displayString = cUtility.RawValueFormatter.GetDisplayValue(_value, _col.DisplayType);
_valRow[_i] = _displayString;
}
}
_values.Add(_valRow);
}
return _values;
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private cHealthCardDetailsTable GetDetailTableValued(object _value, cHealthCardDetailsValued StateDetailsValued)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (_value == null)
return null;
var _strData = cUtility.RawValueFormatter.GetDisplayValue(_value, RawValueType.STRING);
if (_strData == null)
return null;
List<object[]> _values = new List<object[]>();
if (StateDetailsValued.Format == cHealthCardDetailsValued.ValuedFormat.json)
_values = getDetailsValuesJson(_strData, StateDetailsValued);
else
_values = getDetailsValuesCsv(_strData, StateDetailsValued);
var Result = new cHealthCardDetailsTable()
{
Name = "Details-" + StateDetailsValued.ParentState.Name,
Columns = _cols,
Columns = StateDetailsValued.Select(v => v.Names.GetValue()).ToList(),
Values = new Dictionary<int, List<object[]>>() { { 0, _values } }
};
@@ -1563,13 +1720,16 @@ namespace FasdDesktopUi.Basics.Helper
widgetRowData.EditValueInformation = GetEditInfo(rawValueDisplay);
bool shouldShowValueDetails =
(TryGetValuedDetails(rawValueDisplay, out var valuedDetails) && valuedDetails?.Values?.Values?.FirstOrDefault()?.Count > 1)
(TryGetValuedDetails(rawValueDisplay, out var valuedDetails)
&& (valuedDetails?.Values?.Values?.FirstOrDefault()?.Count > 1)
|| (valuedDetails?.Values?.Values?.FirstOrDefault()?.FirstOrDefault()?.Length > 1)
)
|| (stateDefinition.Details is cHealthCardDetails && rawValueDisplay != null && rawValueDisplay.ToString() != "0");
if (shouldShowValueDetails)
{
widgetRowData.ValuedDetails = valuedDetails;
widgetRowData.UiActionValue = new cShowDetailedDataAction(stateDefinition, ValuedDetailsData: valuedDetails)
widgetRowData.UiActionValue = new cShowDetailedDataAction(stateDefinition, valuedDetailsData: valuedDetails)
{
DisplayType = enumActionDisplayType.enabled
};
@@ -1615,7 +1775,7 @@ namespace FasdDesktopUi.Basics.Helper
if (detailTable != null)
displayValue = GetDetailStringValue(rawValue, detailTable);
return displayValue ?? cUtility.RawValueFormatter.GetDisplayValue(rawValue, cUtility.GetRawValueType(stateDefinition.DisplayType));
return displayValue ?? cUtility.RawValueFormatter.GetDisplayValue(rawValue, stateDefinition.DisplayType);
}
string GetTranslationValue(cHealthCardStateTranslation translationDefinition, object rawValue)
@@ -1644,8 +1804,8 @@ namespace FasdDesktopUi.Basics.Helper
return null;
var tableValues = detailTableValueTable.Values.First().Value;
if (detailTableValueTable.Columns.Count == 1 && tableValues.Count == 1)
return cUtility.RawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.First()?.First(), cUtility.GetRawValueType(stateDefinition.Details.First().DisplayType));
if (detailTableValueTable.Columns.Count >= 1 && tableValues.Count == 1)
return cUtility.RawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.First()?.First(), stateDefinition.Details.First().DisplayType);
else
return cUtility.RawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.Count, RawValueType.STRING);
}
@@ -1807,87 +1967,46 @@ namespace FasdDesktopUi.Basics.Helper
}
}
public async Task<bool> GetHealthCardRawDataAsync(cF4sdHealthCardRawDataRequest requestData)
public async Task SetHealthCardRawData(cF4SDHealthCardRawData newHealthCardRawData, cF4sdIdentityList identities)
{
var CM = MethodBase.GetCurrentMethod();
var IsDataIncomplete = true;
LogMethodBegin(CM);
try
{
if (SelectedHealthCard == null)
{
LogEntry("No valid healthcard was found.");
return false;
}
dataProvider.Identities = requestData.Identities;
var requestedTables = requestData.Tables;
HealthCardRawData.RemoveEmptyTables();
var requiredTables = requestedTables.Where(value => HealthCardRawData.Tables.ContainsKey(value) == false && value.StartsWith("Computation_") == false).ToList();
Mouse.OverrideCursor = Cursors.Wait;
cF4SDHealthCardRawData newHealthCardRawData = null;
await LoadingRawDataCriticalSection.EnterAsync();
IsDataIncomplete = false;
if (requiredTables?.Count > 0)
{
requestData.Tables = requiredTables;
newHealthCardRawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(requestData);
if (newHealthCardRawData == null)
return false;
}
parent.dataProvider.Identities = identities;
if (newHealthCardRawData != null)
parent.HealthCardRawData = HealthCardRawData.Combine(newHealthCardRawData);
parent.HealthCardRawData = newHealthCardRawData;
parent.UpdateNamedParameterEntries();
IsDataIncomplete = HealthCardRawData.Tables.Where(table => table.Key.StartsWith("Computation_") == false)
.ToList()
bool isDataIncomplete = HealthCardRawData.Tables
.Where(table => table.Key.StartsWith("Computation_") == false)
.Any(table => table.Value.IsIncomplete);
if (IsDataIncomplete)
{
var _ = Task.Run(ContinueHealthCardDataLoadingAsync);
}
lock (HealthCardRawData)
{
SelectedHealthCard.DoComputations(HealthCardRawData);
}
LogEntry("DataChanged - Finished getting Healthcard rawdata.");
DataChanged?.Invoke(this, new BooleanEventArgs() { BooleanArg = true });
DataChanged?.Invoke(this, new BooleanEventArgs(true));
parent.UpdateNamedParameterEntries();
if (IsDataIncomplete is false)
DataFullyLoaded?.Invoke(this, new EventArgs());
return true;
if (!isDataIncomplete)
DataFullyLoaded?.Invoke(this, EventArgs.Empty);
}
catch (Exception E)
catch (Exception ex)
{
LogException(E);
LogException(ex);
}
finally
{
if (IsDataIncomplete is false)
LoadingRawDataCriticalSection.Leave();
Mouse.OverrideCursor = null;
LogMethodEnd(CM);
}
return false;
}
internal cHealthCardDataLoadingHelper(cHealthCardDataHelper parent) : base(parent) { }
@@ -1902,12 +2021,12 @@ namespace FasdDesktopUi.Basics.Helper
if (oldTable.StartingIndex != newTable.StartingIndex)
return true;
foreach (var oldTableColumn in oldTable.Columns.Values)
foreach (var oldTableColumn in oldTable.Columns)
{
if (!newTable.Columns.TryGetValue(oldTableColumn.ColumnName, out var newTableColumn))
if (!newTable.Columns.TryGetValue(oldTableColumn.Key, out var newTableColumn))
continue;
if (oldTableColumn.Values.Count != newTableColumn.Values.Count)
if (oldTableColumn.Value.Values.Count != newTableColumn.Values.Count)
return true;
}
}
@@ -1980,7 +2099,7 @@ namespace FasdDesktopUi.Basics.Helper
{
try
{
if (newRawData is null)
if (newRawData?.Tables is null)
return;
foreach (var tableName in newRawData.Tables.Keys)
@@ -2035,32 +2154,21 @@ namespace FasdDesktopUi.Basics.Helper
}
}
private bool CheckUpdatedTable(KeyValuePair<string, cF4SDHealthCardRawData.cHealthCardTable> table, cF4SDHealthCardRawData updatedHealthCardRawData)
public async Task UpdateHealthcardRawData(cF4SDHealthCardRawData updatedHealthCardRawData)
{
if (!(updatedHealthCardRawData?.Tables?.ContainsKey(table.Key) is true))
return false;
var _res = WasTableUpdated(table.Value, updatedHealthCardRawData.Tables[table.Key]);
return _res;
}
private async Task ContinueHealthCardDataLoadingAsync()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
var IsDataIncomplete = true;
do
{
if (updatedHealthCardRawData is null)
return;
bool isDataIncomplete = true;
await LoadingRawDataCriticalSection.EnterAsync();
try
{
var updatedHealthCardRawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(HealthCardRawData.Id);
lock (HealthCardRawData)
{
var incompleteRawTables = HealthCardRawData.Tables.Where(table => table.Value.IsIncomplete
&& table.Key.StartsWith("Computation_") == false)
.ToDictionary(table => table.Key, table => table.Value);
@@ -2089,28 +2197,24 @@ namespace FasdDesktopUi.Basics.Helper
SelectedHealthCard.DoComputations(HealthCardRawData);
LogEntry("DataChanged - Couldn't complete healthcard raw data.");
DataChanged?.Invoke(this, EventArgs.Empty);
break;
return;
}
var rawTablesToUpdate = incompleteRawTables.Where(table => CheckUpdatedTable(table, updatedHealthCardRawData)).ToDictionary(table => table.Key, table => table.Value);
Dictionary<string, cHealthCardTable> rawTablesToUpdate = updatedHealthCardRawData.Tables
.Where(table => HealthCardRawData.Tables.TryGetValue(table.Key, out var oldTable) && WasTableUpdated(oldTable, table.Value))
.ToDictionary(table => table.Key, table => table.Value);
foreach (var oldTable in rawTablesToUpdate)
{
if (oldTable.Key.ToLowerInvariant() == "nxt-user")
{
cHealthCardTable newTable = updatedHealthCardRawData.Tables[oldTable.Key];
cHealthCardTable oldTableValues = HealthCardRawData.Tables[oldTable.Key];
}
var newTable = updatedHealthCardRawData.Tables[oldTable.Key];
var oldTableValues = HealthCardRawData.Tables[oldTable.Key];
cF4SDHealthCardRawData.cHealthCardTable mergedTable = oldTableValues;
cHealthCardTable mergedTable = oldTableValues;
foreach (var newTableColumnKeys in newTable.Columns.Keys)
{
if (mergedTable.Columns.ContainsKey(newTableColumnKeys) == false)
mergedTable.Columns[newTableColumnKeys] = new cF4SDHealthCardRawData.cHealthCardTableColumn();
mergedTable.Columns[newTableColumnKeys] = new cHealthCardTableColumn(mergedTable);
int mergedTableColumnValueCount = mergedTable.Columns[newTableColumnKeys].Values.Count;
int mergedTableColumnLength = Math.Max(mergedTable.StartingIndex + mergedTableColumnValueCount, newTable.StartingIndex + newTable.Columns[newTableColumnKeys].Values.Count); //mergedTable.Columns[newTableColumnKeys].Values.Count + newTable.Columns.Count;
@@ -2136,7 +2240,8 @@ namespace FasdDesktopUi.Basics.Helper
HealthCardRawData.Tables[oldTable.Key] = mergedTable;
}
IsDataIncomplete = HealthCardRawData.Tables.Where(table => table.Key.StartsWith("Computation_") == false)
isDataIncomplete = HealthCardRawData.Tables
.Where(table => table.Key.StartsWith("Computation_") == false)
.Any(table => table.Value.IsIncomplete);
if (rawTablesToUpdate?.Count > 0)
@@ -2151,13 +2256,13 @@ namespace FasdDesktopUi.Basics.Helper
{
LogException(E);
}
} while (IsDataIncomplete);
DataFullyLoaded?.Invoke(this, new EventArgs());
if (!isDataIncomplete)
DataFullyLoaded?.Invoke(this, EventArgs.Empty);
}
catch (Exception E)
catch (Exception ex)
{
LogException(E);
LogException(ex);
}
finally
{
@@ -2529,7 +2634,7 @@ namespace FasdDesktopUi.Basics.Helper
{
RawValues = values,
RawMaximizeValues = maximingValues,
DisplayType = cUtility.GetRawValueType(display),
DisplayType = display,
Description = parent.GetTitleColumnOfHealthCardState(stylableStateConfig).ContentDescription,
FontSize = stylableStateConfig.FontSize,
FontWeight = fontWeight,

View File

@@ -125,7 +125,7 @@ namespace FasdDesktopUi.Basics.Helper
private bool HasRequiredInformationClasses(List<enumFasdInformationClass> required)
{
return !(required.Any(informationClass => _dataProvider.Identities.Any(identity => identity.Class == informationClass) == false));
return !(required.Any(informationClass => _dataProvider?.Identities?.Any(identity => identity.Class == informationClass) == false));
}

View File

@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
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 activityType = GetActivityType(relation);
var openExternally = ShouldOpenExternally(ticketConfig, activityType);
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;
}
private static string GetActivityType(cF4sdApiSearchResultRelation relation)
{
if (relation?.Infos != null && relation.Infos.TryGetValue("ActivityType", out var activityTypeValue))
return activityTypeValue;
return null;
}
private static bool ShouldOpenExternally(cF4sdTicketConfig ticketConfig, string activityType)
{
if (ticketConfig == null)
return false;
if (TryGetOverride(ticketConfig.OpenActivitiesExternallyOverrides, activityType, out var overrideValue))
return overrideValue;
return ticketConfig.OpenActivitiesExternally;
}
private static bool TryGetOverride(IEnumerable<string> overrides, string activityType, out bool value)
{
value = false;
if (string.IsNullOrWhiteSpace(activityType) || overrides == null)
return false;
foreach (var entry in overrides)
{
if (string.IsNullOrWhiteSpace(entry))
continue;
var parts = entry.Split(new[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length != 2)
continue;
var typeName = parts[0].Trim();
if (!string.Equals(typeName, activityType, StringComparison.OrdinalIgnoreCase))
continue;
if (!TryParseBool(parts[1], out value))
return false;
return true;
}
return false;
}
private static bool TryParseBool(string value, out bool result)
{
result = false;
if (string.IsNullOrWhiteSpace(value))
return false;
switch (value.Trim().ToLowerInvariant())
{
case "true":
case "1":
case "yes":
result = true;
return true;
case "false":
case "0":
case "no":
result = false;
return true;
default:
return bool.TryParse(value, out result);
}
}
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}";
}
}
}

View File

@@ -280,7 +280,10 @@ namespace FasdDesktopUi.Basics.Models
}
if (App.M42OptionMenuItem != null)
App.Current.MainWindow.Dispatcher.Invoke(() =>
{
App.M42OptionMenuItem.Enabled = userInfo != null;
});
// check, if the are logons needed
bool m42Valid = await CheckAndRefreshM42LogonAsync();

View File

@@ -9,6 +9,7 @@ namespace FasdDesktopUi.Basics.Models
public enumFasdInformationClass InformationClass { get; set; }
public bool IsOnline { get; set; }
public cF4sdIdentityList Identities { get; set; }
public cF4sdApiSearchResultRelation Realtion { get; set; }
}
public class cSwapCaseInfo

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Windows;
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using FasdCockpitBase;
@@ -49,6 +50,7 @@ namespace FasdDesktopUi.Basics.Models
try
{
cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
var outputTable = dataProvider.HealthCardDataHelper.HealthCardRawData.GetTableByName(valueAdress.ValueTable, true);
if (outputTable != null)

View File

@@ -75,6 +75,7 @@ namespace FasdDesktopUi.Basics.Models
get => _unassignedTicketsCriticalSelected;
set { if (_unassignedTicketsCriticalSelected != value) { _unassignedTicketsCriticalSelected = value; OnPropertyChanged(nameof(UnassignedTicketsCriticalSelected)); } }
}
#endregion
#region Highlight-Properties
@@ -107,6 +108,7 @@ namespace FasdDesktopUi.Basics.Models
private bool _unassignedTicketsCriticalHighlighted;
public bool UnassignedTicketsCriticalHighlighted { get => _unassignedTicketsCriticalHighlighted; set { if (_unassignedTicketsCriticalHighlighted != value) { _unassignedTicketsCriticalHighlighted = value; OnPropertyChanged(nameof(UnassignedTicketsCriticalHighlighted)); } } }
#endregion
#region Change Hint Properties
@@ -139,6 +141,7 @@ namespace FasdDesktopUi.Basics.Models
private string _unassignedTicketsCriticalChangeHint;
public string UnassignedTicketsCriticalChangeHint { get => _unassignedTicketsCriticalChangeHint; set { if (_unassignedTicketsCriticalChangeHint != value) { _unassignedTicketsCriticalChangeHint = value; OnPropertyChanged(nameof(UnassignedTicketsCriticalChangeHint)); } } }
#endregion
#region Ticket & Incident-Properties
@@ -176,7 +179,6 @@ namespace FasdDesktopUi.Basics.Models
private int _unassignedTicketsCritical;
public int UnassignedTicketsCritical { get => _unassignedTicketsCritical; set { _unassignedTicketsCritical = value; OnPropertyChanged(nameof(UnassignedTicketsCritical)); } }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
@@ -198,6 +200,7 @@ namespace FasdDesktopUi.Basics.Models
UnassignedTicketsSelected = false;
UnassignedTicketsCriticalSelected = false;
}
public void ResetHighlights()
@@ -227,7 +230,14 @@ namespace FasdDesktopUi.Basics.Models
UnassignedTicketsChangeHint = null;
UnassignedTicketsCriticalChangeHint = null;
}
#endregion
public TicketOverviewModel()
{
}
}
}

View File

@@ -242,7 +242,7 @@ namespace FasdDesktopUi.Basics
if (addRelation)
foreach (var _caseRelation in CaseRelations)
{
if (_caseRelation.isEqual(CaseRelation))
if (_caseRelation.Equals(CaseRelation))
{
addRelation = false;
break;

View File

@@ -5,15 +5,18 @@ namespace FasdDesktopUi.Basics.Services.Models
{
public sealed class TicketOverviewCountsChangedEventArgs : EventArgs
{
public TicketOverviewCountsChangedEventArgs(IReadOnlyList<TileCountChange> changes, IReadOnlyDictionary<string, TileCounts> currentCounts)
public TicketOverviewCountsChangedEventArgs(IReadOnlyList<TileCountChange> changes, IReadOnlyDictionary<string, TileCounts> currentCounts, TileScope? initializedScope = null)
{
Changes = changes;
Changes = changes ?? Array.Empty<TileCountChange>();
CurrentCounts = currentCounts;
InitializedScope = initializedScope;
}
public IReadOnlyList<TileCountChange> Changes { get; }
public IReadOnlyDictionary<string, TileCounts> CurrentCounts { get; }
public TileScope? InitializedScope { get; }
}
public readonly struct TileCountChange

View File

@@ -1,4 +1,5 @@
using System;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
@@ -8,14 +9,14 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
{
internal class F4SDProtocoll
{
private readonly ICollection<IProtocollEntry> _protocollEntries = new List<IProtocollEntry>();
private readonly ICollection<ProtocollEntryBase> _protocollEntries = new List<ProtocollEntryBase>();
public static F4SDProtocoll Instance { get; private set; } = new F4SDProtocoll();
private F4SDProtocoll() { }
internal void Add(IProtocollEntry entry) => _protocollEntries.Add(entry);
internal void Add(IEnumerable<IProtocollEntry> entries)
internal void Add(ProtocollEntryBase entry) => _protocollEntries.Add(entry);
internal void Add(IEnumerable<ProtocollEntryBase> entries)
{
foreach (var entry in entries)
{
@@ -25,34 +26,34 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
internal void Clear() => _protocollEntries.Clear();
internal T GetLatestOfType<T>() where T : IProtocollEntry => _protocollEntries.OfType<T>().LastOrDefault();
internal T GetLatestOfType<T>() where T : ProtocollEntryBase => _protocollEntries.OfType<T>().LastOrDefault();
internal IEnumerable<T> GetOfType<T>(int? count = null) where T : IProtocollEntry
internal IEnumerable<T> GetOfType<T>(int? count = null) where T : ProtocollEntryBase
{
if(count.HasValue)
return _protocollEntries.OfType<T>().Reverse().Take(count.Value).Reverse();
return _protocollEntries.OfType<T>();
}
internal IEnumerable<IProtocollEntry> GetAll() => _protocollEntries;
internal IEnumerable<ProtocollEntryBase> GetAll() => _protocollEntries;
internal DataObject GetLatestOfTypeAsDataObject<T>(bool skipHtmlFrame) where T : IProtocollEntry
internal DataObject GetLatestOfTypeAsDataObject<T>(bool skipHtmlFrame) where T : ProtocollEntryBase
{
IProtocollEntry entry = _protocollEntries.OfType<T>().LastOrDefault();
ProtocollEntryBase entry = _protocollEntries.OfType<T>().LastOrDefault();
if (entry is null)
return new DataObject();
return GetDataObjectOf(new IProtocollEntry[] { entry }, skipHtmlFrame);
return GetDataObjectOf(new ProtocollEntryBase[] { entry }, skipHtmlFrame);
}
internal DataObject GetOfTypeAsDataObject<T>(bool skipHtmlFrame, int? count = null) where T : IProtocollEntry
=> GetDataObjectOf(GetOfType<T>(count).Cast<IProtocollEntry>(), skipHtmlFrame);
internal DataObject GetOfTypeAsDataObject<T>(bool skipHtmlFrame, int? count = null) where T : ProtocollEntryBase
=> GetDataObjectOf(GetOfType<T>(count).Cast<ProtocollEntryBase>(), skipHtmlFrame);
internal DataObject GetAllAsDataObject(bool skipHtmlFrame)
=> GetDataObjectOf(_protocollEntries, skipHtmlFrame);
private DataObject GetDataObjectOf(IEnumerable<IProtocollEntry> entries, bool skipHtmlFrame, int? count = null)
private DataObject GetDataObjectOf(IEnumerable<ProtocollEntryBase> entries, bool skipHtmlFrame, int? count = null)
{
DataObject dataObject = new DataObject();
@@ -67,16 +68,16 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
if (count.HasValue)
entries = entries.Reverse().Take(count.Value).Reverse();
foreach (IProtocollEntry entry in entries)
foreach (ProtocollEntryBase entry in entries)
{
string entryAscii = entry.GetAscii();
string entryAscii = entry.AsciiContent;
if (!string.IsNullOrEmpty(entryAscii))
{
ascii += entryAscii;
ascii += asciiSeparator;
}
string entryHtml = entry.GetHtml();
string entryHtml = entry.HtmlContent;
if (!string.IsNullOrEmpty(entryHtml))
{
html += entryHtml;

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace FasdDesktopUi.Basics.Services.ProtocollService
{
internal interface IProtocollEntry
{
string GetAscii();
string GetHtml();
}
}

View File

@@ -1,27 +1,38 @@
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using C4IT.F4SD.DisplayFormatting;
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.UserControls;
using System;
using System.Collections.Generic;
using System.Globalization;
using static C4IT.Logging.cLogManager;
using static FasdDesktopUi.Basics.UserControls.QuickActionStatusMonitor;
namespace FasdDesktopUi.Basics.Services.ProtocollService
{
internal class QuickActionProtocollEntry : IProtocollEntry
internal static class QuickActionProtocollEntryOutput
{
private readonly cFasdQuickAction _quickActionDefinition;
private readonly cQuickActionCopyData _quickActionCopyData;
const string AsciiSeperator = "\n\n";
public QuickActionProtocollEntry(cFasdQuickAction quickActionDefinition, cQuickActionCopyData quickActionCopyData)
public static QuickActionProtocollEntry GetQuickActionProtocollEntry(cFasdQuickAction quickActionDefinition, cQuickActionCopyData quickActionCopyData)
{
_quickActionDefinition = quickActionDefinition;
_quickActionCopyData = quickActionCopyData;
string ascii = GetAscii(quickActionDefinition, quickActionCopyData);
string html = GetHtml(quickActionDefinition, quickActionCopyData);
return new QuickActionProtocollEntry(ascii, html)
{
Id = quickActionDefinition.Id,
Name = quickActionDefinition.Name,
ExecutionTypeId = (int)quickActionDefinition.ExecutionType,
WasRunningOnAffectedDevice = quickActionCopyData.WasRunningOnAffectedDevice,
AffectedDeviceName = quickActionCopyData.AffectedDeviceName,
ResultCode = (int?)quickActionCopyData.QuickActionOutput?.ResultCode,
ErrorMessage = quickActionCopyData.QuickActionOutput?.ErrorDescription,
MeasureValues = GetQuickActionHtmlValueComparison(quickActionCopyData.MeasureValues)
};
}
internal static cQuickActionCopyData GetCopyData(cFasdQuickAction quickActionDefinition, cSupportCaseDataProvider dataProvider, bool wasRunningOnAffectedDevice, cQuickActionOutput quickActionOutput, List<cQuickActionMeasureValue> measureValues)
@@ -34,8 +45,8 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
quickActionCopyData.Name = quickActionDefinition.Names.GetValue();
quickActionCopyData.ExecutionTime = DateTime.UtcNow;
quickActionCopyData.AffectedDeviceName = dataProvider.HealthCardDataHelper.GetInformationObjectHeadingName(enumFasdInformationClass.Computer);
var infoClass = dataProvider.HealthCardDataHelper.SelectedHealthCard.InformationClasses.FirstOrDefault();
quickActionCopyData.AffectedDeviceName = dataProvider.HealthCardDataHelper.GetInformationObjectHeadingName(infoClass);
quickActionCopyData.WasRunningOnAffectedDevice = wasRunningOnAffectedDevice;
quickActionCopyData.QuickActionOutput = quickActionOutput;
@@ -51,38 +62,21 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return quickActionCopyData;
}
internal cQuickActionResult GetResult()
{
return new cQuickActionResult()
{
QuickActionId = _quickActionDefinition.Id,
QuickActionName = _quickActionDefinition.Name,
QuickActionExecutionType = (int)_quickActionDefinition.ExecutionType,
wasRunningOnAffectedDevice = _quickActionCopyData.WasRunningOnAffectedDevice,
AffectedDeviceName = _quickActionCopyData.AffectedDeviceName,
ExecutionTime = DateTime.UtcNow,
ResultCode = (int?)(_quickActionCopyData.QuickActionOutput?.ResultCode),
ErrorMessage = _quickActionCopyData.QuickActionOutput?.ErrorDescription,
Output = GetQuickActionHtmlOutput(_quickActionCopyData.QuickActionOutput),
MeasureValues = GetQuickActionHtmlValueComparison(_quickActionCopyData.MeasureValues)
};
}
private static string GetAscii(cFasdQuickAction quickActionDefinition, cQuickActionCopyData quickActionCopyData) => GetQuickActionAscii(quickActionDefinition, quickActionCopyData);
public string GetAscii() => GetQuickActionAscii(_quickActionCopyData);
private static string GetHtml(cFasdQuickAction quickActionDefinition, cQuickActionCopyData quickActionCopyData) => GetQuickActionHtml(quickActionDefinition, quickActionCopyData);
public string GetHtml() => GetQuickActionHtml(_quickActionCopyData);
private bool ShouldHideQuickActionOutput(string outputValueKey)
private static bool ShouldHideQuickActionOutput(cFasdQuickAction quickActionDefinition, string outputValueKey)
{
try
{
if (_quickActionDefinition.ColumnOutputFormattings is null)
if (quickActionDefinition.ColumnOutputFormattings is null)
return false;
if (!_quickActionDefinition.ShowAllOutputContent && !_quickActionDefinition.ColumnOutputFormattings.ContainsKey(outputValueKey))
if (!quickActionDefinition.ShowAllOutputContent && !quickActionDefinition.ColumnOutputFormattings.ContainsKey(outputValueKey))
return true;
if (_quickActionDefinition.ColumnOutputFormattings.TryGetValue(outputValueKey, out var columnFormatting))
if (quickActionDefinition.ColumnOutputFormattings.TryGetValue(outputValueKey, out var columnFormatting))
return columnFormatting.Hidden;
}
catch (Exception ex)
@@ -95,19 +89,19 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
#region Ascii
private string GetQuickActionAscii(cQuickActionCopyData copyData)
private static string GetQuickActionAscii(cFasdQuickAction quickActionDefinition, cQuickActionCopyData copyData)
{
string ascii = string.Empty;
ascii += GetQuickActionAsciiDescription(copyData.Name, copyData.AffectedDeviceName, copyData.WasRunningOnAffectedDevice, copyData.ExecutionTime, copyData.QuickActionOutput?.ResultCode);
ascii += GetQuickActionAsciiDescription(quickActionDefinition,copyData.Name, copyData.AffectedDeviceName, copyData.WasRunningOnAffectedDevice, copyData.ExecutionTime, copyData.QuickActionOutput?.ResultCode);
ascii += GetQuickActionAsciiError(copyData.QuickActionOutput?.ErrorDescription);
ascii += GetQuickActionAsciiOutput(copyData.QuickActionOutput);
ascii += GetQuickActionAsciiOutput(quickActionDefinition, copyData.QuickActionOutput);
ascii += GetQuickActionAsciiValueComparisonString(copyData.MeasureValues);
return ascii;
}
private string GetQuickActionAsciiDescription(string quickActionName, string deviceName, bool wasRunningOnAffectedDevice, DateTime executionTime, enumQuickActionSuccess? quickActionStatus)
private static string GetQuickActionAsciiDescription(cFasdQuickAction quickActionDefinition,string quickActionName, string deviceName, bool wasRunningOnAffectedDevice, DateTime executionTime, enumQuickActionSuccess? quickActionStatus)
{
string asciiDescription = string.Empty;
try
@@ -126,6 +120,12 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
}
var rawDescription = wasRunningOnAffectedDevice ? cMultiLanguageSupport.GetItem("QuickAction.Remote.Copy.Description") : cMultiLanguageSupport.GetItem("QuickAction.Local.Copy.Description");
if (quickActionDefinition.Section == enumDataHistoryOrigin.Citrix.ToString())
{
rawDescription = cMultiLanguageSupport.GetItem("QuickAction.RemoteSession.Copy.Description");
}
asciiDescription = string.Format(rawDescription, quickActionName, deviceName, executionTime.ToString("g", new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)), quickActionStatusString);
}
catch (Exception E)
@@ -136,7 +136,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return asciiDescription;
}
private string GetQuickActionAsciiError(string errorMessage)
private static string GetQuickActionAsciiError(string errorMessage)
{
if (!string.IsNullOrEmpty(errorMessage))
errorMessage.Insert(0, AsciiSeperator);
@@ -144,7 +144,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return errorMessage;
}
private string GetQuickActionAsciiOutput(QuickActionStatusMonitor.cQuickActionOutput quickActionOutput)
private static string GetQuickActionAsciiOutput(cFasdQuickAction quickActionDefinition, QuickActionStatusMonitor.cQuickActionOutput quickActionOutput)
{
string output = string.Empty;
@@ -162,7 +162,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
output += AsciiSeperator;
output += cMultiLanguageSupport.GetItem("QuickAction.Copy.Output") + " ";
output += singleOutput.GetDisplayValue(_quickActionDefinition.ColumnOutputFormattings);
output += singleOutput.GetDisplayValue(quickActionDefinition.ColumnOutputFormattings);
break;
}
@@ -174,10 +174,10 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
foreach (var value in listOutput.Values[0])
{
if (ShouldHideQuickActionOutput(value.Key))
if (ShouldHideQuickActionOutput(quickActionDefinition, value.Key))
continue;
if (_quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
output += outputFormatting.Names.GetValue();
else
output += value.Key;
@@ -193,10 +193,10 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
{
string valueKey = listOutput.Values[0][j].Key;
if (ShouldHideQuickActionOutput(valueKey))
if (ShouldHideQuickActionOutput(quickActionDefinition, valueKey))
continue;
string displayValue = listOutput.GetDisplayValue(i, j, _quickActionDefinition.ColumnOutputFormattings);
string displayValue = listOutput.GetDisplayValue(i, j, quickActionDefinition.ColumnOutputFormattings);
if (string.IsNullOrWhiteSpace(displayValue))
continue;
@@ -217,12 +217,12 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
{
var value = objectOutput.Values[i];
if (ShouldHideQuickActionOutput(value.Key))
if (ShouldHideQuickActionOutput(quickActionDefinition, value.Key))
continue;
string columnTitle = string.Empty;
if (_quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
columnTitle = outputFormatting.Names.GetValue();
else
columnTitle = value.Key;
@@ -230,7 +230,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
if (!string.IsNullOrEmpty(columnTitle))
output += $"{columnTitle}: ";
string displayValue = objectOutput.GetDisplayValue(i, _quickActionDefinition.ColumnOutputFormattings);
string displayValue = objectOutput.GetDisplayValue(i, quickActionDefinition.ColumnOutputFormattings);
output += !string.IsNullOrWhiteSpace(displayValue) ? displayValue : null;
output += "\n";
@@ -248,7 +248,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return output;
}
private string GetQuickActionAsciiValueComparisonString(List<QuickActionStatusMonitor.cQuickActionMeasureValue> measureValues)
private static string GetQuickActionAsciiValueComparisonString(List<QuickActionStatusMonitor.cQuickActionMeasureValue> measureValues)
{
string output = string.Empty;
@@ -260,6 +260,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
output += AsciiSeperator + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure");
cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
foreach (var measureValue in measureValues)
{
@@ -292,15 +293,15 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
#region Html
private string GetQuickActionHtml(cQuickActionCopyData copyData)
private static string GetQuickActionHtml(cFasdQuickAction quickActionDefinition, cQuickActionCopyData copyData)
{
string output = string.Empty;
try
{
output += GetQuickActionHtmlDescription(copyData.Name, copyData.AffectedDeviceName, copyData.WasRunningOnAffectedDevice, copyData.ExecutionTime, copyData.QuickActionOutput?.ResultCode);
output += GetQuickActionHtmlDescription(quickActionDefinition,copyData.Name, copyData.AffectedDeviceName, copyData.WasRunningOnAffectedDevice, copyData.ExecutionTime, copyData.QuickActionOutput?.ResultCode);
output += GetQuickActionHtmlError(copyData.QuickActionOutput?.ErrorDescription);
output += GetQuickActionHtmlOutput(copyData.QuickActionOutput);
output += GetQuickActionHtmlOutput(quickActionDefinition, copyData.QuickActionOutput);
output += GetQuickActionHtmlValueComparison(copyData.MeasureValues);
}
catch (Exception E)
@@ -311,7 +312,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return output;
}
private string GetQuickActionHtmlDescription(string quickActionName, string deviceName, bool wasRunningOnAffectedDevice, DateTime executionTime, enumQuickActionSuccess? quickActionStatus)
private static string GetQuickActionHtmlDescription(cFasdQuickAction quickActionDefinition, string quickActionName, string deviceName, bool wasRunningOnAffectedDevice, DateTime executionTime, enumQuickActionSuccess? quickActionStatus)
{
string output = string.Empty;
try
@@ -330,6 +331,11 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
}
var rawDescription = wasRunningOnAffectedDevice ? cMultiLanguageSupport.GetItem("QuickAction.Remote.Copy.Description.Html") : cMultiLanguageSupport.GetItem("QuickAction.Local.Copy.Description.Html");
if(quickActionDefinition.Section == enumDataHistoryOrigin.Citrix.ToString())
{
rawDescription = cMultiLanguageSupport.GetItem("QuickAction.RemoteSession.Copy.Description.Html");
}
output = string.Format(rawDescription, quickActionName, deviceName, executionTime.ToString("g", new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)), quickActionStatusString);
}
catch (Exception E)
@@ -348,7 +354,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return errorMessage;
}
private string GetQuickActionHtmlOutput(QuickActionStatusMonitor.cQuickActionOutput quickActionOutput)
private static string GetQuickActionHtmlOutput(cFasdQuickAction quickActionDefinition, QuickActionStatusMonitor.cQuickActionOutput quickActionOutput)
{
string output = string.Empty;
@@ -366,7 +372,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
if (singleOutput.Value is null)
return output;
var displayValue = singleOutput.GetDisplayValue(_quickActionDefinition?.ColumnOutputFormattings);
var displayValue = singleOutput.GetDisplayValue(quickActionDefinition?.ColumnOutputFormattings);
output += "<p>" + cMultiLanguageSupport.GetItem("QuickAction.Copy.Output.Html") + " " + displayValue + "</p>";
break;
}
@@ -379,11 +385,11 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
foreach (var value in listOutput.Values[0])
{
if (ShouldHideQuickActionOutput(value.Key))
if (ShouldHideQuickActionOutput(quickActionDefinition, value.Key))
continue;
string headingValue = value.Key;
if (_quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
headingValue = outputFormatting.Names.GetValue();
output += "<th align=\"left\">";
@@ -400,10 +406,10 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
for (int j = 0; j < listOutput.Values[i].Count; j++)
{
string valueKey = listOutput.Values[0][j].Key;
if (ShouldHideQuickActionOutput(valueKey))
if (ShouldHideQuickActionOutput(quickActionDefinition, valueKey))
continue;
string displayValue = listOutput.GetDisplayValue(i, j, _quickActionDefinition.ColumnOutputFormattings);
string displayValue = listOutput.GetDisplayValue(i, j, quickActionDefinition.ColumnOutputFormattings);
if (string.IsNullOrWhiteSpace(displayValue))
continue;
@@ -429,11 +435,11 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
{
var value = objectOutput.Values[i];
if (ShouldHideQuickActionOutput(value.Key))
if (ShouldHideQuickActionOutput(quickActionDefinition, value.Key))
continue;
string headingValue = value.Key;
if (_quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
if (quickActionDefinition.ColumnOutputFormattings?.TryGetValue(value.Key, out var outputFormatting) ?? false)
headingValue = outputFormatting.Names.GetValue();
output += "<tr>";
@@ -442,7 +448,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
output += "</td>";
output += "<td>";
string displayValue = objectOutput.GetDisplayValue(i, _quickActionDefinition.ColumnOutputFormattings);
string displayValue = objectOutput.GetDisplayValue(i, quickActionDefinition.ColumnOutputFormattings);
output += !string.IsNullOrWhiteSpace(displayValue) ? displayValue : null;
output += "</td>";
@@ -462,7 +468,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
return output;
}
private string GetQuickActionHtmlValueComparison(List<QuickActionStatusMonitor.cQuickActionMeasureValue> measureValues)
private static string GetQuickActionHtmlValueComparison(List<QuickActionStatusMonitor.cQuickActionMeasureValue> measureValues)
{
string output = string.Empty;
@@ -474,6 +480,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
output += "<p>" + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure.Html") + "</p>";
cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
foreach (var measureValue in measureValues)
{

View File

@@ -1,27 +1,30 @@
using C4IT.FASD.Base;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
namespace FasdDesktopUi.Basics.Services.ProtocollService
{
internal class QuickTipStepProtocollEntry : IProtocollEntry
internal static class QuickTipStepProtocollEntryOutput
{
private readonly cQuickTipElement _quickTipElementDefinition;
private readonly bool _wasSuccessfull;
public QuickTipStepProtocollEntry(cQuickTipElement quickTipElementDefinition, bool wasSuccessfull)
public static QuickTipStepProtocollEntry GetQuickTipStepProtocollEntry(cQuickTipElement quickTipElementDefinition, bool wasSuccessfull)
{
_quickTipElementDefinition = quickTipElementDefinition;
_wasSuccessfull = wasSuccessfull;
string ascii = GetAsciiOutput(quickTipElementDefinition, wasSuccessfull);
string html = GetHtmlOutput(quickTipElementDefinition, wasSuccessfull);
return new QuickTipStepProtocollEntry(ascii, html)
{
Name = quickTipElementDefinition.Name,
WasSuccessfull = wasSuccessfull
};
}
public string GetAscii()
private static string GetAsciiOutput(cQuickTipElement quickTipElementDefinition, bool wasSuccessfull)
{
string currentLanguage = cMultiLanguageSupport.CurrentLanguage;
try
{
cMultiLanguageSupport.CurrentLanguage = cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage ?? currentLanguage;
string ascii = _wasSuccessfull ? cMultiLanguageSupport.GetItem("QuickTips.Copy.ManualStep.Successfull") : cMultiLanguageSupport.GetItem("QuickTips.Copy.ManualStep.Unsuccessfull");
return string.Format(ascii, _quickTipElementDefinition?.Names?.GetValue());
string ascii = wasSuccessfull ? cMultiLanguageSupport.GetItem("QuickTips.Copy.ManualStep.Successfull") : cMultiLanguageSupport.GetItem("QuickTips.Copy.ManualStep.Unsuccessfull");
return string.Format(ascii, quickTipElementDefinition?.Names?.GetValue());
}
finally
{
@@ -29,7 +32,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
}
}
public string GetHtml()
=> GetAscii();
private static string GetHtmlOutput(cQuickTipElement quickTipElementDefinition, bool wasSuccessfull)
=> GetAsciiOutput(quickTipElementDefinition, wasSuccessfull);
}
}

View File

@@ -1,18 +0,0 @@
namespace FasdDesktopUi.Basics.Services.ProtocollService
{
internal class TextualProtocollEntry : IProtocollEntry
{
private readonly string _asciiText;
private readonly string _htmlText;
public TextualProtocollEntry(string asciiText, string htmlText)
{
_asciiText = asciiText;
_htmlText = htmlText;
}
public string GetAscii() => _asciiText;
public string GetHtml() => _htmlText;
}
}

View File

@@ -4,10 +4,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static C4IT.Logging.cLogManager;
[assembly: InternalsVisibleTo("F4SD.Cockpit.Client.Test")]
@@ -29,7 +27,7 @@ namespace FasdDesktopUi.Basics.Services.RelationService
{
try
{
_relations = new List<cF4sdApiSearchResultRelation>();
_relations = relatedTo?.Select(searchResult => new cF4sdApiSearchResultRelation(searchResult)).ToList() ?? new List<cF4sdApiSearchResultRelation>();
cF4sdStagedSearchResultRelationTaskId gatherRelationTask = await cFasdCockpitCommunicationBase.Instance.StartGatheringRelations(relatedTo, token);
_ = Task.Run(async () =>

View File

@@ -0,0 +1,262 @@
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using FasdDesktopUi.Basics.CustomEvents;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Pages.DetailsPage.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
{
/// <summary>
/// Used to manage the <see cref="ISupportCase"/> for the UI via the <see cref="SupportCaseProcessor"/>"
/// </summary>
public class SupportCaseController
{
private SupportCaseProcessor _supportCaseProcessor;
private cF4sdApiSearchResultRelation _focusedRelation;
private readonly Dictionary<enumFasdInformationClass, cF4sdApiSearchResultRelation> _selectedRelations = new Dictionary<enumFasdInformationClass, cF4sdApiSearchResultRelation>();
private cHealthCard _selectedHealthcard = null;
private bool _hasDirectionConnection = false;
public cSupportCaseDataProvider SupportCaseDataProviderArtifact { get => _supportCaseProcessor?.SupportCaseDataProviderArtifact; }
internal void SetSupportCaseProcessor(SupportCaseProcessor supportCaseProcessor, IEnumerable<cF4sdIdentityEntry> preselectedIdentities)
{
IEnumerable<cF4sdApiSearchResultRelation> preselectedRelations = GetPreselectedRelations(supportCaseProcessor.GetCaseRelations(), preselectedIdentities);
ResetSelectedRelations(preselectedRelations);
_hasDirectionConnection = false;
if (_supportCaseProcessor != null)
{
_supportCaseProcessor.AvailableCaseRelationsAdded -= HandleAvailableCaseRelationsAdded;
_supportCaseProcessor.CaseDataChanged -= HandleCaseDataChanged;
_supportCaseProcessor.SupportCaseDataProviderArtifact.DirectConnectionHelper.DirectConnectionChanged -= HandleDirectConnectionChanged;
}
_supportCaseProcessor = supportCaseProcessor;
_supportCaseProcessor.AvailableCaseRelationsAdded += HandleAvailableCaseRelationsAdded;
_supportCaseProcessor.CaseDataChanged += HandleCaseDataChanged;
_supportCaseProcessor.SupportCaseDataProviderArtifact.DirectConnectionHelper.DirectConnectionChanged += HandleDirectConnectionChanged;
}
private IEnumerable<cF4sdApiSearchResultRelation> GetPreselectedRelations
(ILookup<enumFasdInformationClass, cF4sdApiSearchResultRelation> loadedRelations, IEnumerable<cF4sdIdentityEntry> preselectedIdentities)
{
List<cF4sdApiSearchResultRelation> preselectedRelations = new List<cF4sdApiSearchResultRelation>();
foreach (var relationType in loadedRelations)
{
foreach (var relation in relationType)
{
if (relation.Identities.All(ri => preselectedIdentities.Any(i => i.Id == ri.Id)))
preselectedRelations.Add(relation);
}
}
return preselectedRelations;
}
private void ResetSelectedRelations(IEnumerable<cF4sdApiSearchResultRelation> preselectedRelations)
{
try
{
_selectedRelations.Clear();
if (preselectedRelations is null)
return;
foreach (var relation in preselectedRelations)
{
_selectedRelations[cF4sdIdentityEntry.GetFromSearchResult(relation.Type)] = relation;
}
}
catch (Exception ex)
{
LogException(ex);
}
}
private void HandleAvailableCaseRelationsAdded(object sender, RelationEventArgs e)
=> AvailableCaseRelationsAdded?.Invoke(this, e);
private void HandleCaseDataChanged(object sender, SupportCaseDataEventArgs e)
{
CaseDataChanged?.Invoke(this, e);
_ = Task.Run(async () =>
{
await UpdateStatusOfSelectedRelations();
if (!_hasDirectionConnection)
await SupportCaseDataProviderArtifact.DirectConnectionHelper.DirectConnectionStartAsync();
});
}
private void HandleDirectConnectionChanged(object sender, EventArgs e)
{
_hasDirectionConnection = SupportCaseDataProviderArtifact.DirectConnectionHelper.IsDirectConnectionActive;
}
/// <summary>
/// Updates the currently for a support case relevant and shown relation.
/// </summary>
/// <remarks>Raises <see cref="FocusedRelationsChanged"/></remarks>
internal void UpdateFocusedCaseRelation(cF4sdApiSearchResultRelation relation)
{
try
{
_selectedHealthcard = _supportCaseProcessor.GetHealthcardFor(relation);
HashSet<string> requiredTables = cHealthCard.GetRequiredTables(_selectedHealthcard);
_ = Task.Run(async () => await _supportCaseProcessor.LoadSupportCaseDataAsync(relation, requiredTables));
List<enumFasdInformationClass> requiredInformationClasses = relation.Identities
.Where(i => i.Class != enumFasdInformationClass.User)
.Select(i => i.Class)
.ToList();
if (relation.Type == enumF4sdSearchResultClass.User)
requiredInformationClasses = new List<enumFasdInformationClass>() { enumFasdInformationClass.User };
if (requiredInformationClasses.Count == 0)
requiredInformationClasses.Add(enumFasdInformationClass.User);
SupportCaseDataProviderArtifact.HealthCardDataHelper.TrySetSelectedHealthcard(requiredInformationClasses);
_focusedRelation = relation;
if (!_selectedRelations.Values.Contains(relation))
_hasDirectionConnection = false;
_selectedRelations[cF4sdIdentityEntry.GetFromSearchResult(relation.Type)] = relation;
_ = Task.Run(async () => await UpdateStatusOfSelectedRelations());
var focusedRelations = new cF4sdApiSearchResultRelation[1] { _focusedRelation };
FocusedRelationsChanged?.Invoke(this, new RelationEventArgs()
{
Relations = focusedRelations.ToLookup(r => cF4sdIdentityEntry.GetFromSearchResult(r.Type), r => r)
});
}
catch (Exception ex)
{
LogException(ex);
}
}
private async Task UpdateStatusOfSelectedRelations()
{
const string StatusString = "Status";
try
{
int? agentUserId = null;
int? agentDeviceId = null;
// todo these values should not be recieved from the NamedParameters, instead from the relation it self
if (SupportCaseDataProviderArtifact.NamedParameterEntries.TryGetValue("AgentUserId", out var userNamedParameter))
{
var value = userNamedParameter.GetValue();
if (!string.IsNullOrWhiteSpace(value))
agentUserId = int.Parse(value);
}
// todo these values should not be recieved from the NamedParameters, instead from the relation it self
if (SupportCaseDataProviderArtifact.NamedParameterEntries.TryGetValue("AgentDeviceId", out var deviceNamedParameter))
{
var value = deviceNamedParameter.GetValue();
if (!string.IsNullOrWhiteSpace(value))
agentDeviceId = int.Parse(deviceNamedParameter.GetValue());
}
foreach (var relationEntry in _selectedRelations)
{
if (relationEntry.Value is null)
continue;
string statusValue = "Unknown";
switch (relationEntry.Key)
{
case enumFasdInformationClass.Computer:
if (!agentDeviceId.HasValue)
continue;
bool isDeviceOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId.Value);
statusValue = isDeviceOnline ? "Online" : "Offline";
break;
case enumFasdInformationClass.User:
if (!agentDeviceId.HasValue || !agentUserId.HasValue)
continue;
bool isUserOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId.Value, agentUserId.Value);
statusValue = isUserOnline ? "Online" : "Offline";
break;
case enumFasdInformationClass.Ticket:
if (relationEntry.Value.Infos != null && relationEntry.Value.Infos.TryGetValue("StatusId", out var statusIdValue))
if (Enum.TryParse<enumTicketStatus>(statusIdValue, out var ticketStatus))
statusValue = ticketStatus.ToString();
break;
case enumFasdInformationClass.VirtualSession:
case enumFasdInformationClass.MobileDevice:
default:
continue;
}
if (relationEntry.Value.Infos is null)
relationEntry.Value.Infos = new Dictionary<string, string>();
relationEntry.Value.Infos[StatusString] = statusValue;
}
IEnumerable<cHeadingDataModel> newHeadingData = SupportCaseHeadingController.GetHeadingData(_selectedRelations);
HeadingDataChanged?.Invoke(this, new HeadingDataEventArgs(newHeadingData));
}
catch (Exception ex)
{
LogException(ex);
}
}
public async Task RefreshDataForCurrentlyFocusedRelationAsync()
{
SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.LastDataRequest = DateTime.Now;
await _supportCaseProcessor.UpdateLatestCaseDataFor(_focusedRelation);
}
public List<List<cWidgetValueModel>> GetWidgetData()
=> _supportCaseProcessor.GetWidgetData(_focusedRelation);
public cDetailsPageDataHistoryDataModel GetHistoryData()
=> _supportCaseProcessor.GetHistoryData(_focusedRelation);
public List<cContainerCollectionData> GetContainerData()
=> _supportCaseProcessor.GetContainerData(_focusedRelation);
public List<cMenuDataBase> GetMenuBarData()
=> _supportCaseProcessor.GetMenuBarData(_focusedRelation);
/// <summary>
/// Raised when the currently for a support case relevant and shown relations have been updated.
/// </summary>
public event EventHandler<RelationEventArgs> FocusedRelationsChanged;
/// <summary>
/// Raised when newly available relations for a support case were added.
/// </summary>
public event EventHandler<RelationEventArgs> AvailableCaseRelationsAdded;
/// <summary>
/// Raised when the data set of a support case has changed.
/// </summary>
public event EventHandler<SupportCaseDataEventArgs> CaseDataChanged;
public event EventHandler<HeadingDataEventArgs> HeadingDataChanged;
}
}

View File

@@ -0,0 +1,93 @@
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
{
internal class SupportCaseHeadingController
{
internal static IEnumerable<cHeadingDataModel> GetHeadingData(Dictionary<enumFasdInformationClass, cF4sdApiSearchResultRelation> relations)
{
try
{
return Enum.GetValues(typeof(enumFasdInformationClass))
.Cast<enumFasdInformationClass>()
.Select(informationClass =>
{
if (relations.TryGetValue(informationClass, out var relation) && relation != null)
return GetHeadingDataFor(relation);
else
return GetEmptyHeadingDataFor(informationClass);
});
}
catch (Exception ex)
{
LogException(ex);
}
return Enumerable.Empty<cHeadingDataModel>();
}
private static cHeadingDataModel GetEmptyHeadingDataFor(enumFasdInformationClass informationClass)
{
string headingText = string.Empty;
switch (informationClass)
{
case enumFasdInformationClass.Computer:
headingText = cMultiLanguageSupport.GetItem("Header.Select.Computer");
break;
case enumFasdInformationClass.Ticket:
headingText = cMultiLanguageSupport.GetItem("Header.Select.Ticket");
break;
case enumFasdInformationClass.VirtualSession:
headingText = cMultiLanguageSupport.GetItem("Header.Select.VirtualSession");
break;
case enumFasdInformationClass.MobileDevice:
headingText = cMultiLanguageSupport.GetItem("Header.Select.MobileDevice");
break;
}
return new cHeadingDataModel() { InformationClass = informationClass, HeadingText = headingText };
}
private static cHeadingDataModel GetHeadingDataFor(cF4sdApiSearchResultRelation relation)
{
const string StatusString = "Status";
bool isOnline = false;
string statusValue = "Unknown";
if (relation?.Infos?.TryGetValue(StatusString, out var statusValueFromDictionary) ?? false)
statusValue = statusValueFromDictionary;
switch (relation.Type)
{
case enumF4sdSearchResultClass.Computer:
case enumF4sdSearchResultClass.User:
isOnline = string.Equals(statusValue, "Online", StringComparison.InvariantCultureIgnoreCase);
break;
case enumF4sdSearchResultClass.Ticket:
isOnline = !string.Equals(statusValue, nameof(enumTicketStatus.Closed));
break;
case enumF4sdSearchResultClass.VirtualSession:
isOnline = string.Equals(statusValue, nameof(enumCitrixSessionStatus.Active));
break;
case enumF4sdSearchResultClass.MobileDevice:
break;
}
return new cHeadingDataModel()
{
HeadingText = string.IsNullOrEmpty(relation.Name) ? relation.DisplayName : relation.Name,
InformationClass = cF4sdIdentityEntry.GetFromSearchResult(relation.Type),
IsOnline = isOnline,
Identities = relation.Identities,
Realtion = relation
};
}
}
}

View File

@@ -1,8 +1,9 @@
using C4IT.FASD.Base;
using FasdDesktopUi.Basics.Services.RelationService;
using FasdDesktopUi.Basics.CustomEvents;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FasdDesktopUi.Basics.Services.SupportCase
{
@@ -12,10 +13,13 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
void Initialize();
void AddCaseRelations(ILookup<enumFasdInformationClass, cF4sdApiSearchResultRelation> relations);
ILookup<enumFasdInformationClass, cF4sdApiSearchResultRelation> GetCaseRelations();
IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> GetSupportCaseHealthcardData(object identities, object valueAddress);
void UpdateSupportCaseDataCache();
Task LoadSupportCaseDataAsync(cF4sdApiSearchResultRelation relation, IEnumerable<string> tablesToLoad);
IEnumerable<object> GetSupportCaseHealthcardData(cF4sdApiSearchResultRelation relation, cValueAddress valueAddress);
void UpdateSupportCaseDataCache(cF4sdApiSearchResultRelation relation, IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> tables);
void InvalidateCaseDataCacheFor(cF4sdApiSearchResultRelation relation);
void InvalidateLatestCaseDataCacheFor(cF4sdApiSearchResultRelation relation, out ICollection<cF4SDHealthCardRawData.cHealthCardTable> invalidatedTables);
event EventHandler<RelationEventArgs> CaseRelationsAdded;
event EventHandler<object> SupportCaseDataCacheHasChanged;
event EventHandler<SupportCaseDataEventArgs> SupportCaseDataCacheHasChanged;
}
}

View File

@@ -1,10 +1,10 @@
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using FasdDesktopUi.Basics.CustomEvents;
using FasdDesktopUi.Basics.Services.RelationService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using static C4IT.Logging.cLogManager;
@@ -13,7 +13,8 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
public class SupportCase : ISupportCase
{
private readonly Dictionary<enumFasdInformationClass, IList<cF4sdApiSearchResultRelation>> _caseRelations = new Dictionary<enumFasdInformationClass, IList<cF4sdApiSearchResultRelation>>();
//private readonly Lookup<IdentitySet, cF4SDHealthCardRawData.cHealthCardTable> _supportCaseDataCache;
private readonly Dictionary<string, Dictionary<cF4sdApiSearchResultRelation, cF4SDHealthCardRawData.cHealthCardTable>> _supportCaseDataCache = new Dictionary<string, Dictionary<cF4sdApiSearchResultRelation, cF4SDHealthCardRawData.cHealthCardTable>>();
private readonly Dictionary<cF4sdApiSearchResultRelation, cF4SDHealthCardRawData> _rawDataCache = new Dictionary<cF4sdApiSearchResultRelation, cF4SDHealthCardRawData>(); // todo remove, currently only used for SupportCaseDataProviderArtifact
internal readonly Guid Id;
private readonly IRelationService _relationService;
@@ -67,12 +68,12 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
foreach (var relationType in relations)
{
if (_caseRelations.TryGetValue(relationType.Key, out var caseRelation))
caseRelation = caseRelation.Union(relationType, new SearchResultRelationEqualityComparer()).ToList();
caseRelation = caseRelation.Union(relationType).ToList();
else
_caseRelations.Add(relationType.Key, relationType.ToList());
if (SupportCaseDataProviderArtifact?.CaseRelations?.TryGetValue(relationType.Key, out var caseRelations) ?? false)
caseRelations = caseRelations.Union(relationType, new SearchResultRelationEqualityComparer()).ToList();
caseRelations = caseRelations.Union(relationType).ToList();
else
SupportCaseDataProviderArtifact?.CaseRelations?.Add(relationType.Key, relationType.ToList());
}
@@ -85,14 +86,207 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
}
}
public void UpdateSupportCaseDataCache()
public async Task LoadSupportCaseDataAsync(cF4sdApiSearchResultRelation relation, IEnumerable<string> tablesToLoad)
{
throw new NotImplementedException();
try
{
cF4SDHealthCardRawData rawData = null;
// todo this is only a temporary fix. Currently the tablesToLoad contain also detail tables
// and tables won't be loaded e.g. the QuickActionHistory
bool isDataComplete = IsRawDataCacheComplete() && IsSupportCaseDataCacheComplete();
if (isDataComplete)
{
await SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.SetHealthCardRawData(_rawDataCache[relation], relation.Identities);
return;
}
public IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> GetSupportCaseHealthcardData(object identities, object valueAddress)
var rawDataRequest = new cF4sdHealthCardRawDataRequest()
{
throw new NotImplementedException();
Identities = relation.Identities,
Tables = tablesToLoad.ToList(),
MaxAge = cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.SearchResultAge ?? 14
};
while (!isDataComplete)
{
if (rawData is null)
{
rawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(rawDataRequest);
_rawDataCache[relation] = rawData;
await SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.SetHealthCardRawData(rawData, rawDataRequest.Identities);
}
else
{
rawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(rawData.Id);
_rawDataCache[relation] = _rawDataCache[relation].Combine(rawData);
await SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.UpdateHealthcardRawData(rawData);
}
UpdateSupportCaseDataCache(relation, rawData?.Tables?.Values);
isDataComplete = rawData?.Tables?
.Where(table => table.Key.StartsWith("Computation_") == false)
.All(table => !table.Value.IsIncomplete && !table.Value.Columns.Values.Any(c => c.IsIncomplete)) ?? false;
}
}
catch (Exception ex)
{
LogException(ex);
}
bool IsRawDataCacheComplete()
{
return tablesToLoad.All(t =>
_rawDataCache.TryGetValue(relation, out var cachedRawData)
&& (cachedRawData?.Tables?.TryGetValue(t, out var cachedTable) ?? false)
&& cachedTable != null && !cachedTable.IsIncomplete && !cachedTable.Columns.Values.Any(c => c.IsIncomplete)
);
}
bool IsSupportCaseDataCacheComplete()
{
return tablesToLoad.Any(t =>
_supportCaseDataCache.TryGetValue(t, out var cachedTables)
&& cachedTables.TryGetValue(relation, out var table)
&& !table.IsIncomplete && !table.Columns.Values.Any(c => c.IsIncomplete)
);
}
}
public void UpdateSupportCaseDataCache(cF4sdApiSearchResultRelation relation, IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> tables)
{
try
{
if (tables is null)
return;
List<cF4SDHealthCardRawData.cHealthCardTable> dataTables = tables?.ToList();
foreach (var table in dataTables)
{
if (string.IsNullOrEmpty(table.Name))
continue;
if (!_supportCaseDataCache.ContainsKey(table.Name))
_supportCaseDataCache.Add(table.Name, new Dictionary<cF4sdApiSearchResultRelation, cF4SDHealthCardRawData.cHealthCardTable>());
if (!_supportCaseDataCache[table.Name].ContainsKey(relation))
_supportCaseDataCache[table.Name][relation] = table;
else if (_supportCaseDataCache[table.Name][relation].IsIncomplete)
MergeTable(_supportCaseDataCache[table.Name][relation], table);
}
SupportCaseDataCacheHasChanged?.Invoke(this, new SupportCaseDataEventArgs() { Relation = relation, DataTables = dataTables });
}
catch (Exception ex)
{
LogException(ex);
}
void MergeTable(cF4SDHealthCardRawData.cHealthCardTable existingTable, cF4SDHealthCardRawData.cHealthCardTable newTable)
{
try
{
existingTable.IsIncomplete = newTable.IsIncomplete;
foreach (var newColumn in newTable.Columns)
{
existingTable.Columns[newColumn.Key] = newColumn.Value;
}
}
catch (Exception ex)
{
LogException(ex);
}
}
}
public void InvalidateCaseDataCacheFor(cF4sdApiSearchResultRelation relation)
{
try
{
_rawDataCache.Remove(relation);
foreach (var tableCache in _supportCaseDataCache.Values)
{
tableCache.Remove(relation);
}
// todo: invoke SupportCaseDataChache with empty tables
// SupportCaseDataCacheHasChanged?.Invoke(this, new SupportCaseDataEventArgs() { Relation = relation });
}
catch (Exception ex)
{
LogException(ex);
}
}
public void InvalidateLatestCaseDataCacheFor(cF4sdApiSearchResultRelation relation, out ICollection<cF4SDHealthCardRawData.cHealthCardTable> invalidatedTables)
{
invalidatedTables = new HashSet<cF4SDHealthCardRawData.cHealthCardTable>();
try
{
foreach (var tableCache in _supportCaseDataCache.Values)
{
if (!tableCache.TryGetValue(relation, out cF4SDHealthCardRawData.cHealthCardTable table))
continue;
table.IsIncomplete = true;
foreach (var column in table.Columns.Values)
{
if (column.Values != null && column.Values.Count > 0)
column.Values[0] = null;
column.IsIncomplete = true;
}
invalidatedTables.Add(table);
}
if (!_rawDataCache.TryGetValue(relation, out var cachedRawData) || cachedRawData?.Tables is null)
return;
foreach (var table in cachedRawData.Tables.Values)
{
table.IsIncomplete = true;
foreach (var column in table.Columns.Values)
{
if (column.Values != null && column.Values.Count > 0)
column.Values[0] = null;
column.IsIncomplete = true;
}
}
}
catch (Exception ex)
{
LogException(ex);
}
}
public IEnumerable<object> GetSupportCaseHealthcardData(cF4sdApiSearchResultRelation relation, cValueAddress valueAddress)
{
try
{
if (!_supportCaseDataCache.TryGetValue(valueAddress.ValueTable, out var tables))
return null;
if (!tables.TryGetValue(relation, out var table))
return null;
if (!table.Columns.TryGetValue(valueAddress.ValueColumn, out var column))
return null;
return column.Values;
}
catch (Exception ex)
{
LogException(ex);
}
return null;
}
private void HandleRelationsFound(object sender, StagedSearchResultRelationsEventArgs e)
@@ -107,19 +301,6 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
=> AddCaseRelations(relations?.ToLookup(r => cF4sdIdentityEntry.GetFromSearchResult(r.Type), r => r));
public event EventHandler<RelationEventArgs> CaseRelationsAdded;
public event EventHandler<object> SupportCaseDataCacheHasChanged; // Lookup for IdentitySet and tables which has been updated
private class SearchResultRelationEqualityComparer : IEqualityComparer<cF4sdApiSearchResultRelation>
{
public bool Equals(cF4sdApiSearchResultRelation x, cF4sdApiSearchResultRelation y)
{
return x.isEqual(y);
}
public int GetHashCode(cF4sdApiSearchResultRelation obj)
{
return obj.GetHashCode();
}
}
public event EventHandler<SupportCaseDataEventArgs> SupportCaseDataCacheHasChanged;
}
}

View File

@@ -23,9 +23,6 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
if (primaryIdentity is null)
throw new InvalidEnumArgumentException($"{nameof(primaryIdentity)} must not be null.");
if (primaryIdentity.Class != enumFasdInformationClass.User)
throw new InvalidEnumArgumentException($"{nameof(primaryIdentity)} must be of class {nameof(enumFasdInformationClass.User)}.");
if (_supportCases.TryGetValue(primaryIdentity.Id, out var supportCase))
{
supportCase.Initialize();

View File

@@ -0,0 +1,278 @@
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
using FasdDesktopUi.Basics.CustomEvents;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Pages.DetailsPage.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.Services.SupportCase
{
/// <summary>
/// Used for processing raw data of a <see cref="ISupportCase"/> for the UI in a certain way.
/// </summary>
internal class SupportCaseProcessor
{
private ISupportCase _supportCase;
public cSupportCaseDataProvider SupportCaseDataProviderArtifact { get => _supportCase?.SupportCaseDataProviderArtifact; }
private readonly Dictionary<cF4sdApiSearchResultRelation, cDetailsPageData> _detailsPageDataCache = new Dictionary<cF4sdApiSearchResultRelation, cDetailsPageData>();
private readonly Dictionary<cF4sdApiSearchResultRelation, Dictionary<string, object>> _namedParameterCache = new Dictionary<cF4sdApiSearchResultRelation, Dictionary<string, object>>();
internal void SetSupportCase(ISupportCase supportCase)
{
if (_supportCase != null)
{
_supportCase.CaseRelationsAdded -= HandleSupportCaseRelationsAdded;
_supportCase.SupportCaseDataCacheHasChanged -= HandleSupportCaseDataCacheHasChanged;
}
_supportCase = supportCase;
_supportCase.CaseRelationsAdded += HandleSupportCaseRelationsAdded;
_supportCase.SupportCaseDataCacheHasChanged += HandleSupportCaseDataCacheHasChanged;
}
private void HandleSupportCaseRelationsAdded(object sender, RelationEventArgs e)
=> AvailableCaseRelationsAdded?.Invoke(this, e);
private async void HandleSupportCaseDataCacheHasChanged(object sender, SupportCaseDataEventArgs e)
{
bool isArtifactShowingCorrectHealthCard
= SupportCaseDataProviderArtifact.HealthCardDataHelper.SelectedHealthCard == GetHealthcardFor(e.Relation);
if (!isArtifactShowingCorrectHealthCard)
{
// todo this can probably be removed, as soon as the last dependency of the SupportCaseDataProviderArtifact is gone.
// till then the detailspageData gets overriden with the detailspageData of the new relation.
// However, the removal shouldn't be much of a problem, due to the fact the Artifact also stores the raw data
_detailsPageDataCache.Remove(e.Relation);
return;
}
if (_detailsPageDataCache.TryGetValue(e.Relation, out var cachedData))
{
cDetailsPageData detailData = _supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DetailPage.GetDataWithoutHeading();
cachedData.WidgetData = detailData.WidgetData;
cachedData.DataHistoryList = detailData.DataHistoryList;
cachedData.MenuBarData = detailData.MenuBarData;
cachedData.DataContainerCollectionList = detailData.DataContainerCollectionList;
}
else
{
_detailsPageDataCache[e.Relation] = await _supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DetailPage.GetDataAsync();
}
UpdateNamedParameters(e.Relation, e.DataTables);
CaseDataChanged?.Invoke(this, e);
}
private void UpdateNamedParameters(cF4sdApiSearchResultRelation relation, IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> dataTables)
{
try
{
if (!_namedParameterCache.ContainsKey(relation))
_namedParameterCache.Add(relation, new Dictionary<string, object>());
var healthcard = GetHealthcardFor(relation);
foreach (var namedParameter in cHealthCardPrerequisites.GetNamedParameters(healthcard).Values)
{
var table = dataTables.FirstOrDefault(t => t.Name == namedParameter.DatabaseInfo.ValueTable);
if (table is null)
continue;
if (!table.Columns.TryGetValue(namedParameter.DatabaseInfo.ValueColumn, out var column))
continue;
string value = cUtility.RawValueFormatter.GetDisplayValue(column.Values.FirstOrDefault(), namedParameter.Display);
_namedParameterCache[relation][namedParameter.ParameterName] = value;
}
}
catch (Exception ex)
{
LogException(ex);
}
}
public async Task LoadSupportCaseDataAsync(cF4sdApiSearchResultRelation relation, IEnumerable<string> tablesToLoad)
{
_ = Task.Run(async () => await _supportCase.LoadSupportCaseDataAsync(relation, tablesToLoad.Where(t => !t.Contains("-details-"))));
if (!_detailsPageDataCache.TryGetValue(relation, out var detailsData))
{
detailsData = await _supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DetailPage.GetDataAsync();
_detailsPageDataCache.Add(relation, detailsData);
}
else
{
_supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.UpdateNamedParameterEntries();
}
CaseDataChanged?.Invoke(this, new SupportCaseDataEventArgs());
}
public async Task UpdateLatestCaseDataFor(cF4sdApiSearchResultRelation relation)
{
try
{
int? agentUserId = relation.Identities.FirstOrDefault(i => i.Class == enumFasdInformationClass.User)?.agentId;
int? agentDeviceId = relation.Identities.FirstOrDefault(i => i.Class == enumFasdInformationClass.Computer)?.agentId;
await ActualizeDataAsync(agentUserId, agentDeviceId);
_supportCase.InvalidateLatestCaseDataCacheFor(relation, out var invalidatedTables);
_detailsPageDataCache.Remove(relation);
await _supportCase.LoadSupportCaseDataAsync(relation, invalidatedTables.Where(t => !t.Name.StartsWith("Computation_")).Select(t => t.Name));
}
catch (Exception ex)
{
LogException(ex);
}
}
private async Task<enumActualizeStatus> ActualizeDataAsync(int? agentUserId, int? agentDeviceId)
{
var status = enumActualizeStatus.unknown;
try
{
TimeSpan refreshDelay = TimeSpan.FromMilliseconds(500);
const int maxPollCount = 20;
if (!agentDeviceId.HasValue)
{
LogEntry("Coudldn't acutalize data. There was no valid AgentDeviceId found.", LogLevels.Error);
return status;
}
var taskId = await cFasdCockpitCommunicationBase.Instance.ActualizeAgentData(agentDeviceId.Value, agentUserId);
if (taskId == Guid.Empty)
return enumActualizeStatus.failed;
enumFasdInformationClass informationClass = agentUserId != null ? enumFasdInformationClass.User : enumFasdInformationClass.Computer;
int pollCount = 0;
do
{
status = await cFasdCockpitCommunicationBase.Instance.GetActualizeAgentDataStatus(taskId, informationClass);
if (status == enumActualizeStatus.unknown)
{
pollCount++;
if (pollCount >= maxPollCount)
return status;
await Task.Delay(refreshDelay);
}
} while (status == enumActualizeStatus.unknown);
}
catch (Exception E)
{
LogException(E);
}
return status;
}
internal ILookup<enumFasdInformationClass, cF4sdApiSearchResultRelation> GetCaseRelations()
=> _supportCase.GetCaseRelations();
internal cHealthCard GetHealthcardFor(cF4sdApiSearchResultRelation relation)
{
var availableHealthCards = cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.HealthCards?.Values;
if (availableHealthCards is null || availableHealthCards.Count == 0)
return null;
return availableHealthCards
.FirstOrDefault(hc =>
hc.InformationClasses.All(i => i == cF4sdIdentityEntry.GetFromSearchResult(relation.Type))
&& HasCockpitUserRequiredRoles(hc.RequiredRoles));
}
private static bool HasCockpitUserRequiredRoles(List<string> requiredRoles)
{
try
{
if (requiredRoles is null || requiredRoles.Count == 0)
return true;
List<string> roles = null;
lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock)
{
roles = cFasdCockpitCommunicationBase.CockpitUserInfo?.Roles;
}
if (roles is null || roles.Count == 0)
return false;
foreach (var requiredRole in requiredRoles)
{
if (roles.Contains(requiredRole, StringComparer.InvariantCultureIgnoreCase))
return true;
}
}
catch (Exception E)
{
LogException(E);
}
return false;
}
public List<List<cWidgetValueModel>> GetWidgetData(cF4sdApiSearchResultRelation relation)
{
List<List<cWidgetValueModel>> widgetData = null;
if (_detailsPageDataCache.TryGetValue(relation, out var detailsData))
widgetData = detailsData?.WidgetData;
return widgetData ?? new List<List<cWidgetValueModel>>();
}
public cDetailsPageDataHistoryDataModel GetHistoryData(cF4sdApiSearchResultRelation relation)
{
cDetailsPageDataHistoryDataModel historyData = null;
if (_detailsPageDataCache.TryGetValue(relation, out var detailsData))
historyData = detailsData?.DataHistoryList;
return historyData ?? new cDetailsPageDataHistoryDataModel();
}
public List<cContainerCollectionData> GetContainerData(cF4sdApiSearchResultRelation relation)
{
List<cContainerCollectionData> containerData = null;
if (_detailsPageDataCache.TryGetValue(relation, out var detailsData))
containerData = detailsData?.DataContainerCollectionList;
return containerData ?? new List<cContainerCollectionData>();
}
public List<cMenuDataBase> GetMenuBarData(cF4sdApiSearchResultRelation relation)
{
List<cMenuDataBase> menuData = null;
if (_detailsPageDataCache.TryGetValue(relation, out var detailsData))
menuData = detailsData?.MenuBarData;
return menuData ?? new List<cMenuDataBase>();
}
/// <summary>
/// Raised when newly available relations for a support case were added.
/// </summary>
public event EventHandler<RelationEventArgs> AvailableCaseRelationsAdded;
/// <summary>
/// Raised when the data set of a support case has changed.
/// </summary>
public event EventHandler<SupportCaseDataEventArgs> CaseDataChanged;
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
namespace FasdDesktopUi.Basics.Services.SupportCase
{
internal class SupportCaseProcessorFactory
{
private readonly static Dictionary<Guid, SupportCaseProcessor> _supportCaseProccesors = new Dictionary<Guid, SupportCaseProcessor>();
internal static SupportCaseProcessor Get(Guid id)
{
if (!_supportCaseProccesors.ContainsKey(id))
_supportCaseProccesors.Add(id, new SupportCaseProcessor());
return _supportCaseProccesors[id];
}
}
}

View File

@@ -7,6 +7,7 @@ using System.Windows.Threading;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using FasdDesktopUi;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.Services.Models;
#if isDemo
@@ -19,7 +20,6 @@ namespace FasdDesktopUi.Basics.Services
{
public sealed class TicketOverviewUpdateService
{
private static readonly TimeSpan RefreshInterval = TimeSpan.FromMinutes(5);
private static readonly string[] OverviewKeys = new[]
{
"TicketsNew",
@@ -33,15 +33,20 @@ namespace FasdDesktopUi.Basics.Services
"UnassignedTickets",
"UnassignedTicketsCritical"
};
private const string DemoTicketDetailsKey = "Demo.HasTicketDetails";
private readonly Dispatcher _dispatcher;
private readonly Dictionary<string, TileCounts> _currentCounts = new Dictionary<string, TileCounts>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<(string Key, bool UseRoleScope), List<cF4sdApiSearchResultRelation>> _demoRelations = new Dictionary<(string, bool), List<cF4sdApiSearchResultRelation>>();
private DispatcherTimer _timer;
private bool _isFetching;
private bool _fetchRetryPending;
private readonly HashSet<TileScope> _pendingScopes = new HashSet<TileScope>();
private readonly HashSet<TileScope> _initializedScopes = new HashSet<TileScope>();
private readonly object _fetchLock = new object();
private readonly HashSet<TileScope> _retryScopes = new HashSet<TileScope>();
private DispatcherTimer _personalTimer;
private DispatcherTimer _roleTimer;
private Task _fetchWorker;
private bool _retryScheduled;
private bool _isDemo;
private bool _initialized;
private bool _isEnabled;
private readonly Random _random = new Random();
#if isDemo
private readonly List<DemoTicketRecord> _persistedDemoTickets = new List<DemoTicketRecord>();
@@ -69,18 +74,69 @@ namespace FasdDesktopUi.Basics.Services
static TicketOverviewUpdateService()
{
#if isDemo
Instance = new TicketOverviewUpdateService();
#endif
}
public static TicketOverviewUpdateService Instance { get; } = null;
public static TicketOverviewUpdateService Instance { get; }
public event EventHandler<TicketOverviewCountsChangedEventArgs> OverviewCountsChanged;
public IReadOnlyDictionary<string, TileCounts> CurrentCounts => _currentCounts;
public bool IsScopeInitialized(TileScope scope)
{
lock (_fetchLock)
{
return _initializedScopes.Contains(scope);
}
}
public bool AreAllScopesInitialized
{
get
{
lock (_fetchLock)
{
return _initializedScopes.Contains(TileScope.Personal)
&& _initializedScopes.Contains(TileScope.Role);
}
}
}
public void Start()
{
UpdateAvailability(true);
}
public void Stop()
{
UpdateAvailability(false);
}
public void UpdateAvailability(bool isEnabled)
{
if (isEnabled)
{
if (!_isEnabled)
{
_isEnabled = true;
StartInternal();
}
else
{
RefreshTimerIntervals();
}
}
else
{
if (_isEnabled)
StopInternal();
_isEnabled = false;
}
}
private void StartInternal()
{
if (_initialized)
return;
@@ -93,110 +149,247 @@ namespace FasdDesktopUi.Basics.Services
_isDemo = cFasdCockpitCommunicationBase.Instance?.IsDemo() == true;
#endif
if (!_isDemo)
{
_timer = new DispatcherTimer(RefreshInterval, DispatcherPriority.Background, async (s, e) => await FetchAsync().ConfigureAwait(false), _dispatcher);
_timer.Start();
InitializeTimers();
_ = FetchAsync();
}
private void StopInternal()
{
if (!_initialized)
return;
_initialized = false;
lock (_fetchLock)
{
_pendingScopes.Clear();
_initializedScopes.Clear();
}
lock (_retryScopes)
{
_retryScheduled = false;
_retryScopes.Clear();
}
_dispatcher.InvokeAsync(() =>
{
_personalTimer?.Stop();
_roleTimer?.Stop();
_personalTimer = null;
_roleTimer = null;
foreach (var key in OverviewKeys)
{
_currentCounts[key] = TileCounts.Empty;
}
});
}
private void InitializeTimers()
{
_personalTimer = CreateScopeTimer(TileScope.Personal);
_roleTimer = CreateScopeTimer(TileScope.Role);
_personalTimer?.Start();
_roleTimer?.Start();
}
private DispatcherTimer CreateScopeTimer(TileScope scope)
{
var interval = GetPollingInterval(scope);
var timer = new DispatcherTimer(interval, DispatcherPriority.Background, async (s, e) => await FetchAsync(scope).ConfigureAwait(false), _dispatcher)
{
IsEnabled = false
};
return timer;
}
private TimeSpan GetPollingInterval(TileScope scope)
{
var ticketConfig = cFasdCockpitConfig.Instance?.Global?.TicketConfiguration;
int minutes = scope == TileScope.Role
? cF4sdTicketConfig.DefaultOverviewPollingRole
: cF4sdTicketConfig.DefaultOverviewPollingPersonal;
if (ticketConfig != null)
{
minutes = scope == TileScope.Role
? ticketConfig.OverviewPollingRole
: ticketConfig.OverviewPollingPersonal;
}
if (minutes < 1)
minutes = 1;
return TimeSpan.FromMinutes(minutes);
}
public Task FetchAsync()
{
if (!_isEnabled)
return Task.CompletedTask;
return QueueFetchAsync(new[] { TileScope.Personal, TileScope.Role });
}
public Task FetchAsync(TileScope scope)
{
if (!_isEnabled)
return Task.CompletedTask;
return QueueFetchAsync(new[] { scope });
}
private Task QueueFetchAsync(IEnumerable<TileScope> scopes)
{
if (!_isEnabled)
return Task.CompletedTask;
if (scopes == null)
return Task.CompletedTask;
lock (_fetchLock)
{
foreach (var scope in scopes)
{
_pendingScopes.Add(scope);
}
if (_fetchWorker == null || _fetchWorker.IsCompleted)
{
_fetchWorker = Task.Run(ProcessFetchQueueAsync);
}
return _fetchWorker;
}
}
private async Task ProcessFetchQueueAsync()
{
while (true)
{
TileScope scope;
lock (_fetchLock)
{
if (_pendingScopes.Count == 0)
{
_fetchWorker = null;
return;
}
scope = _pendingScopes.First();
_pendingScopes.Remove(scope);
}
await FetchScopeAsync(scope).ConfigureAwait(false);
}
}
private async Task FetchScopeAsync(TileScope scope)
{
if (!_isEnabled)
return;
var communication = cFasdCockpitCommunicationBase.Instance;
if (communication == null)
{
ScheduleFetchRetry(scope);
return;
}
try
{
_isDemo = communication.IsDemo();
var rawCounts = await communication.GetTicketOverviewCounts(OverviewKeys, scope == TileScope.Role).ConfigureAwait(false);
var counts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
if (rawCounts != null)
{
foreach (var kvp in rawCounts)
{
if (string.IsNullOrWhiteSpace(kvp.Key))
continue;
counts[kvp.Key] = Math.Max(0, kvp.Value);
}
}
if (!_isEnabled)
return;
await _dispatcher.InvokeAsync(() => ProcessScopeCounts(scope, counts));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[TicketOverview] Fetch {scope} failed: {ex}");
ScheduleFetchRetry(scope);
}
}
private void RefreshTimerIntervals()
{
_dispatcher.InvokeAsync(() =>
{
if (_personalTimer != null)
_personalTimer.Interval = GetPollingInterval(TileScope.Personal);
if (_roleTimer != null)
_roleTimer.Interval = GetPollingInterval(TileScope.Role);
});
}
private void ProcessScopeCounts(TileScope scope, IDictionary<string, int> newCounts)
{
if (newCounts == null)
return;
var hasInitializedScope = _initializedScopes.Contains(scope);
var changes = new List<TileCountChange>();
foreach (var key in OverviewKeys)
{
var previous = _currentCounts.TryGetValue(key, out var counts) ? counts : TileCounts.Empty;
var incoming = newCounts.TryGetValue(key, out var value) ? value : 0;
TileCounts updated;
int oldValue;
if (scope == TileScope.Role)
{
updated = new TileCounts(previous.Personal, incoming);
oldValue = previous.Role;
}
else
{
_ = FetchAsync();
updated = new TileCounts(incoming, previous.Role);
oldValue = previous.Personal;
}
_currentCounts[key] = updated;
if (hasInitializedScope && oldValue != incoming)
{
changes.Add(new TileCountChange(key, scope, oldValue, incoming));
}
}
public async Task FetchAsync()
if (!hasInitializedScope)
{
if (_isFetching)
return;
var communication = cFasdCockpitCommunicationBase.Instance;
if (communication == null)
{
ScheduleFetchRetry();
_initializedScopes.Add(scope);
var initArgs = new TicketOverviewCountsChangedEventArgs(
Array.Empty<TileCountChange>(),
new Dictionary<string, TileCounts>(_currentCounts, StringComparer.OrdinalIgnoreCase),
scope);
OverviewCountsChanged?.Invoke(this, initArgs);
return;
}
_isFetching = true;
try
{
_isDemo = communication?.IsDemo() == true;
if (_isDemo && _timer != null)
{
_timer.Stop();
_timer = null;
}
var counts = await Task.Run(() => RetrieveCountsAsync()).ConfigureAwait(false);
if (counts != null)
{
await _dispatcher.InvokeAsync(() => ProcessCounts(counts));
}
}
finally
{
_isFetching = false;
}
}
private Dictionary<string, TileCounts> RetrieveCountsAsync()
{
var communication = cFasdCockpitCommunicationBase.Instance;
if (communication == null)
return null;
var result = new Dictionary<string, TileCounts>(StringComparer.OrdinalIgnoreCase);
foreach (var key in OverviewKeys)
{
var personalTask = communication.GetTicketOverviewRelations(key, useRoleScope: false, count: 0);
var roleTask = communication.GetTicketOverviewRelations(key, useRoleScope: true, count: 0);
Task.WaitAll(personalTask, roleTask);
int personalCount = personalTask.Result?.Count ?? 0;
int roleCount = roleTask.Result?.Count ?? 0;
if (_isDemo)
{
personalCount += GetDemoRelationCount(key, useRoleScope: false);
roleCount += GetDemoRelationCount(key, useRoleScope: true);
}
result[key] = new TileCounts(personalCount, roleCount);
}
return result;
}
private void ProcessCounts(Dictionary<string, TileCounts> newCounts)
{
var changes = new List<TileCountChange>();
bool hasPrevious = _currentCounts.Values.Any(tc => tc.Personal > 0 || tc.Role > 0);
foreach (var key in OverviewKeys)
{
var previous = _currentCounts[key];
var current = newCounts.TryGetValue(key, out var value) ? value : TileCounts.Empty;
if (previous.Personal != current.Personal)
{
changes.Add(new TileCountChange(key, TileScope.Personal, previous.Personal, current.Personal));
}
if (previous.Role != current.Role)
{
changes.Add(new TileCountChange(key, TileScope.Role, previous.Role, current.Role));
}
_currentCounts[key] = current;
}
if (!hasPrevious)
return;
if (changes.Count == 0)
return;
var args = new TicketOverviewCountsChangedEventArgs(changes, new Dictionary<string, TileCounts>(_currentCounts));
var args = new TicketOverviewCountsChangedEventArgs(changes, new Dictionary<string, TileCounts>(_currentCounts, StringComparer.OrdinalIgnoreCase));
OverviewCountsChanged?.Invoke(this, args);
}
@@ -347,6 +540,7 @@ namespace FasdDesktopUi.Basics.Services
private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record)
{
var activityType = ResolveDemoActivityType(record?.ActivityType);
var relation = new cF4sdApiSearchResultRelation
{
Type = enumF4sdSearchResultClass.Ticket,
@@ -361,7 +555,7 @@ namespace FasdDesktopUi.Basics.Services
["UserDisplayName"] = record.UserDisplayName ?? string.Empty,
["UserAccount"] = record.UserAccount ?? string.Empty,
["UserDomain"] = record.UserDomain ?? string.Empty,
[DemoTicketDetailsKey] = bool.TrueString
["ActivityType"] = activityType
},
Identities = new cF4sdIdentityList
{
@@ -373,6 +567,13 @@ namespace FasdDesktopUi.Basics.Services
return relation;
}
private static string ResolveDemoActivityType(string configuredActivityType)
{
return string.IsNullOrWhiteSpace(configuredActivityType)
? null
: configuredActivityType.Trim();
}
private DemoTicketDetail CloneDetail(DemoTicketDetail source)
{
if (source == null)
@@ -383,7 +584,6 @@ namespace FasdDesktopUi.Basics.Services
AffectedUser = source.AffectedUser,
Asset = source.Asset,
Category = source.Category,
Classification = source.Classification,
Description = source.Description,
DescriptionHtml = source.DescriptionHtml,
Priority = source.Priority,
@@ -548,6 +748,7 @@ namespace FasdDesktopUi.Basics.Services
TicketId = relationId,
TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey,
UseRoleScope = template.UseRoleScope,
ActivityType = ResolveDemoActivityType(template.ActivityType),
DisplayName = displayName,
Summary = summary,
StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId,
@@ -577,22 +778,41 @@ namespace FasdDesktopUi.Basics.Services
return 0;
}
private void ScheduleFetchRetry()
private void ScheduleFetchRetry(TileScope scope)
{
if (_fetchRetryPending)
if (!_isEnabled)
return;
_fetchRetryPending = true;
lock (_retryScopes)
{
_retryScopes.Add(scope);
if (_retryScheduled)
return;
_retryScheduled = true;
}
_ = _dispatcher.InvokeAsync(async () =>
{
try
{
await Task.Delay(250).ConfigureAwait(false);
await FetchAsync().ConfigureAwait(false);
}
finally
await Task.Delay(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
TileScope[] scopes;
lock (_retryScopes)
{
_fetchRetryPending = false;
scopes = _retryScopes.ToArray();
_retryScopes.Clear();
_retryScheduled = false;
}
foreach (var pendingScope in scopes)
{
await FetchAsync(pendingScope).ConfigureAwait(false);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[TicketOverview] Retry scheduling failed: {ex}");
}
}, DispatcherPriority.Background);
}

View File

@@ -7,6 +7,7 @@ using System.Windows.Documents;
using System.Linq;
using System.Windows.Input;
using System.Diagnostics;
using System.Windows.Threading;
using C4IT.FASD.Base;
using C4IT.Logging;
@@ -26,6 +27,8 @@ using Newtonsoft.Json;
using FasdDesktopUi.Basics.Services.ProtocollService;
using FasdDesktopUi.Basics.Services.SupportCase;
using FasdDesktopUi.Basics.Services.RelationService;
using FasdDesktopUi.Basics.Services.SupportCase.Controllers;
using C4IT.F4SD.SupportCaseProtocoll.Models;
namespace FasdDesktopUi.Basics
@@ -100,7 +103,7 @@ namespace FasdDesktopUi.Basics
QuickActionProtocollHelper = new cQuickActionProtocollHelper(this);
}
public static async Task<cSupportCaseDataProvider> GetDataProviderForAsync(List<cF4sdApiSearchResultRelation> storedRelations, cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService)
public static async Task<cSupportCaseDataProvider> GetDataProviderForAsync(cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService)
{
try
{
@@ -111,6 +114,8 @@ namespace FasdDesktopUi.Basics
return null;
}
await EnsureUserIdentityForTicketAsync(selectedRelation);
// get the identities of the selected relation
var Identities = selectedRelation.Identities.Clone();
@@ -153,37 +158,62 @@ namespace FasdDesktopUi.Basics
DataProviders.Add(MainIdentity.Id, _result);
}
await EnsureSupportCasePagesAsync();
_result.NamedParameterEntries = new cNamedParameterList(_result);
_result.StartCase(MainIdentity.Id);
var supportCase = SupportCaseFactory.Get(MainIdentity, relationService, _result);
cSupportCaseDataProvider.detailsPage.SetSupportCase(supportCase);
cSupportCaseDataProvider.slimPage.SetSupportCase(supportCase);
var supportCaseProcessor = SupportCaseProcessorFactory.Get(MainIdentity.Id);
var supportCaseController = new SupportCaseController();
supportCaseProcessor.SetSupportCase(supportCase);
supportCaseController.SetSupportCaseProcessor(supportCaseProcessor, Identities);
if (cSupportCaseDataProvider.detailsPage == null || cSupportCaseDataProvider.slimPage == null)
{
LogEntry("Support case pages are not initialized; aborting case start.", LogLevels.Error);
return null;
}
cSupportCaseDataProvider.detailsPage.SetSupportCaseController(supportCaseController);
cSupportCaseDataProvider.slimPage.SetSupportCaseController(supportCaseController);
var Status = await _result.SetViewDataAsync(requiredInformationClasses, Identities, true);
cF4sdApiSearchResultRelation relationToFocus = GetRelationToFocus(selectedRelation, relationService.GetLoadedRelations());
// relation to focus may not have all identities
supportCaseController.UpdateFocusedCaseRelation(relationToFocus);
if (!Status)
return null;
var selectedHealthCard = _result.HealthCardDataHelper?.SelectedHealthCard;
if (selectedHealthCard != null)
_ = cHealthCard.GetRequiredTables(selectedHealthCard); // todo the healthcard is not selected at this point
if (detailsPage?.WidgetCollection != null)
detailsPage.WidgetCollection.WidgetDataList = supportCaseController.GetWidgetData();
if (detailsPage?.DataHistoryCollectionUserControl != null)
detailsPage.DataHistoryCollectionUserControl.HistoryDataList = supportCaseController.GetHistoryData();
if (detailsPage?.CustomizableSectionUc != null)
detailsPage.CustomizableSectionUc.ContainerCollections = supportCaseController.GetContainerData();
CurrentProvider = _result;
// start the direct connection
if (_result.DirectConnectionHelper.IsDirectConnectionActive is false)
_ = Task.Run(async () =>
{
try
{
await _result.DirectConnectionHelper.DirectConnectionStartAsync();
}
catch { }
});
// start the slim or detaild page
bool shouldSkipSlimView = Identities.Any(identity => identity.Class is enumFasdInformationClass.Ticket) || cFasdCockpitConfig.Instance.Global.ShouldSkipSlimView;
bool shouldSkipSlimView = (Identities?.Any(identity => identity.Class is enumFasdInformationClass.Ticket) ?? false)
|| (cFasdCockpitConfig.Instance?.Global?.ShouldSkipSlimView ?? false);
if (shouldSkipSlimView)
{
cSupportCaseDataProvider.detailsPage?.Show();
cSupportCaseDataProvider.slimPage?.Hide();
}
else
cSupportCaseDataProvider.slimPage.Show();
{
cSupportCaseDataProvider.slimPage?.Show();
cSupportCaseDataProvider.detailsPage?.Hide();
}
return _result;
}
@@ -194,6 +224,30 @@ namespace FasdDesktopUi.Basics
return null;
}
private static cF4sdApiSearchResultRelation GetRelationToFocus(cF4sdApiSearchResultRelation selectedRelation, IEnumerable<cF4sdApiSearchResultRelation> loadedRelations)
{
try
{
if (selectedRelation.Type != enumF4sdSearchResultClass.User)
return selectedRelation;
cF4sdIdentityEntry alternativeIdentity = selectedRelation.Identities.FirstOrDefault(i => i.Class != enumFasdInformationClass.User);
cF4sdApiSearchResultRelation relationToFocus = loadedRelations.FirstOrDefault(r => r.id == alternativeIdentity?.Id && cF4sdIdentityEntry.GetFromSearchResult(r.Type) == alternativeIdentity.Class);
if (relationToFocus is null)
return selectedRelation;
relationToFocus.Identities = selectedRelation.Identities.Clone();
return relationToFocus;
}
catch (Exception ex)
{
LogException(ex);
}
return selectedRelation;
}
public void StartCase(Guid userId)
{
var CM = MethodBase.GetCurrentMethod();
@@ -244,6 +298,104 @@ namespace FasdDesktopUi.Basics
}
}
private static async Task EnsureSupportCasePagesAsync()
{
if (detailsPage != null && slimPage != null)
return;
if (Application.Current == null)
return;
await Application.Current.Dispatcher.InvokeAsync(() =>
{
if (slimPage == null)
slimPage = new Pages.SlimPage.SlimPageView();
if (detailsPage == null)
detailsPage = new Pages.DetailsPage.DetailsPageView();
}, DispatcherPriority.Normal);
}
private static async Task EnsureUserIdentityForTicketAsync(cF4sdApiSearchResultRelation relation)
{
if (relation == null || relation.Type != enumF4sdSearchResultClass.Ticket)
return;
if (relation.Identities == null)
relation.Identities = new cF4sdIdentityList();
var existingUsers = relation.Identities
.Where(identity => identity.Class == enumFasdInformationClass.User)
.ToList();
Guid userId = Guid.Empty;
if (relation.Infos != null)
{
if (relation.Infos.TryGetValue("Sids", out var sidsValue) ||
relation.Infos.TryGetValue("UserSid", out sidsValue))
{
var sids = sidsValue?.Split(',')
.Select(v => v.Trim())
.Where(v => !string.IsNullOrWhiteSpace(v))
.ToList();
if (sids != null && sids.Count > 0)
{
var communication = cFasdCockpitCommunicationBase.Instance;
if (communication != null)
{
relation.Infos.TryGetValue("UserDisplayName", out var userDisplayName);
var result = await communication.GetUserSearchResults(userDisplayName, sids);
var user = result?.Values?.FirstOrDefault()?.FirstOrDefault();
if (user != null)
userId = user.id;
}
}
}
if (userId == Guid.Empty && relation.Infos.TryGetValue("UserAccount", out var userAccount))
{
relation.Infos.TryGetValue("UserDomain", out var userDomain);
if (!string.IsNullOrWhiteSpace(userAccount))
{
var communication = cFasdCockpitCommunicationBase.Instance;
if (communication != null)
{
userId = await communication.GetUserIdByAccount(userAccount, userDomain ?? string.Empty);
}
}
}
if (userId == Guid.Empty)
{
if (relation.Infos.TryGetValue("UserId", out var userIdString) ||
relation.Infos.TryGetValue("UserGuid", out userIdString) ||
relation.Infos.TryGetValue("UserIdentityId", out userIdString))
{
Guid.TryParse(userIdString, out userId);
}
}
}
if (userId == Guid.Empty)
return;
if (existingUsers.Count == 0 || existingUsers.Any(identity => identity.Id != userId))
{
relation.Identities.RemoveAll(identity => identity.Class == enumFasdInformationClass.User);
relation.Identities.Add(new cF4sdIdentityEntry
{
Class = enumFasdInformationClass.User,
Id = userId
});
}
if (relation.Infos == null)
relation.Infos = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
relation.Infos["UserId"] = userId.ToString();
relation.Infos["UserGuid"] = userId.ToString();
}
public async Task CloseCaseAsync()
{
var CM = MethodBase.GetCurrentMethod();
@@ -452,35 +604,12 @@ namespace FasdDesktopUi.Basics
}
}
var isOk = await HealthCardDataHelper.LoadingHelper.GetHealthCardRawDataAsync(new cF4sdHealthCardRawDataRequest()
{
Identities = Identities,
Tables = requiredTables.ToList(),
MaxAge = cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.SearchResultAge ?? 14
});
if (isNewCase)
HealthCardDataHelper.LoadingHelper.LastDataRequest = DateTime.Now;
if (isOk == false)
{
string identityString = "";
foreach (var identity in Identities)
{
identityString += "\n" + identity.Id + " (Type: " + identity.Class + ")";
}
LogEntry($"Error trying to receive healthcard data for following identities: {identityString}", LogLevels.Error);
CustomMessageBox.Show($"Error trying to receive healthcard data for following identities: {identityString}", "Data Error", enumHealthCardStateLevel.Error);
return false;
}
var slimPageData = await HealthCardDataHelper.SlimCard.GetDataAsync();
var detailsPageData = await HealthCardDataHelper.DetailPage.GetDataAsync();
slimPage?.SetPropertyValues(slimPageData);
detailsPage?.SetPropertyValues(detailsPageData);
return true;
}
@@ -543,12 +672,6 @@ namespace FasdDesktopUi.Basics
ComputerRemoved |= relationIdentity.Class == enumFasdInformationClass.Computer;
ComputerAdded |= relationIdentity.Class == enumFasdInformationClass.Computer;
}
relationIdentity.CopyTo(existingIdentity);
}
else
{
Identities.Add(relationIdentity.CreateCopy());
ComputerAdded |= relationIdentity.Class == enumFasdInformationClass.Computer;
}
}
@@ -561,16 +684,6 @@ namespace FasdDesktopUi.Basics
var searchResultInfoClass = cF4sdIdentityEntry.GetFromSearchResult(searchResultRelation.Type);
await SetViewDataAsync(new List<enumFasdInformationClass>() { searchResultInfoClass }, Identities, false);
if (ComputerAdded)
_ = Task.Run(async () =>
{
try
{
await DirectConnectionHelper.DirectConnectionStartAsync();
}
catch { }
});
}
catch (Exception E)
{

View File

@@ -1,24 +1,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.UserControls;
using FasdDesktopUi.Basics.Services.SupportCase.Controllers;
using FasdDesktopUi.Pages.DetailsPage;
using FasdDesktopUi.Pages.DetailsPage.UserControls;
using static C4IT.Logging.cLogManager;
@@ -26,11 +13,14 @@ namespace FasdDesktopUi.Basics.UiActions
{
public class cChangeHealthCardAction : cUiActionBase
{
private readonly SupportCaseController _supportCaseController;
public cF4sdApiSearchResultRelation ResultRelation { get; private set; } = null;
public cChangeHealthCardAction(cF4sdApiSearchResultRelation resultRelation)
public cChangeHealthCardAction(cF4sdApiSearchResultRelation resultRelation, SupportCaseController supportCaseController)
{
ResultRelation = resultRelation;
_supportCaseController = supportCaseController;
}
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
@@ -52,6 +42,8 @@ namespace FasdDesktopUi.Basics.UiActions
detailsPage.NavigationHeadingUc.ResetSelectors();
await dataProvider.ExchangeCaseIdentitiesAsync(ResultRelation);
_supportCaseController.UpdateFocusedCaseRelation(ResultRelation);
detailsPage.UpdateHealthcardSectionVisibilities();
return true;
}

View File

@@ -34,17 +34,17 @@ namespace FasdDesktopUi.Basics.UiActions
private string Recommendation { get; set; }
private cHealthCardDetailsTable ValuedDetailsData = null;
private readonly cHealthCardDetailsTable _valuedDetailsData = null;
public cShowDetailedDataAction(cHealthCardStateBase StateDefinition, int DayIndex = 0, cHealthCardDetailsTable ValuedDetailsData = null)
public cShowDetailedDataAction(cHealthCardStateBase stateDefinition, int dayIndex = 0, cHealthCardDetailsTable valuedDetailsData = null)
{
this.StateDefinition = StateDefinition;
this.DayIndex = DayIndex;
this.DetailsTitle = StateDefinition.Names.GetValue();
this.Recommendation = StateDefinition.Descriptions.GetValue();
if (this.Recommendation == String.Empty)
this.Recommendation = null;
this.ValuedDetailsData = ValuedDetailsData;
StateDefinition = stateDefinition;
DayIndex = dayIndex;
DetailsTitle = stateDefinition.Names.GetValue();
Recommendation = stateDefinition.Descriptions.GetValue();
if (Recommendation == string.Empty)
Recommendation = null;
_valuedDetailsData = valuedDetailsData;
}
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
@@ -61,7 +61,7 @@ namespace FasdDesktopUi.Basics.UiActions
if (StateDefinition.Details is cHealthCardDetailsValued)
{
if (ValuedDetailsData == null)
if (_valuedDetailsData == null)
return false;
}
else
@@ -240,26 +240,37 @@ namespace FasdDesktopUi.Basics.UiActions
private cDetailedDataModel GetValuedDataModel()
{
if (!(StateDefinition.Details is cHealthCardDetailsValued _details) || ValuedDetailsData == null)
if (!(StateDefinition.Details is cHealthCardDetailsValued details) || _valuedDetailsData == null)
return null;
if (ValuedDetailsData.Columns.Count > 1)
var _colCount = details.Count;
if (_colCount == 0)
return null;
var _rowHeadings = _details.Select(v => v.Names.GetValue() as object).ToList();
var rowHeadings = details.Select(v => (object)v.Names.GetValue()).ToList();
cDetailedDataModel output = new cDetailedDataModel()
{
Heading = StateDefinition.Names.GetValue(),
FullDetailedData = new List<object>(),
HasColumnHeaders = _rowHeadings.Count > 1
HasColumnHeaders = _colCount > 1
};
if (_rowHeadings.Count > 1)
output.FullDetailedData.Add(_rowHeadings);
if (rowHeadings.Count > 1)
output.FullDetailedData.Add(rowHeadings);
var _data = ValuedDetailsData.Values[0];
var _data = _valuedDetailsData.Values[0];
foreach (var _row in _data)
output.FullDetailedData.Add(new List<object>() { _row[0] });
{
var _rowValues = new List<object>();
for (int i = 0; i < _colCount; i++)
{
_rowValues.Add(_row[i]);
}
output.FullDetailedData.Add(_rowValues);
}
var _json = Newtonsoft.Json.JsonConvert.SerializeObject(output);
return output;
}
@@ -307,7 +318,7 @@ namespace FasdDesktopUi.Basics.UiActions
var valueProcessing = splitColumnName.Length > 1 ? splitColumnName[1] : null;
rawColumnIndexes.Add(rawColumnIndex);
displayTypes.Add(cUtility.GetRawValueType(displayType));
displayTypes.Add(displayType);
valueProcessings.Add(valueProcessing);
}
@@ -326,7 +337,8 @@ namespace FasdDesktopUi.Basics.UiActions
shouldHideRow = true;
}
cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultCulture(new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
foreach (var index in rawColumnIndexes)
{
@@ -366,6 +378,8 @@ namespace FasdDesktopUi.Basics.UiActions
output.FullDetailedData.Add(displayValuesOfRow);
}
var _json = Newtonsoft.Json.JsonConvert.SerializeObject(output);
return output;
}
catch (Exception E)

View File

@@ -5,6 +5,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.MultiLanguage;
@@ -135,8 +136,10 @@ namespace FasdDesktopUi.Basics.UiActions
StatusMonitor.QuickActionOutputs.Add(_ref.Output);
quickActionOutput = QuickActionStatusMonitor.cQuickActionOutput.GetQuickActionOutput(_ref.Output, DataProvider);
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(quickActionDemo, DataProvider, true, quickActionOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(quickActionDemo, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(quickActionDemo, DataProvider, true, quickActionOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(quickActionDemo, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
_msg = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull");
}

View File

@@ -6,6 +6,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
@@ -154,9 +155,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(LocalQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
string quickActionStatus;
switch (ResultRevision.Status)
@@ -193,8 +195,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(LocalQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
output = new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
}

View File

@@ -1,4 +1,5 @@
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.MultiLanguage;
@@ -124,8 +125,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(LocalQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
}
@@ -141,8 +144,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage;
protocollOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.error, ErrorDescription = cMultiLanguageSupport.GetItem("QuickAction.Copy.Output.Cancel") });
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(LocalQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
cMultiLanguageSupport.CurrentLanguage = tempLang;
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };

View File

@@ -58,7 +58,7 @@ namespace FasdDesktopUi.Basics.UiActions
}
}
HistoryEntry.isSeen = true;
dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(RelationEntry.Relations, RelationEntry.SelectedRelation, relationService);
dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(RelationEntry.SelectedRelation, relationService);
if (dataProvider is null)
{
Debug.Assert(true, "Could not start a data provider for the selected criterias.");

View File

@@ -1,11 +1,13 @@
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Services.RelationService;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using static C4IT.Logging.cLogManager;
@@ -23,7 +25,7 @@ namespace FasdDesktopUi.Basics.UiActions
public cUiProcessSearchRelationAction(cSearchHistorySearchResultEntry searchHistoryEntry, cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService, ISearchUiProvider searchUiProvider)
{
Name = $"{searchHistoryEntry.HeaderText} → {selectedRelation.DisplayName}";
Name = !string.IsNullOrWhiteSpace(selectedRelation.DisplayName) ? $"{searchHistoryEntry.HeaderText} → {selectedRelation.DisplayName}" : searchHistoryEntry.HeaderText;
_selectedSearchResult = searchHistoryEntry.SelectedSearchResult;
_relations = searchHistoryEntry.Relations;
_selectedRelation = selectedRelation;
@@ -32,7 +34,7 @@ namespace FasdDesktopUi.Basics.UiActions
_searchHistoryEntry = searchHistoryEntry;
}
public cUiProcessSearchRelationAction(string name, List<cFasdApiSearchResultEntry> selectedSearchResult, List<cF4sdApiSearchResultRelation> relations, cF4sdApiSearchResultRelation selectedRelation, ISearchUiProvider searchUiProvider, cSearchHistoryEntryBase searchHistoryEntry)
public cUiProcessSearchRelationAction(string name, List<cFasdApiSearchResultEntry> selectedSearchResult, List<cF4sdApiSearchResultRelation> relations, cF4sdApiSearchResultRelation selectedRelation, ISearchUiProvider searchUiProvider, cSearchHistoryEntryBase searchHistoryEntry, IRelationService relationService)
{
Name = name;
_selectedSearchResult = selectedSearchResult;
@@ -40,6 +42,7 @@ namespace FasdDesktopUi.Basics.UiActions
_selectedRelation = selectedRelation;
_searchUiProvider = searchUiProvider;
_searchHistoryEntry = searchHistoryEntry;
_relationService = relationService;
}
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
@@ -65,6 +68,9 @@ namespace FasdDesktopUi.Basics.UiActions
return false;
}
if (TicketDeepLinkHelper.TryOpenTicketRelationExternally(_selectedRelation))
return false;
// check, if have an active support case
var supportCaseActive = dataProvider?.IsActive ?? false;
@@ -84,10 +90,15 @@ namespace FasdDesktopUi.Basics.UiActions
return false;
}
// set the new result menu properies for loading ....
_seachHistoryEntry.isSeen = true;
// get the new data provider for the support call informations (get it from the cache or create a new one)
dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(_relations, _selectedRelation, _relationService);
dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(_selectedRelation, _relationService);
bool shouldLoadRelationsForSelectedRelation = _selectedRelation.Type == enumF4sdSearchResultClass.User;
if (shouldLoadRelationsForSelectedRelation)
StartLoadingRelationsFor(_selectedRelation);
if (dataProvider is null)
{
@@ -106,5 +117,26 @@ namespace FasdDesktopUi.Basics.UiActions
return false;
}
private void StartLoadingRelationsFor(cF4sdApiSearchResultRelation selectedRelation)
{
try
{
var relationsToReload = new List<cFasdApiSearchResultEntry>() { new cFasdApiSearchResultEntry()
{
DisplayName = selectedRelation.DisplayName,
id = selectedRelation.id,
Infos = selectedRelation.Infos,
Name = selectedRelation.Name,
Status = selectedRelation.Status,
Type = selectedRelation.Type
} };
_ = Task.Run(async () => _relationService.LoadRelationsAsync(relationsToReload), CancellationToken.None);
}
catch (Exception ex)
{
LogException(ex);
}
}
}
}

View File

@@ -24,6 +24,8 @@ namespace FasdDesktopUi.Basics.UiActions
private readonly List<cF4sdApiSearchResultRelation> _loadedRelations = new List<cF4sdApiSearchResultRelation>();
private readonly TaskCompletionSource<bool> _isSearchUnambigous = new TaskCompletionSource<bool>();
private IRelationService _relationService = null;
public cF4sdApiSearchResultRelation PreSelectedSearchRelation { get; set; } = null;
public cUiProcessSearchResultAction(string name, ISearchUiProvider searchUiProvider, List<cFasdApiSearchResultEntry> searchResults)
@@ -89,12 +91,12 @@ namespace FasdDesktopUi.Basics.UiActions
Mouse.OverrideCursor = null;
if (MatchPreselectedSearchRelation(_loadedRelations))
return await ProcessSearchResultRelationAsync(_searchResults.First().Name, _loadedRelations, PreSelectedSearchRelation);
if (await _isSearchUnambigous.Task)
return await ProcessSearchResultRelationAsync(_searchResults.First().Name, _loadedRelations, _loadedRelations.FirstOrDefault());
if (MatchPreselectedSearchRelation(_loadedRelations))
return await ProcessSearchResultRelationAsync(_searchResults.First().Name, _loadedRelations, PreSelectedSearchRelation);
return true;
}
catch (Exception ex)
@@ -115,10 +117,10 @@ namespace FasdDesktopUi.Basics.UiActions
private async Task<bool> ProcessSearchResultRelationAsync(string name, List<cF4sdApiSearchResultRelation> caseRelations, cF4sdApiSearchResultRelation selectedRelation)
{
var relationSearchResult = new cSearchHistorySearchResultEntry(_searchResults.FirstOrDefault().DisplayName, _searchResults.FirstOrDefault().DisplayName, _searchResults, caseRelations, _searchUiProvider);
string displayName = selectedRelation != null ? $"{name} → {selectedRelation.Name}" : name;
string displayName = !string.IsNullOrWhiteSpace(selectedRelation?.Name) ? $"{name} → {selectedRelation.Name}" : name;
cUiProcessSearchRelationAction action
= new cUiProcessSearchRelationAction(displayName, _searchResults, caseRelations, caseRelations.FirstOrDefault(), _searchUiProvider, relationSearchResult)
= new cUiProcessSearchRelationAction(displayName, _searchResults, caseRelations, selectedRelation, _searchUiProvider, relationSearchResult, _relationService)
{
DisplayType = enumActionDisplayType.enabled,
};
@@ -155,6 +157,7 @@ namespace FasdDesktopUi.Basics.UiActions
try
{
_loadedRelations.AddRange(e.StagedResultRelations.Relations);
_relationService = e.RelationService;
if (!e.StagedResultRelations.IsComplete)
return;

View File

@@ -0,0 +1,34 @@
using System;
using System.Threading.Tasks;
using System.Windows;
using C4IT.FASD.Base;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UiActions
{
public sealed class cUiProcessTicketOverviewRelationAction : cUiActionBase
{
private readonly Func<Task> _runAsync;
public cUiProcessTicketOverviewRelationAction(string name, Func<Task> runAsync)
{
Name = name;
_runAsync = runAsync;
}
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
{
try
{
if (_runAsync != null)
await _runAsync();
}
catch (Exception ex)
{
LogException(ex);
}
return false;
}
}
}

View File

@@ -45,6 +45,7 @@ namespace FasdDesktopUi.Basics.UiActions
return;
cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
shouldRunImmidiate = QuickActionConfig.RunImmediate;
Description = QuickActionConfig.Descriptions?.GetValue(Default: null);

View File

@@ -27,12 +27,12 @@ namespace FasdDesktopUi.Basics.UiActions
_quickTip = quickTip;
}
public override Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
{
try
{
if (!(UiLocation is QuickTipStatusMonitor quickTipStatusMonitor))
return Task.FromResult(false);
return false;
DataProvider = dataProvider;
@@ -49,13 +49,13 @@ namespace FasdDesktopUi.Basics.UiActions
quickTipStatusMonitor.Visibility = Visibility.Visible;
return Task.FromResult(true);
return true;
}
catch (Exception E)
{
LogException(E);
}
return Task.FromResult(false);
return false;
}
private void CreateElementData()

View File

@@ -1,4 +1,5 @@
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
@@ -137,9 +138,10 @@ namespace FasdDesktopUi.Basics.UiActions
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, RemoteQuickAction.Name, enumActionStepType.running, status);
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, RemoteQuickAction.Name, enumActionStepType.main, status);
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(RemoteQuickAction, DataProvider, true, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(RemoteQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(RemoteQuickAction, DataProvider, true, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(RemoteQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
}
else
{
@@ -155,8 +157,11 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(RemoteQuickAction, DataProvider, true, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(RemoteQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(RemoteQuickAction, DataProvider, true, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(RemoteQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
}
@@ -241,7 +246,7 @@ namespace FasdDesktopUi.Basics.UiActions
{
Id = measure.Id,
Names = measureDefinition.Names,
Display = cUtility.GetRawValueType(measureDefinition.Display),
Display = measureDefinition.Display,
Value = measure.Value,
PostValue = measure.PostValue
});

View File

@@ -1,4 +1,5 @@
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
@@ -170,8 +171,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(ServerQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(ServerQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
string quickActionStatus;
switch (ResultRevision.Status)
@@ -208,8 +211,10 @@ namespace FasdDesktopUi.Basics.UiActions
cMultiLanguageSupport.CurrentLanguage = tempLang;
}
cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(ServerQuickAction, copyData));
cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues);
QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(ServerQuickAction, copyData);
F4SDProtocoll.Instance.Add(protocollEntry);
output = new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
}

View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using C4IT.Logging;
using FasdDesktopUi.Pages.RawHealthCardValuesPage;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UiActions
{
public class UiShowRawHealthcardValues : cUiActionBase
{
public override async Task<bool> RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _rawValueWindow = new RawHealthCardValuesPage();
_rawValueWindow.Show();
return true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return false;
}
}
}

View File

@@ -0,0 +1,27 @@
<UserControl x:Class="FasdDesktopUi.Basics.UserControls.Badge"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FasdDesktopUi.Basics.UserControls"
xmlns:ico="clr-namespace:FasdDesktopUi.Basics.UserControls.AdaptableIcon;assembly=F4SD-AdaptableIcon"
mc:Ignorable="d"
d:DesignHeight="20"
d:DesignWidth="40"
x:Name="BadgeControl">
<Border Background="{DynamicResource Color.F4SD}"
CornerRadius="5">
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal"
Margin="7.5 2.5">
<TextBlock FontSize="12"
FontWeight="Bold"
Foreground="White"
Text="{Binding ElementName=BadgeControl, Path=Text}" />
</StackPanel>
</Border>
</UserControl>

View File

@@ -0,0 +1,27 @@
using F4SD_AdaptableIcon;
using FasdDesktopUi.Basics.Helper;
using System;
using System.Windows;
using System.Windows.Controls;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls
{
public partial class Badge : UserControl
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register(nameof(Text), typeof(string), typeof(Badge), new PropertyMetadata("Beta"));
public Badge()
{
InitializeComponent();
}
}
}

View File

@@ -1,5 +1,6 @@
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
@@ -129,6 +130,19 @@ namespace FasdDesktopUi.Basics.UserControls
#endregion
#region RestoreParentScrollFocusOnDropDownClose
public bool RestoreParentScrollFocusOnDropDownClose
{
get { return (bool)GetValue(RestoreParentScrollFocusOnDropDownCloseProperty); }
set { SetValue(RestoreParentScrollFocusOnDropDownCloseProperty, value); }
}
public static readonly DependencyProperty RestoreParentScrollFocusOnDropDownCloseProperty =
DependencyProperty.Register("RestoreParentScrollFocusOnDropDownClose", typeof(bool), typeof(ComboBoxPageable), new PropertyMetadata(false));
#endregion
#region ItemData
public ObservableCollection<KeyValuePair<string, object>> ItemData
@@ -306,6 +320,28 @@ namespace FasdDesktopUi.Basics.UserControls
{
timer.Stop();
cFocusInvoker.InvokeLostFocus(this, e);
if (RestoreParentScrollFocusOnDropDownClose)
{
_ = Dispatcher.BeginInvoke((Action)(() =>
{
try
{
var parentScrollViewer = cUiElementHelper.GetFirstParentOfType<ScrollViewer>(this);
Keyboard.ClearFocus();
if (parentScrollViewer != null)
{
parentScrollViewer.Focus();
Keyboard.Focus(parentScrollViewer);
}
}
catch (Exception exception)
{
LogException(exception);
}
}), System.Windows.Threading.DispatcherPriority.Input);
}
}
private void ComboBoxControl_DropDownOpened(object sender, EventArgs e)

View File

@@ -169,6 +169,18 @@ namespace FasdDesktopUi.Basics.UserControls
{
SearchRelationGrid.Visibility = Visibility.Visible;
if (searchRelationMenuData.LastUsed == DateTime.MinValue)
{
LessThanTextBlock.Text= string.Empty;
LessThanTextBlock.Visibility = Visibility.Collapsed;
LastSeenTextBox.Visibility = Visibility.Collapsed;
ActivityIndicator.Width = 0;
ActivityIndicator.Visibility = Visibility.Collapsed;
ActivityTextBlock.Visibility = Visibility.Collapsed;
}
else
{
var lastUsedTimeSpan = DateTime.UtcNow - searchRelationMenuData.LastUsed;
LanguageDefinitionsConverter valueConverter = new LanguageDefinitionsConverter();
string lastSeenText = null;
@@ -181,8 +193,14 @@ namespace FasdDesktopUi.Basics.UserControls
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalMinutes), null, "Searchbar.LessThan.Min", null) as string;
LessThanTextBlock.Text = lastSeenText;
LessThanTextBlock.Visibility = Visibility.Visible;
LastSeenTextBox.Visibility = Visibility.Visible;
ActivityIndicator.Width = Math.Max(ActivityIndicator.Width * relationData.UsingLevel, ActivityIndicator.Width * 0.1);
ActivityIndicator.Visibility = Visibility.Visible;
ActivityTextBlock.Visibility = Visibility.Visible;
}
}
}

View File

@@ -23,12 +23,6 @@
Visibility="{Binding ElementName=DataCanvasUc, Path=IsDetailedLayout, Converter={StaticResource BoolToVisibility}}"
IsCloseButtonVisible="{Binding ElementName=DataCanvasUc, Path=DataCanvasData, Converter={StaticResource IsCloseButtonVisible}, ConverterParameter={x:Static converter:enumDataCanvasTypes.detailedData} }" />
<local:DetailedChart x:Name="DetailedChartUc"
HorizontalAlignment="Stretch"
Width="385"
Visibility="{Binding ElementName=DataCanvasUc, Path=IsDetailedLayout, Converter={StaticResource BoolToVisibility}}"
IsCloseButtonVisible="{Binding ElementName=DataCanvasUc, Path=DataCanvasData, Converter={StaticResource IsCloseButtonVisible}, ConverterParameter={x:Static converter:enumDataCanvasTypes.detailedData} }" />
<local:DynamicChart x:Name="DynamicChartUc"
HorizontalAlignment="Stretch"
Width="385"

View File

@@ -72,20 +72,16 @@ namespace FasdDesktopUi.Basics.UserControls
{
_me.DetailedDataUc.DetailedInformationData = _me.DataCanvasData.DetailedData;
_me.DetailedDataUc.CloseButtonClickedAction = _me.CloseDataCanvas;
_me.DetailedChartUc.ChartData = null;
_me.DynamicChartUc.ChartData = null;
}
else if (_me.DataCanvasData.ChartData is null)
{
_me.DetailedChartUc.ChartData = _me.DataCanvasData.DetailedChartData;
_me.DynamicChartUc.ChartData = null;
_me.DetailedDataUc.DetailedInformationData = null;
_me.DetailedChartUc.CloseButtonClickedAction = _me.CloseDataCanvas;
}
else
{
_me.DynamicChartUc.ChartData = _me.DataCanvasData.ChartData;
_me.DetailedChartUc.ChartData = null;
_me.DetailedDataUc.DetailedInformationData = null;
_me.DynamicChartUc.CloseButtonClickedAction = _me.CloseDataCanvas;
}
@@ -169,7 +165,6 @@ namespace FasdDesktopUi.Basics.UserControls
public DataCanvas()
{
InitializeComponent();
DetailedChartUc.Visibility = Visibility.Visible;
}
public DataCanvas(bool drawInScrollViewer)
@@ -186,6 +181,11 @@ namespace FasdDesktopUi.Basics.UserControls
}
private async void HealthCardDataHelper_DataRefreshed(object sender, EventArgs e)
{
await UpdateDataAsync();
}
internal async Task UpdateDataAsync()
{
try
{

View File

@@ -555,21 +555,34 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
public void SetValuesLineGraph()
{
try
{
double oneDayMs = TimeSpan.FromDays(1).TotalMilliseconds;
double chartStartMs = 0;
double chartEndMs = oneDayMs;
foreach (var data in GraphicDataProperty)
{
DateTime dataTime = data.Time;
double dataValue = data.Value;
int dataDuration = data.Duration;
double time = dataTime.TimeOfDay.TotalMilliseconds;
double startMs = dataTime.TimeOfDay.TotalMilliseconds;
double endMs = startMs + dataDuration;
double xLeft = xCoordinate.GetCoordinate(time);
double xRight = xCoordinate.GetCoordinate(time + dataDuration);
if (startMs >= chartEndMs || endMs <= chartStartMs)
continue;
if (startMs < chartStartMs)
startMs = chartStartMs;
if (endMs > chartEndMs)
endMs = chartEndMs;
double xLeft = xCoordinate.GetCoordinate(startMs);
double xRight = xCoordinate.GetCoordinate(endMs);
double y = 0;
@@ -652,16 +665,30 @@ namespace FasdDesktopUi.Basics.UserControls
{
try
{
double oneDayMs = TimeSpan.FromDays(1).TotalMilliseconds;
double chartStartMs = 0;
double chartEndMs = oneDayMs;
foreach (var data in GraphicDataProperty)
{
DateTime dataTime = data.Time;
double dataValue = data.Value;
int dataDuration = data.Duration;
double time = dataTime.TimeOfDay.TotalMilliseconds;
double startMs = dataTime.TimeOfDay.TotalMilliseconds;
double endMs = startMs + dataDuration;
double xLeft = xCoordinate.GetCoordinate(time);
double xRight = xCoordinate.GetCoordinate(time + dataDuration);
if (startMs >= chartEndMs || endMs <= chartStartMs)
continue;
if (startMs < chartStartMs)
startMs = chartStartMs;
if (endMs > chartEndMs)
endMs = chartEndMs;
double xLeft = xCoordinate.GetCoordinate(startMs);
double xRight = xCoordinate.GetCoordinate(endMs);
double y = 0;

View File

@@ -1,4 +1,5 @@
using C4IT.F4SD.DisplayFormatting;
using C4IT.F4SD.SupportCaseProtocoll.Models;
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using F4SD_AdaptableIcon.Enums;
@@ -38,6 +39,7 @@ namespace FasdDesktopUi.Basics.UserControls
public cQuickActionOutput(cF4sdQuickActionRevision.cOutput scriptOutput)
{
_rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
_rawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
ErrorCode = scriptOutput.ErrorCode;
ErrorDescription = scriptOutput.ErrorDescription;
ResultCode = scriptOutput.ResultCode.GetValueOrDefault();
@@ -246,7 +248,7 @@ namespace FasdDesktopUi.Basics.UserControls
return veiledText;
if (outputFormatting.DisplayType != null)
output = _rawValueFormatter.GetDisplayValue(Value, cUtility.GetRawValueType(outputFormatting.DisplayType.Value));
output = _rawValueFormatter.GetDisplayValue(Value, outputFormatting.DisplayType.Value);
if (outputFormatting.Translation != null)
{
@@ -372,7 +374,7 @@ namespace FasdDesktopUi.Basics.UserControls
return veiledText;
if (outputFormatting.DisplayType != null)
output = _rawValueFormatter.GetDisplayValue(selectedItem.Value, cUtility.GetRawValueType(outputFormatting.DisplayType.Value));
output = _rawValueFormatter.GetDisplayValue(selectedItem.Value, outputFormatting.DisplayType.Value);
if (outputFormatting.Translation != null)
{
@@ -464,7 +466,7 @@ namespace FasdDesktopUi.Basics.UserControls
return veiledText;
if (outputFormatting.DisplayType != null)
output = _rawValueFormatter.GetDisplayValue(Values[row][column].Value, cUtility.GetRawValueType(outputFormatting.DisplayType.Value));
output = _rawValueFormatter.GetDisplayValue(Values[row][column].Value, outputFormatting.DisplayType.Value);
if (outputFormatting.Translation != null)
{
@@ -803,6 +805,7 @@ namespace FasdDesktopUi.Basics.UserControls
return;
_rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage));
_rawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local);
for (int i = 0; i < measureValues.Count; i++)
{

View File

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

View File

@@ -8,7 +8,6 @@ using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls
{
@@ -22,6 +21,7 @@ namespace FasdDesktopUi.Basics.UserControls
private TextBox searchTextBox;
private TreeView treeViewControl;
private ScrollViewer itemsScrollViewer;
public ObservableCollection<HierarchicalSelectionItem> VisibleItems => visibleItems;
@@ -40,7 +40,6 @@ namespace FasdDesktopUi.Basics.UserControls
EnsureTemplateParts();
if (treeViewControl != null)
treeViewControl.ItemsSource = VisibleItems;
UpdateDisplaySelection();
}
#region DependencyProperties
@@ -63,7 +62,6 @@ namespace FasdDesktopUi.Basics.UserControls
{
control.RebuildLookup();
control.ApplyFilter(control.lastSearchText);
control.TryExpandToSelectedItem();
}
}
@@ -83,8 +81,8 @@ namespace FasdDesktopUi.Basics.UserControls
{
if (d is HierarchicalSelectionControl control)
{
control.LogSelectedItemChange(e.NewValue as HierarchicalSelectionItem);
control.TryExpandToSelectedItem();
control.SyncTreeSelectionWithSelectedItem(bringIntoView: false);
}
}
@@ -108,13 +106,15 @@ namespace FasdDesktopUi.Basics.UserControls
#endregion
#region UI Event Handling
private void ComboBoxControl_DropDownOpened(object sender, EventArgs e)
{
EnsureTemplateParts();
searchTextBox?.Focus();
searchTextBox?.SelectAll();
suppressTreeSelectionChanged = false;
LogEntry($"[CategoryPicker] DropDownOpened. Selected={SelectedItem?.FullPath ?? "<null>"}");
SyncTreeSelectionWithSelectedItem(bringIntoView: true);
DropDownOpened?.Invoke(this, e);
}
@@ -122,7 +122,6 @@ namespace FasdDesktopUi.Basics.UserControls
{
searchDelayTimer.Stop();
suppressTreeSelectionChanged = false;
LogEntry("[CategoryPicker] DropDownClosed");
DropDownClosed?.Invoke(this, e);
}
@@ -136,7 +135,6 @@ namespace FasdDesktopUi.Basics.UserControls
{
searchDelayTimer.Stop();
lastSearchText = searchTextBox?.Text ?? string.Empty;
LogEntry($"[CategoryPicker] Search text changed: '{lastSearchText}'");
ApplyFilter(lastSearchText);
}
@@ -151,7 +149,6 @@ namespace FasdDesktopUi.Basics.UserControls
if (original != null && !Equals(SelectedItem, original))
{
SelectedItem = original;
LogEntry($"[CategoryPicker] Tree selection changed: {original.FullPath}");
}
suppressTreeSelectionChanged = true;
@@ -159,6 +156,10 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
#endregion
#region Data Preparation and Filtering
private HierarchicalSelectionItem ResolveOriginalItem(HierarchicalSelectionItem item)
{
if (item == null)
@@ -202,6 +203,7 @@ namespace FasdDesktopUi.Basics.UserControls
}
TryExpandToSelectedItem();
SyncTreeSelectionWithSelectedItem(bringIntoView: false);
return;
}
@@ -219,6 +221,9 @@ namespace FasdDesktopUi.Basics.UserControls
clone.SetExpandedRecursive(true);
visibleItems.Add(clone);
}
// If the selected item is part of current results, keep it visually selected.
SyncTreeSelectionWithSelectedItem(bringIntoView: false);
}
private void TryExpandToSelectedItem()
@@ -237,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()
{
if (treeViewControl == null)
@@ -255,26 +355,54 @@ namespace FasdDesktopUi.Basics.UserControls
if (searchTextBox != null)
searchTextBox.TextChanged += SearchTextBox_TextChanged;
}
if (itemsScrollViewer == null)
{
itemsScrollViewer = ComboBoxControl.Template.FindName("PART_ItemsScrollViewer", ComboBoxControl) as ScrollViewer;
}
}
private void UpdateDisplaySelection()
private void ItemsScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
// Display handled by template TextBlock bound to SelectedItem.FullPath.
var scroller = itemsScrollViewer ?? sender as ScrollViewer;
if (scroller == null || scroller.ScrollableHeight <= 0)
return;
var lines = SystemParameters.WheelScrollLines;
if (lines < 0)
{
if (e.Delta < 0)
scroller.PageDown();
else
scroller.PageUp();
e.Handled = true;
return;
}
private void LogSelectedItemChange(HierarchicalSelectionItem newValue)
if (lines == 0)
{
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})";
scroller.ScrollToVerticalOffset(scroller.VerticalOffset - e.Delta);
e.Handled = true;
return;
}
LogEntry($"[CategoryPicker] DependencyProperty SelectedItem updated -> {description}");
var direction = e.Delta < 0 ? 1 : -1;
var stepCount = Math.Max(1, Math.Abs(e.Delta) / 120) * lines;
for (var i = 0; i < stepCount; i++)
{
if (direction > 0)
scroller.LineDown();
else
scroller.LineUp();
}
e.Handled = true;
}
#endregion
#region Keyboard
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
@@ -295,5 +423,7 @@ namespace FasdDesktopUi.Basics.UserControls
e.Handled = true;
}
}
#endregion
}
}

Some files were not shown because too many files have changed in this diff Show More