aktueller Stand
This commit is contained in:
@@ -886,8 +886,8 @@ namespace FasdDesktopUi.Basics.Helper
|
||||
|
||||
public string GetInformationObjectHeadingName(enumFasdInformationClass InfoClass)
|
||||
{
|
||||
if (HeadingData.TryGetValue(enumFasdInformationClass.Computer, out var computerHeadingData))
|
||||
return computerHeadingData.HeadingText;
|
||||
if (HeadingData.TryGetValue(InfoClass, out var infoClassHeadingData))
|
||||
return infoClassHeadingData.HeadingText;
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1086,7 +1086,7 @@ namespace FasdDesktopUi.Basics.Helper
|
||||
return output;
|
||||
}
|
||||
|
||||
private void UpdateNamedParameterEntries()
|
||||
internal void UpdateNamedParameterEntries()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -1978,7 +1978,7 @@ namespace FasdDesktopUi.Basics.Helper
|
||||
parent.dataProvider.Identities = identities;
|
||||
|
||||
if (newHealthCardRawData != null)
|
||||
parent.HealthCardRawData = HealthCardRawData.Combine(newHealthCardRawData);
|
||||
parent.HealthCardRawData = newHealthCardRawData;
|
||||
|
||||
parent.UpdateNamedParameterEntries();
|
||||
|
||||
@@ -2021,12 +2021,12 @@ namespace FasdDesktopUi.Basics.Helper
|
||||
if (oldTable.StartingIndex != newTable.StartingIndex)
|
||||
return true;
|
||||
|
||||
foreach (var oldTableColumn in oldTable.Columns.Values)
|
||||
foreach (var oldTableColumn in oldTable.Columns)
|
||||
{
|
||||
if (!newTable.Columns.TryGetValue(oldTableColumn.ColumnName, out var newTableColumn))
|
||||
if (!newTable.Columns.TryGetValue(oldTableColumn.Key, out var newTableColumn))
|
||||
continue;
|
||||
|
||||
if (oldTableColumn.Values.Count != newTableColumn.Values.Count)
|
||||
if (oldTableColumn.Value.Values.Count != newTableColumn.Values.Count)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
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;
|
||||
|
||||
@@ -43,8 +45,8 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
|
||||
quickActionCopyData.Name = quickActionDefinition.Names.GetValue();
|
||||
quickActionCopyData.ExecutionTime = DateTime.UtcNow;
|
||||
|
||||
quickActionCopyData.AffectedDeviceName = dataProvider.HealthCardDataHelper.GetInformationObjectHeadingName(enumFasdInformationClass.Computer);
|
||||
var infoClass = dataProvider.HealthCardDataHelper.SelectedHealthCard.InformationClasses.FirstOrDefault();
|
||||
quickActionCopyData.AffectedDeviceName = dataProvider.HealthCardDataHelper.GetInformationObjectHeadingName(infoClass);
|
||||
|
||||
quickActionCopyData.WasRunningOnAffectedDevice = wasRunningOnAffectedDevice;
|
||||
quickActionCopyData.QuickActionOutput = quickActionOutput;
|
||||
@@ -91,7 +93,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
{
|
||||
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(quickActionDefinition, copyData.QuickActionOutput);
|
||||
ascii += GetQuickActionAsciiValueComparisonString(copyData.MeasureValues);
|
||||
@@ -99,7 +101,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
return ascii;
|
||||
}
|
||||
|
||||
private static 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
|
||||
@@ -118,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)
|
||||
@@ -291,7 +299,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
|
||||
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(quickActionDefinition, copyData.QuickActionOutput);
|
||||
output += GetQuickActionHtmlValueComparison(copyData.MeasureValues);
|
||||
@@ -304,7 +312,7 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService
|
||||
return output;
|
||||
}
|
||||
|
||||
private static 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
|
||||
@@ -323,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)
|
||||
|
||||
@@ -81,8 +81,8 @@ namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleAvailableCaseRelationsAdded(object sender, RelationEventArgs e)
|
||||
=> AvailableCaseRelationsAdded?.Invoke(this, e);
|
||||
private void HandleAvailableCaseRelationsAdded(object sender, RelationEventArgs e)
|
||||
=> AvailableCaseRelationsAdded?.Invoke(this, e);
|
||||
|
||||
private void HandleCaseDataChanged(object sender, SupportCaseDataEventArgs e)
|
||||
{
|
||||
@@ -127,13 +127,13 @@ namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
|
||||
|
||||
SupportCaseDataProviderArtifact.HealthCardDataHelper.TrySetSelectedHealthcard(requiredInformationClasses);
|
||||
|
||||
_focusedRelation = relation;
|
||||
|
||||
if (!_selectedRelations.Values.Contains(relation))
|
||||
_hasDirectionConnection = false;
|
||||
|
||||
_selectedRelations[cF4sdIdentityEntry.GetFromSearchResult(relation.Type)] = relation;
|
||||
_ = Task.Run(async () => await UpdateStatusOfSelectedRelations());
|
||||
_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()
|
||||
@@ -147,7 +147,7 @@ namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UpdateStatusOfSelectedRelations()
|
||||
private async Task UpdateStatusOfSelectedRelations()
|
||||
{
|
||||
const string StatusString = "Status";
|
||||
|
||||
@@ -197,6 +197,11 @@ namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
|
||||
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:
|
||||
@@ -215,11 +220,13 @@ namespace FasdDesktopUi.Basics.Services.SupportCase.Controllers
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task RefreshDataForCurrentlyFocusedRelationAsync()
|
||||
{
|
||||
SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.LastDataRequest = DateTime.Now;
|
||||
await _supportCaseProcessor.UpdateLatestCaseDataFor(_focusedRelation);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
{
|
||||
private readonly Dictionary<enumFasdInformationClass, IList<cF4sdApiSearchResultRelation>> _caseRelations = new Dictionary<enumFasdInformationClass, IList<cF4sdApiSearchResultRelation>>();
|
||||
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;
|
||||
@@ -93,11 +94,13 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
|
||||
// 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 = tablesToLoad.Any(t =>
|
||||
_supportCaseDataCache.TryGetValue(t, out var cachedTables)
|
||||
&& cachedTables.TryGetValue(relation, out var table)
|
||||
&& !table.IsIncomplete && !table.Columns.Values.Any(c => c.IsIncomplete)
|
||||
);
|
||||
bool isDataComplete = IsRawDataCacheComplete() && IsSupportCaseDataCacheComplete();
|
||||
|
||||
if (isDataComplete)
|
||||
{
|
||||
await SupportCaseDataProviderArtifact.HealthCardDataHelper.LoadingHelper.SetHealthCardRawData(_rawDataCache[relation], relation.Identities);
|
||||
return;
|
||||
}
|
||||
|
||||
var rawDataRequest = new cF4sdHealthCardRawDataRequest()
|
||||
{
|
||||
@@ -111,11 +114,13 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -130,6 +135,24 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
|
||||
bool IsRawDataCacheComplete()
|
||||
{
|
||||
return tablesToLoad.All(t =>
|
||||
_rawDataCache.TryGetValue(relation, out var cachedRawData)
|
||||
&& cachedRawData.Tables.TryGetValue(t, out var cachedTable)
|
||||
&& !cachedTable.IsIncomplete && !cachedTable.Columns.Values.Any(c => c.IsIncomplete)
|
||||
);
|
||||
}
|
||||
|
||||
bool IsSupportCaseDataCacheComplete()
|
||||
{
|
||||
return tablesToLoad.Any(t =>
|
||||
_supportCaseDataCache.TryGetValue(t, out var cachedTables)
|
||||
&& cachedTables.TryGetValue(relation, out var table)
|
||||
&& !table.IsIncomplete && !table.Columns.Values.Any(c => c.IsIncomplete)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateSupportCaseDataCache(cF4sdApiSearchResultRelation relation, IEnumerable<cF4SDHealthCardRawData.cHealthCardTable> tables)
|
||||
@@ -151,7 +174,7 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
|
||||
if (!_supportCaseDataCache[table.Name].ContainsKey(relation))
|
||||
_supportCaseDataCache[table.Name][relation] = table;
|
||||
else
|
||||
else if (_supportCaseDataCache[table.Name][relation].IsIncomplete)
|
||||
MergeTable(_supportCaseDataCache[table.Name][relation], table);
|
||||
}
|
||||
|
||||
@@ -164,9 +187,18 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
|
||||
void MergeTable(cF4SDHealthCardRawData.cHealthCardTable existingTable, cF4SDHealthCardRawData.cHealthCardTable newTable)
|
||||
{
|
||||
foreach (var newColumn in newTable.Columns)
|
||||
try
|
||||
{
|
||||
existingTable.Columns[newColumn.Key] = newColumn.Value;
|
||||
existingTable.IsIncomplete = newTable.IsIncomplete;
|
||||
|
||||
foreach (var newColumn in newTable.Columns)
|
||||
{
|
||||
existingTable.Columns[newColumn.Key] = newColumn.Value;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -175,6 +207,8 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
{
|
||||
try
|
||||
{
|
||||
_rawDataCache.Remove(relation);
|
||||
|
||||
foreach (var tableCache in _supportCaseDataCache.Values)
|
||||
{
|
||||
tableCache.Remove(relation);
|
||||
@@ -209,6 +243,20 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
|
||||
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)
|
||||
{
|
||||
column.Values[0] = null;
|
||||
column.IsIncomplete = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -110,6 +110,10 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
detailsData = await _supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DetailPage.GetDataAsync();
|
||||
_detailsPageDataCache.Add(relation, detailsData);
|
||||
}
|
||||
else
|
||||
{
|
||||
_supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.UpdateNamedParameterEntries();
|
||||
}
|
||||
|
||||
CaseDataChanged?.Invoke(this, new SupportCaseDataEventArgs());
|
||||
}
|
||||
@@ -124,7 +128,7 @@ namespace FasdDesktopUi.Basics.Services.SupportCase
|
||||
await ActualizeDataAsync(agentUserId, agentDeviceId);
|
||||
_supportCase.InvalidateLatestCaseDataCacheFor(relation, out var invalidatedTables);
|
||||
_detailsPageDataCache.Remove(relation);
|
||||
await _supportCase.LoadSupportCaseDataAsync(relation, invalidatedTables.Select(t => t.Name));
|
||||
await _supportCase.LoadSupportCaseDataAsync(relation, invalidatedTables.Where(t => !t.Name.StartsWith("Computation_")).Select(t => t.Name));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -107,15 +107,17 @@ namespace FasdDesktopUi.Basics
|
||||
{
|
||||
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();
|
||||
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);
|
||||
@@ -312,6 +314,87 @@ namespace FasdDesktopUi.Basics
|
||||
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()
|
||||
{
|
||||
|
||||
@@ -4,8 +4,8 @@ using C4IT.MultiLanguage;
|
||||
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;
|
||||
@@ -92,9 +92,9 @@ namespace FasdDesktopUi.Basics.UiActions
|
||||
// get the new data provider for the support call informations (get it from the cache or create a new one)
|
||||
dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(_selectedRelation, _relationService);
|
||||
|
||||
bool shouldLoadRelationsForSelectedRelation = _selectedRelation.Type == enumF4sdSearchResultClass.User;
|
||||
if (shouldLoadRelationsForSelectedRelation)
|
||||
StartLoadingRelationsFor(_selectedRelation);
|
||||
bool shouldLoadRelationsForSelectedRelation = _selectedRelation.Type == enumF4sdSearchResultClass.User;
|
||||
if (shouldLoadRelationsForSelectedRelation)
|
||||
StartLoadingRelationsFor(_selectedRelation);
|
||||
|
||||
if (dataProvider is null)
|
||||
{
|
||||
|
||||
@@ -91,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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace FasdDesktopUi.Basics.UserControls
|
||||
Dispatcher.Invoke(() => SearchSpinner.Visibility = visibility);
|
||||
}
|
||||
|
||||
public async Task SetFixedSearchResultAsync(enumF4sdSearchResultClass Class, string search, cFilteredResults _result)
|
||||
public async Task SetFixedSearchResultAsync(enumF4sdSearchResultClass Class, string search, cFilteredResults result)
|
||||
{
|
||||
SearchStatus = eSearchStatus.fixedResult;
|
||||
SearchTextBox.IsEnabled = false;
|
||||
@@ -173,8 +173,8 @@ namespace FasdDesktopUi.Basics.UserControls
|
||||
}
|
||||
SearchTextBox.Text = search;
|
||||
|
||||
await ChangedSearchValue?.Invoke(_result);
|
||||
|
||||
if (ChangedSearchValue != null)
|
||||
await ChangedSearchValue.Invoke(result);
|
||||
}
|
||||
|
||||
public void SetApiStatus()
|
||||
|
||||
Reference in New Issue
Block a user