using C4IT.FASD.Base; using C4IT.Logging; using C4IT.MultiLanguage; using FasdDesktopUi.Basics.Services.RelationService; using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Threading.Tasks; using System.Windows; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.UiActions { public class cUiProcessSearchRelationAction : cUiActionBase { private readonly List _selectedSearchResult; private readonly List _relations; private readonly cF4sdApiSearchResultRelation _selectedRelation; private readonly IRelationService _relationService; private readonly ISearchUiProvider _searchUiProvider; private readonly cSearchHistoryEntryBase _searchHistoryEntry; public cUiProcessSearchRelationAction(cSearchHistorySearchResultEntry searchHistoryEntry, cF4sdApiSearchResultRelation selectedRelation, IRelationService relationService, ISearchUiProvider searchUiProvider) { Name = $"{searchHistoryEntry.HeaderText} → {selectedRelation.DisplayName}"; _selectedSearchResult = searchHistoryEntry.SelectedSearchResult; _relations = searchHistoryEntry.Relations; _selectedRelation = selectedRelation; _relationService = relationService; _searchUiProvider = searchUiProvider; _searchHistoryEntry = searchHistoryEntry; } public cUiProcessSearchRelationAction(string name, List selectedSearchResult, List relations, cF4sdApiSearchResultRelation selectedRelation, ISearchUiProvider searchUiProvider, cSearchHistoryEntryBase searchHistoryEntry) { Name = name; _selectedSearchResult = selectedSearchResult; _relations = relations; _selectedRelation = selectedRelation; _searchUiProvider = searchUiProvider; _searchHistoryEntry = searchHistoryEntry; } public override async Task RunUiActionAsync(object sender, UIElement UiLocation, bool isDetailedLayout, cSupportCaseDataProvider dataProvider) { // return false: The search action has finished, the search could be canceled // return true: The search action is ongoing var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); try { if (dataProvider != null) { Debug.Assert(true, "At this moment, we want to create a new support call, so we must not have a dataProvider"); LogEntry("At this moment, we want to create a new support call, so we must not have a dataProvider", LogLevels.Error); return false; } if (_selectedRelation == null) { Debug.Assert(true, "A new support case can't be opend, if we have no selected relation or seach result"); LogEntry("A new support case can't be opend, if we have no sselected relation or seach result", LogLevels.Error); return false; } // check, if have an active support case var supportCaseActive = dataProvider?.IsActive ?? false; // create the search histroy entry var _seachHistoryEntry = new cSearchHistoryRelationEntry(Name, _selectedSearchResult, _relations, _selectedRelation, _searchUiProvider); cSearchManager.Instance.ReplaceEntry(_seachHistoryEntry, _searchHistoryEntry); // show the loading information string caseObjectName = _selectedRelation.DisplayName; string loadingStatusText = string.Format(cMultiLanguageSupport.GetItem("Searchbar.Loading.CaseData"), caseObjectName); _searchUiProvider.ShowLoadingTextItem(loadingStatusText); // if we have an opened support case, close it immediately if (supportCaseActive) { if (!await cSupportCaseDataProvider.SupportTicketActiveNoticeAsync()) return false; } // set the new result menu properies for loading .... _seachHistoryEntry.isSeen = true; // get the new data provider for the support call informations (get it from the cache or create a new one) dataProvider = await cSupportCaseDataProvider.GetDataProviderForAsync(_relations, _selectedRelation, _relationService); if (dataProvider is null) { Debug.Assert(true, "Could not start a data provider for the selected criterias."); LogEntry("Could not start a data provider for the selected criterias.", LogLevels.Error); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return false; } } }