Compare commits
36 Commits
78dec5aa2c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7392454a63 | ||
|
|
f89e2de60d | ||
|
|
764a8cffb8 | ||
|
|
e8584c1453 | ||
|
|
deb8d43911 | ||
|
|
bf9d37d7af | ||
|
|
9e5a7f7946 | ||
|
|
ca584d3929 | ||
|
|
820a6ad3f3 | ||
|
|
fe49708c2e | ||
|
|
d6cbbe1ef1 | ||
|
|
825ddf05d4 | ||
|
|
7ba20b3aa6 | ||
|
|
aafd1f12de | ||
|
|
3d055ac2ba | ||
|
|
101572d35f | ||
|
|
a1506f36c9 | ||
|
|
5a9e58dcfb | ||
|
|
c1f600bc0d | ||
|
|
195d5c9188 | ||
|
|
2670751754 | ||
|
|
696629b5a8 | ||
|
|
7192319e1e | ||
|
|
ee1f54675e | ||
|
|
1283750829 | ||
|
|
4475997a59 | ||
|
|
7fca608a78 | ||
|
|
8c74bc667d | ||
|
|
ed80f72e81 | ||
|
|
567584faf0 | ||
|
|
5856ff4df8 | ||
|
|
27425f5dde | ||
|
|
7f14de43ce | ||
|
|
7653b92eb6 | ||
|
|
5a8cbe8716 | ||
|
|
1aefa425e0 |
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
BIN
2025-11-13 17_31_36-.png
Normal file
BIN
2025-11-13 17_31_36-.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
2025-11-13 17_31_55-.png
Normal file
BIN
2025-11-13 17_31_55-.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
BIN
2026-01-28 10_49_55-.png
Normal file
BIN
2026-01-28 10_49_55-.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.4 KiB |
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>F4SD.Cockpit.Client.Test</RootNamespace>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<!--
|
||||
To enable the Microsoft Testing Platform 'dotnet test' experience, add property:
|
||||
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
|
||||
@@ -27,9 +27,9 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
|
||||
<PackageReference Include="NSubstitute" Version="5.3.0" />
|
||||
<PackageReference Include="xunit.v3" Version="3.1.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>
|
||||
|
||||
@@ -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" />
|
||||
@@ -125,12 +159,13 @@
|
||||
<Link>Properties\SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="ExternalToolExecutor.cs" />
|
||||
<Compile Include="F4sdCockpitCommunicationM42Base.cs" />
|
||||
<Compile Include="FasdCockpitCommunicationBase.cs" />
|
||||
<Compile Include="Models\F4sdAgentScript.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<Compile Include="F4sdCockpitCommunicationM42Base.cs" />
|
||||
<Compile Include="FasdCockpitCommunicationBase.cs" />
|
||||
<Compile Include="Models\F4sdAgentScript.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -140,4 +175,4 @@
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -62,12 +62,18 @@ namespace C4IT.FASD.Cockpit.Communication
|
||||
public abstract Task<cFasdApiSearchResultCollection> GetUserSearchResults(string Name, List<string> SIDs);
|
||||
|
||||
public abstract Task<cF4sdStagedSearchResultRelationTaskId> StartGatheringRelations(IEnumerable<cFasdApiSearchResultEntry> relatedTo, CancellationToken token);
|
||||
public abstract Task<cF4sdStagedSearchResultRelations> GetStagedRelations(Guid id, CancellationToken token);
|
||||
|
||||
public abstract Task<List<cF4sdApiSearchResultRelation>> GetSearchResultRelations(enumF4sdSearchResultClass resultType, List<cFasdApiSearchResultEntry> searchResults);
|
||||
public abstract Task<List<cF4sdApiSearchResultRelation>> GetTicketOverviewRelations(string key, bool useRoleScope, int count);
|
||||
|
||||
public abstract Task<cF4SDHealthCardRawData> GetHealthCardData(cF4sdHealthCardRawDataRequest requestData);
|
||||
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);
|
||||
|
||||
public abstract Task<cF4SDHealthCardRawData> GetHealthCardData(Guid healthCardId);
|
||||
|
||||
|
||||
11
FasdCockpitBase/app.config
Normal file
11
FasdCockpitBase/app.config
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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" />
|
||||
@@ -95,11 +95,12 @@
|
||||
<Compile Include="..\Shared\SharedAssemblyInfo.cs">
|
||||
<Link>Properties\SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="F4sdCockpitCommunicationM42Web.cs" />
|
||||
<Compile Include="FasdCockpitCommunicationWeb.cs" />
|
||||
<Compile Include="FasdCockpitMachineConfiguration.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<Compile Include="F4sdCockpitCommunicationM42Web.cs" />
|
||||
<Compile Include="FasdCockpitCommunicationWeb.cs" />
|
||||
<Compile Include="FasdCockpitMachineConfiguration.cs" />
|
||||
<Compile Include="TicketOverview\TicketOverviewCountsResponse.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\F4SD-Logging\F4SD-Logging.csproj">
|
||||
<Project>{7793f281-b226-4e20-b6f6-5d53d70f1dc1}</Project>
|
||||
@@ -115,6 +116,7 @@
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
@@ -123,4 +125,4 @@
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
</Target>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -17,7 +17,8 @@ using C4IT.Security;
|
||||
using C4IT.FASD.Communication.Agent;
|
||||
|
||||
using FasdCockpitBase.Models;
|
||||
using FasdCockpitCommunication;
|
||||
using FasdCockpitCommunication;
|
||||
using FasdCockpitCommunication.TicketOverview;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
@@ -1093,16 +1094,131 @@ namespace C4IT.FASD.Cockpit.Communication
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
public override Task<List<cF4sdApiSearchResultRelation>> GetTicketOverviewRelations(string key, bool useRoleScope, int count)
|
||||
{
|
||||
return Task.FromResult(new List<cF4sdApiSearchResultRelation>());
|
||||
}
|
||||
public override async Task<cF4SDHealthCardRawData> GetHealthCardData(cF4sdHealthCardRawDataRequest requestData)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
return output;
|
||||
}
|
||||
|
||||
#region Ticketübersicht
|
||||
|
||||
public override async Task<Dictionary<string, int>> GetTicketOverviewCounts(IEnumerable<string> keys, bool useRoleScope)
|
||||
{
|
||||
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();
|
||||
LogMethodBegin(CM);
|
||||
|
||||
var apiError = 0;
|
||||
var timeStart = DateTime.UtcNow;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
FasdCockpitCommunication/app.config
Normal file
11
FasdCockpitCommunication/app.config
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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"><table border="1" cellpadding="5,1,5,1"><tbody>
|
||||
<tr><td><em>%DeviceName.Label%</em></td><td style="color: #0000ff;">%DeviceName.Value%</td></tr>
|
||||
<tr><td><em>%UserFullName.Label%</em></td><td>%UserFullName.Value%</td></tr>
|
||||
<tr><td><em>%UserAccount.Label%</em></td><td>%UserAccount.Value%</td></tr>
|
||||
<tr><td><em>%OsInfo.Label%</em></td><td>%OsInfo.Value%</td></tr>
|
||||
<tr><td><em>%IpAddress.Label%</em></td><td>%IpAddress.Value%</td></tr>
|
||||
<tr><td><em>%LastSeenCalc.Label%</em></td><td>%LastSeenCalc.Value%</td></tr>
|
||||
</tbody></table></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">
|
||||
<table border="1" cellpadding="5,1,5,1"><tbody>
|
||||
<tr><td><em>%DeviceName.Label%</em></td><td style="color: #0000ff;">%DeviceName.Value%</td></tr>
|
||||
<tr><td><em>%UserFullName.Label%</em></td><td>%UserFullName.Value%</td></tr>
|
||||
<tr><td><em>%UserAccount.Label%</em></td><td>%UserAccount.Value%</td></tr>
|
||||
<tr><td><em>%OsInfo.Label%</em></td><td>%OsInfo.Value%</td></tr>
|
||||
<tr><td><em>%IpAddress.Label%</em></td><td>%IpAddress.Value%</td></tr>
|
||||
<tr><td><em>%LastBoot.Label%</em></td><td>%LastBoot.Value%</td></tr>
|
||||
<tr><td><em>%LastSeen.Label%</em></td><td>%LastSeen.Value%</td></tr>
|
||||
</tbody></table>
|
||||
</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">
|
||||
<table border="1" cellpadding="5,1,5,1"><tbody>
|
||||
<tr><td><em>%VirtualSessionName.Label%</em></td><td style="color: #0000ff;">%VirtualSessionName.Value%</td></tr>
|
||||
<tr><td><em>%DNSName.Label%</em></td><td>%DNSName.Value%</td></tr>
|
||||
<tr><td><em>%DomainName.Label%</em></td><td>%DomainName.Value%</td></tr>
|
||||
<tr><td><em>%HostedMachine.Label%</em></td><td>%HostedMachine.Value%</td></tr>
|
||||
</tbody></table>
|
||||
</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>
|
||||
@@ -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>
|
||||
@@ -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" >
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
@@ -116,12 +116,16 @@
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Config\F4SD-MenuSection-Configuration.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Config\F4SD-QuickAction-Configuration.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<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>
|
||||
@@ -248,9 +252,12 @@
|
||||
<None Include="MockupPickup\M42Wpm-Ticket-CloseCase-Services.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="MockupPickup\M42Wpm-Ticket-QuickCalls.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<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>
|
||||
@@ -269,4 +276,4 @@
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>copy "$(ProjectDir)..\..\C4IT FASD\_Common\XmlSchemas\*" "$(ProjectDir)Config"</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
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
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
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
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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,27 +184,27 @@
|
||||
"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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -469,4 +510,4 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,12 +45,11 @@ namespace FasdCockpitCommunicationDemo
|
||||
public DateTime? ClosingDate { get; set; }
|
||||
public enumTicketCreationSource CreationSource { get; set; }
|
||||
|
||||
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 Description { get; set; }
|
||||
public string DescriptionHtml { get; set; }
|
||||
public int Priority { get; set; }
|
||||
public string Category { get; set; } //todo: replace with tree structure
|
||||
public string Solution { get; set; }
|
||||
public string SolutionHtml { get; set; }
|
||||
public Dictionary<string, string> DirectLinks { get; set; }
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -2,15 +2,16 @@ using System;
|
||||
|
||||
namespace FasdCockpitCommunicationDemo
|
||||
{
|
||||
public class TicketOverviewRelationDefinition
|
||||
{
|
||||
public Guid TicketId { get; set; }
|
||||
public Guid UserId { get; set; }
|
||||
public string DisplayName { get; set; }
|
||||
public string Summary { get; set; }
|
||||
public string StatusId { get; set; }
|
||||
public string UserDisplayName { get; set; }
|
||||
public string UserAccount { get; set; }
|
||||
public string UserDomain { get; set; }
|
||||
public class TicketOverviewRelationDefinition
|
||||
{
|
||||
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; }
|
||||
public string UserAccount { get; set; }
|
||||
public string UserDomain { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
11
FasdCockpitCommunicationDemo/app.config
Normal file
11
FasdCockpitCommunicationDemo/app.config
Normal 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>
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -3,10 +3,11 @@ using C4IT.FASD.Cockpit.Communication;
|
||||
using C4IT.FASD.Security;
|
||||
using C4IT.Graphics;
|
||||
using C4IT.Logging;
|
||||
using C4IT.MultiLanguage;
|
||||
using FasdDesktopUi.Basics;
|
||||
using FasdDesktopUi.Basics.Helper;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
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;
|
||||
@@ -35,10 +36,15 @@ namespace FasdDesktopUi
|
||||
|
||||
static public System.Windows.Forms.ToolStripItem M42OptionMenuItem = null;
|
||||
|
||||
public System.Windows.Forms.NotifyIcon notifyIcon = new System.Windows.Forms.NotifyIcon() { Text = $"First Aid Service Desk" };
|
||||
public bool UseOsLanguage = string.IsNullOrEmpty(cFasdCockpitConfig.Instance.SelectedLanguage);
|
||||
|
||||
private TrayTicketNotificationManager _ticketTrayNotification;
|
||||
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)
|
||||
{
|
||||
@@ -166,42 +172,40 @@ namespace FasdDesktopUi
|
||||
|
||||
}
|
||||
|
||||
private void NotifyIcon_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e is System.Windows.Forms.MouseEventArgs mouseEventArgs)
|
||||
if (mouseEventArgs.Button == System.Windows.Forms.MouseButtons.Right)
|
||||
return;
|
||||
private void NotifyIcon_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e is System.Windows.Forms.MouseEventArgs mouseEventArgs)
|
||||
if (mouseEventArgs.Button == System.Windows.Forms.MouseButtons.Right)
|
||||
return;
|
||||
|
||||
|
||||
var searchView = SearchPageView.Instance;
|
||||
if (searchView == null)
|
||||
return;
|
||||
|
||||
#if isDemo
|
||||
var hasNotification = HasPendingTicketOverviewNotification();
|
||||
|
||||
if (searchView.IsVisible && !hasNotification)
|
||||
{
|
||||
searchView.Hide();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!searchView.IsVisible)
|
||||
searchView.ActivateSearchView();
|
||||
else
|
||||
searchView.BringToFrontPreserveState();
|
||||
|
||||
searchView.ShowTicketOverviewPane();
|
||||
|
||||
if (hasNotification)
|
||||
ClearTicketOverviewTrayNotification();
|
||||
#else
|
||||
if (SearchPageView.Instance.IsVisible)
|
||||
SearchPageView.Instance.Hide();
|
||||
else
|
||||
SearchPageView.Instance.ActivateSearchView();
|
||||
var searchView = SearchPageView.Instance;
|
||||
if (searchView == null)
|
||||
return;
|
||||
|
||||
if (TryHandleTicketOverviewNotificationClick(searchView))
|
||||
return;
|
||||
|
||||
#if isDemo
|
||||
if (searchView.IsVisible)
|
||||
{
|
||||
searchView.Hide();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!searchView.IsVisible)
|
||||
searchView.ActivateSearchView();
|
||||
else
|
||||
searchView.BringToFrontPreserveState();
|
||||
|
||||
searchView.ShowTicketOverviewPane();
|
||||
#else
|
||||
if (SearchPageView.Instance.IsVisible)
|
||||
SearchPageView.Instance.Hide();
|
||||
else
|
||||
SearchPageView.Instance.ActivateSearchView();
|
||||
#endif
|
||||
}
|
||||
catch (Exception E)
|
||||
@@ -268,54 +272,84 @@ namespace FasdDesktopUi
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#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?.ShowTicketOverviewPaneForScope(PendingTicketOverviewScope);
|
||||
ClearTicketOverviewTrayNotification();
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasPendingTicketOverviewNotification()
|
||||
{
|
||||
return _ticketTrayNotification?.HasNotification ?? false;
|
||||
}
|
||||
|
||||
private void NotifyIcon_BalloonTipClicked(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
SearchPageView.Instance?.BringToFrontPreserveState();
|
||||
SearchPageView.Instance?.ShowTicketOverviewPane();
|
||||
ClearTicketOverviewTrayNotification();
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasPendingTicketOverviewNotification()
|
||||
{
|
||||
return _ticketTrayNotification?.HasNotification ?? false;
|
||||
}
|
||||
|
||||
public void ShowTicketOverviewTrayNotification(string message)
|
||||
{
|
||||
try
|
||||
{
|
||||
_ticketTrayNotification?.Show(message);
|
||||
}
|
||||
public void ShowTicketOverviewTrayNotification(string message)
|
||||
{
|
||||
try
|
||||
{
|
||||
_ticketTrayNotification?.Show(message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearTicketOverviewTrayNotification()
|
||||
{
|
||||
try
|
||||
{
|
||||
_ticketTrayNotification?.Clear();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private System.Windows.Forms.ToolStripItem SetUpNotifyIconLanguageOption()
|
||||
{
|
||||
public void ClearTicketOverviewTrayNotification()
|
||||
{
|
||||
try
|
||||
{
|
||||
_pendingTicketOverviewScope = null;
|
||||
_ticketTrayNotification?.Clear();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTicketOverviewNotificationScope(TileScope? scope)
|
||||
{
|
||||
_pendingTicketOverviewScope = scope;
|
||||
}
|
||||
|
||||
public TileScope? PendingTicketOverviewScope => _pendingTicketOverviewScope;
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ToolStripItem SetUpNotifyIconLanguageOption()
|
||||
{
|
||||
try
|
||||
{
|
||||
var output = new System.Windows.Forms.ToolStripMenuItem() { Text = cMultiLanguageSupport.GetItem("Menu.SelectLanguage") };
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
16
FasdDesktopUi/Basics/CustomEvents/HeadingDataEventArgs.cs
Normal file
16
FasdDesktopUi/Basics/CustomEvents/HeadingDataEventArgs.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
142
FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs
Normal file
142
FasdDesktopUi/Basics/Helper/TicketDeepLinkHelper.cs
Normal 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}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -229,7 +229,10 @@ namespace FasdDesktopUi.Basics.Models
|
||||
{
|
||||
Dispatcher.CurrentDispatcher.Invoke(() => splashScreen?.SetStatusText(cMultiLanguageSupport.GetItem("StartUp.SplashScreen.AuthenticateUser")));
|
||||
ApiConnectionStatus = enumOnlineStatus.unauthorized;
|
||||
const string cockpitUserRole = "Cockpit.User";
|
||||
const string cockpitUserRole = "Cockpit.User";
|
||||
#if isNewFeature
|
||||
const string cockpitTicketAgentRole = "Cockpit.TicketAgent";
|
||||
#endif
|
||||
userInfo = await cFasdCockpitCommunicationBase.Instance.WinLogon();
|
||||
lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock)
|
||||
{
|
||||
@@ -244,6 +247,10 @@ namespace FasdDesktopUi.Basics.Models
|
||||
{
|
||||
await Task.Run(async () => await cFasdCockpitConfig.Instance.InstantiateAnalyticsAsync(cFasdCockpitConfig.SessionId));
|
||||
ApiConnectionStatus = enumOnlineStatus.online;
|
||||
#if isNewFeature
|
||||
if (userInfo.Roles.Contains(cockpitTicketAgentRole))
|
||||
cCockpitConfiguration.Instance.ticketSupport.EditTicket = true;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -273,7 +280,10 @@ namespace FasdDesktopUi.Basics.Models
|
||||
}
|
||||
|
||||
if (App.M42OptionMenuItem != null)
|
||||
App.M42OptionMenuItem.Enabled = userInfo != null;
|
||||
App.Current.MainWindow.Dispatcher.Invoke(() =>
|
||||
{
|
||||
App.M42OptionMenuItem.Enabled = userInfo != null;
|
||||
});
|
||||
|
||||
// check, if the are logons needed
|
||||
bool m42Valid = await CheckAndRefreshM42LogonAsync();
|
||||
|
||||
@@ -22,6 +22,9 @@ namespace FasdDesktopUi.Basics.Models
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
public enumHighlightColor? HighlightColor { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public enumHistoryTitleType? PresentationStyle { get; set; } = enumHistoryTitleType.none;
|
||||
|
||||
[JsonIgnore]
|
||||
public cUiActionBase UiAction { get; set; }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -55,50 +55,51 @@ namespace FasdDesktopUi.Basics.Models
|
||||
set { if (_incidentCriticalSelected != value) { _incidentCriticalSelected = value; OnPropertyChanged(nameof(IncidentCriticalSelected)); } }
|
||||
}
|
||||
|
||||
private bool _incidentNewInfoSelected;
|
||||
public bool IncidentNewInfoSelected
|
||||
{
|
||||
get => _incidentNewInfoSelected;
|
||||
set { if (_incidentNewInfoSelected != value) { _incidentNewInfoSelected = value; OnPropertyChanged(nameof(IncidentNewInfoSelected)); } }
|
||||
}
|
||||
|
||||
private bool _unassignedTicketsSelected;
|
||||
public bool UnassignedTicketsSelected
|
||||
{
|
||||
get => _unassignedTicketsSelected;
|
||||
set { if (_unassignedTicketsSelected != value) { _unassignedTicketsSelected = value; OnPropertyChanged(nameof(UnassignedTicketsSelected)); } }
|
||||
}
|
||||
|
||||
private bool _incidentNewInfoSelected;
|
||||
public bool IncidentNewInfoSelected
|
||||
{
|
||||
get => _incidentNewInfoSelected;
|
||||
set { if (_incidentNewInfoSelected != value) { _incidentNewInfoSelected = value; OnPropertyChanged(nameof(IncidentNewInfoSelected)); } }
|
||||
}
|
||||
|
||||
private bool _unassignedTicketsSelected;
|
||||
public bool UnassignedTicketsSelected
|
||||
{
|
||||
get => _unassignedTicketsSelected;
|
||||
set { if (_unassignedTicketsSelected != value) { _unassignedTicketsSelected = value; OnPropertyChanged(nameof(UnassignedTicketsSelected)); } }
|
||||
}
|
||||
|
||||
private bool _unassignedTicketsCriticalSelected;
|
||||
public bool UnassignedTicketsCriticalSelected
|
||||
{
|
||||
get => _unassignedTicketsCriticalSelected;
|
||||
set { if (_unassignedTicketsCriticalSelected != value) { _unassignedTicketsCriticalSelected = value; OnPropertyChanged(nameof(UnassignedTicketsCriticalSelected)); } }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Highlight-Properties
|
||||
private bool _ticketsNewHighlighted;
|
||||
public bool TicketsNewHighlighted { get => _ticketsNewHighlighted; set { if (_ticketsNewHighlighted != value) { _ticketsNewHighlighted = value; OnPropertyChanged(nameof(TicketsNewHighlighted)); } } }
|
||||
|
||||
private bool _ticketsActiveHighlighted;
|
||||
public bool TicketsActiveHighlighted { get => _ticketsActiveHighlighted; set { if (_ticketsActiveHighlighted != value) { _ticketsActiveHighlighted = value; OnPropertyChanged(nameof(TicketsActiveHighlighted)); } } }
|
||||
|
||||
private bool _ticketsCriticalHighlighted;
|
||||
public bool TicketsCriticalHighlighted { get => _ticketsCriticalHighlighted; set { if (_ticketsCriticalHighlighted != value) { _ticketsCriticalHighlighted = value; OnPropertyChanged(nameof(TicketsCriticalHighlighted)); } } }
|
||||
|
||||
private bool _ticketsNewInfoHighlighted;
|
||||
public bool TicketsNewInfoHighlighted { get => _ticketsNewInfoHighlighted; set { if (_ticketsNewInfoHighlighted != value) { _ticketsNewInfoHighlighted = value; OnPropertyChanged(nameof(TicketsNewInfoHighlighted)); } } }
|
||||
|
||||
private bool _incidentNewHighlighted;
|
||||
public bool IncidentNewHighlighted { get => _incidentNewHighlighted; set { if (_incidentNewHighlighted != value) { _incidentNewHighlighted = value; OnPropertyChanged(nameof(IncidentNewHighlighted)); } } }
|
||||
|
||||
private bool _incidentActiveHighlighted;
|
||||
public bool IncidentActiveHighlighted { get => _incidentActiveHighlighted; set { if (_incidentActiveHighlighted != value) { _incidentActiveHighlighted = value; OnPropertyChanged(nameof(IncidentActiveHighlighted)); } } }
|
||||
|
||||
private bool _incidentCriticalHighlighted;
|
||||
public bool IncidentCriticalHighlighted { get => _incidentCriticalHighlighted; set { if (_incidentCriticalHighlighted != value) { _incidentCriticalHighlighted = value; OnPropertyChanged(nameof(IncidentCriticalHighlighted)); } } }
|
||||
|
||||
|
||||
#region Highlight-Properties
|
||||
private bool _ticketsNewHighlighted;
|
||||
public bool TicketsNewHighlighted { get => _ticketsNewHighlighted; set { if (_ticketsNewHighlighted != value) { _ticketsNewHighlighted = value; OnPropertyChanged(nameof(TicketsNewHighlighted)); } } }
|
||||
|
||||
private bool _ticketsActiveHighlighted;
|
||||
public bool TicketsActiveHighlighted { get => _ticketsActiveHighlighted; set { if (_ticketsActiveHighlighted != value) { _ticketsActiveHighlighted = value; OnPropertyChanged(nameof(TicketsActiveHighlighted)); } } }
|
||||
|
||||
private bool _ticketsCriticalHighlighted;
|
||||
public bool TicketsCriticalHighlighted { get => _ticketsCriticalHighlighted; set { if (_ticketsCriticalHighlighted != value) { _ticketsCriticalHighlighted = value; OnPropertyChanged(nameof(TicketsCriticalHighlighted)); } } }
|
||||
|
||||
private bool _ticketsNewInfoHighlighted;
|
||||
public bool TicketsNewInfoHighlighted { get => _ticketsNewInfoHighlighted; set { if (_ticketsNewInfoHighlighted != value) { _ticketsNewInfoHighlighted = value; OnPropertyChanged(nameof(TicketsNewInfoHighlighted)); } } }
|
||||
|
||||
private bool _incidentNewHighlighted;
|
||||
public bool IncidentNewHighlighted { get => _incidentNewHighlighted; set { if (_incidentNewHighlighted != value) { _incidentNewHighlighted = value; OnPropertyChanged(nameof(IncidentNewHighlighted)); } } }
|
||||
|
||||
private bool _incidentActiveHighlighted;
|
||||
public bool IncidentActiveHighlighted { get => _incidentActiveHighlighted; set { if (_incidentActiveHighlighted != value) { _incidentActiveHighlighted = value; OnPropertyChanged(nameof(IncidentActiveHighlighted)); } } }
|
||||
|
||||
private bool _incidentCriticalHighlighted;
|
||||
public bool IncidentCriticalHighlighted { get => _incidentCriticalHighlighted; set { if (_incidentCriticalHighlighted != value) { _incidentCriticalHighlighted = value; OnPropertyChanged(nameof(IncidentCriticalHighlighted)); } } }
|
||||
|
||||
private bool _incidentNewInfoHighlighted;
|
||||
public bool IncidentNewInfoHighlighted { get => _incidentNewInfoHighlighted; set { if (_incidentNewInfoHighlighted != value) { _incidentNewInfoHighlighted = value; OnPropertyChanged(nameof(IncidentNewInfoHighlighted)); } } }
|
||||
|
||||
@@ -107,30 +108,31 @@ 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
|
||||
private string _ticketsNewChangeHint;
|
||||
public string TicketsNewChangeHint { get => _ticketsNewChangeHint; set { if (_ticketsNewChangeHint != value) { _ticketsNewChangeHint = value; OnPropertyChanged(nameof(TicketsNewChangeHint)); } } }
|
||||
|
||||
private string _ticketsActiveChangeHint;
|
||||
public string TicketsActiveChangeHint { get => _ticketsActiveChangeHint; set { if (_ticketsActiveChangeHint != value) { _ticketsActiveChangeHint = value; OnPropertyChanged(nameof(TicketsActiveChangeHint)); } } }
|
||||
|
||||
private string _ticketsCriticalChangeHint;
|
||||
public string TicketsCriticalChangeHint { get => _ticketsCriticalChangeHint; set { if (_ticketsCriticalChangeHint != value) { _ticketsCriticalChangeHint = value; OnPropertyChanged(nameof(TicketsCriticalChangeHint)); } } }
|
||||
|
||||
private string _ticketsNewInfoChangeHint;
|
||||
public string TicketsNewInfoChangeHint { get => _ticketsNewInfoChangeHint; set { if (_ticketsNewInfoChangeHint != value) { _ticketsNewInfoChangeHint = value; OnPropertyChanged(nameof(TicketsNewInfoChangeHint)); } } }
|
||||
|
||||
private string _incidentNewChangeHint;
|
||||
public string IncidentNewChangeHint { get => _incidentNewChangeHint; set { if (_incidentNewChangeHint != value) { _incidentNewChangeHint = value; OnPropertyChanged(nameof(IncidentNewChangeHint)); } } }
|
||||
|
||||
private string _incidentActiveChangeHint;
|
||||
public string IncidentActiveChangeHint { get => _incidentActiveChangeHint; set { if (_incidentActiveChangeHint != value) { _incidentActiveChangeHint = value; OnPropertyChanged(nameof(IncidentActiveChangeHint)); } } }
|
||||
|
||||
private string _incidentCriticalChangeHint;
|
||||
public string IncidentCriticalChangeHint { get => _incidentCriticalChangeHint; set { if (_incidentCriticalChangeHint != value) { _incidentCriticalChangeHint = value; OnPropertyChanged(nameof(IncidentCriticalChangeHint)); } } }
|
||||
|
||||
|
||||
#region Change Hint Properties
|
||||
private string _ticketsNewChangeHint;
|
||||
public string TicketsNewChangeHint { get => _ticketsNewChangeHint; set { if (_ticketsNewChangeHint != value) { _ticketsNewChangeHint = value; OnPropertyChanged(nameof(TicketsNewChangeHint)); } } }
|
||||
|
||||
private string _ticketsActiveChangeHint;
|
||||
public string TicketsActiveChangeHint { get => _ticketsActiveChangeHint; set { if (_ticketsActiveChangeHint != value) { _ticketsActiveChangeHint = value; OnPropertyChanged(nameof(TicketsActiveChangeHint)); } } }
|
||||
|
||||
private string _ticketsCriticalChangeHint;
|
||||
public string TicketsCriticalChangeHint { get => _ticketsCriticalChangeHint; set { if (_ticketsCriticalChangeHint != value) { _ticketsCriticalChangeHint = value; OnPropertyChanged(nameof(TicketsCriticalChangeHint)); } } }
|
||||
|
||||
private string _ticketsNewInfoChangeHint;
|
||||
public string TicketsNewInfoChangeHint { get => _ticketsNewInfoChangeHint; set { if (_ticketsNewInfoChangeHint != value) { _ticketsNewInfoChangeHint = value; OnPropertyChanged(nameof(TicketsNewInfoChangeHint)); } } }
|
||||
|
||||
private string _incidentNewChangeHint;
|
||||
public string IncidentNewChangeHint { get => _incidentNewChangeHint; set { if (_incidentNewChangeHint != value) { _incidentNewChangeHint = value; OnPropertyChanged(nameof(IncidentNewChangeHint)); } } }
|
||||
|
||||
private string _incidentActiveChangeHint;
|
||||
public string IncidentActiveChangeHint { get => _incidentActiveChangeHint; set { if (_incidentActiveChangeHint != value) { _incidentActiveChangeHint = value; OnPropertyChanged(nameof(IncidentActiveChangeHint)); } } }
|
||||
|
||||
private string _incidentCriticalChangeHint;
|
||||
public string IncidentCriticalChangeHint { get => _incidentCriticalChangeHint; set { if (_incidentCriticalChangeHint != value) { _incidentCriticalChangeHint = value; OnPropertyChanged(nameof(IncidentCriticalChangeHint)); } } }
|
||||
|
||||
private string _incidentNewInfoChangeHint;
|
||||
public string IncidentNewInfoChangeHint { get => _incidentNewInfoChangeHint; set { if (_incidentNewInfoChangeHint != value) { _incidentNewInfoChangeHint = value; OnPropertyChanged(nameof(IncidentNewInfoChangeHint)); } } }
|
||||
|
||||
@@ -139,9 +141,10 @@ 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
|
||||
#endregion
|
||||
|
||||
#region Ticket & Incident-Properties
|
||||
|
||||
// Ticket Properties
|
||||
private int _ticketsNew;
|
||||
@@ -166,48 +169,48 @@ namespace FasdDesktopUi.Basics.Models
|
||||
private int _incidentCritical;
|
||||
public int IncidentCritical { get => _incidentCritical; set { _incidentCritical = value; OnPropertyChanged(nameof(IncidentCritical)); } }
|
||||
|
||||
private int _incidentNewInfo;
|
||||
public int IncidentNewInfo { get => _incidentNewInfo; set { _incidentNewInfo = value; OnPropertyChanged(nameof(IncidentNewInfo)); } }
|
||||
|
||||
// Unassigned Ticket Properties
|
||||
private int _unassignedTickets;
|
||||
public int UnassignedTickets { get => _unassignedTickets; set { _unassignedTickets = value; OnPropertyChanged(nameof(UnassignedTickets)); } }
|
||||
|
||||
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));
|
||||
private int _incidentNewInfo;
|
||||
public int IncidentNewInfo { get => _incidentNewInfo; set { _incidentNewInfo = value; OnPropertyChanged(nameof(IncidentNewInfo)); } }
|
||||
|
||||
// Unassigned Ticket Properties
|
||||
private int _unassignedTickets;
|
||||
public int UnassignedTickets { get => _unassignedTickets; set { _unassignedTickets = value; OnPropertyChanged(nameof(UnassignedTickets)); } }
|
||||
|
||||
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));
|
||||
#endregion
|
||||
|
||||
#region Helper-Methods
|
||||
|
||||
public void ResetSelection()
|
||||
{
|
||||
TicketsNewSelected = false;
|
||||
TicketsActiveSelected = false;
|
||||
TicketsCriticalSelected = false;
|
||||
public void ResetSelection()
|
||||
{
|
||||
TicketsNewSelected = false;
|
||||
TicketsActiveSelected = false;
|
||||
TicketsCriticalSelected = false;
|
||||
TicketsNewInfoSelected = false;
|
||||
|
||||
IncidentNewSelected = false;
|
||||
IncidentActiveSelected = false;
|
||||
IncidentCriticalSelected = false;
|
||||
IncidentNewInfoSelected = false;
|
||||
|
||||
IncidentCriticalSelected = false;
|
||||
IncidentNewInfoSelected = false;
|
||||
|
||||
UnassignedTicketsSelected = false;
|
||||
UnassignedTicketsCriticalSelected = false;
|
||||
|
||||
}
|
||||
|
||||
public void ResetHighlights()
|
||||
{
|
||||
TicketsNewHighlighted = false;
|
||||
TicketsActiveHighlighted = false;
|
||||
TicketsCriticalHighlighted = false;
|
||||
TicketsNewInfoHighlighted = false;
|
||||
|
||||
IncidentNewHighlighted = false;
|
||||
|
||||
public void ResetHighlights()
|
||||
{
|
||||
TicketsNewHighlighted = false;
|
||||
TicketsActiveHighlighted = false;
|
||||
TicketsCriticalHighlighted = false;
|
||||
TicketsNewInfoHighlighted = false;
|
||||
|
||||
IncidentNewHighlighted = false;
|
||||
IncidentActiveHighlighted = false;
|
||||
IncidentCriticalHighlighted = false;
|
||||
IncidentNewInfoHighlighted = false;
|
||||
@@ -218,8 +221,8 @@ namespace FasdDesktopUi.Basics.Models
|
||||
TicketsNewChangeHint = null;
|
||||
TicketsActiveChangeHint = null;
|
||||
TicketsCriticalChangeHint = null;
|
||||
TicketsNewInfoChangeHint = null;
|
||||
|
||||
TicketsNewInfoChangeHint = null;
|
||||
|
||||
IncidentNewChangeHint = null;
|
||||
IncidentActiveChangeHint = null;
|
||||
IncidentCriticalChangeHint = null;
|
||||
@@ -227,7 +230,14 @@ namespace FasdDesktopUi.Basics.Models
|
||||
|
||||
UnassignedTicketsChangeHint = null;
|
||||
UnassignedTicketsCriticalChangeHint = null;
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public TicketOverviewModel()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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,9 +45,8 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
|
||||
quickActionCopyData.Name = quickActionDefinition.Names.GetValue();
|
||||
quickActionCopyData.ExecutionTime = DateTime.UtcNow;
|
||||
|
||||
if (dataProvider.HealthCardDataHelper.HeadingData.TryGetValue(enumFasdInformationClass.Computer, out var computerHeadingData))
|
||||
quickActionCopyData.AffectedDeviceName = computerHeadingData.HeadingText;
|
||||
var infoClass = dataProvider.HealthCardDataHelper.SelectedHealthCard.InformationClasses.FirstOrDefault();
|
||||
quickActionCopyData.AffectedDeviceName = dataProvider.HealthCardDataHelper.GetInformationObjectHeadingName(infoClass);
|
||||
|
||||
quickActionCopyData.WasRunningOnAffectedDevice = wasRunningOnAffectedDevice;
|
||||
quickActionCopyData.QuickActionOutput = quickActionOutput;
|
||||
@@ -52,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)
|
||||
@@ -96,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
|
||||
@@ -127,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)
|
||||
@@ -137,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);
|
||||
@@ -145,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;
|
||||
|
||||
@@ -163,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;
|
||||
}
|
||||
@@ -175,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;
|
||||
@@ -194,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;
|
||||
@@ -218,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;
|
||||
@@ -231,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";
|
||||
@@ -249,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;
|
||||
|
||||
@@ -261,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)
|
||||
{
|
||||
@@ -293,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)
|
||||
@@ -312,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
|
||||
@@ -331,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)
|
||||
@@ -349,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;
|
||||
|
||||
@@ -367,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;
|
||||
}
|
||||
@@ -380,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\">";
|
||||
@@ -401,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;
|
||||
@@ -430,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>";
|
||||
@@ -443,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>";
|
||||
|
||||
@@ -463,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;
|
||||
|
||||
@@ -475,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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 () =>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
var rawDataRequest = new cF4sdHealthCardRawDataRequest()
|
||||
{
|
||||
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 IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> GetSupportCaseHealthcardData(object identities, object valueAddress)
|
||||
public void UpdateSupportCaseDataCache(cF4sdApiSearchResultRelation relation, IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> tables)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,9 @@ using System.Windows.Threading;
|
||||
|
||||
using C4IT.FASD.Base;
|
||||
using C4IT.FASD.Cockpit.Communication;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
using FasdDesktopUi.Basics.Services.Models;
|
||||
using FasdDesktopUi;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
using FasdDesktopUi.Basics.Services.Models;
|
||||
#if isDemo
|
||||
using System.Net;
|
||||
using FasdCockpitCommunicationDemo;
|
||||
@@ -19,30 +20,34 @@ namespace FasdDesktopUi.Basics.Services
|
||||
{
|
||||
public sealed class TicketOverviewUpdateService
|
||||
{
|
||||
private static readonly TimeSpan RefreshInterval = TimeSpan.FromMinutes(5);
|
||||
private static readonly string[] OverviewKeys = new[]
|
||||
{
|
||||
"TicketsNew",
|
||||
"TicketsActive",
|
||||
"TicketsCritical",
|
||||
"TicketsNewInfo",
|
||||
"IncidentNew",
|
||||
"IncidentActive",
|
||||
"IncidentCritical",
|
||||
"IncidentNewInfo",
|
||||
"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 bool _isDemo;
|
||||
private bool _initialized;
|
||||
private readonly Random _random = new Random();
|
||||
private static readonly string[] OverviewKeys = new[]
|
||||
{
|
||||
"TicketsNew",
|
||||
"TicketsActive",
|
||||
"TicketsCritical",
|
||||
"TicketsNewInfo",
|
||||
"IncidentNew",
|
||||
"IncidentActive",
|
||||
"IncidentCritical",
|
||||
"IncidentNewInfo",
|
||||
"UnassignedTickets",
|
||||
"UnassignedTicketsCritical"
|
||||
};
|
||||
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 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>();
|
||||
private readonly List<DemoTicketTemplate> _demoTemplates = new List<DemoTicketTemplate>();
|
||||
@@ -67,138 +72,326 @@ namespace FasdDesktopUi.Basics.Services
|
||||
#endif
|
||||
}
|
||||
|
||||
static TicketOverviewUpdateService()
|
||||
{
|
||||
#if isDemo
|
||||
Instance = new TicketOverviewUpdateService();
|
||||
#endif
|
||||
}
|
||||
|
||||
public static TicketOverviewUpdateService Instance { get; } = null;
|
||||
static TicketOverviewUpdateService()
|
||||
{
|
||||
Instance = new TicketOverviewUpdateService();
|
||||
}
|
||||
|
||||
public static TicketOverviewUpdateService Instance { get; }
|
||||
|
||||
public event EventHandler<TicketOverviewCountsChangedEventArgs> OverviewCountsChanged;
|
||||
|
||||
public IReadOnlyDictionary<string, TileCounts> CurrentCounts => _currentCounts;
|
||||
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()
|
||||
{
|
||||
if (_initialized)
|
||||
return;
|
||||
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;
|
||||
|
||||
_initialized = true;
|
||||
#if isDemo
|
||||
_isDemo = true;
|
||||
LoadPersistedDemoTickets();
|
||||
#else
|
||||
_isDemo = cFasdCockpitCommunicationBase.Instance?.IsDemo() == true;
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
_initialized = true;
|
||||
#if isDemo
|
||||
_isDemo = true;
|
||||
LoadPersistedDemoTickets();
|
||||
#else
|
||||
_isDemo = cFasdCockpitCommunicationBase.Instance?.IsDemo() == true;
|
||||
#endif
|
||||
|
||||
if (!_isDemo)
|
||||
{
|
||||
_timer = new DispatcherTimer(RefreshInterval, DispatcherPriority.Background, async (s, e) => await FetchAsync().ConfigureAwait(false), _dispatcher);
|
||||
_timer.Start();
|
||||
_ = FetchAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = FetchAsync();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task FetchAsync()
|
||||
{
|
||||
if (_isFetching)
|
||||
return;
|
||||
|
||||
var communication = cFasdCockpitCommunicationBase.Instance;
|
||||
if (communication == null)
|
||||
{
|
||||
ScheduleFetchRetry();
|
||||
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));
|
||||
OverviewCountsChanged?.Invoke(this, args);
|
||||
}
|
||||
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
|
||||
{
|
||||
updated = new TileCounts(incoming, previous.Role);
|
||||
oldValue = previous.Personal;
|
||||
}
|
||||
|
||||
_currentCounts[key] = updated;
|
||||
|
||||
if (hasInitializedScope && oldValue != incoming)
|
||||
{
|
||||
changes.Add(new TileCountChange(key, scope, oldValue, incoming));
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasInitializedScope)
|
||||
{
|
||||
_initializedScopes.Add(scope);
|
||||
var initArgs = new TicketOverviewCountsChangedEventArgs(
|
||||
Array.Empty<TileCountChange>(),
|
||||
new Dictionary<string, TileCounts>(_currentCounts, StringComparer.OrdinalIgnoreCase),
|
||||
scope);
|
||||
OverviewCountsChanged?.Invoke(this, initArgs);
|
||||
return;
|
||||
}
|
||||
|
||||
if (changes.Count == 0)
|
||||
return;
|
||||
|
||||
var args = new TicketOverviewCountsChangedEventArgs(changes, new Dictionary<string, TileCounts>(_currentCounts, StringComparer.OrdinalIgnoreCase));
|
||||
OverviewCountsChanged?.Invoke(this, args);
|
||||
}
|
||||
|
||||
public void SimulateDemoTicket()
|
||||
{
|
||||
@@ -318,9 +511,9 @@ namespace FasdDesktopUi.Basics.Services
|
||||
if (appliedChanges.Count == 0)
|
||||
return;
|
||||
|
||||
var args = new TicketOverviewCountsChangedEventArgs(appliedChanges, new Dictionary<string, TileCounts>(_currentCounts));
|
||||
OverviewCountsChanged?.Invoke(this, args);
|
||||
}
|
||||
var args = new TicketOverviewCountsChangedEventArgs(appliedChanges, new Dictionary<string, TileCounts>(_currentCounts));
|
||||
OverviewCountsChanged?.Invoke(this, args);
|
||||
}
|
||||
|
||||
private void AddRelationForRecord(DemoTicketRecord record)
|
||||
{
|
||||
@@ -345,48 +538,55 @@ namespace FasdDesktopUi.Basics.Services
|
||||
}
|
||||
}
|
||||
|
||||
private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record)
|
||||
{
|
||||
var relation = new cF4sdApiSearchResultRelation
|
||||
{
|
||||
Type = enumF4sdSearchResultClass.Ticket,
|
||||
DisplayName = record.DisplayName,
|
||||
Name = record.DisplayName,
|
||||
private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record)
|
||||
{
|
||||
var activityType = ResolveDemoActivityType(record?.ActivityType);
|
||||
var relation = new cF4sdApiSearchResultRelation
|
||||
{
|
||||
Type = enumF4sdSearchResultClass.Ticket,
|
||||
DisplayName = record.DisplayName,
|
||||
Name = record.DisplayName,
|
||||
id = record.TicketId,
|
||||
Status = enumF4sdSearchResultStatus.Active,
|
||||
Infos = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["Summary"] = record.Summary ?? string.Empty,
|
||||
["StatusId"] = record.StatusId ?? string.Empty,
|
||||
["UserDisplayName"] = record.UserDisplayName ?? string.Empty,
|
||||
["UserAccount"] = record.UserAccount ?? string.Empty,
|
||||
["UserDomain"] = record.UserDomain ?? string.Empty,
|
||||
[DemoTicketDetailsKey] = bool.TrueString
|
||||
},
|
||||
Identities = new cF4sdIdentityList
|
||||
{
|
||||
new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = record.TicketId },
|
||||
new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = record.UserId }
|
||||
Infos = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["Summary"] = record.Summary ?? string.Empty,
|
||||
["StatusId"] = record.StatusId ?? string.Empty,
|
||||
["UserDisplayName"] = record.UserDisplayName ?? string.Empty,
|
||||
["UserAccount"] = record.UserAccount ?? string.Empty,
|
||||
["UserDomain"] = record.UserDomain ?? string.Empty,
|
||||
["ActivityType"] = activityType
|
||||
},
|
||||
Identities = new cF4sdIdentityList
|
||||
{
|
||||
new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = record.TicketId },
|
||||
new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = record.UserId }
|
||||
}
|
||||
};
|
||||
|
||||
return relation;
|
||||
}
|
||||
|
||||
return relation;
|
||||
}
|
||||
|
||||
private static string ResolveDemoActivityType(string configuredActivityType)
|
||||
{
|
||||
return string.IsNullOrWhiteSpace(configuredActivityType)
|
||||
? null
|
||||
: configuredActivityType.Trim();
|
||||
}
|
||||
|
||||
private DemoTicketDetail CloneDetail(DemoTicketDetail source)
|
||||
{
|
||||
if (source == null)
|
||||
return new DemoTicketDetail();
|
||||
|
||||
return new DemoTicketDetail
|
||||
{
|
||||
AffectedUser = source.AffectedUser,
|
||||
Asset = source.Asset,
|
||||
Category = source.Category,
|
||||
Classification = source.Classification,
|
||||
Description = source.Description,
|
||||
DescriptionHtml = source.DescriptionHtml,
|
||||
Priority = source.Priority,
|
||||
return new DemoTicketDetail
|
||||
{
|
||||
AffectedUser = source.AffectedUser,
|
||||
Asset = source.Asset,
|
||||
Category = source.Category,
|
||||
Description = source.Description,
|
||||
DescriptionHtml = source.DescriptionHtml,
|
||||
Priority = source.Priority,
|
||||
Solution = source.Solution,
|
||||
SolutionHtml = source.SolutionHtml,
|
||||
Journal = source.Journal?.Select(entry => new DemoTicketJournalEntry
|
||||
@@ -543,15 +743,16 @@ namespace FasdDesktopUi.Basics.Services
|
||||
entry.CreationDate = createdAt;
|
||||
}
|
||||
|
||||
return new DemoTicketRecord
|
||||
{
|
||||
TicketId = relationId,
|
||||
TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey,
|
||||
UseRoleScope = template.UseRoleScope,
|
||||
DisplayName = displayName,
|
||||
Summary = summary,
|
||||
StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId,
|
||||
UserDisplayName = template.UserDisplayName ?? detail.AffectedUser ?? "Ticket, Timo",
|
||||
return new DemoTicketRecord
|
||||
{
|
||||
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,
|
||||
UserDisplayName = template.UserDisplayName ?? detail.AffectedUser ?? "Ticket, Timo",
|
||||
UserAccount = template.UserAccount ?? "TT007",
|
||||
UserDomain = template.UserDomain ?? "CONTOSO",
|
||||
UserId = template.UserId ?? Guid.Parse("42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a"),
|
||||
@@ -577,24 +778,43 @@ namespace FasdDesktopUi.Basics.Services
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void ScheduleFetchRetry()
|
||||
{
|
||||
if (_fetchRetryPending)
|
||||
return;
|
||||
|
||||
_fetchRetryPending = true;
|
||||
_ = _dispatcher.InvokeAsync(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
await Task.Delay(250).ConfigureAwait(false);
|
||||
await FetchAsync().ConfigureAwait(false);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_fetchRetryPending = false;
|
||||
}
|
||||
}, DispatcherPriority.Background);
|
||||
}
|
||||
private void ScheduleFetchRetry(TileScope scope)
|
||||
{
|
||||
if (!_isEnabled)
|
||||
return;
|
||||
|
||||
lock (_retryScopes)
|
||||
{
|
||||
_retryScopes.Add(scope);
|
||||
if (_retryScheduled)
|
||||
return;
|
||||
|
||||
_retryScheduled = true;
|
||||
}
|
||||
|
||||
_ = _dispatcher.InvokeAsync(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
|
||||
TileScope[] scopes;
|
||||
lock (_retryScopes)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@ using System.Windows;
|
||||
using System.Windows.Documents;
|
||||
using System.Linq;
|
||||
using System.Windows.Input;
|
||||
using System.Diagnostics;
|
||||
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,19 +103,21 @@ namespace FasdDesktopUi.Basics
|
||||
QuickActionProtocollHelper = new cQuickActionProtocollHelper(this);
|
||||
}
|
||||
|
||||
public static async Task<cSupportCaseDataProvider> GetDataProviderForAsync(List<cF4sdApiSearchResultRelation> storedRelations, cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (selectedRelation == null)
|
||||
{
|
||||
Debug.Assert(true, "The selected relation must not be null here!");
|
||||
LogEntry("The selected relation must not be null here!", LogLevels.Error);
|
||||
return null;
|
||||
}
|
||||
|
||||
// get the identities of the selected relation
|
||||
var Identities = selectedRelation.Identities.Clone();
|
||||
public static async Task<cSupportCaseDataProvider> GetDataProviderForAsync(cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (selectedRelation == null)
|
||||
{
|
||||
Debug.Assert(true, "The selected relation must not be null here!");
|
||||
LogEntry("The selected relation must not be null here!", LogLevels.Error);
|
||||
return null;
|
||||
}
|
||||
|
||||
await EnsureUserIdentityForTicketAsync(selectedRelation);
|
||||
|
||||
// get the identities of the selected relation
|
||||
var Identities = selectedRelation.Identities.Clone();
|
||||
|
||||
// get the main indentities from all identites (normally this is the user, in a special case, where a computer was searched and found without any user activities, it could be the computer)
|
||||
var MainIdentity = Identities.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.User);
|
||||
@@ -147,43 +152,68 @@ namespace FasdDesktopUi.Basics
|
||||
cSupportCaseDataProvider.CurrentProvider = null;
|
||||
}
|
||||
|
||||
if (!DataProviders.TryGetValue(MainIdentity.Id, out var _result))
|
||||
{
|
||||
_result = new cSupportCaseDataProvider();
|
||||
DataProviders.Add(MainIdentity.Id, _result);
|
||||
}
|
||||
|
||||
_result.NamedParameterEntries = new cNamedParameterList(_result);
|
||||
|
||||
_result.StartCase(MainIdentity.Id);
|
||||
if (!DataProviders.TryGetValue(MainIdentity.Id, out var _result))
|
||||
{
|
||||
_result = new cSupportCaseDataProvider();
|
||||
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;
|
||||
if (shouldSkipSlimView)
|
||||
cSupportCaseDataProvider.detailsPage?.Show();
|
||||
else
|
||||
cSupportCaseDataProvider.slimPage.Show();
|
||||
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.detailsPage?.Hide();
|
||||
}
|
||||
|
||||
return _result;
|
||||
}
|
||||
@@ -194,11 +224,35 @@ namespace FasdDesktopUi.Basics
|
||||
return null;
|
||||
}
|
||||
|
||||
public void StartCase(Guid userId)
|
||||
private static cF4sdApiSearchResultRelation GetRelationToFocus(cF4sdApiSearchResultRelation selectedRelation, IEnumerable<cF4sdApiSearchResultRelation> loadedRelations)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
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();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
lock (caseIdLockObject)
|
||||
{
|
||||
@@ -238,11 +292,109 @@ namespace FasdDesktopUi.Basics
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
@@ -432,7 +584,7 @@ namespace FasdDesktopUi.Basics
|
||||
{
|
||||
try
|
||||
{
|
||||
var couldGetHealthCard = HealthCardDataHelper.TryGetHealthcard(requiredInformationClasses);
|
||||
var couldGetHealthCard = HealthCardDataHelper.TrySetSelectedHealthcard(requiredInformationClasses);
|
||||
|
||||
if (!couldGetHealthCard)
|
||||
{
|
||||
@@ -452,35 +604,12 @@ namespace FasdDesktopUi.Basics
|
||||
}
|
||||
}
|
||||
|
||||
var isOk = await HealthCardDataHelper.GetHealthCardRawDataAsync(new cF4sdHealthCardRawDataRequest()
|
||||
{
|
||||
Identities = Identities,
|
||||
Tables = requiredTables.ToList(),
|
||||
MaxAge = cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.SearchResultAge ?? 14
|
||||
});
|
||||
|
||||
if (isNewCase)
|
||||
HealthCardDataHelper.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;
|
||||
}
|
||||
HealthCardDataHelper.LoadingHelper.LastDataRequest = DateTime.Now;
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace FasdDesktopUi.Basics.UiActions
|
||||
return null;
|
||||
|
||||
if (cF4SDCustomDialogConfig.Instance.CustomDialogContainers.TryGetValue(name, out var containerConfig))
|
||||
output = dataProvider.HealthCardDataHelper.GetContainerDataFromConfig(containerConfig);
|
||||
output = dataProvider.HealthCardDataHelper.CustomizableSectionHelper.GetContainerDataFromConfig(containerConfig);
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
@@ -55,13 +55,13 @@ namespace FasdDesktopUi.Basics.UiActions
|
||||
return false;
|
||||
|
||||
DataProvider = dataProvider;
|
||||
DataProvider.HealthCardDataHelper.DataRefreshed += (s, e) => CachedDetails.Clear();
|
||||
DataProvider.HealthCardDataHelper.LoadingHelper.DataRefreshed += (s, e) => CachedDetails.Clear();
|
||||
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
|
||||
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)
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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) };
|
||||
}
|
||||
|
||||
@@ -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) };
|
||||
|
||||
@@ -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.");
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
using C4IT.FASD.Base;
|
||||
using C4IT.Logging;
|
||||
using C4IT.MultiLanguage;
|
||||
using C4IT.MultiLanguage;
|
||||
using FasdDesktopUi.Basics.Helper;
|
||||
using FasdDesktopUi.Basics.Services.RelationService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
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)
|
||||
@@ -58,15 +61,18 @@ namespace FasdDesktopUi.Basics.UiActions
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_selectedRelation == null)
|
||||
{
|
||||
Debug.Assert(true, "A new support case can't be opend, if we have no selected relation or seach result");
|
||||
LogEntry("A new support case can't be opend, if we have no sselected relation or seach result", LogLevels.Error);
|
||||
return false;
|
||||
}
|
||||
|
||||
// check, if have an active support case
|
||||
var supportCaseActive = dataProvider?.IsActive ?? false;
|
||||
if (_selectedRelation == null)
|
||||
{
|
||||
Debug.Assert(true, "A new support case can't be opend, if we have no selected relation or seach result");
|
||||
LogEntry("A new support case can't be opend, if we have no sselected relation or seach result", LogLevels.Error);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TicketDeepLinkHelper.TryOpenTicketRelationExternally(_selectedRelation))
|
||||
return false;
|
||||
|
||||
// check, if have an active support case
|
||||
var supportCaseActive = dataProvider?.IsActive ?? false;
|
||||
|
||||
// create the search histroy entry
|
||||
var _seachHistoryEntry = new cSearchHistoryRelationEntry(Name, _selectedSearchResult, _relations, _selectedRelation, _searchUiProvider);
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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) };
|
||||
}
|
||||
|
||||
41
FasdDesktopUi/Basics/UiActions/UiShowRawHealthcardValues.cs
Normal file
41
FasdDesktopUi/Basics/UiActions/UiShowRawHealthcardValues.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
27
FasdDesktopUi/Basics/UserControls/Badge.xaml
Normal file
27
FasdDesktopUi/Basics/UserControls/Badge.xaml
Normal 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>
|
||||
27
FasdDesktopUi/Basics/UserControls/Badge.xaml.cs
Normal file
27
FasdDesktopUi/Basics/UserControls/Badge.xaml.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,14 +199,15 @@
|
||||
</UserControl.Resources>
|
||||
|
||||
<Grid>
|
||||
<ComboBox x:Name="ComboBoxControl"
|
||||
DropDownOpened="ComboBoxControl_DropDownOpened"
|
||||
DropDownClosed="ComboBoxControl_DropDownClosed"
|
||||
Background="{Binding ElementName=ComboBoxPagableUc, Path=ComboBoxBackground}"
|
||||
BorderBrush="{Binding ElementName=ComboBoxPagableUc, Path=BorderBrush}"
|
||||
ItemsSource="{Binding ElementName=ComboBoxPagableUc, Path=ItemData}"
|
||||
SelectedItem="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ComboBoxPageable}}, Path=SelectedItem, Mode=TwoWay}"
|
||||
DisplayMemberPath="Key"
|
||||
Template="{StaticResource ComboBoxPagableTemplate}" />
|
||||
</Grid>
|
||||
<ComboBox x:Name="ComboBoxControl"
|
||||
DropDownOpened="ComboBoxControl_DropDownOpened"
|
||||
DropDownClosed="ComboBoxControl_DropDownClosed"
|
||||
Background="{Binding ElementName=ComboBoxPagableUc, Path=ComboBoxBackground}"
|
||||
BorderBrush="{Binding ElementName=ComboBoxPagableUc, Path=BorderBrush}"
|
||||
BorderThickness="{Binding ElementName=ComboBoxPagableUc, Path=BorderThickness}"
|
||||
ItemsSource="{Binding ElementName=ComboBoxPagableUc, Path=ItemData}"
|
||||
SelectedItem="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ComboBoxPageable}}, Path=SelectedItem, Mode=TwoWay}"
|
||||
DisplayMemberPath="Key"
|
||||
Template="{StaticResource ComboBoxPagableTemplate}" />
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using C4IT.FASD.Base;
|
||||
using C4IT.MultiLanguage;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
using C4IT.MultiLanguage;
|
||||
using FasdDesktopUi.Basics.Helper;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -124,12 +125,25 @@ namespace FasdDesktopUi.Basics.UserControls
|
||||
}
|
||||
|
||||
|
||||
public static readonly DependencyProperty SearchDataChangedProperty =
|
||||
DependencyProperty.Register("SearchDataChanged", typeof(EventHandler<cF4sdHealthSelectionDataRequest>), typeof(ComboBoxPageable), new PropertyMetadata(null));
|
||||
|
||||
#endregion
|
||||
|
||||
#region ItemData
|
||||
public static readonly DependencyProperty SearchDataChangedProperty =
|
||||
DependencyProperty.Register("SearchDataChanged", typeof(EventHandler<cF4sdHealthSelectionDataRequest>), typeof(ComboBoxPageable), new PropertyMetadata(null));
|
||||
|
||||
#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
|
||||
{
|
||||
@@ -302,11 +316,33 @@ namespace FasdDesktopUi.Basics.UserControls
|
||||
}
|
||||
}
|
||||
|
||||
private void ComboBoxControl_DropDownClosed(object sender, EventArgs e)
|
||||
{
|
||||
timer.Stop();
|
||||
cFocusInvoker.InvokeLostFocus(this, e);
|
||||
}
|
||||
private void ComboBoxControl_DropDownClosed(object sender, EventArgs e)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -169,20 +169,38 @@ namespace FasdDesktopUi.Basics.UserControls
|
||||
{
|
||||
SearchRelationGrid.Visibility = Visibility.Visible;
|
||||
|
||||
var lastUsedTimeSpan = DateTime.UtcNow - searchRelationMenuData.LastUsed;
|
||||
LanguageDefinitionsConverter valueConverter = new LanguageDefinitionsConverter();
|
||||
string lastSeenText = null;
|
||||
if (searchRelationMenuData.LastUsed == DateTime.MinValue)
|
||||
{
|
||||
LessThanTextBlock.Text= string.Empty;
|
||||
LessThanTextBlock.Visibility = Visibility.Collapsed;
|
||||
LastSeenTextBox.Visibility = Visibility.Collapsed;
|
||||
|
||||
if (Math.Floor(lastUsedTimeSpan.TotalHours) > 24)
|
||||
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalDays), null, "Searchbar.LessThan.Days", null) as string;
|
||||
else if (Math.Floor(lastUsedTimeSpan.TotalHours) >= 1)
|
||||
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalHours), null, "Searchbar.LessThan.Hours", null) as string;
|
||||
else
|
||||
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalMinutes), null, "Searchbar.LessThan.Min", null) as string;
|
||||
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;
|
||||
|
||||
if (Math.Floor(lastUsedTimeSpan.TotalHours) > 24)
|
||||
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalDays), null, "Searchbar.LessThan.Days", null) as string;
|
||||
else if (Math.Floor(lastUsedTimeSpan.TotalHours) >= 1)
|
||||
lastSeenText = valueConverter.Convert(Math.Ceiling(lastUsedTimeSpan.TotalHours), null, "Searchbar.LessThan.Hours", null) as string;
|
||||
else
|
||||
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;
|
||||
|
||||
LessThanTextBlock.Text = lastSeenText;
|
||||
ActivityIndicator.Width = Math.Max(ActivityIndicator.Width * relationData.UsingLevel, ActivityIndicator.Width * 0.1);
|
||||
ActivityIndicator.Visibility = Visibility.Visible;
|
||||
ActivityTextBlock.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
ActivityIndicator.Width = Math.Max(ActivityIndicator.Width * relationData.UsingLevel, ActivityIndicator.Width * 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user