diff --git a/FasdCockpitCommunicationDemo/Config/F4SD-HealthCard-Configuration.xsd b/FasdCockpitCommunicationDemo/Config/F4SD-HealthCard-Configuration.xsd index 9d678ee..cc1eb82 100644 --- a/FasdCockpitCommunicationDemo/Config/F4SD-HealthCard-Configuration.xsd +++ b/FasdCockpitCommunicationDemo/Config/F4SD-HealthCard-Configuration.xsd @@ -1051,11 +1051,7 @@ - - - - - + diff --git a/FasdDesktopUi/Basics/Helper/HealthCardDataHelper.cs b/FasdDesktopUi/Basics/Helper/HealthCardDataHelper.cs index fcc7263..c924704 100644 --- a/FasdDesktopUi/Basics/Helper/HealthCardDataHelper.cs +++ b/FasdDesktopUi/Basics/Helper/HealthCardDataHelper.cs @@ -35,8 +35,6 @@ namespace FasdDesktopUi.Basics.Helper { #region Properties and fields - private readonly IRawValueFormatter _rawValueFormatter = new RawValueFormatter(); - private readonly cSupportCaseDataProvider dataProvider; private bool isInEditMode; @@ -59,7 +57,7 @@ namespace FasdDesktopUi.Basics.Helper } } - #endregion + #endregion Properties and fields #region Events @@ -71,13 +69,23 @@ namespace FasdDesktopUi.Basics.Helper public static event EventHandler EditModeChanged; - #endregion + #endregion // Events + + #region sub helpers + public readonly cHealthCardSlimPageHelper SlimCard; + public readonly cHealthCardHistoryDataHelper HistoryData; + public cHealthCardDetailPageHelper DetailPage; + #endregion // sub helpers public cHealthCardDataHelper(cSupportCaseDataProvider dataProvider) { this.dataProvider = dataProvider; _menuDataProvider = new MenuItemDataProvider(dataProvider); - _rawValueFormatter.SetDefaultCulture(new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + + HistoryData = new cHealthCardHistoryDataHelper(this); + SlimCard = new cHealthCardSlimPageHelper(this); + DetailPage = new cHealthCardDetailPageHelper(this); } public void Reset() @@ -604,6 +612,8 @@ namespace FasdDesktopUi.Basics.Helper return false; } + #endregion + #region Helper public static bool IsUiVisible(IUiVisibilityInformation visibilityInformation, cNamedParameterList NamedParameters = null) @@ -732,6 +742,39 @@ namespace FasdDesktopUi.Basics.Helper 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 = stateDefinitionForLeveling is cHealthCardStateAggregation aggregation ? + GetSummaryStatusColor(aggregation.States, true) : GetHighlightColor(rawValueLeveling, stateDefinitionForLeveling); + + return _color; + } + catch (Exception ex) + { + LogException(ex); + } + return enumHighlightColor.none; + } + + private enumHighlightColor GetHighlightColor(object value, cHealthCardStateBase stateDefinition, int referenceDays = 0) { return GetHighlightColor(new cStateThresholdValues() { Value = value, StateDefinition = stateDefinition, ReferenceDays = referenceDays }); @@ -822,6 +865,11 @@ namespace FasdDesktopUi.Basics.Helper break; } } + else if (thresholdValues.StateDefinition is cHealthCardStateRefLink stateRefLink) + { + //if (cHealthCardPrerequisites.GetReferencableStates(SelectedHealthCard).TryGetValue(stateRefLink.Reference, out var referencedState)) + // output = GetHighlightColor(thresholdValues); + } } catch (Exception E) { @@ -890,6 +938,101 @@ namespace FasdDesktopUi.Basics.Helper return false; } + 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 DetailsPageDataHistoryValueModel GetTitleColumnOfHealthCardState(cHealthCardStateBase stateDefinition) + { + DetailsPageDataHistoryValueModel 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 DetailsPageDataHistoryValueModel() { 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 @@ -977,58 +1120,6 @@ namespace FasdDesktopUi.Basics.Helper #endregion - #region CustomizableSection - - 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; - } - - #endregion - #region Page Common public List GetHeadingDataWithoutOnlineStatus() @@ -1257,744 +1348,57 @@ namespace FasdDesktopUi.Basics.Helper #endregion - #region SlimPage - - private List> GetWidgetDataSlim() - { - 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 = GetStateValueAt(stateDefinition.DatabaseInfo, 0, true); - widgetValueToAdd.Value = _rawValueFormatter.GetDisplayValue(widgetValue, cUtility.GetRawValueType(stateDefinition.DisplayType)); - - if (stateDefinition is cHealthCardStateRefLink refLinkState) - { - stateModel = cF4SDHealthCardConfig.GetReferencableStateWithName(stateDefinition.ParentNode, refLinkState.Reference); - widgetValue = GetStateValueAt(stateModel.DatabaseInfo, 0, true); - } - - var widgetHighlightColor = GetHighlightColor(widgetValue, stateModel); - 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 GetSlimPageHistoryData() - { - 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 = GetSummaryStatusColor(categoryDefinition.States, false, i); - slimPageData.ValueColumns.Add(new cDataHistoryValueModel() { Content = tempContent, HighlightColor = tempHighlightColor, 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)GetSummaryStatusColor(categoryDefinition.States, false, i)); - } - - 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 async Task GetSlimPageDataAsync() - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - - cSlimPageData output = new cSlimPageData(); - try - { - if (SelectedHealthCard == null) - return output; - - output.DataProvider = dataProvider; - output.HeadingData = await GetHeadingDataAsync(); - output.WidgetData = GetWidgetDataSlim(); - output.DataHistoryList = GetSlimPageHistoryData(); - output.MenuBarData = GetMenuBarData(); - } - catch (Exception E) - { - LogException(E); - } - finally - { - LogMethodEnd(CM); - } - - return output; - } - - #endregion - - #region DetailsPage - - 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 = _rawValueFormatter.GetDisplayValue(_value, RawValueType.STRING); - if (_strData == null) - return null; - - var _cols = new List(); - foreach (var _colConfig in StateDetailsValued) - _cols.Add(_colConfig.Names.GetValue()); - - var _arrRow = _strData.Split(StateDetailsValued.RowSeparator); - var _values = new List(); - 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 = _strData.Split((char)StateDetailsValued.ColSeparator); - foreach (var _col in _arrCol) - _entry.Add(_col.Trim()); - } - - while (_entry.Count < _cols.Count) - _entry.Add(null); - - _values.Add(_entry.ToArray()); - } - - var Result = new cHealthCardDetailsTable() - { - Name = "Details-" + StateDetailsValued.ParentState.Name, - Columns = _cols, - 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 = GetUiActionByQuickActionNames(stateDefinition.QuickActions, stateDefinition.Names.GetValue(), stateDefinition.Descriptions.GetValue()) - }; - - if (stateDefinition.DatabaseInfo is null) - return widgetRowData; - - object rawValueDisplay = GetStateValueAt(stateDefinition.DatabaseInfo, 0, true); - object rawValueLeveling = rawValueDisplay; - cHealthCardStateBase stateDefinitionForLeveling = stateDefinition; - - if (stateDefinition is cHealthCardStateRefLink refLinkState) - rawValueLeveling = GetRawValueOf(refLinkState, out stateDefinitionForLeveling); - - widgetRowData.EditValueInformation = GetEditInfo(rawValueDisplay); - widgetRowData.HighlightIn = stateDefinitionForLeveling is cHealthCardStateAggregation aggregation ? - GetSummaryStatusColor(aggregation.States, true) : GetHighlightColor(rawValueLeveling, stateDefinitionForLeveling); - - bool shouldShowValueDetails = - (TryGetValuedDetails(rawValueDisplay, out var valuedDetails) && valuedDetails?.Values?.Values?.FirstOrDefault()?.Count > 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; - - object GetRawValueOf(cHealthCardStateRefLink refLinkState, out cHealthCardStateBase referencedStateDefinition) - { - referencedStateDefinition = cF4SDHealthCardConfig.GetReferencableStateWithName(refLinkState.ParentNode, refLinkState.Reference); - - if (referencedStateDefinition?.DatabaseInfo is null) - return null; - - return GetStateValueAt(referencedStateDefinition.DatabaseInfo, 0, true); - } - - cEditableValueInformationBase GetEditInfo(object rawValue) - { - if (stateDefinition?.EditInfo is null) - return null; - - switch (stateDefinition.EditInfo) - { - //todo: add Ids to editableInformation - case cStateEditableSelection editableSelectionInfo: - var editSelectionValues = 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 ?? _rawValueFormatter.GetDisplayValue(rawValue, cUtility.GetRawValueType(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 _rawValueFormatter.GetDisplayValue(detailTableValueTable.Values.First().Value.First()?.First(), cUtility.GetRawValueType(stateDefinition.Details.First().DisplayType)); - else - return _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 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 DetailsPageDataHistoryValueModel GetTitleColumnOfHealthCardState(cHealthCardStateBase stateDefinition) - { - DetailsPageDataHistoryValueModel 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 DetailsPageDataHistoryValueModel() { Content = titleRowContent, ContentDescription = titleRowDescription, PresentationStyle = titleRowPresentationStyle, UiAction = titleRowQuickAction }; - } - catch (Exception E) - { - LogException(E); - } - - return output; - } - - private void ProcessHealthCardState(cHealthCardStateBase stateDefinition, int valueColumnCount, bool isStatic, ref List historySectionValueColumns) - { - var stateValues = GetStateValues(stateDefinition.DatabaseInfo, isStatic); - - //in case state is translationstate, get translation to avoid calling GetTranslationWithName method for every column - cHealthCardStateTranslation stateTranslation = null; - cHealthCardTranslator translation = null; - if (stateDefinition is cHealthCardStateTranslation tempStateTranslation) - { - stateTranslation = tempStateTranslation; - var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(tempStateTranslation, stateTranslation.Translation); - - if (abstractTranslation is cHealthCardTranslator castedTranslation) - translation = castedTranslation; - } - - for (int i = 0; i < valueColumnCount; i++) - { - string cellContentString = stateDefinition is cHealthCardStateAggregation ? "Ø" : "-"; - enumHighlightColor cellContentColor = enumHighlightColor.none; - cStateThresholdValues thresholdValues = null; - - if (stateValues.Count > i) - { - FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.Date.AddDays(i) }; - thresholdValues = new cStateThresholdValues() { Value = stateValues[i], StateDefinition = stateDefinition, ReferenceDays = i }; - cellContentString = _rawValueFormatter.GetDisplayValue(stateValues[i], cUtility.GetRawValueType(stateDefinition.DisplayType), options); - if (string.IsNullOrWhiteSpace(cellContentString)) - cellContentString = "-"; - cellContentColor = GetHighlightColor(thresholdValues); - } - - if (stateDefinition is cHealthCardStateAggregation stateAggregation) - { - cellContentColor = GetSummaryStatusColor(stateAggregation.States, isStatic, i); - } - - if (stateTranslation != null) - { - if (translation != null && cellContentString != "-") - { - var translationValue = translation.DefaultTranslation?.Translation.GetValue() ?? cellContentString; - foreach (var translationEntry in translation.Translations) - { - if (cellContentString != null) - if (translationEntry.Values.Any(value => cellContentString.Equals(value, StringComparison.CurrentCultureIgnoreCase))) - translationValue = translationEntry.Translation.GetValue(); - } - cellContentString = translationValue; - } - } - - bool isStateRowLoading = false; - if (stateDefinition.DatabaseInfo != null) - { - var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic); - - if (stateTable != null) - { - int maxColumnCount = 0; - if (stateTable?.Columns?.Count > 0) - maxColumnCount = stateTable.Columns.Max(column => column.Value?.Values?.Count ?? 1); - - if (i < stateTable.StartingIndex || i >= stateTable.StartingIndex + maxColumnCount) - isStateRowLoading = stateTable.IsIncomplete; - } - } - - - if (stateDefinition.DatabaseInfo != null) - { - var stateTable = HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic); - - if (stateTable != null) - if (stateTable.Columns.TryGetValue(stateDefinition.DatabaseInfo.ValueColumn, out var stateColumn)) - isStateRowLoading = stateColumn.IsIncomplete; - } - - var cellContent = new DetailsPageDataHistoryValueModel() { Content = cellContentString, HighlightColor = cellContentColor, IsLoading = isStateRowLoading, ThresholdValues = thresholdValues }; - - if (stateDefinition.Details != null && stateValues?.Count > i && stateValues[i] != null) - cellContent.UiAction = new cShowDetailedDataAction(stateDefinition, i); - - historySectionValueColumns[i].ColumnValues.Add(cellContent); - } - } - - private List GetDetailsPageHistoryData() - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - - List output = new List(); - 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 = 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 = GetSummaryStatusColor(stateCategoryDefinition.States, false, i); - var valueColumn = new DetailsPageDataHistoryColumnModel() { ColumnValues = new List(), Content = valueColumnHeader, HighlightColor = summaryStatusColor }; - 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 = GetTitleColumnOfHealthCardState(stateDefinition); - if (titleRowData != null) - titleColumn.ColumnValues.Add(titleRowData); - - ProcessHealthCardState(stateDefinition, valueColumnCount, false, ref historySectionValueColumns); - - //StateAggregation - if (stateDefinition is cHealthCardStateAggregation stateAggregationDefinition) - { - foreach (var aggregatedStateDefinition in stateAggregationDefinition.States) - { - if (!IsUiVisible(aggregatedStateDefinition, dataProvider.NamedParameterEntries)) - continue; - - var aggregatedTitleRowData = GetTitleColumnOfHealthCardState(aggregatedStateDefinition); - if (aggregatedStateDefinition != null) - { - aggregatedTitleRowData.PresentationStyle = enumHistoryTitleType.subValue; - titleColumn.ColumnValues.Add(aggregatedTitleRowData); - } - - ProcessHealthCardState(aggregatedStateDefinition, valueColumnCount, false, ref historySectionValueColumns); - } - } - } - - output.Add(new cDetailsPageDataHistoryDataModel() - { - TitleColumn = titleColumn, - ValueColumns = historySectionValueColumns - }); - } - } - catch (Exception E) - { - LogException(E); - } - finally - { - LogMethodEnd(CM); - } - - 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; - } #region Customizable Section + 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; + } + private IContainerData GetContainerDataAtIndexFromHelper(IContainerHelperClass containerHelper, int index = 0) { @@ -2011,7 +1415,7 @@ namespace FasdDesktopUi.Basics.Helper if (containerValue.RawValues.Count > index) { - displayValue = _rawValueFormatter.GetDisplayValue(containerValue.RawValues[index], containerValue.DisplayType); + displayValue = cUtility.RawValueFormatter.GetDisplayValue(containerValue.RawValues[index], containerValue.DisplayType); if (editableValueInformation != null) editableValueInformation.CurrentValue = containerValue.RawValues[index]; @@ -2019,7 +1423,7 @@ namespace FasdDesktopUi.Basics.Helper string maximizeValue = string.Empty; if (containerValue.RawMaximizeValues.Count > index) - maximizeValue = _rawValueFormatter.GetDisplayValue(containerValue.RawMaximizeValues[index], containerValue.DisplayType); + maximizeValue = cUtility.RawValueFormatter.GetDisplayValue(containerValue.RawMaximizeValues[index], containerValue.DisplayType); output = new cContainerValue() { @@ -2409,59 +1813,6 @@ namespace FasdDesktopUi.Basics.Helper #endregion - public cDetailsPageData GetDetailsPageDataWithoutHeading() - { - cDetailsPageData output = new cDetailsPageData(); - try - { - if (SelectedHealthCard == null) - return output; - - output.DataProvider = dataProvider; - output.WidgetData = GetWidgetsData(); - output.DataHistoryList = GetDetailsPageHistoryData(); - output.DataContainerCollectionList = GetContainerCollectionData(); - output.MenuBarData = GetMenuBarData(); - } - catch (Exception E) - { - LogException(E); - } - return output; - } - - public async Task GetDetailsPageDataAsync() - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - - cDetailsPageData output = new cDetailsPageData(); - try - { - if (SelectedHealthCard == null) - return output; - - output.DataProvider = dataProvider; - output.HeadingData = await GetHeadingDataAsync(); - output.WidgetData = GetWidgetsData(); - output.DataHistoryList = GetDetailsPageHistoryData(); - output.DataContainerCollectionList = GetContainerCollectionData(); - output.MenuBarData = GetMenuBarData(); - } - catch (Exception E) - { - LogException(E); - } - finally - { - LogMethodEnd(CM); - } - - return output; - } - - #endregion - #region NamedParameters public string ReplaceNamedParameters(string rawString, bool shouldUseHtml) @@ -2545,7 +1896,7 @@ namespace FasdDesktopUi.Basics.Helper string namedParameterTitle = namedParameter.Value.Names.GetValue(); var parameterValue = GetStateValueAt(namedParameter.Value.DatabaseInfo, 0, true); - string namedParameterValue = _rawValueFormatter.GetDisplayValue(parameterValue, cUtility.GetRawValueType(namedParameter.Value.Display)); + string namedParameterValue = cUtility.RawValueFormatter.GetDisplayValue(parameterValue, cUtility.GetRawValueType(namedParameter.Value.Display)); if (!dataProvider.NamedParameterEntries.ContainsKey(namedParameter.Value.ParameterName)) dataProvider.NamedParameterEntries.Add(namedParameter.Value.ParameterName, new cNamedParameterEntryPointer(dataProvider, namedParameter.Value.DatabaseInfo, cUtility.GetRawValueType(namedParameter.Value.Display)) { Title = namedParameterTitle }); @@ -2581,8 +1932,708 @@ namespace FasdDesktopUi.Basics.Helper #endregion - #endregion + public abstract class cHealthCardStateSubHelper + { + protected readonly cHealthCardDataHelper parent; + protected cSupportCaseDataProvider dataProvider { get { return parent.dataProvider; } } + + internal cHealthCardStateSubHelper(cHealthCardDataHelper parent) + { + this.parent = parent; + } + } + + public class cHealthCardHistoryDataHelper : cHealthCardStateSubHelper + { + internal cHealthCardHistoryDataHelper(cHealthCardDataHelper parent) : base(parent) { } + + private void ProcessState(cHealthCardStateBase stateDefinition, int valueColumnCount, bool isStatic, ref List historySectionValueColumns) + { + var stateValues = parent.GetStateValues(stateDefinition.DatabaseInfo, isStatic); + + //in case state is translationstate, get translation to avoid calling GetTranslationWithName method for every column + cHealthCardStateTranslation stateTranslation = null; + cHealthCardTranslator translation = null; + if (stateDefinition is cHealthCardStateTranslation tempStateTranslation) + { + stateTranslation = tempStateTranslation; + var abstractTranslation = cF4SDHealthCardConfig.GetTranslationsWithName(tempStateTranslation, stateTranslation.Translation); + + if (abstractTranslation is cHealthCardTranslator castedTranslation) + translation = castedTranslation; + } + else + tempStateTranslation = null; + + for (int i = 0; i < valueColumnCount; i++) + { + string cellContentString = stateDefinition is cHealthCardStateAggregation ? "Ø" : "-"; + enumHighlightColor cellContentColor = enumHighlightColor.none; + cStateThresholdValues thresholdValues = null; + + if (stateValues.Count > i) + { + FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.Date.AddDays(i) }; + thresholdValues = new cStateThresholdValues() { Value = stateValues[i], StateDefinition = stateDefinition, ReferenceDays = i }; + cellContentString = cUtility.RawValueFormatter.GetDisplayValue(stateValues[i], cUtility.GetRawValueType(stateDefinition.DisplayType), options); + if (string.IsNullOrWhiteSpace(cellContentString)) + cellContentString = "-"; + cellContentColor = parent.GetHighlightColor(thresholdValues); + } + + if (stateDefinition is cHealthCardStateAggregation stateAggregation) + { + cellContentColor = parent.GetSummaryStatusColor(stateAggregation.States, isStatic, i); + } + + if (stateTranslation != null) + { + if (translation != null && cellContentString != "-") + { + var translationValue = translation.DefaultTranslation?.Translation.GetValue() ?? cellContentString; + foreach (var translationEntry in translation.Translations) + { + if (cellContentString != null) + if (translationEntry.Values.Any(value => cellContentString.Equals(value, StringComparison.CurrentCultureIgnoreCase))) + translationValue = translationEntry.Translation.GetValue(); + } + cellContentString = translationValue; + } + } + + bool isStateRowLoading = false; + if (stateDefinition.DatabaseInfo != null) + { + var stateTable = parent.HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic); + + if (stateTable != null) + { + int maxColumnCount = 0; + if (stateTable?.Columns?.Count > 0) + maxColumnCount = stateTable.Columns.Max(column => column.Value?.Values?.Count ?? 1); + + if (i < stateTable.StartingIndex || i >= stateTable.StartingIndex + maxColumnCount) + isStateRowLoading = stateTable.IsIncomplete; + } + } + + + if (stateDefinition.DatabaseInfo != null) + { + var stateTable = parent.HealthCardRawData.GetTableByName(stateDefinition.DatabaseInfo.ValueTable, isStatic); + + if (stateTable != null) + if (stateTable.Columns.TryGetValue(stateDefinition.DatabaseInfo.ValueColumn, out var stateColumn)) + isStateRowLoading = stateColumn.IsIncomplete; + } + + var cellContent = new DetailsPageDataHistoryValueModel() { Content = cellContentString, HighlightColor = cellContentColor, IsLoading = isStateRowLoading, ThresholdValues = thresholdValues }; + + if (stateDefinition.Details != null && stateValues?.Count > i && stateValues[i] != null) + cellContent.UiAction = new cShowDetailedDataAction(stateDefinition, i); + + historySectionValueColumns[i].ColumnValues.Add(cellContent); + } + } + + internal List GetData() + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + + List output = new List(); + try + { + var healthCardHistoryConfig = parent.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 = parent.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 }; + historySectionValueColumns.Add(valueColumn); + } + + + foreach (var stateDefinition in stateCategoryDefinition.States) + { + if (!IsUiVisible(stateDefinition, dataProvider.NamedParameterEntries)) + continue; + + if (stateDefinition.DatabaseInfo != null && parent.HealthCardRawData.Tables.ContainsKey(stateDefinition.DatabaseInfo.ValueTable) == false) + continue; + + var titleRowData = parent.GetTitleColumnOfHealthCardState(stateDefinition); + if (titleRowData != null) + titleColumn.ColumnValues.Add(titleRowData); + + ProcessState(stateDefinition, valueColumnCount, false, ref 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, ref historySectionValueColumns); + } + } + } + + output.Add(new cDetailsPageDataHistoryDataModel() + { + TitleColumn = titleColumn, + ValueColumns = historySectionValueColumns + }); + } + } + catch (Exception E) + { + LogException(E); + } + finally + { + LogMethodEnd(CM); + } + + return output; + } + + } + + public class cHealthCardSlimPageHelper : cHealthCardStateSubHelper + { + internal cHealthCardSlimPageHelper(cHealthCardDataHelper parent) : base(parent) { } + + private List> GetWidgetData() + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + var output = new List>(); + + try + { + var healthCardWidgetConfig = parent.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 (parent.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, cUtility.GetRawValueType(stateDefinition.DisplayType)); + + if (stateDefinition is cHealthCardStateRefLink refLinkState) + { + stateModel = cF4SDHealthCardConfig.GetReferencableStateWithName(stateDefinition.ParentNode, refLinkState.Reference); + widgetValue = parent.GetStateValueAt(stateModel.DatabaseInfo, 0, true); + } + + var widgetHighlightColor = parent.GetHighlightColor(widgetValue, stateModel); + 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 = parent.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 = parent.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, 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 = parent.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)); + } + + 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 async Task GetDataAsync() + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + + cSlimPageData output = new cSlimPageData(); + try + { + if (parent.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; + } + + } + + public class cHealthCardDetailPageHelper : cHealthCardStateSubHelper + { + internal cHealthCardDetailPageHelper(cHealthCardDataHelper parent) : base(parent) { } + + 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; + + var _cols = new List(); + foreach (var _colConfig in StateDetailsValued) + _cols.Add(_colConfig.Names.GetValue()); + + var _arrRow = _strData.Split(StateDetailsValued.RowSeparator); + var _values = new List(); + 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 = _strData.Split((char)StateDetailsValued.ColSeparator); + foreach (var _col in _arrCol) + _entry.Add(_col.Trim()); + } + + while (_entry.Count < _cols.Count) + _entry.Add(null); + + _values.Add(_entry.ToArray()); + } + + var Result = new cHealthCardDetailsTable() + { + Name = "Details-" + StateDetailsValued.ParentState.Name, + Columns = _cols, + 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 = parent.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) + || (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, cUtility.GetRawValueType(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(), cUtility.GetRawValueType(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 parent.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(); + } + } + + public cDetailsPageData GetDataWithoutHeading() + { + cDetailsPageData output = new cDetailsPageData(); + try + { + if (parent.SelectedHealthCard == null) + return output; + + output.DataProvider = dataProvider; + output.WidgetData = GetWidgetsData(); + output.DataHistoryList = parent.HistoryData.GetData(); + output.DataContainerCollectionList = parent.GetContainerCollectionData(); + output.MenuBarData = parent.GetMenuBarData(); + } + catch (Exception E) + { + LogException(E); + } + return output; + } + + public async Task GetDataAsync() + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + + cDetailsPageData output = new cDetailsPageData(); + try + { + if (parent.SelectedHealthCard == null) + return output; + + output.DataProvider = dataProvider; + output.HeadingData = await parent.GetHeadingDataAsync(); + output.WidgetData = GetWidgetsData(); + output.DataHistoryList = parent.HistoryData.GetData(); + output.DataContainerCollectionList = parent.GetContainerCollectionData(); + output.MenuBarData = parent.GetMenuBarData(); + } + catch (Exception E) + { + LogException(E); + } + finally + { + LogMethodEnd(CM); + } + + return output; + } + + } } public static class LoadingRawDataCriticalSection diff --git a/FasdDesktopUi/Basics/Models/ConnectionStatusHelper.cs b/FasdDesktopUi/Basics/Models/ConnectionStatusHelper.cs index e076461..d28c2fb 100644 --- a/FasdDesktopUi/Basics/Models/ConnectionStatusHelper.cs +++ b/FasdDesktopUi/Basics/Models/ConnectionStatusHelper.cs @@ -229,10 +229,7 @@ namespace FasdDesktopUi.Basics.Models { Dispatcher.CurrentDispatcher.Invoke(() => splashScreen?.SetStatusText(cMultiLanguageSupport.GetItem("StartUp.SplashScreen.AuthenticateUser"))); ApiConnectionStatus = enumOnlineStatus.unauthorized; - const string cockpitUserRole = "Cockpit.User"; -#if isNewFeature - const string cockpitTicketAgentRole = "Cockpit.TicketAgent"; -#endif + const string cockpitUserRole = "Cockpit.User"; userInfo = await cFasdCockpitCommunicationBase.Instance.WinLogon(); lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock) { @@ -247,10 +244,6 @@ namespace FasdDesktopUi.Basics.Models { await Task.Run(async () => await cFasdCockpitConfig.Instance.InstantiateAnalyticsAsync(cFasdCockpitConfig.SessionId)); ApiConnectionStatus = enumOnlineStatus.online; -#if isNewFeature - if (userInfo.Roles.Contains(cockpitTicketAgentRole)) - cCockpitConfiguration.Instance.ticketSupport.EditTicket = true; -#endif } } } diff --git a/FasdDesktopUi/Basics/Models/HierarchicalSelectionItem.cs b/FasdDesktopUi/Basics/Models/HierarchicalSelectionItem.cs new file mode 100644 index 0000000..1fcbe6b --- /dev/null +++ b/FasdDesktopUi/Basics/Models/HierarchicalSelectionItem.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; + +namespace FasdDesktopUi.Basics.Models +{ + public class HierarchicalSelectionItem : INotifyPropertyChanged + { + private bool _isExpanded; + + public string Id { get; set; } + public string DisplayName { get; set; } + public string ParentId { get; set; } + public string ParentDisplayName { get; set; } + + public ObservableCollection Children { get; } = new ObservableCollection(); + + public HierarchicalSelectionItem Parent { get; private set; } + + public bool IsExpanded + { + get => _isExpanded; + set + { + if (_isExpanded == value) + return; + _isExpanded = value; + OnPropertyChanged(nameof(IsExpanded)); + } + } + + public string FullPath + { + get + { + if (Parent == null || string.IsNullOrWhiteSpace(Parent.DisplayName)) + return DisplayName ?? string.Empty; + + if (string.IsNullOrWhiteSpace(DisplayName)) + return Parent.FullPath; + + return $"{Parent.FullPath} / {DisplayName}"; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string propertyName) => + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + + public void AddChild(HierarchicalSelectionItem child) + { + if (child == null) + return; + + child.Parent = this; + Children.Add(child); + } + + public void ClearChildren() + { + foreach (var child in Children) + child.Parent = null; + + Children.Clear(); + } + + public void SortChildrenRecursive() + { + if (Children == null || Children.Count == 0) + return; + + var orderedChildren = Children + .OrderBy(child => child.DisplayName, StringComparer.CurrentCultureIgnoreCase) + .ToList(); + + Children.Clear(); + + foreach (var child in orderedChildren) + { + Children.Add(child); + child.SortChildrenRecursive(); + } + } + + public IEnumerable SelfAndDescendants() + { + yield return this; + foreach (var child in Children) + { + foreach (var descendant in child.SelfAndDescendants()) + yield return descendant; + } + } + + public void SetExpandedRecursive(bool isExpanded) + { + IsExpanded = isExpanded; + + foreach (var child in Children) + child.SetExpandedRecursive(isExpanded); + } + + public HierarchicalSelectionItem CloneWithoutChildren() + { + return new HierarchicalSelectionItem + { + Id = Id, + DisplayName = DisplayName, + ParentId = ParentId, + ParentDisplayName = ParentDisplayName + }; + } + + public HierarchicalSelectionItem CloneBranch(Func predicate) + { + bool matches = predicate?.Invoke(this) ?? true; + var matchingChildren = new List(); + + foreach (var child in Children) + { + var childClone = child.CloneBranch(predicate); + if (childClone != null) + matchingChildren.Add(childClone); + } + + if (!matches && matchingChildren.Count == 0) + return null; + + var clone = CloneWithoutChildren(); + foreach (var childClone in matchingChildren) + clone.AddChild(childClone); + + return clone; + } + + public static ObservableCollection BuildTree(IEnumerable items) + { + if (items == null) + return new ObservableCollection(); + + var lookup = items + .Where(item => !string.IsNullOrWhiteSpace(item?.Id)) + .GroupBy(item => item.Id) + .Select(group => group.First()) + .ToDictionary(item => item.Id); + + foreach (var entry in lookup.Values) + entry.ClearChildren(); + + var roots = new List(); + + foreach (var item in lookup.Values) + { + if (!string.IsNullOrWhiteSpace(item.ParentId) && lookup.TryGetValue(item.ParentId, out var parent)) + { + parent.AddChild(item); + } + else + { + item.Parent = null; + roots.Add(item); + } + } + + foreach (var root in roots) + root.SortChildrenRecursive(); + + return new ObservableCollection( + roots.OrderBy(root => root.DisplayName, StringComparer.CurrentCultureIgnoreCase)); + } + } +} diff --git a/FasdDesktopUi/Basics/Models/NamedParameterEntry.cs b/FasdDesktopUi/Basics/Models/NamedParameterEntry.cs index b7ef5ed..56e9d97 100644 --- a/FasdDesktopUi/Basics/Models/NamedParameterEntry.cs +++ b/FasdDesktopUi/Basics/Models/NamedParameterEntry.cs @@ -48,13 +48,12 @@ namespace FasdDesktopUi.Basics.Models try { - IRawValueFormatter formatter = new RawValueFormatter(); - formatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); var outputTable = dataProvider.HealthCardDataHelper.HealthCardRawData.GetTableByName(valueAdress.ValueTable, true); if (outputTable != null) if (outputTable.Columns.TryGetValue(valueAdress.ValueColumn, out var outpuColumn)) - output = formatter.GetDisplayValue(outpuColumn.Values[valueAdress.DayIndex], display); + output = cUtility.RawValueFormatter.GetDisplayValue(outpuColumn.Values[valueAdress.DayIndex], display); } catch (Exception E) { diff --git a/FasdDesktopUi/Basics/Services/ProtocollService/QuickActionProtocollEntry.cs b/FasdDesktopUi/Basics/Services/ProtocollService/QuickActionProtocollEntry.cs index 72a9bef..0c1bbc7 100644 --- a/FasdDesktopUi/Basics/Services/ProtocollService/QuickActionProtocollEntry.cs +++ b/FasdDesktopUi/Basics/Services/ProtocollService/QuickActionProtocollEntry.cs @@ -15,7 +15,6 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService { private readonly cFasdQuickAction _quickActionDefinition; private readonly cQuickActionCopyData _quickActionCopyData; - private readonly IRawValueFormatter _rawValueFormatter = new RawValueFormatter(); const string AsciiSeperator = "\n\n"; @@ -261,18 +260,18 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService output += AsciiSeperator + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure"); - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); foreach (var measureValue in measureValues) { try { - string value = _rawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); - string postValue = _rawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); + string value = cUtility.RawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); + string postValue = cUtility.RawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); string difference = string.Empty; if (measureValue.Difference != null) - difference = $" (∆ {_rawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; + difference = $" (∆ {cUtility.RawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; output += "\n" + measureValue.Names.GetValue(cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage) + ": " + value + " ➜ " + postValue + difference; } @@ -475,18 +474,18 @@ namespace FasdDesktopUi.Basics.Services.ProtocollService output += "

" + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure.Html") + "

"; - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); foreach (var measureValue in measureValues) { try { - string value = _rawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); - string postValue = _rawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); + string value = cUtility.RawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); + string postValue = cUtility.RawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); string difference = string.Empty; if (measureValue.Difference != null) - difference = $" (∆ {_rawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; + difference = $" (∆ {cUtility.RawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; output += "

"; output += "" + measureValue.Names.GetValue(cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage) + ": " + value + " ➜ " + postValue + difference; diff --git a/FasdDesktopUi/Basics/Services/RelationService/RelationService.cs b/FasdDesktopUi/Basics/Services/RelationService/RelationService.cs index cade9d4..ca81a80 100644 --- a/FasdDesktopUi/Basics/Services/RelationService/RelationService.cs +++ b/FasdDesktopUi/Basics/Services/RelationService/RelationService.cs @@ -41,7 +41,7 @@ namespace FasdDesktopUi.Basics.Services.RelationService stagedRelations.MergeAsRelationInfosWith(relatedTo); _relations = _relations.Union(stagedRelations.Relations); - RelationsFound?.Invoke(this, new StagedSearchResultRelationsEventArgs() { RelatedTo = relatedTo, StagedResultRelations = stagedRelations }); + RelationsFound?.Invoke(this, new StagedSearchResultRelationsEventArgs() { RelatedTo = relatedTo, StagedResultRelations = stagedRelations, RelationService = this }); if (stagedRelations?.IsComplete ?? false) break; diff --git a/FasdDesktopUi/Basics/Services/SupportCase/SupportCaseFactory.cs b/FasdDesktopUi/Basics/Services/SupportCase/SupportCaseFactory.cs index 7c2ed9a..87089e0 100644 --- a/FasdDesktopUi/Basics/Services/SupportCase/SupportCaseFactory.cs +++ b/FasdDesktopUi/Basics/Services/SupportCase/SupportCaseFactory.cs @@ -12,7 +12,7 @@ namespace FasdDesktopUi.Basics.Services.SupportCase private static ISupportCase Create(cF4sdIdentityEntry primaryIdentity, IRelationService relationService, cSupportCaseDataProvider supportCaseDataProvider) { - SupportCase supportCase = new SupportCase(primaryIdentity.Id, relationService.Clone(), supportCaseDataProvider); + SupportCase supportCase = new SupportCase(primaryIdentity.Id, relationService, supportCaseDataProvider); _supportCases.Add(primaryIdentity.Id, supportCase); supportCase.Initialize(); return supportCase; diff --git a/FasdDesktopUi/Basics/Services/SupportCaseSearchService/SupportCaseSearchService.cs b/FasdDesktopUi/Basics/Services/SupportCaseSearchService/SupportCaseSearchService.cs index b0f1224..c602d27 100644 --- a/FasdDesktopUi/Basics/Services/SupportCaseSearchService/SupportCaseSearchService.cs +++ b/FasdDesktopUi/Basics/Services/SupportCaseSearchService/SupportCaseSearchService.cs @@ -3,9 +3,6 @@ using C4IT.FASD.Cockpit.Communication; using FasdDesktopUi.Basics.Services.RelationService; using System; using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; using System.Threading; using System.Threading.Tasks; using static C4IT.Logging.cLogManager; @@ -19,12 +16,6 @@ namespace FasdDesktopUi.Basics.Services.SupportCaseSearchService public SupportCaseSearchService(IRelationService relationService) { _relationService = relationService; - _relationService.RelationsFound += HandleRelationsFound; - } - - ~SupportCaseSearchService() - { - _relationService.RelationsFound -= HandleRelationsFound; } public static async Task GetSearchResultsAsync(string searchQuery, CancellationToken token = default) @@ -53,12 +44,18 @@ namespace FasdDesktopUi.Basics.Services.SupportCaseSearchService } public async Task LoadRelationsAsync(IEnumerable relatedTo, CancellationToken token = default) - => await _relationService.LoadRelationsAsync(relatedTo, token); + { + IRelationService relationService = _relationService.Clone(); + relationService.RelationsFound += HandleRelationsFound; + return await relationService.LoadRelationsAsync(relatedTo, token); + } private void HandleRelationsFound(object sender, StagedSearchResultRelationsEventArgs e) { - e.RelationService = _relationService; RelationsFound.Invoke(this, e); + + if (e.StagedResultRelations.IsComplete) + e.RelationService.RelationsFound -= HandleRelationsFound; } public event EventHandler RelationsFound; diff --git a/FasdDesktopUi/Basics/SupportCaseDataProvider.cs b/FasdDesktopUi/Basics/SupportCaseDataProvider.cs index 33dfc23..87f0abf 100644 --- a/FasdDesktopUi/Basics/SupportCaseDataProvider.cs +++ b/FasdDesktopUi/Basics/SupportCaseDataProvider.cs @@ -476,8 +476,8 @@ namespace FasdDesktopUi.Basics return false; } - var slimPageData = await HealthCardDataHelper.GetSlimPageDataAsync(); - var detailsPageData = await HealthCardDataHelper.GetDetailsPageDataAsync(); + var slimPageData = await HealthCardDataHelper.SlimCard.GetDataAsync(); + var detailsPageData = await HealthCardDataHelper.DetailPage.GetDataAsync(); slimPage?.SetPropertyValues(slimPageData); detailsPage?.SetPropertyValues(detailsPageData); diff --git a/FasdDesktopUi/Basics/UiActions/ShowDetailedDataAction.cs b/FasdDesktopUi/Basics/UiActions/ShowDetailedDataAction.cs index 0fd7c1d..ecdb4ec 100644 --- a/FasdDesktopUi/Basics/UiActions/ShowDetailedDataAction.cs +++ b/FasdDesktopUi/Basics/UiActions/ShowDetailedDataAction.cs @@ -326,8 +326,7 @@ namespace FasdDesktopUi.Basics.UiActions shouldHideRow = true; } - IRawValueFormatter rawValueFormatter = new RawValueFormatter(); - rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); foreach (var index in rawColumnIndexes) { @@ -352,7 +351,7 @@ namespace FasdDesktopUi.Basics.UiActions if (detailsRow[timeColumnIndex] is DateTime timeColumnValue) ProcessDetailValue(valueProcessingsEnumerator.Current, ref rawDetailValue, timeColumnValue); - var displayValue = rawValueFormatter.GetDisplayValue(rawDetailValue, displayTypeEnumerator.Current); + var displayValue = cUtility.RawValueFormatter.GetDisplayValue(rawDetailValue, displayTypeEnumerator.Current); displayValuesOfRow.Add(displayValue); } catch (Exception E) diff --git a/FasdDesktopUi/Basics/UiActions/UiChainQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiChainQuickAction.cs index 6bdb913..95a49b1 100644 --- a/FasdDesktopUi/Basics/UiActions/UiChainQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiChainQuickAction.cs @@ -184,17 +184,17 @@ namespace FasdDesktopUi.Basics.UiActions if (result != null && result[0].Equals(cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"))) { CancelRunningActionSteps(); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } if (token.IsCancellationRequested) { CancelRunningActionSteps(); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } catch (Exception E) { diff --git a/FasdDesktopUi/Basics/UiActions/UiDemoQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiDemoQuickAction.cs index 38a9e75..eba4b54 100644 --- a/FasdDesktopUi/Basics/UiActions/UiDemoQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiDemoQuickAction.cs @@ -41,11 +41,11 @@ namespace FasdDesktopUi.Basics.UiActions detailedData.FullDetailedData = new List() { new List() { "Status", cMultiLanguageSupport.GetItem("QuickAction.Revision.ExecutionTime")}, - new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddMinutes(-5), RawValueType.DATETIME)}, - new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddMinutes(-38), RawValueType.DATETIME) }, - new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddHours(-2).AddMinutes(12), RawValueType.DATETIME) }, - new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddDays(-1).AddHours(4).AddMinutes(-32), RawValueType.DATETIME) }, - new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddDays(-1).AddHours(4).AddMinutes(-34), RawValueType.DATETIME) } + new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddMinutes(-5), RawValueType.DATETIME)}, + new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddMinutes(-38), RawValueType.DATETIME) }, + new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddHours(-2).AddMinutes(12), RawValueType.DATETIME) }, + new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddDays(-1).AddHours(4).AddMinutes(-32), RawValueType.DATETIME) }, + new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow.AddDays(-1).AddHours(4).AddMinutes(-34), RawValueType.DATETIME) } }; //Get Process Steps of Action @@ -141,7 +141,7 @@ namespace FasdDesktopUi.Basics.UiActions _msg = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"); } - return new List() { _msg, _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { _msg, cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } } diff --git a/FasdDesktopUi/Basics/UiActions/UiDummyQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiDummyQuickAction.cs index b2740c8..d6205c1 100644 --- a/FasdDesktopUi/Basics/UiActions/UiDummyQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiDummyQuickAction.cs @@ -35,7 +35,7 @@ namespace FasdDesktopUi.Basics.UiActions public override async Task> ProcessActionAsync(CancellationToken token, Dictionary ParameterDictionary = null) { await Task.CompletedTask; - List result = new List { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + List result = new List { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; return result; } diff --git a/FasdDesktopUi/Basics/UiActions/UiLocalQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiLocalQuickAction.cs index f3d08f7..ecacfda 100644 --- a/FasdDesktopUi/Basics/UiActions/UiLocalQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiLocalQuickAction.cs @@ -176,7 +176,7 @@ namespace FasdDesktopUi.Basics.UiActions break; } - output = new List() { quickActionStatus, _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + output = new List() { quickActionStatus, cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } else { @@ -196,7 +196,7 @@ namespace FasdDesktopUi.Basics.UiActions cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues); F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData)); - output = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + output = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } _ = Task.Run(async () => @@ -239,7 +239,7 @@ namespace FasdDesktopUi.Basics.UiActions catch (Exception E) { LogException(E); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } } diff --git a/FasdDesktopUi/Basics/UiActions/UiLocalWebRequestQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiLocalWebRequestQuickAction.cs index f9e48ab..235a0d8 100644 --- a/FasdDesktopUi/Basics/UiActions/UiLocalWebRequestQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiLocalWebRequestQuickAction.cs @@ -102,7 +102,7 @@ namespace FasdDesktopUi.Basics.UiActions cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, LocalQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.main, enumQuickActionRevisionStatus.canceled); cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, LocalQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.canceled); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } cQuickActionOutput quickActionOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.unknown }); ; @@ -127,7 +127,7 @@ namespace FasdDesktopUi.Basics.UiActions cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(LocalQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues); F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData)); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } else { @@ -145,13 +145,13 @@ namespace FasdDesktopUi.Basics.UiActions F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(LocalQuickAction, copyData)); cMultiLanguageSupport.CurrentLanguage = tempLang; - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } catch (Exception E) { LogException(E); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } finally { diff --git a/FasdDesktopUi/Basics/UiActions/UiQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiQuickAction.cs index 19ce7f5..98f5f49 100644 --- a/FasdDesktopUi/Basics/UiActions/UiQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiQuickAction.cs @@ -28,8 +28,6 @@ namespace FasdDesktopUi.Basics.UiActions { private readonly bool shouldRunImmidiate = false; - protected readonly IRawValueFormatter _rawValueFormatter = new RawValueFormatter(); - public cFasdQuickAction QuickActionConfig { get; private set; } public cSupportCaseDataProvider DataProvider { get; set; } @@ -46,7 +44,7 @@ namespace FasdDesktopUi.Basics.UiActions if (QuickActionConfig is null) return; - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + cUtility.RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); shouldRunImmidiate = QuickActionConfig.RunImmediate; Description = QuickActionConfig.Descriptions?.GetValue(Default: null); diff --git a/FasdDesktopUi/Basics/UiActions/UiRemoteQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiRemoteQuickAction.cs index 1ef86e6..7b7d2c4 100644 --- a/FasdDesktopUi/Basics/UiActions/UiRemoteQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiRemoteQuickAction.cs @@ -64,7 +64,7 @@ namespace FasdDesktopUi.Basics.UiActions var quickActionHistory = await dataProvider.QuickActionProtocollHelper.GetQuickActionHistoryAsync(RemoteQuickAction.Name); foreach (var quickActionLine in quickActionHistory) { - quickActionLine[1] = _rawValueFormatter.GetDisplayValue(quickActionLine[1], RawValueType.DATETIME); + quickActionLine[1] = cUtility.RawValueFormatter.GetDisplayValue(quickActionLine[1], RawValueType.DATETIME); detailedData.FullDetailedData.Add(quickActionLine); } } @@ -157,7 +157,7 @@ namespace FasdDesktopUi.Basics.UiActions cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(RemoteQuickAction, DataProvider, true, protocollOutput, StatusMonitor.MeasureValues); F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(RemoteQuickAction, copyData)); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } string quickActionStatus; @@ -213,12 +213,12 @@ namespace FasdDesktopUi.Basics.UiActions } }); - return new List() { quickActionStatus, _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { quickActionStatus, cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } catch (Exception E) { LogException(E); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } diff --git a/FasdDesktopUi/Basics/UiActions/UiServerQuickAction.cs b/FasdDesktopUi/Basics/UiActions/UiServerQuickAction.cs index 8b711d0..487d73a 100644 --- a/FasdDesktopUi/Basics/UiActions/UiServerQuickAction.cs +++ b/FasdDesktopUi/Basics/UiActions/UiServerQuickAction.cs @@ -191,7 +191,7 @@ namespace FasdDesktopUi.Basics.UiActions break; } - output = new List() { quickActionStatus, _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + output = new List() { quickActionStatus, cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } else { @@ -211,7 +211,7 @@ namespace FasdDesktopUi.Basics.UiActions cQuickActionCopyData copyData = QuickActionProtocollEntry.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues); F4SDProtocoll.Instance.Add(new QuickActionProtocollEntry(ServerQuickAction, copyData)); - output = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + output = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } _ = Task.Run(async () => @@ -254,7 +254,7 @@ namespace FasdDesktopUi.Basics.UiActions catch (Exception E) { LogException(E); - return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), _rawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; + return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } } diff --git a/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml b/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml new file mode 100644 index 0000000..bebe5a4 --- /dev/null +++ b/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml.cs b/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml.cs new file mode 100644 index 0000000..b1b8c95 --- /dev/null +++ b/FasdDesktopUi/Basics/UserControls/HierarchicalSelectionControl.xaml.cs @@ -0,0 +1,256 @@ +using FasdDesktopUi.Basics.Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Threading; + +namespace FasdDesktopUi.Basics.UserControls +{ + public partial class HierarchicalSelectionControl : UserControl, IFocusInvoker + { + private readonly ObservableCollection visibleItems = new ObservableCollection(); + private readonly Dictionary itemLookup = new Dictionary(); + private readonly DispatcherTimer searchDelayTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(250) }; + private string lastSearchText = string.Empty; + public ObservableCollection VisibleItems => visibleItems; + + public int? ParentIndex { get; set; } + public UIElement ParentElement { get; set; } + + public HierarchicalSelectionControl() + { + InitializeComponent(); + TreeViewControl.ItemsSource = visibleItems; + searchDelayTimer.Tick += SearchDelayTimer_Tick; + } + + #region DependencyProperties + + public ObservableCollection ItemsSource + { + get => (ObservableCollection)GetValue(ItemsSourceProperty); + set => SetValue(ItemsSourceProperty, value); + } + + public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( + nameof(ItemsSource), + typeof(ObservableCollection), + typeof(HierarchicalSelectionControl), + new PropertyMetadata(null, OnItemsSourceChanged)); + + private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is HierarchicalSelectionControl control) + { + control.RebuildLookup(); + control.ApplyFilter(control.lastSearchText); + control.TryExpandToSelectedItem(); + } + } + + public HierarchicalSelectionItem SelectedItem + { + get => (HierarchicalSelectionItem)GetValue(SelectedItemProperty); + set => SetValue(SelectedItemProperty, value); + } + + public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register( + nameof(SelectedItem), + typeof(HierarchicalSelectionItem), + typeof(HierarchicalSelectionControl), + new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedItemChanged)); + + private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is HierarchicalSelectionControl control) + { + control.TryExpandToSelectedItem(); + } + } + + public Brush ComboBoxBackground + { + get => (Brush)GetValue(ComboBoxBackgroundProperty); + set => SetValue(ComboBoxBackgroundProperty, value); + } + + public static readonly DependencyProperty ComboBoxBackgroundProperty = + DependencyProperty.Register(nameof(ComboBoxBackground), typeof(Brush), typeof(HierarchicalSelectionControl), new PropertyMetadata(Brushes.Transparent)); + + public string SearchPlaceholderText + { + get => (string)GetValue(SearchPlaceholderTextProperty); + set => SetValue(SearchPlaceholderTextProperty, value); + } + + public static readonly DependencyProperty SearchPlaceholderTextProperty = + DependencyProperty.Register(nameof(SearchPlaceholderText), typeof(string), typeof(HierarchicalSelectionControl), new PropertyMetadata(string.Empty)); + + #endregion + + private void DropDownPopup_Opened(object sender, EventArgs e) + { + SearchTextBox.Focus(); + SearchTextBox.SelectAll(); + EnsureParentPlacement(); + cFocusInvoker.InvokeGotFocus(this, e); + } + + private void DropDownPopup_Closed(object sender, EventArgs e) + { + searchDelayTimer.Stop(); + cFocusInvoker.InvokeLostFocus(this, e); + } + + private void EnsureParentPlacement() + { + if (ParentElement == null || ParentElement != this.Parent) + { + ParentElement = this.Parent as UIElement; + + if (this.Parent is Panel panel) + ParentIndex = panel.Children.IndexOf(this); + else + ParentIndex = null; + } + } + + private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e) + { + searchDelayTimer.Stop(); + searchDelayTimer.Start(); + } + + private void SearchDelayTimer_Tick(object sender, EventArgs e) + { + searchDelayTimer.Stop(); + lastSearchText = SearchTextBox.Text ?? string.Empty; + ApplyFilter(lastSearchText); + } + + private void TreeViewControl_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (e.NewValue is HierarchicalSelectionItem selected) + { + var original = ResolveOriginalItem(selected); + if (original != null) + SelectedItem = original; + + DropDownPopup.IsOpen = false; + } + } + + private HierarchicalSelectionItem ResolveOriginalItem(HierarchicalSelectionItem item) + { + if (item == null) + return null; + + if (!string.IsNullOrWhiteSpace(item.Id) && itemLookup.TryGetValue(item.Id, out var original)) + return original; + + return item; + } + + private void RebuildLookup() + { + itemLookup.Clear(); + + if (ItemsSource == null) + return; + + foreach (var entry in ItemsSource.SelectMany(item => item.SelfAndDescendants())) + { + if (string.IsNullOrWhiteSpace(entry.Id)) + continue; + + itemLookup[entry.Id] = entry; + } + } + + private void ApplyFilter(string searchText) + { + visibleItems.Clear(); + + if (ItemsSource == null) + return; + + if (string.IsNullOrWhiteSpace(searchText)) + { + foreach (var item in ItemsSource) + { + item.SetExpandedRecursive(false); + visibleItems.Add(item); + } + + TryExpandToSelectedItem(); + return; + } + + var comparison = StringComparison.CurrentCultureIgnoreCase; + + foreach (var root in ItemsSource) + { + var clone = root.CloneBranch(node => + node.FullPath?.IndexOf(searchText, comparison) >= 0 || + node.DisplayName?.IndexOf(searchText, comparison) >= 0); + + if (clone == null) + continue; + + clone.SetExpandedRecursive(true); + visibleItems.Add(clone); + } + } + + private void TryExpandToSelectedItem() + { + if (SelectedItem == null || string.IsNullOrWhiteSpace(SelectedItem.Id)) + return; + + if (!string.IsNullOrWhiteSpace(lastSearchText)) + return; + + var chain = SelectedItem; + while (chain != null) + { + chain.IsExpanded = true; + chain = chain.Parent; + } + } + + private void DisplayBorder_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + if (!IsEnabled) + return; + + e.Handled = true; + DropDownPopup.IsOpen = !DropDownPopup.IsOpen; + } + + protected override void OnPreviewKeyDown(KeyEventArgs e) + { + base.OnPreviewKeyDown(e); + + if (!IsEnabled) + return; + + if (!DropDownPopup.IsOpen && (e.Key == Key.Enter || e.Key == Key.Down || e.Key == Key.Space)) + { + DropDownPopup.IsOpen = true; + e.Handled = true; + return; + } + + if (DropDownPopup.IsOpen && e.Key == Key.Escape) + { + DropDownPopup.IsOpen = false; + e.Handled = true; + } + } + } +} diff --git a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml index a6fedca..7401c6a 100644 --- a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml +++ b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml @@ -160,13 +160,13 @@ Margin="0 10 0 0" Foreground="{DynamicResource FontColor.Menu.Categories}" /> - + { ["Special"] = "NoTicket" } }; - private readonly cF4sdApiSearchResultRelation _removeAffectedAssetEntry = new cF4sdApiSearchResultRelation() - { - DisplayName = cMultiLanguageSupport.GetItem("Dialog.CloseCase.RemoveAffectedAssetEntry"), - Type = enumF4sdSearchResultClass.Computer, - Identities = null, - Infos = new Dictionary { ["Special"] = "RemoveAffectedAssetEntry" } - }; + private readonly cF4sdApiSearchResultRelation _removeAffectedAssetEntry = new cF4sdApiSearchResultRelation() + { + DisplayName = cMultiLanguageSupport.GetItem("Dialog.CloseCase.RemoveAffectedAssetEntry"), + Type = enumF4sdSearchResultClass.Computer, + Identities = null, + Infos = new Dictionary { ["Special"] = "RemoveAffectedAssetEntry" } + }; + + private const string CategoryTableNamePrimary = "M42Wpm-Ticket-Categories"; + private const string CategoryTableNameLegacy = "M42Wpm-Ticket-CloseCase-Categories"; + private string activeCategoryTableName = CategoryTableNamePrimary; + + private ObservableCollection categoryHierarchy = new ObservableCollection(); + private readonly Dictionary categoryLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); + private bool isCategoryLoading; public bool IsTicket { @@ -139,17 +147,17 @@ namespace FasdDesktopUi.Basics.UserControls ShowAssetWarningTicketAction = IsTicket; ValidateProperty("SelectedTicket"); EnableHoldTicketAction = _selectedTicket == null || SelectedTicket == _selectTicketRelation || selectedTicketIsNewTicket; - if (_selectedTicket != null && _selectedTicket.Infos.TryGetValue("StatusId", out var statusIdString)) - { - object parsedStatusId = Enum.Parse(typeof(enumTicketStatus), statusIdString); - if (parsedStatusId is enumTicketStatus statusId) - { - EnableHoldTicketAction = statusId != enumTicketStatus.OnHold; - } - } - - } - } + if (_selectedTicket != null && _selectedTicket.Infos.TryGetValue("StatusId", out var statusIdString)) + { + object parsedStatusId = Enum.Parse(typeof(enumTicketStatus), statusIdString); + if (parsedStatusId is enumTicketStatus statusId) + { + EnableHoldTicketAction = statusId != enumTicketStatus.OnHold; + } + } + TrySelectTicketCategoryFromTicketInfos(); + } + } private bool selectedTicketIsNewTicket { @@ -207,26 +215,22 @@ namespace FasdDesktopUi.Basics.UserControls #region SelectedCategory DependencyProperty - public static readonly DependencyProperty SelectedCategoryProperty = DependencyProperty.Register( - "SelectedCategory", - typeof(KeyValuePair), - typeof(CloseCaseDialogWithTicket), - new PropertyMetadata(default(KeyValuePair), OnSelectedCategoryChanged)); - - public KeyValuePair SelectedCategory - { - get { return (KeyValuePair)GetValue(SelectedCategoryProperty); } - set - { - SetValue(SelectedCategoryProperty, value); - } - } - - private static void OnSelectedCategoryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - var control = (CloseCaseDialogWithTicket)d; - var newValue = (KeyValuePair)e.NewValue; - } + public static readonly DependencyProperty SelectedCategoryProperty = DependencyProperty.Register( + "SelectedCategory", + typeof(HierarchicalSelectionItem), + typeof(CloseCaseDialogWithTicket), + new PropertyMetadata(null, OnSelectedCategoryChanged)); + + public HierarchicalSelectionItem SelectedCategory + { + get { return (HierarchicalSelectionItem)GetValue(SelectedCategoryProperty); } + set { SetValue(SelectedCategoryProperty, value); } + } + + private static void OnSelectedCategoryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + // Reserved for future use when additional reactions are required. + } #endregion @@ -373,19 +377,15 @@ namespace FasdDesktopUi.Basics.UserControls me.UpdateAffectedServiceLabel(); me.UpdateAffectedAssetComboBox(); - me.ServiceSelectionControl.SearchDataChanged = me.HandleServiceSearchDataChanged; - me.ServiceSelectionControl.ParentElement = me.MainStack; - me.ServiceSelectionControl.ParentIndex = me.MainStack.Children.IndexOf(me.ServiceSelectionControl); - - me.CategorySelectionControl.ParentElement = me.MainStack; - me.CategorySelectionControl.ParentIndex = me.MainStack.Children.IndexOf(me.CategorySelectionControl); - - me.CategorySelectionControl.SearchDataChanged = me.HandleCategorySearchDataChanged; - - me.AddNewOrExistingOrNoneTicketSelection(); - me.UpdateCaseNotesPreview(); - me.UpdateTicketComponentVisibility(); - await me.UpdateQuickCallsComboBoxAsync(); + me.ServiceSelectionControl.SearchDataChanged = me.HandleServiceSearchDataChanged; + me.ServiceSelectionControl.ParentElement = me.MainStack; + me.ServiceSelectionControl.ParentIndex = me.MainStack.Children.IndexOf(me.ServiceSelectionControl); + + me.AddNewOrExistingOrNoneTicketSelection(); + me.UpdateCaseNotesPreview(); + me.UpdateTicketComponentVisibility(); + await me.InitializeCategorySelectionAsync(); + await me.UpdateQuickCallsComboBoxAsync(); } catch (Exception E) { @@ -412,13 +412,8 @@ namespace FasdDesktopUi.Basics.UserControls dpd?.AddValueChanged(CaseNotesPreview, TicketCaseNotesTextBlock_TextChanged); -#if !IsNewFeature - CategoryLabelPanel.Visibility = Visibility.Collapsed; - CategorySelectionControl.Visibility = Visibility.Collapsed; -#endif - - SupportNotepad = true; - } + SupportNotepad = true; + } private void CloseCaseDialogWithTicket_Loaded(object sender, RoutedEventArgs e) { @@ -886,95 +881,193 @@ namespace FasdDesktopUi.Basics.UserControls return null; } - private string lastCategorySearch; - private async void HandleCategorySearchDataChanged(object sender, cF4sdHealthSelectionDataRequest e) - { - await UpdateCategorySelectionControlAsync(e); - } - - private async Task UpdateCategorySelectionControlAsync(cF4sdHealthSelectionDataRequest requestData) - { - try - { - - requestData.Identities = DataProvider.Identities; - requestData.Table = "M42Wpm-Ticket-CloseCase-Categories"; - requestData.ResetFilter = CategorySelectionControl.ResetFilter; - - if (string.IsNullOrEmpty(lastCategorySearch) || - !lastCategorySearch.Equals(requestData.Search, StringComparison.CurrentCultureIgnoreCase)) - { - var resCategoryCount = await cFasdCockpitCommunicationBase.Instance.GetPagedDataCount(requestData); - CategorySelectionControl.TotalItemCount = resCategoryCount; - lastCategorySearch = requestData.Search; - } - - var categoryData = await cFasdCockpitCommunicationBase.Instance.GetPagedData(requestData); - var categoriesList = GetCategorySelectionData(categoryData) ?? new ObservableCollection>(); - - // Aktuell am Ticket gesetzte Kategorie ggf. sicherstellen - string categoryId = null; - string categoryName = null; - - if (SelectedTicket != null && SelectedTicket.Infos != null) - { - var catIdPair = SelectedTicket.Infos.FirstOrDefault(x => x.Key == "CategoryId"); - categoryId = catIdPair.Value; - - var catNamePair = SelectedTicket.Infos.FirstOrDefault(x => x.Key == "CategoryName"); - categoryName = catNamePair.Value; - } - - if (!string.IsNullOrEmpty(categoryId) && Guid.Empty.ToString() != categoryId) - { - bool exists = categoriesList.Any(kvp => kvp.Value != null && kvp.Value.ToString() == categoryId); - if (!exists) - { - categoriesList.Add(new KeyValuePair( - string.IsNullOrEmpty(categoryName) ? categoryId : categoryName, - categoryId)); - } - } - - CategorySelectionControl.ItemData = categoriesList; - } - catch (Exception E) - { - LogException(E); - } - } - - private ObservableCollection> GetCategorySelectionData(cF4SDHealthCardRawData.cHealthCardTable dataTable) - { - try - { - if (dataTable == null || dataTable.Name != "M42Wpm-Ticket-CloseCase-Categories") - return null; - - if (!dataTable.Columns.TryGetValue("id", out var idColumn)) - return null; - - if (!dataTable.Columns.TryGetValue("Name", out var nameColumn)) - return null; - - var zippedKeyValuePairs = - idColumn.Values.Zip(nameColumn.Values, (id, display) => - new KeyValuePair(display != null ? display.ToString() : string.Empty, id)); - - return new ObservableCollection>(zippedKeyValuePairs); - } - catch (Exception E) - { - LogException(E); - } - - return null; - } - - - private async Task UpdateQuickCallsComboBoxAsync() - { + private async Task InitializeCategorySelectionAsync() + { + if (isCategoryLoading) + return; + + try + { + if (DataProvider == null || CategorySelectionControl == null) + return; + + isCategoryLoading = true; + + var tableCandidates = new[] { CategoryTableNamePrimary, CategoryTableNameLegacy }; + bool initialized = false; + + foreach (var tableName in tableCandidates) + { + if (await TryPopulateCategoryHierarchyAsync(tableName)) + { + activeCategoryTableName = tableName; + initialized = true; + break; + } + } + + if (initialized) + { + CategorySelectionControl.ItemsSource = categoryHierarchy; + TrySelectTicketCategoryFromTicketInfos(); + } + } + catch (Exception E) + { + LogException(E); + } + finally + { + isCategoryLoading = false; + } + } + + private async Task TryPopulateCategoryHierarchyAsync(string tableName) + { + try + { + const int defaultPageSize = 250; + + var requestData = new cF4sdHealthSelectionDataRequest + { + Identities = DataProvider.Identities, + Table = tableName, + Page = 0, + PageSize = defaultPageSize, + Search = string.Empty + }; + + var totalCount = await cFasdCockpitCommunicationBase.Instance.GetPagedDataCount(requestData); + var effectivePageSize = requestData.PageSize > 0 ? requestData.PageSize : defaultPageSize; + var pageCount = Math.Max(1, (int)Math.Ceiling((double)totalCount / Math.Max(1, effectivePageSize))); + + var flatItems = new Dictionary(StringComparer.OrdinalIgnoreCase); + + for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) + { + requestData.Page = pageIndex; + requestData.PageSize = effectivePageSize; + + var categoryTable = await cFasdCockpitCommunicationBase.Instance.GetPagedData(requestData); + bool rowAdded = false; + + foreach (var item in ConvertCategoryTable(categoryTable)) + { + if (string.IsNullOrWhiteSpace(item.Id)) + continue; + + flatItems[item.Id] = item; + rowAdded = true; + } + + if (!rowAdded && categoryTable == null) + return false; + } + + var hierarchy = HierarchicalSelectionItem.BuildTree(flatItems.Values); + if (hierarchy == null || hierarchy.Count == 0) + return false; + + categoryHierarchy = hierarchy; + UpdateCategoryLookup(); + return true; + } + catch (Exception E) + { + LogException(E); + return false; + } + } + + private IEnumerable ConvertCategoryTable(cF4SDHealthCardRawData.cHealthCardTable dataTable) + { + if (dataTable == null || dataTable.Columns == null) + yield break; + + if (!dataTable.Columns.TryGetValue("id", out var idColumn)) + yield break; + + if (!dataTable.Columns.TryGetValue("Name", out var nameColumn)) + yield break; + + cF4SDHealthCardRawData.cHealthCardTableColumn parentIdColumn = null; + cF4SDHealthCardRawData.cHealthCardTableColumn parentNameColumn = null; + if (!dataTable.Columns.TryGetValue("parentValue", out parentIdColumn)) + dataTable.Columns.TryGetValue("Parent_Value", out parentIdColumn); + if (!dataTable.Columns.TryGetValue("parent", out parentNameColumn)) + dataTable.Columns.TryGetValue("Parent", out parentNameColumn); + + for (int index = 0; index < idColumn.Values.Count; index++) + { + var id = idColumn.Values[index]?.ToString(); + if (string.IsNullOrWhiteSpace(id)) + continue; + + var displayName = index < nameColumn.Values.Count ? nameColumn.Values[index]?.ToString() : string.Empty; + + string parentId = null; + if (parentIdColumn != null && index < parentIdColumn.Values.Count) + parentId = parentIdColumn.Values[index]?.ToString(); + + if (Guid.TryParse(parentId, out var parsedParentId) && parsedParentId == Guid.Empty) + parentId = null; + + var parentDisplayName = parentNameColumn != null && index < parentNameColumn.Values.Count + ? parentNameColumn.Values[index]?.ToString() + : null; + + yield return new HierarchicalSelectionItem + { + Id = id, + DisplayName = string.IsNullOrWhiteSpace(displayName) ? parentDisplayName ?? id : displayName, + ParentId = parentId, + ParentDisplayName = parentDisplayName + }; + } + } + + private void UpdateCategoryLookup() + { + categoryLookup.Clear(); + + if (categoryHierarchy == null) + return; + + foreach (var node in categoryHierarchy.SelectMany(item => item.SelfAndDescendants())) + { + if (!string.IsNullOrWhiteSpace(node.Id)) + categoryLookup[node.Id] = node; + } + } + + private void TrySelectTicketCategoryFromTicketInfos() + { + try + { + if (SelectedTicket?.Infos == null) + { + SelectedCategory = null; + return; + } + + if (!SelectedTicket.Infos.TryGetValue("CategoryId", out var categoryId) || string.IsNullOrWhiteSpace(categoryId)) + { + SelectedCategory = null; + return; + } + + if (categoryLookup.TryGetValue(categoryId, out var categoryNode)) + SelectedCategory = categoryNode; + } + catch (Exception E) + { + LogException(E); + } + } + + private async Task UpdateQuickCallsComboBoxAsync() + { try { cF4sdHealthSelectionDataRequest requestData = new cF4sdHealthSelectionDataRequest diff --git a/FasdDesktopUi/Basics/cUtility.cs b/FasdDesktopUi/Basics/cUtility.cs index 30ca9b8..8dd4377 100644 --- a/FasdDesktopUi/Basics/cUtility.cs +++ b/FasdDesktopUi/Basics/cUtility.cs @@ -24,7 +24,7 @@ namespace FasdDesktopUi.Basics { public static class cUtility { - private static readonly IRawValueFormatter _rawValueFormatter = new RawValueFormatter(); + public static readonly IRawValueFormatter RawValueFormatter = new RawValueFormatter(); internal static RawValueType GetRawValueType(enumHealthCardDisplayTypes displayType) { @@ -568,18 +568,18 @@ namespace FasdDesktopUi.Basics output += "\n\n" + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure"); - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); foreach (var measureValue in measureValues) { try { - string value = _rawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); - string postValue = _rawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); + string value = RawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); + string postValue = RawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); string difference = string.Empty; if (measureValue.Difference != null) - difference = $" (∆ {_rawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; + difference = $" (∆ {RawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; output += "\n" + measureValue.Names.GetValue(cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage) + ": " + value + " ➜ " + postValue + difference; } @@ -807,18 +807,18 @@ namespace FasdDesktopUi.Basics output += "

" + cMultiLanguageSupport.GetItem("QuickAction.Copy.Measure.Html") + "

"; - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); foreach (var measureValue in measureValues) { try { - string value = _rawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); - string postValue = _rawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); + string value = RawValueFormatter.GetDisplayValue(measureValue.Value, measureValue.Display); + string postValue = RawValueFormatter.GetDisplayValue(measureValue.PostValue, measureValue.Display); string difference = string.Empty; if (measureValue.Difference != null) - difference = $" (∆ {_rawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; + difference = $" (∆ {RawValueFormatter.GetDisplayValue(measureValue.Difference, measureValue.Display)})"; output += "

"; output += "" + measureValue.Names.GetValue(cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage) + ": " + value + " ➜ " + postValue + difference; @@ -850,30 +850,30 @@ namespace FasdDesktopUi.Basics { FormattingOptions options = new FormattingOptions() { ReferenceDate = DateTime.UtcNow.AddDays(_v.ReferenceDays) }; - _rawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); - var _strVal = _rawValueFormatter.GetDisplayValue(_v.Value, GetRawValueType(_v.StateDefinition.DisplayType), options); + RawValueFormatter.SetDefaultCulture(new System.Globalization.CultureInfo(cFasdCockpitConfig.Instance.SelectedLanguage)); + var _strVal = RawValueFormatter.GetDisplayValue(_v.Value, GetRawValueType(_v.StateDefinition.DisplayType), options); _t.rawValue.Text = _strVal; if (_v.StateDefinition is cHealthCardStateLevel _sl) { - _strVal = _rawValueFormatter.GetDisplayValue(_sl.Warning, GetRawValueType(_v.StateDefinition.DisplayType), options); + _strVal = RawValueFormatter.GetDisplayValue(_sl.Warning, GetRawValueType(_v.StateDefinition.DisplayType), options); _t.tresholdWarning.Text = _strVal; - _strVal = _rawValueFormatter.GetDisplayValue(_sl.Error, GetRawValueType(_v.StateDefinition.DisplayType), options); + _strVal = RawValueFormatter.GetDisplayValue(_sl.Error, GetRawValueType(_v.StateDefinition.DisplayType), options); _t.tresholdError.Text = _strVal; } else if (_v.StateDefinition is cHealthCardStateVersion _sv) { - _strVal = _rawValueFormatter.GetDisplayValue(_sv.Warning, GetRawValueType(_v.StateDefinition.DisplayType), options); + _strVal = RawValueFormatter.GetDisplayValue(_sv.Warning, GetRawValueType(_v.StateDefinition.DisplayType), options); _t.tresholdWarning.Text = _strVal; - _strVal = _rawValueFormatter.GetDisplayValue(_sv.Error, GetRawValueType(_v.StateDefinition.DisplayType), options); + _strVal = RawValueFormatter.GetDisplayValue(_sv.Error, GetRawValueType(_v.StateDefinition.DisplayType), options); _t.tresholdError.Text = _strVal; } else if (_v.StateDefinition is cHealthCardStateDateTime _sd) { - _strVal = _rawValueFormatter.GetDisplayValue(_sd.WarningHours, RawValueType.DURATION_HOUR, options); + _strVal = RawValueFormatter.GetDisplayValue(_sd.WarningHours, RawValueType.DURATION_HOUR, options); _t.tresholdWarning.Text = _strVal; - _strVal = _rawValueFormatter.GetDisplayValue(_sd.ErrorHours, RawValueType.DURATION_HOUR, options); + _strVal = RawValueFormatter.GetDisplayValue(_sd.ErrorHours, RawValueType.DURATION_HOUR, options); _t.tresholdError.Text = _strVal; } else if (_v.StateDefinition is cHealthCardStateTranslation _st) diff --git a/FasdDesktopUi/F4SD-Cockpit-Client.csproj b/FasdDesktopUi/F4SD-Cockpit-Client.csproj index 77fdb56..06dfab3 100644 --- a/FasdDesktopUi/F4SD-Cockpit-Client.csproj +++ b/FasdDesktopUi/F4SD-Cockpit-Client.csproj @@ -194,10 +194,11 @@ - - - - + + + + + @@ -234,13 +235,16 @@ - - BlurInvokerContainer.xaml - - - ComboBoxPageAble.xaml - - + + BlurInvokerContainer.xaml + + + ComboBoxPageAble.xaml + + + HierarchicalSelectionControl.xaml + + DynamicChart.xaml @@ -443,11 +447,15 @@ MSBuild:Compile Designer - - Designer - MSBuild:Compile - - + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + Designer MSBuild:Compile @@ -1007,4 +1015,4 @@ taskkill -im "F4SD-Cockpit-Client.exe" -f -FI "STATUS eq RUNNING" - \ No newline at end of file + diff --git a/FasdDesktopUi/Pages/DetailsPage/DetailsPageView.xaml.cs b/FasdDesktopUi/Pages/DetailsPage/DetailsPageView.xaml.cs index 088c526..ff12a3b 100644 --- a/FasdDesktopUi/Pages/DetailsPage/DetailsPageView.xaml.cs +++ b/FasdDesktopUi/Pages/DetailsPage/DetailsPageView.xaml.cs @@ -949,7 +949,7 @@ namespace FasdDesktopUi.Pages.DetailsPage if (!(e is BooleanEventArgs booleanArg) || booleanArg.BooleanArg == false) isDataProviderLoading = true; - var data = _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetDetailsPageDataWithoutHeading(); + var data = _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.DetailPage.GetDataWithoutHeading(); await Dispatcher.Invoke(async () => { NavigationHeadingUc.HeadingData = _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetHeadingDataWithoutOnlineStatus(); diff --git a/FasdDesktopUi/Pages/SlimPage/SlimPageView.xaml.cs b/FasdDesktopUi/Pages/SlimPage/SlimPageView.xaml.cs index 48a2a3f..1183efa 100644 --- a/FasdDesktopUi/Pages/SlimPage/SlimPageView.xaml.cs +++ b/FasdDesktopUi/Pages/SlimPage/SlimPageView.xaml.cs @@ -310,7 +310,7 @@ namespace FasdDesktopUi.Pages.SlimPage return; } - var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetSlimPageDataAsync(); + var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.SlimCard.GetDataAsync(); //todo: check if there is a more performant way solving this Dispatcher.Invoke(() => WidgetCollectionUc.HeadingData = data.HeadingData); Dispatcher.Invoke(() => WidgetCollectionUc.WidgetData = data.WidgetData); @@ -339,7 +339,7 @@ namespace FasdDesktopUi.Pages.SlimPage { try { - var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetSlimPageDataAsync(); + var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.SlimCard.GetDataAsync(); //todo: check if there is a more performant way solving this Dispatcher.Invoke(() => WidgetCollectionUc.HeadingData = data.HeadingData); Dispatcher.Invoke(() => WidgetCollectionUc.WidgetData = data.WidgetData);