public virtual ActionResult <object> InitializeScreen([FromBody] RequestScreenModel model) { // Проверка, что такой скрин уже не проинициализирован if (screenInfo.Screen == null || screenInfo.Screen.Name != model.NewScreenName) { // Очистка информации viewInfo.Dispose(); // Инициализация скрина screenInfo.Initialize(model.NewScreenName, model.NewViewName, context); screenInfo.ActionType = ActionType.InitializeScreen; screenInfoUI.Initialize(screenInfo, context); // Восстановление контекста при переходе на экран, который присутствует в хлебных крошках if (ComponentsRecordsInfo.GetCrumbs().FirstOrDefault(i => i.ViewId == screenInfo.CurrentView?.ViewId) != null) { ComponentsRecordsInfo.RestoreContext(new List <View>() { context.Views .Include(bo => bo.BusObject) .ThenInclude(boc => boc.BusObjectComponents) .ThenInclude(bc => bc.BusComp) .FirstOrDefault(i => i.Id == screenInfo.CurrentView.ViewId) }); } } else { screenInfo.ActionType = ActionType.ReloadScreen; } return(Ok(screenInfoUI.Serialize())); }
public virtual ActionResult <object> UpdateScreenInfo([FromBody] RequestScreenModel model) { switch (model.Action) { case "SelectScreenItem": Screen newScreen = context.Screens .Include(si => si.ScreenItems) .ThenInclude(v => v.View) .FirstOrDefault(n => n.Name == model.NewScreenName); View oldView = context.Views.FirstOrDefault(n => n.Name == model.OldViewName); View newView = context.Views .Include(bo => bo.BusObject) .ThenInclude(boc => boc.BusObjectComponents) .ThenInclude(bc => bc.BusComp) .FirstOrDefault(n => n.Name == model.NewViewName); ScreenItem oldScreenItem = newScreen.ScreenItems.FirstOrDefault(n => n.ViewId == oldView.Id); ScreenItem newScreenItem = newScreen.ScreenItems.FirstOrDefault(n => n.ViewId == newView.Id); List <ScreenItem> crumbs = ComponentsRecordsInfo.GetCrumbs(); /* Если не произошел переход на представление того же уровня внутри того же родителя и выполняется одно из двух следующих условий: * - уже есть хлебные крошки; * - у выбранного представления есть родитель, который не является последней хлебной крошкой. * Тогда текущее выбранное представление добавляется в хлебные крошки */ if (oldScreenItem.ParentItemId != newScreenItem.ParentItemId && (crumbs.Count > 0 || newScreenItem.ParentItemId != null)) { ComponentsRecordsInfo.AppendCrumbs("SelectScreenItem", newScreen, oldScreenItem, newScreenItem); } // Обновление контекста в случае, если представление, на которое произошел переход уже есть в хлебных крошках и если для него уничтожен контекст if (crumbs.FirstOrDefault(i => i.ViewId == newView.Id) != null && !ComponentsRecordsInfo.IsInitComponent(newView.BusObject.BusObjectComponents.FirstOrDefault()?.Name)) { ComponentsRecordsInfo.RestoreContext(new List <View>() { newView }); } screenInfo.Initialize(model.NewScreenName, model.NewViewName, context); break; case "SelectScreen": if (screenInfo.Screen.Name != model.NewScreenName) { // Добавление хлебной крошки if (screenInfo.Crumbs?.Count > 0) { Screen oldScreen = context.Screens .Include(si => si.ScreenItems) .ThenInclude(v => v.View) .FirstOrDefault(n => n.Name == model.OldScreenName); ComponentsRecordsInfo.AppendCrumb(oldScreen.ScreenItems.FirstOrDefault(n => n.View != null && n.View.Name == model.OldViewName)); screenInfo.Initialize(model.OldScreenName, model.OldViewName, context); } ComponentsRecordsInfo.Dispose(); } break; case "SelectCrumb": // Удаление хлебных крошек ComponentsRecordsInfo.RemoveCrumbs(model.CrumbId); List <ScreenItem> screenItems = ComponentsRecordsInfo.GetCrumbs(); List <View> viewsToResore = new List <View>(); // Добавление всех представлений, оставшихся в хлебных крошках в представления, контекст которых необходимо восстановить screenItems.ForEach(crumb => { viewsToResore.Add(context.Views .Include(bo => bo.BusObject) .ThenInclude(boc => boc.BusObjectComponents) .ThenInclude(bc => bc.BusComp) .FirstOrDefault(i => i.Id == crumb.ViewId)); }); // Добавление представления, на которое перешли по хлебным крошкам в представления, контекст которых необходимо восстановить viewsToResore.Add(context.Views .Include(bo => bo.BusObject) .ThenInclude(boc => boc.BusObjectComponents) .ThenInclude(bc => bc.BusComp) .FirstOrDefault(n => n.Name == model.NewViewName)); // При переходе не другой экран необходимо очистить информацию о выбранных и отображаемых записях if (screenInfo.Screen.Name != model.NewScreenName) { ComponentsRecordsInfo.Dispose(); } // Восстановление контекста ComponentsRecordsInfo.RestoreContext(viewsToResore); screenInfo.Initialize(model.NewScreenName, model.NewViewName, context); break; } screenInfo.ActionType = (ActionType)Enum.Parse(typeof(ActionType), model.Action); screenInfoUI.Initialize(screenInfo, context); return(Ok(screenInfoUI.Serialize())); }