protected ComponentsTreeItemModel GetTreeItemModel(
            SimplifiedComponent component,
            string[] expandedItems,
            DateTime from,
            DateTime to)
        {
            var eventRepository = CurrentAccountDbContext.GetEventRepository();
            var states          = eventRepository.GetTimelineStates(component.Id, EventCategory.ComponentExternalStatus, from, to);
            var okTime          = eventRepository.GetTimelineOkTime(states, from, to);
            var items           = this.GetTimelineItemsByStates(states, from, to);

            var result = new ComponentsTreeItemModel()
            {
                Id              = component.Id,
                ParentId        = component.ParentId,
                ComponentTypeId = component.ComponentTypeId,
                DisplayName     = component.DisplayName,
                SystemName      = component.SystemName,
                Path            = component.Path,
                From            = from,
                To              = to,
                OkTime          = okTime,
                Timeline        = new TimelineModel()
                {
                    Category = EventCategory.ComponentExternalStatus,
                    OwnerId  = component.Id,
                    DateFrom = from,
                    DateTo   = to,
                    Items    = items,
                    OkTime   = okTime
                }
            };

            // Изначально развёрнут только корень дерева
            var expanded = result.IsRoot;

            if (expandedItems.Contains(result.Id.ToString()))
            {
                expanded = true;
            }

            result.Expanded = expanded;

            // Если узел раскрыт, то загрузим содержимое
            if (result.Expanded)
            {
                if (result.Content == null)
                {
                    result.Content = GetTreeItemContentModel(component, expandedItems, from, to);
                }

                if (result.Content.Details == null)
                {
                    result.Content.Details = GetTreeItemDetailsModel(component, expandedItems, from, to);
                }
            }

            return(result);
        }
Пример #2
0
        protected ComponentsTreeItemModel GetTreeItemModel(
            List <MonitoringStatus> statuses, Guid?componentTypeId, string search,
            SimplifiedComponent component,
            DateTime now,
            string[] expandedItems)
        {
            var result = new ComponentsTreeItemModel()
            {
                Id              = component.Id,
                DisplayName     = component.DisplayName,
                SystemName      = component.SystemName,
                Status          = component.ExternalStatus.Status,
                StatusDuration  = component.ExternalStatus.GetDuration(now),
                IsRoot          = component.ComponentTypeId == SystemComponentTypes.Root.Id,
                IsFolder        = component.ComponentTypeId == SystemComponentTypes.Folder.Id,
                ParentId        = component.ParentId,
                ComponentTypeId = component.ComponentTypeId
            };

            // Изначально развёрнут только корень дерева
            var expanded = result.IsRoot;

            // Если заполнен хотя бы один фильтр, то нужно проверять всех детей
            var isFilterActive = (statuses != null && statuses.Count > 0) || componentTypeId.HasValue || !string.IsNullOrEmpty(search);

            if (isFilterActive)
            {
                var filtered = true;

                if (statuses != null && statuses.Count > 0)
                {
                    if (!statuses.Contains(result.Status))
                    {
                        filtered = false;
                    }
                }

                if (componentTypeId.HasValue)
                {
                    if (result.ComponentTypeId != componentTypeId.Value)
                    {
                        filtered = false;
                    }
                }

                if (!string.IsNullOrEmpty(search))
                {
                    if (!(
                            result.Id.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            result.SystemName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            result.DisplayName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0
                            ))
                    {
                        filtered = false;
                    }
                }

                result.Content = GetTreeItemContentModel(statuses, componentTypeId, search, component, now, expandedItems);
                filtered       = filtered || (result.Content.Childs.Length > 0);

                // Критерии поиска не выполняются ни у себя, ни у детей -> этот элемент не нужен
                if (!filtered)
                {
                    return(null);
                }

                // Раскрываем, если есть дети, подходящие под условия
                if (result.Content.Childs.Length > 0)
                {
                    expanded = true;
                }
            }

            if (expandedItems.Contains(result.Id.ToString()))
            {
                expanded = true;
            }

            result.Expanded = expanded;

            // Если узел раскрыт, то загрузим содержимое
            if (result.Expanded)
            {
                if (result.Content == null)
                {
                    result.Content = GetTreeItemContentModel(statuses, componentTypeId, search, component, now, expandedItems);
                }

                if (result.Content.Details == null)
                {
                    result.Content.Details = GetTreeItemDetailsModel(component, now, expandedItems);
                }
            }

            return(result);
        }