using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using C4IT.Configuration; using C4IT.F4SD.DisplayFormatting; using C4IT.FASD.Base; using C4IT.FASD.Cockpit.Communication; using C4IT.Logging; using C4IT.MultiLanguage; using F4SD_AdaptableIcon.Enums; using FasdDesktopUi.Basics.CustomEvents; using FasdDesktopUi.Basics.Enums; using FasdDesktopUi.Basics.Models; using FasdDesktopUi.Basics.UiActions; using FasdDesktopUi.Pages.DetailsPage.Models; using FasdDesktopUi.Pages.SlimPage.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using static C4IT.FASD.Base.cF4SDHealthCardRawData; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.Helper { public class cHealthCardDataHelper { #region sub helpers public readonly cHealthCardSlimPageHelper SlimCard; public readonly cHealthCardHistoryDataHelper HistoryData; public readonly cHealthCardDetailPageHelper DetailPage; public readonly cHealthCardDataLoadingHelper LoadingHelper; public readonly cHealthCardCustomizableSectionHelper CustomizableSectionHelper; #endregion sub helpers #region public properties, fields & events public cHealthCard SelectedHealthCard { get; private set; } public cF4SDHealthCardRawData HealthCardRawData { get; private set; } = new cF4SDHealthCardRawData(); public bool IsInEditMode { get => isInEditMode; set { isInEditMode = value; EditModeChanged?.Invoke(this, new BooleanEventArgs() { BooleanArg = value }); } } public static event EventHandler EditModeChanged; #endregion public properties, fields & events #region private properties, fields & events private readonly cSupportCaseDataProvider dataProvider; private bool isInEditMode; private Dictionary HeadingData { get; set; } private readonly MenuItemDataProvider _menuDataProvider; #endregion private properties, fields & events public cHealthCardDataHelper(cSupportCaseDataProvider dataProvider) { this.dataProvider = dataProvider; _menuDataProvider = new MenuItemDataProvider(dataProvider); cUtility.RawValueFormatter.SetDefaultCulture(new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); cUtility.RawValueFormatter.SetDefaultTimeZone(TimeZoneInfo.Local); HistoryData = new cHealthCardHistoryDataHelper(this); SlimCard = new cHealthCardSlimPageHelper(this); DetailPage = new cHealthCardDetailPageHelper(this); LoadingHelper = new cHealthCardDataLoadingHelper(this); CustomizableSectionHelper = new cHealthCardCustomizableSectionHelper(this); } public void Reset() { try { HeadingData = null; if (HealthCardRawData?.Tables?.Count > 0) { var tablesToRemove = HealthCardRawData.Tables.Values.Select(value => value.InformationClass) .Distinct() .ToList(); RemoveTablesWithUpdatedIdentities(tablesToRemove); } } catch (Exception E) { LogException(E); } } public void RemoveTablesWithUpdatedIdentities(List updatedInformationClasses) { try { if (updatedInformationClasses.Count <= 0) return; //var dataProvider = cDataProviderBase.CurrentPorvider; if (dataProvider is null) return; var tablesToRemove = dataProvider.HealthCardDataHelper.HealthCardRawData?.Tables?.Where(table => updatedInformationClasses.Contains(table.Value.InformationClass)) .Select(table => table.Key) .ToArray(); foreach (var tableToRemove in tablesToRemove) { dataProvider.HealthCardDataHelper.HealthCardRawData?.Tables?.Remove(tableToRemove); } dataProvider.HealthCardDataHelper.HealthCardRawData?.Tables?.Remove("agnt-user"); dataProvider.HealthCardDataHelper.HealthCardRawData?.Tables?.Remove("agnt-computer"); } catch (Exception E) { LogException(E); } } #region GetHealthCardData private static cHealthCard GetAvailableHealthCard(List informationClasses) { try { if (informationClasses is null) return null; foreach (var healthCard in cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.HealthCards.Values) { bool found = true; foreach (var informationClass in informationClasses) { found &= healthCard.InformationClasses.Any(healthCardInformationClass => healthCardInformationClass == informationClass); if (!found) break; } found &= HasCockpitUserRequiredRoles(healthCard.RequiredRoles); if (found) return healthCard; } } catch (Exception E) { LogException(E); } finally { } return null; } public static bool HasAvailableHealthCard(List informationClasses) { return GetAvailableHealthCard(informationClasses) != null; } public bool TrySetSelectedHealthcard(List informationClasses) { var _hc = GetAvailableHealthCard(informationClasses); if (_hc != null) { SelectedHealthCard = _hc; return true; } return false; } #endregion GetHealthCardData #region Helper public static bool IsUiVisible(IUiVisibilityInformation visibilityInformation, cNamedParameterList NamedParameters = null) { if (visibilityInformation == null) return true; if (visibilityInformation.IsHidden) return false; if (!string.IsNullOrEmpty(visibilityInformation.IsVisibleByParameter)) if (!IsNamedParameterTrue(visibilityInformation.IsVisibleByParameter, NamedParameters)) return false; if (visibilityInformation.RequiredRoles != null && visibilityInformation.RequiredRoles.Count > 0) { if (!HasCockpitUserRequiredRoles(visibilityInformation.RequiredRoles)) return false; } return true; } private static bool HasCockpitUserRequiredRoles(List requiredRoles) { try { if (requiredRoles is null || requiredRoles.Count == 0) return true; List 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; } private List GetValuesOfHealthCardTableColumn(int startingIndex, cF4SDHealthCardRawData.cHealthCardTableColumn healthCardColumn) { List output = new List(); if (healthCardColumn?.Values == null) return output; try { for (int i = 0; i < startingIndex; i++) { output.Add(null); } output.AddRange(healthCardColumn.Values); } catch (Exception E) { LogException(E); } return output; } private List GetStateValues(cHealthCardTableColumn tableColumn) { if (tableColumn == null) return new List(); else return GetValuesOfHealthCardTableColumn(tableColumn.Table.StartingIndex, tableColumn); } private List GetStateValues(cValueAddress DatabaseInfo, bool isStatic) { List output = new List(); try { if (DatabaseInfo != null) { var healthCardTable = HealthCardRawData.GetTableByName(DatabaseInfo.ValueTable, isStatic); if (healthCardTable != null) if (healthCardTable.Columns.TryGetValue(DatabaseInfo.ValueColumn, out var healthCardColumn)) output = GetValuesOfHealthCardTableColumn(healthCardTable.StartingIndex, healthCardColumn); } } catch (Exception E) { LogException(E); } return output; } private object GetStateValueAt(cValueAddress DatabaseInfo, int index, bool isStatic) { var stateValues = GetStateValues(DatabaseInfo, isStatic); if (stateValues.Count <= index) return null; return stateValues[index]; } private enumHighlightColor GetHighlightColorWithReference(object rawValue, cHealthCardStateBase stateDefinition) { try { object rawValueLeveling = rawValue; cHealthCardStateBase stateDefinitionForLeveling = stateDefinition; if (stateDefinition is cHealthCardStateRefLink refLinkState) { rawValueLeveling = null; var referencedStateDefinition = cF4SDHealthCardConfig.GetReferencableStateWithName(refLinkState.ParentNode, refLinkState.Reference); if (referencedStateDefinition == null) return enumHighlightColor.none; stateDefinitionForLeveling = referencedStateDefinition; if (referencedStateDefinition?.DatabaseInfo != null) rawValueLeveling = GetStateValueAt(referencedStateDefinition.DatabaseInfo, 0, true); } var _color = GetHighlightColor(rawValueLeveling, stateDefinitionForLeveling, 0, true); return _color; } catch (Exception ex) { LogException(ex); } return enumHighlightColor.none; } private enumHighlightColor GetHighlightColor(object value, cHealthCardStateBase stateDefinition, int referenceDays, bool isStatic) { if (stateDefinition == null) return enumHighlightColor.none; enumHighlightColor output = enumHighlightColor.none; if (stateDefinition is cHealthCardStateAggregation _stateAggregation) return GetSummaryStatusColor(_stateAggregation.States, isStatic, referenceDays) ?? enumHighlightColor.none; try { if (value == null) return output; if (stateDefinition is cHealthCardStateLevel stateLevel) { var valueDouble = cF4SDHealthCardRawData.GetDouble(value); if (valueDouble != null) { if (stateLevel.IsDirectionUp) output = valueDouble >= stateLevel.Error ? enumHighlightColor.red : valueDouble >= stateLevel.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; else output = valueDouble <= stateLevel.Error ? enumHighlightColor.red : valueDouble <= stateLevel.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; } } else if (stateDefinition is cHealthCardStateVersion stateVersion) { var valueVersion = cF4SDHealthCardRawData.GetVersion(value); if (valueVersion != null) { if (stateVersion.IsDirectionUp) output = valueVersion >= stateVersion.Error ? enumHighlightColor.red : valueVersion >= stateVersion.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; else output = valueVersion <= stateVersion.Error ? enumHighlightColor.red : valueVersion <= stateVersion.Warning ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; } } else if (stateDefinition is cHealthCardStateDateTime stateDateTime) { var valueDateTime = cF4SDHealthCardRawData.GetDateTime(value); if (valueDateTime != null) { var tempDateTime = valueDateTime ?? DateTime.Now; var differenceHours = Math.Floor((DateTime.UtcNow.AddDays(-referenceDays) - tempDateTime).TotalHours); if (stateDateTime.IsDirectionUp) output = differenceHours >= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours >= stateDateTime.WarningHours ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; else output = differenceHours <= stateDateTime.ErrorHours ? enumHighlightColor.red : differenceHours <= stateDateTime.WarningHours ? enumHighlightColor.orange : stateDefinition.IsNotTransparent ? enumHighlightColor.green : enumHighlightColor.none; } } else if (stateDefinition is cHealthCardStateInfo) { output = stateDefinition.IsNotTransparent ? enumHighlightColor.blue : enumHighlightColor.none; } else if (stateDefinition is cHealthCardStateTranslation stateTranslation) { var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(stateTranslation, stateTranslation.Translation); if (abstractTranslation == null || !(abstractTranslation is cHealthCardTranslator translation)) return output; enumHealthCardStateLevel translationStateLevel = translation.DefaultTranslation?.StateLevel ?? enumHealthCardStateLevel.Info; foreach (var translationEntry in translation.Translations) { if (translationEntry.Values.Any(translationValue => value.ToString().Equals(translationValue, StringComparison.InvariantCultureIgnoreCase))) translationStateLevel = translationEntry.StateLevel; } switch (translationStateLevel) { case enumHealthCardStateLevel.None: output = enumHighlightColor.none; break; case enumHealthCardStateLevel.Ok: if (stateDefinition.IsNotTransparent) output = enumHighlightColor.green; break; case enumHealthCardStateLevel.Warning: output = enumHighlightColor.orange; break; case enumHealthCardStateLevel.Error: output = enumHighlightColor.red; break; case enumHealthCardStateLevel.Info: if (stateDefinition.IsNotTransparent) output = enumHighlightColor.blue; break; } } else if (stateDefinition is cHealthCardStateRefLink stateRefLink) { //if (cHealthCardPrerequisites.GetReferencableStates(SelectedHealthCard).TryGetValue(stateRefLink.Reference, out var referencedState)) // output = GetHighlightColor(thresholdValues); } } catch (Exception E) { LogException(E); } return output; } private enumHighlightColor? GetSummaryStatusColor(List stateDefinitions, bool isStatic, int dayIndex = 0) { enumHighlightColor? output = null; try { foreach (var stateDefinition in stateDefinitions) { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) continue; var stateValue = GetStateValueAt(stateDefinition.DatabaseInfo, dayIndex, isStatic); enumHighlightColor? tempColor = null; if (stateValue != null) { tempColor = GetHighlightColor(stateValue, stateDefinition, dayIndex, isStatic); if (tempColor == enumHighlightColor.none && stateValue != null) tempColor = enumHighlightColor.green; } if (output == null) output = tempColor; else if (tempColor != null) output = (enumHighlightColor)Math.Max((int)tempColor, (int)output); } } catch (Exception E) { LogException(E); } return output; } private cDataHistoryValueModel ProcessSingleStateValue(cProcessStateRequirements Requirements, object value, object thresholdValue, int columnIndex) { try { var cellContent = new cDataHistoryValueModel() { Content = null, HighlightColor = enumHighlightColor.none, IsLoading = Requirements.valueTableColumn?.IsIncomplete ?? false }; if (Requirements.valueState is cHealthCardStateAggregation stateAggregation) { cellContent.Content = "Ø"; cellContent.HighlightColor = GetSummaryStatusColor(stateAggregation.States, Requirements.isStatic, columnIndex); if (cellContent.HighlightColor == null) { cellContent.Content = "-"; cellContent.HighlightColor = enumHighlightColor.none; } } else { FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.Date.AddDays(columnIndex), TimeZone = TimeZoneInfo.Local }; var _c = cUtility.RawValueFormatter.GetDisplayValue(value, Requirements.valueState.DisplayType, options); if (!string.IsNullOrWhiteSpace(_c)) cellContent.Content = _c; cellContent.ThresholdValues = new cStateThresholdValues() { Value = thresholdValue, StateDefinition = Requirements.valueState.StateProcessingRequirements.tresholdState, ReferenceDays = columnIndex }; cellContent.HighlightColor = GetHighlightColor(cellContent.ThresholdValues.Value, Requirements.valueState.StateProcessingRequirements.tresholdState, columnIndex, Requirements.isStatic); if (Requirements.valueState.StateProcessingRequirements.translation != null && cellContent.Content != null) { var translationValue = Requirements.valueState.StateProcessingRequirements.translation.DefaultTranslation?.Translation.GetValue() ?? cellContent.Content; foreach (var translationEntry in Requirements.valueState.StateProcessingRequirements.translation.Translations) { if (translationEntry.Values.Any(_val => cellContent.Content.Equals(_val, StringComparison.CurrentCultureIgnoreCase))) translationValue = translationEntry.Translation.GetValue(); } cellContent.Content = translationValue; } if (cellContent.Content == null) cellContent.Content = "-"; if (!cellContent.IsLoading && Requirements.valueTableColumn?.Table != null) { int maxColumnCount = 0; if (Requirements.valueTableColumn.Table.Columns?.Count > 0) maxColumnCount = Requirements.valueTableColumn.Table.Columns.Max(column => column.Value?.Values?.Count ?? 1); if (columnIndex < Requirements.valueTableColumn.Table.StartingIndex || columnIndex >= Requirements.valueTableColumn.Table.StartingIndex + maxColumnCount) cellContent.IsLoading = Requirements.valueTableColumn.Table.IsIncomplete; } } if (Requirements.valueState.Details != null && value != null) cellContent.UiAction = new cShowDetailedDataAction(Requirements.valueState, columnIndex); return cellContent; } catch (Exception E) { LogException(E); } return null; } private cProcessStateRequirements CreateProcessStateRequirements(cHealthCardStateBase stateDefinition, bool isStatic) { var ProcessRequirements = new cProcessStateRequirements() { valueState = stateDefinition, valueTableColumn = null, isStatic = isStatic, Values = new List(), ThresholdValues = new List() }; try { // get the global requirements one which are not support case dependent if (stateDefinition.StateProcessingRequirements == null) { stateDefinition.StateProcessingRequirements = new cHealthCardStateBase.cStateProcessingRequirements() { tresholdState = stateDefinition, translation = null }; // if we have a ref link, get the referenced stateDefinition and state values ProcessRequirements.ThresholdValues = ProcessRequirements.Values; if (stateDefinition is cHealthCardStateRefLink ReferencedLinkState) { var refState = cF4SDHealthCardConfig.GetReferencableStateWithName(ReferencedLinkState.ParentNode, ReferencedLinkState.Reference); if (refState != null) { stateDefinition.StateProcessingRequirements.tresholdState = refState; } } //in state is translation state, get the translation if (stateDefinition is cHealthCardStateTranslation _StateTranslation) { var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(_StateTranslation, _StateTranslation.Translation); if (abstractTranslation is cHealthCardTranslator castedTranslation) stateDefinition.StateProcessingRequirements.translation = castedTranslation; } } // get the state values if (stateDefinition.DatabaseInfo != null) { var _table = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic); if (_table != null) { _table.Columns.TryGetValue(stateDefinition.DatabaseInfo.ValueColumn, out ProcessRequirements.valueTableColumn); ProcessRequirements.Values = GetValuesOfHealthCardTableColumn(_table.StartingIndex, ProcessRequirements.valueTableColumn); } } // get the treshold values if (stateDefinition == stateDefinition.StateProcessingRequirements.tresholdState) ProcessRequirements.ThresholdValues = ProcessRequirements.Values; else ProcessRequirements.ThresholdValues = GetStateValues(stateDefinition.StateProcessingRequirements.tresholdState.DatabaseInfo, isStatic); } catch (Exception E) { LogException(E); } return ProcessRequirements; } private cUiActionBase GetUiActionByQuickActionNames(List names, string uiActionName, string uiActionDescription) { try { if (names?.Count is null || names.Count == 0) return null; if (names.Count > 1) { List uiActions = _menuDataProvider.GetMenuItemData() .Where(data => names.Contains(data.UiAction.Name) && data.UiAction.DisplayType != enumActionDisplayType.hidden) .OrderBy(action => names.IndexOf(action.UiAction.Name)) .Select(action => SelectWithRecommendation(action, uiActionName, uiActionDescription)) .ToList(); if (uiActions?.Count == 0) return null; if (uiActions?.Count == 1) return uiActions[0].UiAction; return new cSubMenuAction(false) { SubMenuData = uiActions, Name = uiActionName, Description = uiActionDescription, DisplayType = enumActionDisplayType.enabled }; } else { string quickActionName = names[0]; if (string.IsNullOrWhiteSpace(quickActionName)) return null; cUiActionBase uiAction = _menuDataProvider.GetMenuItemData() // .Where(data => data is cUiQuickAction) .FirstOrDefault(data => data.UiAction.Name == quickActionName && data.UiAction.DisplayType == enumActionDisplayType.enabled)?.UiAction; if (uiAction is cUiQuickAction uiQuickAction) uiQuickAction.QuickActionRecommendation = new cRecommendationDataModel() { Category = uiActionName, Recommendation = uiActionDescription }; return uiAction; } } catch (Exception E) { LogException(E); } return null; cMenuDataBase SelectWithRecommendation(cMenuDataBase menuData, string category, string recommendation) { if (!(menuData.UiAction is cUiQuickAction uiQuickAction)) return menuData; uiQuickAction.QuickActionRecommendation = new cRecommendationDataModel() { Category = category, Recommendation = recommendation }; return menuData; } } private cDataHistoryValueModel GetTitleColumnOfHealthCardState(cHealthCardStateBase stateDefinition) { cDataHistoryValueModel output = null; try { var titleRowContent = stateDefinition.Names.GetValue(); var titleRowDescription = stateDefinition.Descriptions.GetValue(Default: titleRowContent); var titleRowPresentationStyle = stateDefinition is cHealthCardStateAggregation ? enumHistoryTitleType.aggregate : enumHistoryTitleType.header; cUiActionBase titleRowQuickAction = GetUiActionByQuickActionNames(stateDefinition.QuickActions, stateDefinition.Names.GetValue(), stateDefinition.Descriptions.GetValue(Default: null)); output = new cDataHistoryValueModel() { Content = titleRowContent, ContentDescription = titleRowDescription, PresentationStyle = titleRowPresentationStyle, UiAction = titleRowQuickAction }; } catch (Exception E) { LogException(E); } return output; } private static bool IsNamedParameterTrue(string namedParameter, cNamedParameterList NamedParameters) { if (NamedParameters == null) return false; if (!NamedParameters.TryGetValue(namedParameter, out var entry)) return false; var entryValue = entry.GetValue(); cConfigRegistryHelper.ReadFromStringBoolean(entryValue, out var result); return result; } #endregion #region Editable public List> GetEditInformationSelectionValues(cHealthCardStateBase stateDefinition) { List> output = null; try { if (!(stateDefinition.EditInfo is cStateEditableSelection editableSelectionInfo)) return output; List listValues = null; if (editableSelectionInfo.SelectionRawValueDatabaseInfo != null) listValues = GetStateValues(editableSelectionInfo.SelectionRawValueDatabaseInfo, false); List listDisplayValues = listValues.Select(value => value.ToString()).ToList(); if (editableSelectionInfo.SelectionDisplayValueDatabaseInfo != null) listDisplayValues = GetStateValues(editableSelectionInfo.SelectionDisplayValueDatabaseInfo, false) .Select(value => value.ToString()) .ToList(); if (editableSelectionInfo.Translation != null) { var translation = cF4SDHealthCardConfig.GetTranslationsWithName(stateDefinition, editableSelectionInfo.Translation); if (translation != null && translation is cHealthCardTranslator translator) { foreach (var displayValue in listDisplayValues.ToArray()) { var matchingTranslation = translator.Translations.FirstOrDefault(translatorTranslation => translatorTranslation.Values.Any(value => value.Equals(displayValue, StringComparison.InvariantCultureIgnoreCase))); if (matchingTranslation != null) listDisplayValues[listDisplayValues.IndexOf(displayValue)] = matchingTranslation.Translation.GetValue(); else listDisplayValues[listDisplayValues.IndexOf(displayValue)] = translator.DefaultTranslation?.Translation?.GetValue() ?? displayValue; } } } if (listValues.Count != listDisplayValues.Count) LogEntry($"The count of edit-values and edit-display-values doesn't match in the State '{stateDefinition.Name}'.", LogLevels.Warning); output = Enumerable .Zip(listValues, listDisplayValues, (value, displayValue) => new KeyValuePair(value, displayValue ?? value.ToString())) .ToList(); } catch (Exception E) { LogException(E); } return output; } public async Task UpdateHealthcardTableDataAsync(cValueAddress databaseInfo, object newValue) { bool output = false; try { var table = HealthCardRawData.GetTableByName(databaseInfo.ValueTable, false); if (table is null) return false; var identity = dataProvider.Identities.FirstOrDefault(identityEnty => identityEnty.Class == table.InformationClass); Guid id = identity?.Id ?? Guid.Empty; cF4SDWriteParameters updateParameter = new cF4SDWriteParameters() { id = id, TableName = databaseInfo.ValueTable, Values = new Dictionary() { [databaseInfo.ValueColumn] = newValue } }; await cFasdCockpitCommunicationBase.Instance.UpdateHealthcardTableData(updateParameter); } catch (Exception E) { LogException(E); } return output; } #endregion #region Page Common public List GetHeadingDataWithoutOnlineStatus() { Dictionary outputDictionary = new Dictionary(); var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (HeadingData != null) outputDictionary = HeadingData; var healthCardHeaderConfig = SelectedHealthCard.HeaderValues; bool isOnline = false; foreach (var headerValue in healthCardHeaderConfig) { string headingText = null; var selectedTable = HealthCardRawData.GetTableByName(headerValue.DatabaseInfo.ValueTable, true); if (selectedTable != null) if (selectedTable.Columns.TryGetValue(headerValue.DatabaseInfo.ValueColumn, out var selectedColumn)) headingText = cF4SDHealthCardRawData.GetString(selectedColumn.Values[0], null); cHeadingDataModel singleHeadingValue = null; if (outputDictionary != null && outputDictionary.TryGetValue(headerValue.InformationClass, out singleHeadingValue)) if (singleHeadingValue.IsOnline && singleHeadingValue.HeadingText.Equals(headingText)) continue; cF4sdIdentityList headingIdentities = dataProvider.Identities; singleHeadingValue = new cHeadingDataModel() { InformationClass = headerValue.InformationClass, HeadingText = headingText, IsOnline = isOnline, Identities = headingIdentities }; outputDictionary[headerValue.InformationClass] = singleHeadingValue; } foreach (enumFasdInformationClass informationClass in Enum.GetValues(typeof(enumFasdInformationClass))) { if (outputDictionary.ContainsKey(informationClass)) continue; 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; } outputDictionary[informationClass] = new cHeadingDataModel() { InformationClass = informationClass, HeadingText = headingText }; } HeadingData = outputDictionary; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return outputDictionary.Values.ToList(); } public async Task> UpdateOnlineStatusAsync() { try { if (HeadingData is null) return null; if (dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameter)) if (int.TryParse(agentDeviceIdParameter.GetValue(), out int agentDeviceId)) HeadingData[enumFasdInformationClass.Computer].IsOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId); if (dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameterUserContext)) if (int.TryParse(agentDeviceIdParameterUserContext.GetValue(), out int agentDeviceId)) if (dataProvider.NamedParameterEntries.TryGetValue("AgentUserId", out var agentUserIdParameter)) if (int.TryParse(agentUserIdParameter.GetValue(), out int agentUserId)) HeadingData[enumFasdInformationClass.User].IsOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId, agentUserId); } catch (Exception E) { LogException(E); } return HeadingData?.Values?.ToList(); } public string GetInformationObjectHeadingName(enumFasdInformationClass InfoClass) { if (HeadingData.TryGetValue(InfoClass, out var infoClassHeadingData)) return infoClassHeadingData.HeadingText; return null; } private async Task> GetHeadingDataAsync() { Dictionary outputDictionary = new Dictionary(); var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (HeadingData != null) outputDictionary = HeadingData; var healthCardHeaderConfig = SelectedHealthCard.HeaderValues; bool isOnline = false; foreach (var headerValue in healthCardHeaderConfig) { string headingText = null; var selectedTable = HealthCardRawData.GetTableByName(headerValue.DatabaseInfo.ValueTable, true); if (selectedTable != null) if (selectedTable.Columns.TryGetValue(headerValue.DatabaseInfo.ValueColumn, out var selectedColumn)) headingText = cF4SDHealthCardRawData.GetString(selectedColumn.Values[0], null); cHeadingDataModel singleHeadingValue = null; if (outputDictionary != null) outputDictionary.TryGetValue(headerValue.InformationClass, out singleHeadingValue); cF4sdIdentityList headingIdentities = dataProvider.Identities; switch (headerValue.InformationClass) { case enumFasdInformationClass.Computer: if (dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameter)) if (int.TryParse(agentDeviceIdParameter.GetValue(), out int agentDeviceId)) isOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId); break; case enumFasdInformationClass.User: if (dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameterUserContext)) if (int.TryParse(agentDeviceIdParameterUserContext.GetValue(), out int agentDeviceId)) if (dataProvider.NamedParameterEntries.TryGetValue("AgentUserId", out var agentUserIdParameter)) if (int.TryParse(agentUserIdParameter.GetValue(), out int agentUserId)) isOnline = await cFasdCockpitCommunicationBase.Instance.GetAgentOnlineStatus(agentDeviceId, agentUserId); break; case enumFasdInformationClass.Ticket: //todo: check ticket status not via stored relations! if (dataProvider.CaseRelations != null && dataProvider.CaseRelations.TryGetValue(enumFasdInformationClass.Ticket, out var ticketValues)) { var selectedTicket = ticketValues.FirstOrDefault(value => dataProvider.Identities.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.Ticket)?.Id == value.id); if (selectedTicket != null) { if (selectedTicket.Infos.TryGetValue("StatusId", out var statusIdString)) { Enum.TryParse(statusIdString, out enumTicketStatus statusId); isOnline = statusId != enumTicketStatus.Closed; } } } break; case enumFasdInformationClass.VirtualSession: if (dataProvider.CaseRelations != null && dataProvider.CaseRelations.TryGetValue(enumFasdInformationClass.VirtualSession, out var virtualSessionValues)) { var selectedVirtualSession = virtualSessionValues.FirstOrDefault(value => dataProvider.Identities.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.VirtualSession)?.Id == value.id); if (selectedVirtualSession != null) { if (selectedVirtualSession.Infos.TryGetValue("Status", out var statusIdString)) { Enum.TryParse(statusIdString, out enumCitrixSessionStatus statusId); isOnline = statusId == enumCitrixSessionStatus.Active; } } } break; case enumFasdInformationClass.MobileDevice: //todo: check ticket status not via stored relations! if (dataProvider.CaseRelations != null && dataProvider.CaseRelations.TryGetValue(enumFasdInformationClass.MobileDevice, out var mobileDeviceValues)) { var selectedMobileDevice = mobileDeviceValues.FirstOrDefault(value => dataProvider.Identities.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.MobileDevice)?.Id == value.id); } break; } singleHeadingValue = new cHeadingDataModel() { InformationClass = headerValue.InformationClass, HeadingText = headingText, IsOnline = isOnline, Identities = headingIdentities }; outputDictionary[headerValue.InformationClass] = singleHeadingValue; } foreach (enumFasdInformationClass informationClass in Enum.GetValues(typeof(enumFasdInformationClass))) { if (outputDictionary.ContainsKey(informationClass)) continue; 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; } outputDictionary[informationClass] = new cHeadingDataModel() { InformationClass = informationClass, HeadingText = headingText }; } HeadingData = outputDictionary; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return outputDictionary.Values.ToList(); } private List GetMenuBarData() => _menuDataProvider.GetMenuItemData() .Where(data => (data.MenuSections?.Count == 0 || data.IconPositionIndex > -1) && data.UiAction?.DisplayType != enumActionDisplayType.hidden) .ToList(); #endregion #region NamedParameters public string ReplaceNamedParameters(string rawString, bool shouldUseHtml) { var output = rawString; try { foreach (var namedParameterEntry in dataProvider.NamedParameterEntries) { try { if (namedParameterEntry.Value is cNamedParameterEntryCopyTemplate _) continue; var parameterName = namedParameterEntry.Key; var (Title, Value) = namedParameterEntry.Value.GetTitleValuePair(); var parameterLabel = string.Format("{0}:", Title); var parameterValue = Value; if (shouldUseHtml) parameterValue = namedParameterEntry.Value.GetHtmlValue(); output = output.Replace("%" + parameterName + ".Label%", parameterLabel); output = output.Replace("%" + parameterName + ".Value%", parameterValue); } catch { } } bool found = true; while (found) { var _pos1 = output.IndexOf(".Label%"); var _pos2 = output.IndexOf(".Value%"); int _pos = -1; if (_pos1 < 0) _pos = _pos2; else if (_pos2 < 0) _pos = _pos1; else _pos = Math.Min(_pos1, _pos2); if (_pos < 0) { found = false; continue; } var _strSub = output.Substring(0, _pos); _pos1 = _strSub.LastIndexOf("%"); if (_pos1 > 0) { _strSub = output.Substring(_pos1, _pos + 7 - _pos1); output = output.Replace(_strSub, ""); } else found = false; } ; } catch (Exception E) { LogException(E); } return output; } internal void UpdateNamedParameterEntries() { try { var namedParameters = cHealthCardPrerequisites.GetNamedParameters(SelectedHealthCard); foreach (var namedParameter in namedParameters) { try { if (namedParameter.Value.ParameterName == null) continue; string namedParameterTitle = namedParameter.Value.Names.GetValue(); var parameterValue = GetStateValueAt(namedParameter.Value.DatabaseInfo, 0, true); string namedParameterValue = cUtility.RawValueFormatter.GetDisplayValue(parameterValue, namedParameter.Value.Display); if (!dataProvider.NamedParameterEntries.ContainsKey(namedParameter.Value.ParameterName)) dataProvider.NamedParameterEntries.Add(namedParameter.Value.ParameterName, new cNamedParameterEntryPointer(dataProvider, namedParameter.Value.DatabaseInfo, namedParameter.Value.Display) { Title = namedParameterTitle }); } catch (Exception ex) { LogException(ex); } } const string defaultCopyTemplateParameterName = "Copy_default"; if (!dataProvider.NamedParameterEntries.ContainsKey(defaultCopyTemplateParameterName)) { string defaultCopyTemplate = cF4SDCockpitXmlConfig.Instance?.CopyTemplateConfig?.CopyTemplates.DefaultTemplate.Name; dataProvider.NamedParameterEntries.Add(defaultCopyTemplateParameterName, new cNamedParameterEntryCopyTemplate(dataProvider, defaultCopyTemplate)); } foreach (var copyTemplate in cF4SDCockpitXmlConfig.Instance?.CopyTemplateConfig?.CopyTemplates.CopyTemplates) { string namedParameterName = "Copy_" + copyTemplate.Key; if (dataProvider.NamedParameterEntries.ContainsKey(namedParameterName)) continue; dataProvider.NamedParameterEntries.Add(namedParameterName, new cNamedParameterEntryCopyTemplate(dataProvider, copyTemplate.Key)); } } catch (Exception E) { LogException(E); } } #endregion private class cProcessStateRequirements { internal cHealthCardStateBase valueState; internal bool isStatic; internal cHealthCardTableColumn valueTableColumn; internal List Values; internal List ThresholdValues; } public abstract class cHealthCardStateSubHelper { protected readonly cHealthCardDataHelper parent; protected cSupportCaseDataProvider dataProvider { get { return parent.dataProvider; } } protected cHealthCard SelectedHealthCard { get { return parent.SelectedHealthCard; } } protected cF4SDHealthCardRawData HealthCardRawData { get { return parent.HealthCardRawData; } } internal cHealthCardStateSubHelper(cHealthCardDataHelper parent) { this.parent = parent; } } public class cHealthCardHistoryDataHelper : cHealthCardStateSubHelper { internal cHealthCardHistoryDataHelper(cHealthCardDataHelper parent) : base(parent) { } internal cDetailsPageDataHistoryDataModel GetData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); cDetailsPageDataHistoryDataModel output = new cDetailsPageDataHistoryDataModel(); try { var healthCardHistoryConfig = SelectedHealthCard.CategoriesHistory; if (healthCardHistoryConfig is null) return output; foreach (var stateCategoryDefinition in healthCardHistoryConfig.StateCategories) { if (!IsUiVisible(stateCategoryDefinition, dataProvider.NamedParameterEntries)) continue; var categoryContent = stateCategoryDefinition.Names.GetValue(); var categoryContentDescription = stateCategoryDefinition.Descriptions.GetValue(Default: categoryContent); cUiActionBase categoryQuickAction = parent.GetUiActionByQuickActionNames(stateCategoryDefinition.QuickActions, stateCategoryDefinition.Names.GetValue(), stateCategoryDefinition.Descriptions.GetValue(Default: null)); var titleColumn = new DetailsPageDataHistoryColumnModel() //todo: refactor, see same code in titleRow { Content = categoryContent, ContentDescription = categoryContentDescription, UiAction = categoryQuickAction, ColumnValues = new List() }; // Adding columns to history section int valueColumnCount = SelectedHealthCard.MaxAgeInDays; var historySectionValueColumns = new List(valueColumnCount); for (int i = 0; i < valueColumnCount; i++) { CultureInfo culture = new CultureInfo(cMultiLanguageSupport.CurrentLanguage); var valueColumnHeader = i != 0 ? DateTime.Today.AddDays(-i).ToString(cMultiLanguageSupport.GetItem("Global.Date.Format.ShortDateWithDay", "ddd. dd.MM."), culture) : cMultiLanguageSupport.GetItem("Global.Date.Today"); var summaryStatusColor = parent.GetSummaryStatusColor(stateCategoryDefinition.States, false, i); var valueColumn = new DetailsPageDataHistoryColumnModel() { ColumnValues = new List(), Content = valueColumnHeader, HighlightColor = summaryStatusColor ?? enumHighlightColor.none }; historySectionValueColumns.Add(valueColumn); } foreach (var stateDefinition in stateCategoryDefinition.States) { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) continue; if (stateDefinition.DatabaseInfo != null && HealthCardRawData.Tables.ContainsKey(stateDefinition.DatabaseInfo.ValueTable) == false) continue; var titleRowData = parent.GetTitleColumnOfHealthCardState(stateDefinition); if (titleRowData != null) titleColumn.ColumnValues.Add(titleRowData); ProcessState(stateDefinition, valueColumnCount, false, historySectionValueColumns); //StateAggregation if (stateDefinition is cHealthCardStateAggregation stateAggregationDefinition) { foreach (var aggregatedStateDefinition in stateAggregationDefinition.States) { if (!IsUiVisible(aggregatedStateDefinition, dataProvider.NamedParameterEntries)) continue; var aggregatedTitleRowData = parent.GetTitleColumnOfHealthCardState(aggregatedStateDefinition); if (aggregatedStateDefinition != null) { aggregatedTitleRowData.PresentationStyle = enumHistoryTitleType.subValue; titleColumn.ColumnValues.Add(aggregatedTitleRowData); } ProcessState(aggregatedStateDefinition, valueColumnCount, false, historySectionValueColumns); } } } output.Add(new cDetailsPageDataHistoryCategoryDataModel() { TitleColumn = titleColumn, ValueColumns = historySectionValueColumns }); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } private void ProcessState(cHealthCardStateBase stateDefinition, int valueColumnCount, bool isStatic, List historySectionValueColumns) { var ProcessRequirements = parent.CreateProcessStateRequirements(stateDefinition, isStatic); for (int i = 0; i < valueColumnCount; i++) { var Value = ProcessRequirements.Values?.Count > i ? ProcessRequirements.Values[i] : null; var thresholdValue = ProcessRequirements.ThresholdValues?.Count > i ? ProcessRequirements.ThresholdValues[i] : null; var cellContent = parent.ProcessSingleStateValue(ProcessRequirements, Value, thresholdValue, i); historySectionValueColumns[i].ColumnValues.Add(cellContent); } } } public class cHealthCardSlimPageHelper : cHealthCardStateSubHelper { public async Task GetDataAsync() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); cSlimPageData output = new cSlimPageData(); try { if (SelectedHealthCard == null) return output; output.DataProvider = dataProvider; output.HeadingData = await parent.GetHeadingDataAsync(); output.WidgetData = GetWidgetData(); output.DataHistoryList = GetHistoryData(); output.MenuBarData = parent.GetMenuBarData(); } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } internal cHealthCardSlimPageHelper(cHealthCardDataHelper parent) : base(parent) { } private List> GetWidgetData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); var output = new List>(); try { var healthCardWidgetConfig = SelectedHealthCard.CategoriesStaticSlim; foreach (var categoryDefinition in healthCardWidgetConfig.StateCategories) { if (!IsUiVisible(categoryDefinition, dataProvider.NamedParameterEntries)) continue; var widgetValues = new List(); foreach (var stateDefinition in categoryDefinition.States) { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) continue; if (HealthCardRawData.Tables.ContainsKey(stateDefinition.DatabaseInfo?.ValueTable) == false) continue; var stateModel = stateDefinition; var widgetValueToAdd = new cWidgetValueModel { TechnicalName = stateDefinition.ParameterName }; if (!stateDefinition.IsTitleOptional && stateDefinition.Names.Count > 0) widgetValueToAdd.Title = stateDefinition.Names.GetValue(); if (stateDefinition.DatabaseInfo != null) { object widgetValue = parent.GetStateValueAt(stateDefinition.DatabaseInfo, 0, true); widgetValueToAdd.Value = cUtility.RawValueFormatter.GetDisplayValue(widgetValue, stateDefinition.DisplayType); object stateValue = widgetValue; if (stateDefinition is cHealthCardStateRefLink refLinkState) { stateModel = cF4SDHealthCardConfig.GetReferencableStateWithName(stateDefinition.ParentNode, refLinkState.Reference); stateValue = parent.GetStateValueAt(stateModel.DatabaseInfo, 0, true); } var widgetHighlightColor = parent.GetHighlightColor(stateValue, stateModel, 0, true); widgetValueToAdd.HighlightIn = widgetHighlightColor; widgetValues.Add(widgetValueToAdd); } } if (widgetValues?.Count <= 0) continue; output.Add(widgetValues); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } private List GetHistoryData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); List output = new List(); try { var healthCardHistoryConfig = SelectedHealthCard.CategoriesHistory; if (healthCardHistoryConfig is null) return output; foreach (var categoryDefinition in healthCardHistoryConfig.StateCategories) { if (!IsUiVisible(categoryDefinition, dataProvider.NamedParameterEntries)) continue; var slimPageData = new cSlimPageDataHistoryModel() { Content = categoryDefinition.Names.GetValue(), ContentDescription = categoryDefinition.Descriptions.GetValue(), ValueColumns = new List() }; for (int i = 0; i < 6; i++) { bool isLoading = false; foreach (var stateDefinition in categoryDefinition?.States) { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) continue; if (stateDefinition.DatabaseInfo != null) { var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, false); if (stateTable != null) { int tableColumnCount = 0; try { if (stateTable?.Columns?.Count > 0) tableColumnCount = stateTable.Columns.Max(column => column.Value?.Values?.Count ?? 1); //todo: check for better implementation } catch { } if (i < stateTable.StartingIndex || i >= stateTable.StartingIndex + tableColumnCount) isLoading = stateTable.IsIncomplete; } } } var tempContent = i != 0 ? DateTime.Today.AddDays(-i).ToString("dd.MM") : cMultiLanguageSupport.GetItem("Global.Date.Today"); var tempHighlightColor = parent.GetSummaryStatusColor(categoryDefinition.States, false, i); slimPageData.ValueColumns.Add(new cDataHistoryValueModel() { Content = tempContent, HighlightColor = tempHighlightColor ?? enumHighlightColor.none, IsLoading = isLoading }); } //SummaryValueColumn var summaryValueColumnContent = $"{DateTime.Today.AddDays(-7):dd.MM} - {DateTime.Today.AddDays(-14):dd.MM}"; enumHighlightColor summaryValueColumnColor = enumHighlightColor.none; bool isSummaryLoading = false; for (int i = 7; i < 14; i++) { foreach (var stateDefinition in categoryDefinition?.States) { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) continue; if (stateDefinition.DatabaseInfo != null) { var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, false); if (stateTable != null) { int tableColumnCount = 0; try { if (stateTable?.Columns?.Count > 0) tableColumnCount = stateTable.Columns.Max(column => column.Value?.Values?.Count ?? 1); } catch { } if (i < stateTable.StartingIndex || i >= stateTable.StartingIndex + tableColumnCount) { isSummaryLoading = stateTable.IsIncomplete; break; } } } } summaryValueColumnColor = (enumHighlightColor)Math.Max((int)summaryValueColumnColor, (int)(parent.GetSummaryStatusColor(categoryDefinition.States, false, i) ?? enumHighlightColor.none)); } var summaryValueColumn = new cDataHistoryValueModel() { Content = summaryValueColumnContent, HighlightColor = summaryValueColumnColor, IsLoading = isSummaryLoading }; slimPageData.ValueColumns.Add(summaryValueColumn); output.Add(slimPageData); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } } public class cHealthCardDetailPageHelper : cHealthCardStateSubHelper { public async Task GetDataAsync() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); cDetailsPageData output = new cDetailsPageData(); try { if (SelectedHealthCard == null) return output; output.DataProvider = dataProvider; output.HeadingData = await parent.GetHeadingDataAsync(); output.WidgetData = GetWidgetsData(); output.DataHistoryList = parent.HistoryData.GetData(); output.DataContainerCollectionList = parent.CustomizableSectionHelper.GetContainerCollectionData(); output.MenuBarData = parent.GetMenuBarData(); } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } public cDetailsPageData GetDataWithoutHeading() { cDetailsPageData output = new cDetailsPageData(); try { if (SelectedHealthCard == null) return output; output.DataProvider = dataProvider; output.WidgetData = GetWidgetsData(); output.DataHistoryList = parent.HistoryData.GetData(); output.DataContainerCollectionList = parent.CustomizableSectionHelper.GetContainerCollectionData(); output.MenuBarData = parent.GetMenuBarData(); } catch (Exception E) { LogException(E); } return output; } internal cHealthCardDetailPageHelper(cHealthCardDataHelper parent) : base(parent) { } private List getDetailsValuesCsv(string Data, cHealthCardDetailsValued StateDetailsValued) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } var _values = new List(); try { var _arrRow = Data.Split(StateDetailsValued.RowSeparator); foreach (var _row in _arrRow) { if (string.IsNullOrEmpty(_row)) continue; var _entry = new List(); if (StateDetailsValued.ColSeparator == null) _entry.Add(_row.Trim()); else { var _arrCol = Data.Split((char)StateDetailsValued.ColSeparator); foreach (var _col in _arrCol) _entry.Add(_col.Trim()); } while (_entry.Count < StateDetailsValued.Count) _entry.Add(null); _values.Add(_entry.ToArray()); } } catch (Exception E) { LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } return _values; } private List getDetailsValuesJson(string Data, cHealthCardDetailsValued StateDetailsValued) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } try { var _rawVals = JsonConvert.DeserializeObject>(Data); if (_rawVals?.Count > 0) { var _values = new List(); foreach (JObject _row in _rawVals) { var _props = _row.Children(); var _valRow = new object[StateDetailsValued.Count]; for (int i = 0; i < StateDetailsValued.Count; i++) _valRow[i] = null; foreach (var _token in _props) { if (!(_token is JProperty jProp)) continue; var _name = jProp.Name; var _i = StateDetailsValued.FindIndex(v => v.Column.Equals(_name, StringComparison.InvariantCultureIgnoreCase)); if (_i < 0) continue; var _col = StateDetailsValued[_i]; if (jProp.Value is JValue jValue) { var _value = jValue.Value; var _displayString = cUtility.RawValueFormatter.GetDisplayValue(_value, _col.DisplayType); _valRow[_i] = _displayString; } } _values.Add(_valRow); } return _values; } } catch (Exception E) { LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } return null; } private cHealthCardDetailsTable GetDetailTableValued(object _value, cHealthCardDetailsValued StateDetailsValued) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } try { if (_value == null) return null; var _strData = cUtility.RawValueFormatter.GetDisplayValue(_value, RawValueType.STRING); if (_strData == null) return null; List _values = new List(); if (StateDetailsValued.Format == cHealthCardDetailsValued.ValuedFormat.json) _values = getDetailsValuesJson(_strData, StateDetailsValued); else _values = getDetailsValuesCsv(_strData, StateDetailsValued); var Result = new cHealthCardDetailsTable() { Name = "Details-" + StateDetailsValued.ParentState.Name, Columns = StateDetailsValued.Select(v => v.Names.GetValue()).ToList(), Values = new Dictionary>() { { 0, _values } } }; return Result; } catch (Exception E) { LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } return null; } private cWidgetValueModel GetWidgetRowData(cHealthCardStateBase stateDefinition) { try { if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) return null; var widgetRowData = new cWidgetValueModel { Title = stateDefinition.Names?.GetValue(), TechnicalName = stateDefinition.ParameterName, IsLoading = IsValueIncomplete(stateDefinition.DatabaseInfo, true), Value = "N/A", UiActionTitle = parent.GetUiActionByQuickActionNames(stateDefinition.QuickActions, stateDefinition.Names.GetValue(), stateDefinition.Descriptions.GetValue()) }; if (stateDefinition.DatabaseInfo is null) return widgetRowData; object rawValueDisplay = parent.GetStateValueAt(stateDefinition.DatabaseInfo, 0, true); widgetRowData.HighlightIn = parent.GetHighlightColorWithReference(rawValueDisplay, stateDefinition); widgetRowData.EditValueInformation = GetEditInfo(rawValueDisplay); bool shouldShowValueDetails = (TryGetValuedDetails(rawValueDisplay, out var valuedDetails) && (valuedDetails?.Values?.Values?.FirstOrDefault()?.Count > 1) || (valuedDetails?.Values?.Values?.FirstOrDefault()?.FirstOrDefault()?.Length > 1) ) || (stateDefinition.Details is cHealthCardDetails && rawValueDisplay != null && rawValueDisplay.ToString() != "0"); if (shouldShowValueDetails) { widgetRowData.ValuedDetails = valuedDetails; widgetRowData.UiActionValue = new cShowDetailedDataAction(stateDefinition, valuedDetailsData: valuedDetails) { DisplayType = enumActionDisplayType.enabled }; } widgetRowData.Value = GetDisplayValue(rawValueDisplay, valuedDetails); return widgetRowData; } catch (Exception ex) { LogException(ex); } return null; cEditableValueInformationBase GetEditInfo(object rawValue) { if (stateDefinition?.EditInfo is null) return null; switch (stateDefinition.EditInfo) { //todo: add Ids to editableInformation case cStateEditableSelection editableSelectionInfo: var editSelectionValues = parent.GetEditInformationSelectionValues(stateDefinition); return new cEditValueInformationSelection() { CurrentValue = rawValue, Description = stateDefinition.Names.GetValue(), DatabaseInfo = stateDefinition.DatabaseInfo, SelectionValues = editSelectionValues }; case cStateEditableText edtiableTextInfo: var editValue = new List(1) { rawValue }; return new cEditValueInformationText() { CurrentValue = rawValue, Description = stateDefinition.Names.GetValue(), DatabaseInfo = stateDefinition.DatabaseInfo }; default: return null; } } string GetDisplayValue(object rawValue, cHealthCardDetailsTable detailTable) { string displayValue = null; if (stateDefinition is cHealthCardStateTranslation translationDefinition) displayValue = GetTranslationValue(translationDefinition, rawValue); if (detailTable != null) displayValue = GetDetailStringValue(rawValue, detailTable); return displayValue ?? cUtility.RawValueFormatter.GetDisplayValue(rawValue, stateDefinition.DisplayType); } string GetTranslationValue(cHealthCardStateTranslation translationDefinition, object rawValue) { ITranslatorObject abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(translationDefinition, translationDefinition.Translation); if (abstractTranslation is null || !(abstractTranslation is cHealthCardTranslator translation)) return null; if (rawValue is null) return translation.DefaultTranslation?.Translation?.GetValue(); var translationValue = translation.DefaultTranslation?.Translation?.GetValue() ?? rawValue.ToString(); foreach (var translationEntry in translation.Translations) { if (translationEntry.Values.Any(value => rawValue.ToString().Equals(value, StringComparison.InvariantCultureIgnoreCase))) return translationEntry.Translation.GetValue(); } return translationValue; } string GetDetailStringValue(object rawValue, cHealthCardDetailsTable detailTableValueTable) { if (detailTableValueTable?.Values is null || detailTableValueTable.Values.Count == 0) return null; var tableValues = detailTableValueTable.Values.First().Value; if (detailTableValueTable.Columns.Count >= 1 && tableValues.Count == 1) return cUtility.RawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.First()?.First(), stateDefinition.Details.First().DisplayType); else return cUtility.RawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.Count, RawValueType.STRING); } bool TryGetValuedDetails(object rawValue, out cHealthCardDetailsTable valuedDetails) { valuedDetails = null; if (!(stateDefinition.Details is cHealthCardDetailsValued detailsValued)) return false; valuedDetails = GetDetailTableValued(rawValue, detailsValued); return true; } } private List> GetWidgetsData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { return SelectedHealthCard.CategoriesStatic.StateCategories .Where(widgetDefinition => IsUiVisible(widgetDefinition, dataProvider.NamedParameterEntries)) .Select(widgetDefinition => GetWidgetData(widgetDefinition)) .ToList(); } catch (Exception ex) { LogException(ex); } finally { LogMethodEnd(CM); } return new List>(); List GetWidgetData(cHealthCardStateCategory widgetDefinition) { try { return widgetDefinition.States.Select(GetWidgetRowData) .Where(value => value != null) .ToList(); } catch (Exception ex) { LogException(ex); } return new List(); } } private bool IsValueIncomplete(cValueAddress databaseInfo, bool isStatic) { try { var healthCardTable = HealthCardRawData.GetTableByName(databaseInfo.ValueTable, isStatic); if (healthCardTable is null) return false; if (!healthCardTable.IsIncomplete) return false; if (!healthCardTable.Columns.TryGetValue(databaseInfo.ValueColumn, out var column)) return true; return column.IsIncomplete; } catch (Exception e) { LogException(e); } return false; } } public class cHealthCardDataLoadingHelper : cHealthCardStateSubHelper { public event EventHandler DataChanged; public event EventHandler DataFullyLoaded; public event EventHandler DataRefreshed; public DateTime? LastDataRequest { get; set; } = null; public async Task RefreshLatestDataAsync() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (dataProvider.DirectConnectionHelper.IsDirectConnectionActive) { var actualizeResult = await ActualizeDataAsync(); if (actualizeResult == enumActualizeStatus.failed) LogEntry("Failed to actualize data, due to server timeout.", LogLevels.Error); } var requiredTables = HealthCardRawData.Tables.Keys.Where(tableKey => tableKey.StartsWith("Computation_") is false).ToList(); if (requiredTables is null || requiredTables.Count <= 0) return; var request = new cF4sdHealthCardRawDataRequest() { Identities = dataProvider.Identities, Tables = requiredTables, MaxAge = cF4SDCockpitXmlConfig.Instance?.HealthCardConfig?.SearchResultAge ?? 14 }; //todo: reduce requested days to 1 await LoadingRawDataCriticalSection.EnterAsync(); try { var newRawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(request); UpdateLatestValues(newRawData); bool isRawDataIncomplete = false; do { isRawDataIncomplete = false; if (newRawData != null) { newRawData = await cFasdCockpitCommunicationBase.Instance.GetHealthCardData(newRawData.Id); UpdateLatestValues(newRawData); } if (newRawData?.Tables?.Count > 0) if (newRawData.Tables.Values.Any(table => table.IsIncomplete)) isRawDataIncomplete = true; } while (isRawDataIncomplete); LastDataRequest = DateTime.Now; DataRefreshed?.Invoke(this, EventArgs.Empty); DataFullyLoaded?.Invoke(this, EventArgs.Empty); } catch (Exception E) { LogException(E); } LoadingRawDataCriticalSection.Leave(); } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } } public async Task SetHealthCardRawData(cF4SDHealthCardRawData newHealthCardRawData, cF4sdIdentityList identities) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { await LoadingRawDataCriticalSection.EnterAsync(); parent.dataProvider.Identities = identities; if (newHealthCardRawData != null) parent.HealthCardRawData = newHealthCardRawData; parent.UpdateNamedParameterEntries(); bool isDataIncomplete = HealthCardRawData.Tables .Where(table => table.Key.StartsWith("Computation_") == false) .Any(table => table.Value.IsIncomplete); lock (HealthCardRawData) { SelectedHealthCard.DoComputations(HealthCardRawData); } LogEntry("DataChanged - Finished getting Healthcard rawdata."); DataChanged?.Invoke(this, new BooleanEventArgs(true)); parent.UpdateNamedParameterEntries(); if (!isDataIncomplete) DataFullyLoaded?.Invoke(this, EventArgs.Empty); } catch (Exception ex) { LogException(ex); } finally { LoadingRawDataCriticalSection.Leave(); LogMethodEnd(CM); } } internal cHealthCardDataLoadingHelper(cHealthCardDataHelper parent) : base(parent) { } private bool WasTableUpdated(cF4SDHealthCardRawData.cHealthCardTable oldTable, cF4SDHealthCardRawData.cHealthCardTable newTable) { try { if (oldTable.IsIncomplete && !newTable.IsIncomplete) return true; if (oldTable.StartingIndex != newTable.StartingIndex) return true; foreach (var oldTableColumn in oldTable.Columns) { if (!newTable.Columns.TryGetValue(oldTableColumn.Key, out var newTableColumn)) continue; if (oldTableColumn.Value.Values.Count != newTableColumn.Values.Count) return true; } } catch (Exception E) { LogException(E); } return false; } private async Task ActualizeDataAsync() { var output = enumActualizeStatus.unknown; try { const int refreshDelayInMilliseconds = 500; const int maxPollCount = 20; if (dataProvider.Identities.Any(identity => identity.Class == enumFasdInformationClass.Computer) is false) { LogEntry("Coudldn't acutalize data. There was no information class of type computer found.", LogLevels.Error); return output; } if (dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameter) is false || int.TryParse(agentDeviceIdParameter.GetValue(), out int agentDeviceId) is false) { LogEntry("Coudldn't acutalize data. There was no valid AgentDeviceId found.", LogLevels.Error); return output; } int? agentUserId = null; if (dataProvider.Identities.Any(identity => identity.Class == enumFasdInformationClass.User)) if (dataProvider.NamedParameterEntries.TryGetValue("AgentUserId", out var agentUserIdParameter)) if (int.TryParse(agentUserIdParameter.GetValue(), out int tempAgentUserId)) agentUserId = tempAgentUserId; var actualizeId = await cFasdCockpitCommunicationBase.Instance.ActualizeAgentData(agentDeviceId, agentUserId); if (actualizeId == Guid.Empty) return enumActualizeStatus.failed; enumFasdInformationClass informationClass = agentUserId != null ? enumFasdInformationClass.User : enumFasdInformationClass.Computer; int pollCount = 0; while (output == enumActualizeStatus.unknown) { output = await cFasdCockpitCommunicationBase.Instance.GetActualizeAgentDataStatus(actualizeId, informationClass); if (output == enumActualizeStatus.unknown) { pollCount++; if (pollCount >= maxPollCount) return output; await Task.Delay(refreshDelayInMilliseconds); } } } catch (Exception E) { LogException(E); } return output; } private void UpdateLatestValues(cF4SDHealthCardRawData newRawData) { try { if (newRawData?.Tables is null) return; foreach (var tableName in newRawData.Tables.Keys) { try { if (HealthCardRawData.Tables.TryGetValue(tableName, out var oldTable) == false) continue; if (newRawData.Tables.TryGetValue(tableName, out var newTable) == false) continue; foreach (var oldColumn in oldTable.Columns) { try { if (newTable.Columns.TryGetValue(oldColumn.Key, out var newTableColumn) == false) continue; if (newTable.TableType != eDataHistoryTableType.HistoryEvents) { if (newTableColumn.Values is null || newTableColumn.Values?.Count <= 0) continue; if (oldColumn.Value?.Values is null || oldColumn.Value.Values.Count <= 0) continue; oldColumn.Value.Values[0] = newTableColumn.Values[0]; } else oldColumn.Value.Values = newTableColumn.Values; } catch (Exception E) { LogException(E); } } } catch (Exception E) { LogException(E); } } SelectedHealthCard.DoComputations(HealthCardRawData); LogEntry("DataChanged - Update Latest Values finished."); DataChanged?.Invoke(this, EventArgs.Empty); } catch (Exception E) { LogException(E); } } public async Task UpdateHealthcardRawData(cF4SDHealthCardRawData updatedHealthCardRawData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (updatedHealthCardRawData is null) return; bool isDataIncomplete = true; await LoadingRawDataCriticalSection.EnterAsync(); try { lock (HealthCardRawData) { var incompleteRawTables = HealthCardRawData.Tables.Where(table => table.Value.IsIncomplete && table.Key.StartsWith("Computation_") == false) .ToDictionary(table => table.Key, table => table.Value); if (updatedHealthCardRawData is null) { var _msg = new List { $"Couldn't recieve complete healthcard raw data with id {HealthCardRawData?.Id}.", " Incomplete health cards:" }; foreach (var incompleteTable in HealthCardRawData.Tables.Where(table => table.Value.IsIncomplete)) { _msg.Add($" {incompleteTable.Value.Name}"); foreach (var incompleteColumn in incompleteTable.Value.Columns.Values.Where(column => column.IsIncomplete)) { incompleteColumn.IsIncomplete = false; } incompleteTable.Value.IsIncomplete = false; } cLogManager.DefaultLogger.LogList(LogLevels.Error, _msg); SelectedHealthCard.DoComputations(HealthCardRawData); LogEntry("DataChanged - Couldn't complete healthcard raw data."); DataChanged?.Invoke(this, EventArgs.Empty); return; } Dictionary rawTablesToUpdate = updatedHealthCardRawData.Tables .Where(table => HealthCardRawData.Tables.TryGetValue(table.Key, out var oldTable) && WasTableUpdated(oldTable, table.Value)) .ToDictionary(table => table.Key, table => table.Value); foreach (var oldTable in rawTablesToUpdate) { cHealthCardTable newTable = updatedHealthCardRawData.Tables[oldTable.Key]; cHealthCardTable oldTableValues = HealthCardRawData.Tables[oldTable.Key]; cHealthCardTable mergedTable = oldTableValues; foreach (var newTableColumnKeys in newTable.Columns.Keys) { if (mergedTable.Columns.ContainsKey(newTableColumnKeys) == false) mergedTable.Columns[newTableColumnKeys] = new cHealthCardTableColumn(mergedTable); int mergedTableColumnValueCount = mergedTable.Columns[newTableColumnKeys].Values.Count; int mergedTableColumnLength = Math.Max(mergedTable.StartingIndex + mergedTableColumnValueCount, newTable.StartingIndex + newTable.Columns[newTableColumnKeys].Values.Count); //mergedTable.Columns[newTableColumnKeys].Values.Count + newTable.Columns.Count; object[] mergedTableColumnValues = new object[mergedTableColumnLength]; for (int i = mergedTable.StartingIndex; i < mergedTable.StartingIndex + mergedTableColumnValueCount; i++) { mergedTableColumnValues[i] = mergedTable.Columns[newTableColumnKeys].Values[i - mergedTable.StartingIndex]; } for (int i = newTable.StartingIndex; i < newTable.StartingIndex + newTable.Columns[newTableColumnKeys].Values.Count; i++) { mergedTableColumnValues[i] = newTable.Columns[newTableColumnKeys].Values[i - newTable.StartingIndex]; } int newStartingIndex = Math.Min(mergedTable.StartingIndex, newTable.StartingIndex); mergedTable.Columns[newTableColumnKeys].Values = mergedTableColumnValues.Skip(newStartingIndex).ToList(); mergedTable.Columns[newTableColumnKeys].IsIncomplete = newTable.Columns[newTableColumnKeys].IsIncomplete; mergedTable.StartingIndex = newStartingIndex; mergedTable.IsIncomplete = newTable.IsIncomplete; } HealthCardRawData.Tables[oldTable.Key] = mergedTable; } isDataIncomplete = HealthCardRawData.Tables .Where(table => table.Key.StartsWith("Computation_") == false) .Any(table => table.Value.IsIncomplete); if (rawTablesToUpdate?.Count > 0) { SelectedHealthCard.DoComputations(HealthCardRawData); LogEntry($"DataChanged - {rawTablesToUpdate.Count} Tables where updated with last GetHealthcardData-Request."); DataChanged?.Invoke(this, EventArgs.Empty); } } } catch (Exception E) { LogException(E); } if (!isDataIncomplete) DataFullyLoaded?.Invoke(this, EventArgs.Empty); } catch (Exception ex) { LogException(ex); } finally { LoadingRawDataCriticalSection.Leave(); LogMethodEnd(CM); } } private static class LoadingRawDataCriticalSection { private readonly static SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); public static async Task EnterAsync() { await _semaphore.WaitAsync(); } public static void Leave() { _semaphore.Release(); } } } public class cHealthCardCustomizableSectionHelper : cHealthCardStateSubHelper { public List GetContainerDataFromConfig(cHealthCardStateContainer containerConfig) { List output = new List(); try { if (containerConfig is null) return null; List containerHelpers = new List(); foreach (var stateContainerElementConfig in containerConfig.StateContainerElements) { var containerHelper = GetContainerHelperFromConfigElement(stateContainerElementConfig); containerHelpers.Add(containerHelper); } if (containerHelpers?.Count <= 0) return null; int maxValueCountOfContainerHelpers = containerHelpers.Max(helper => helper.MaxValueCount); for (int i = 0; i < maxValueCountOfContainerHelpers; i++) { var containerToAdd = new cContainerData() { IsMaximizable = containerConfig.IsMaximizable, IsAddable = containerConfig.IsAddable, IsDeletable = containerConfig.IsDeletable }; bool shouldSkipContainer = false; foreach (var containerHelper in containerHelpers) { var containerValue = GetContainerDataAtIndexFromHelper(containerHelper, i); containerToAdd.Add(containerValue); if (containerHelper.IsValueRequired && containerValue.HasValue is false) shouldSkipContainer = true; } if (shouldSkipContainer) continue; output.Add(containerToAdd); } } catch (Exception E) { LogException(E); } return output; } internal cHealthCardCustomizableSectionHelper(cHealthCardDataHelper parent) : base(parent) { } internal List GetContainerCollectionData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); var output = new List(); try { var customizableSectionConfig = SelectedHealthCard.CustomizableSection; if (customizableSectionConfig is null) return output; foreach (var containerConfigList in customizableSectionConfig.ContainerList) { try { if (containerConfigList is null) continue; var containerCollectionToAdd = new cContainerCollectionData() { ColumnSpan = containerConfigList.ColumnSpan }; foreach (var containerConfig in containerConfigList.StateContainers) { var containerValuesToAdd = GetContainerDataFromConfig(containerConfig); containerCollectionToAdd.AddRange(containerValuesToAdd); } output.Add(containerCollectionToAdd); } catch (Exception E) { LogException(E); } } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } private IContainerData GetContainerDataAtIndexFromHelper(IContainerHelperClass containerHelper, int index = 0) { IContainerData output = null; try { switch (containerHelper) { case cContainerValueHelper containerValue: { string displayValue = string.Empty; cEditableValueInformationBase editableValueInformation = containerValue.EditableValueInformation; if (containerValue.RawValues.Count > index) { displayValue = cUtility.RawValueFormatter.GetDisplayValue(containerValue.RawValues[index], containerValue.DisplayType); if (editableValueInformation != null) editableValueInformation.CurrentValue = containerValue.RawValues[index]; } string maximizeValue = string.Empty; if (containerValue.RawMaximizeValues.Count > index) maximizeValue = cUtility.RawValueFormatter.GetDisplayValue(containerValue.RawMaximizeValues[index], containerValue.DisplayType); output = new cContainerValue() { DisplayValue = displayValue, MaximizeValue = maximizeValue, FontSize = containerValue.FontSize, FontWeight = containerValue.FontWeight, Description = containerValue.Description, IsEditOnly = containerValue.IsEditOnly, EditableValueInformation = editableValueInformation }; break; } case cContainerIconHelper containerIcon: { output = new cContainerIcon(enumInternIcons.none); if (containerIcon.Icons.Count > index) output = containerIcon.Icons[index]; break; } case cContainerStackPanelHelper containerStackPanel: { var outputStackPanelData = new List(); foreach (var stackPanelData in containerStackPanel.StackPanelHelperData) { try { var dataToAdd = GetContainerDataAtIndexFromHelper(stackPanelData, index); outputStackPanelData.Add(dataToAdd); } catch (Exception E) { LogException(E); } } output = new cContainerStackPanel() { StackPanelData = outputStackPanelData, Orientation = containerStackPanel.Orientation }; break; } case cContainerContentHelper containerContent: { var outputContentData = GetContainerDataAtIndexFromHelper(containerContent.Content, index); output = new cContainerPrimaryContent() { Value = outputContentData }; break; } } } catch (Exception E) { LogException(E); } return output; } private FontWeight GetFontWeightFromConfigFontWeight(enumFontWeights configFontWeight) { var output = FontWeights.Normal; try { switch (configFontWeight) { case enumFontWeights.Thin: output = FontWeights.Thin; break; case enumFontWeights.ExtraLight: output = FontWeights.ExtraLight; break; case enumFontWeights.UltraLight: output = FontWeights.UltraLight; break; case enumFontWeights.Light: output = FontWeights.Light; break; case enumFontWeights.Normal: output = FontWeights.Normal; break; case enumFontWeights.Regular: output = FontWeights.Regular; break; case enumFontWeights.Medium: output = FontWeights.Medium; break; case enumFontWeights.DemiBold: output = FontWeights.DemiBold; break; case enumFontWeights.SemiBold: output = FontWeights.SemiBold; break; case enumFontWeights.Bold: output = FontWeights.Bold; break; case enumFontWeights.ExtraBold: output = FontWeights.ExtraBold; break; case enumFontWeights.UltraBold: output = FontWeights.UltraBold; break; case enumFontWeights.Black: output = FontWeights.Black; break; case enumFontWeights.Heavy: output = FontWeights.Heavy; break; case enumFontWeights.ExtraBlack: output = FontWeights.ExtraBlack; break; case enumFontWeights.UltraBlack: output = FontWeights.UltraBlack; break; } } catch (Exception E) { LogException(E); } return output; } private IContainerData GetPlaceHolderContainerDataFromConfigElement(IStateContainerElement stateContainerElementConfig) { IContainerData output = null; try { switch (stateContainerElementConfig) { case cHealthCardStateStylable stylableStateConfig: { var fontWeight = GetFontWeightFromConfigFontWeight(stylableStateConfig.FontWeight); output = new cContainerValue() { DisplayValue = stylableStateConfig.Names.GetValue(), FontSize = stylableStateConfig.FontSize, FontWeight = fontWeight, Description = parent.GetTitleColumnOfHealthCardState(stylableStateConfig).ContentDescription, }; break; } case cHealthCardStateIconTranslation iconTranslationStateConfig: { output = new cContainerIcon() { IconType = enumIconType.intern, IconName = "f4sd" }; break; } case cHealthCardStateStackPanel stackPanelConfig: { var orientation = Orientation.Horizontal; Enum.TryParse(stackPanelConfig.Orientation.ToString(), out orientation); var stackPanelData = new List(); foreach (var stackPanelState in stackPanelConfig.Children) { var childData = GetPlaceHolderContainerDataFromConfigElement(stackPanelState); stackPanelData.Add(childData); } output = new cContainerStackPanel() { Orientation = orientation, StackPanelData = stackPanelData }; break; } case cHealthCardStateContainerContent containerContentConfig: { var content = GetPlaceHolderContainerDataFromConfigElement(containerContentConfig.Content); output = new cContainerPrimaryContent() { Value = content }; break; } } } catch (Exception E) { LogException(E); } return output; } private IContainerHelperClass GetContainerHelperFromConfigElement(IStateContainerElement stateContainerElementConfig) { IContainerHelperClass output = null; try { switch (stateContainerElementConfig) { case cHealthCardStateStylable stylableStateConfig: { var values = parent.GetStateValues(stylableStateConfig.DatabaseInfo, false); var display = stylableStateConfig.DisplayType; var maximingValues = parent.GetStateValues(stylableStateConfig.MaximizedDatabaseInfo, false); var fontWeight = GetFontWeightFromConfigFontWeight(stylableStateConfig.FontWeight); cEditableValueInformationBase editableInformation = null; if (stylableStateConfig.EditInfo != null) { switch (stylableStateConfig.EditInfo) { case cStateEditableSelection edtiableSelectionInfo: var editSelectionValues = parent.GetEditInformationSelectionValues(stylableStateConfig); editableInformation = new cEditValueInformationSelection() { DatabaseInfo = stylableStateConfig.DatabaseInfo, SelectionValues = editSelectionValues, Description = stylableStateConfig.Names.GetValue() }; break; case cStateEditableText editableTextInfo: editableInformation = new cEditValueInformationText() { DatabaseInfo = stylableStateConfig.DatabaseInfo, Description = stylableStateConfig.Names.GetValue() }; break; default: break; } } output = new cContainerValueHelper() { RawValues = values, RawMaximizeValues = maximingValues, DisplayType = display, Description = parent.GetTitleColumnOfHealthCardState(stylableStateConfig).ContentDescription, FontSize = stylableStateConfig.FontSize, FontWeight = fontWeight, EditableValueInformation = editableInformation, IsValueRequired = stateContainerElementConfig.IsRequired }; break; } case cHealthCardStateIconTranslation iconTranslationStateConfig: { var rawValues = parent.GetStateValues(iconTranslationStateConfig.DatabaseInfo, false); var translation = cF4SDHealthCardConfig.GetTranslationsWithName(iconTranslationStateConfig, iconTranslationStateConfig.Translation); var icons = new List(); foreach (var rawValue in rawValues) { var iconName = "none"; enumIconType iconType = enumIconType.intern; enumHighlightColor highlightColor = enumHighlightColor.none; if (translation is cHealthCardIconTranslator iconTranslation) { var selectedTranslation = iconTranslation.IconTranslations.FirstOrDefault(tempTranslation => tempTranslation.Values.Contains(rawValue)) ?? iconTranslation.DefaultIconTranslation; if (selectedTranslation != null) { iconName = selectedTranslation.Icon.Name; iconType = selectedTranslation.Icon.IconType; switch (selectedTranslation.StateLevel) { case enumHealthCardStateLevel.Ok: highlightColor = enumHighlightColor.green; break; case enumHealthCardStateLevel.Warning: highlightColor = enumHighlightColor.orange; break; case enumHealthCardStateLevel.Error: highlightColor = enumHighlightColor.red; break; case enumHealthCardStateLevel.Info: highlightColor = enumHighlightColor.blue; break; } string toolTipText = selectedTranslation.Descriptions.GetValue(null, string.Empty); icons.Add(new cContainerIcon() { IconName = iconName, IconType = iconType, HighlightColor = highlightColor, ToolTipText = toolTipText }); } } } output = new cContainerIconHelper() { Icons = icons, IsValueRequired = stateContainerElementConfig.IsRequired }; break; } case cHealthCardStateStackPanel stackPanelConfig: { var orientation = Orientation.Horizontal; Enum.TryParse(stackPanelConfig.Orientation.ToString(), out orientation); var stackPanelData = new List(); foreach (var stackPanelState in stackPanelConfig.Children) { var childData = GetContainerHelperFromConfigElement(stackPanelState); stackPanelData.Add(childData); } output = new cContainerStackPanelHelper() { Orientation = orientation, StackPanelHelperData = stackPanelData, IsValueRequired = stateContainerElementConfig.IsRequired }; break; } case cHealthCardStateContainerContent containerContentConfig: { var content = GetContainerHelperFromConfigElement(containerContentConfig.Content); output = new cContainerContentHelper() { Content = content, IsValueRequired = stateContainerElementConfig.IsRequired || content.IsValueRequired }; break; } case cHealthCardStateEditable editableStateConfig: { cEditableValueInformationBase editableInformation = null; if (editableStateConfig.EditInfo is null) break; switch (editableStateConfig.EditInfo) { case cStateEditableSelection edtiableSelectionInfo: var editSelectionValues = parent.GetEditInformationSelectionValues(editableStateConfig); editableInformation = new cEditValueInformationSelection() { DatabaseInfo = editableStateConfig.DatabaseInfo, SelectionValues = editSelectionValues, Description = editableStateConfig.Names.GetValue() }; break; case cStateEditableText editableTextInfo: editableInformation = new cEditValueInformationText() { DatabaseInfo = editableStateConfig.DatabaseInfo, Description = editableStateConfig.Names.GetValue() }; break; default: break; } output = new cContainerValueHelper() { RawValues = new List() { editableStateConfig.Names.GetValue() }, IsEditOnly = true, EditableValueInformation = editableInformation, IsValueRequired = stateContainerElementConfig.IsRequired }; break; } } } catch (Exception E) { LogException(E); } return output; } } private class cStateValueInfo { public string Content { get; set; } public enumHighlightColor HighlightColor { get; set; } } } }