示例#1
0
        /// <summary>
        /// Возвращает цепочку сущностей для хлебных крошек
        /// </summary>
        /// <param name="entityTypeCode">код типа сущности</param>
        /// <param name="entityId">идентификатор сущности</param>
        /// <param name="parentEntityId">идентификатор родительской сущности</param>
        /// <param name="actionCode"></param>
        /// <returns>цепочка сущностей</returns>
        public static IEnumerable <EntityInfo> GetBreadCrumbsList(string entityTypeCode, long entityId, long?parentEntityId, string actionCode)
        {
            if (!string.IsNullOrWhiteSpace(actionCode))
            {
                if (actionCode.Equals(ActionCode.ChildContentPermissions, StringComparison.InvariantCultureIgnoreCase))
                {
                    entityTypeCode = EntityTypeCode.Content;
                }
                else if (actionCode.Equals(ActionCode.ChildArticlePermissions, StringComparison.InvariantCultureIgnoreCase))
                {
                    entityTypeCode = EntityTypeCode.Article;
                }
            }

            return(EntityObjectRepository.GetParentsChain(entityTypeCode, entityId, parentEntityId));
        }
示例#2
0
        /// <summary>
        /// Возвращает поддерево меню от корня до ближайшего существующего нода для параметров
        /// </summary>
        /// <param name="entityTypeCode"></param>
        /// <param name="entityId"></param>
        /// <param name="parentEntityId"></param>
        /// <returns></returns>
        public static TreeNode GetSubTreeToEntity(string entityTypeCode, long entityId, long parentEntityId)
        {
            // положить в стек все ВОЗМОЖНЫЕ (Folder и Not Folder) tree menu nodes от корня до Entity
            var stack = new Stack <TreeNode>();

            EntityObjectRepository.GetParentsChain(entityTypeCode, entityId, parentEntityId).ToList()
            .ForEach(e =>
            {
                stack.Push(new TreeNode
                {
                    Code     = e.Code,
                    Id       = Converter.ToInt32(e.Id),
                    ParentId = Converter.ToInt32(e.ParentId),
                    IsFolder = false
                });

                if (StringComparer.InvariantCultureIgnoreCase.Equals(e.Code, EntityTypeCode.Content))
                {
                    var group = ContentRepository.GetContentGroup(Convert.ToInt32(e.Id));
                    if (group != null)
                    {
                        stack.Push(new TreeNode
                        {
                            Code          = group.EntityTypeCode,
                            Id            = Converter.ToInt32(group.Id),
                            ParentId      = Converter.ToInt32(group.ParentEntityId),
                            GroupItemCode = GroupItemCodes.ContentGroup,
                            IsGroup       = true
                        });
                    }
                }

                stack.Push(new TreeNode
                {
                    Code     = e.Code,
                    Id       = Converter.ToInt32(e.ParentId),
                    IsFolder = true
                });
            });

            // получить реальные nodes
            var nodeQueue = new Queue <TreeNode>(stack.Count);
            var nodes     = TreeMenuRepository.GetChildNodeList(null, null, false, false, null);

            while (stack.Count > 0)
            {
                var      paramNode = stack.Pop();
                TreeNode currentNode;
                if (paramNode.IsFolder)
                {
                    currentNode = nodes.SingleOrDefault(n => n.IsFolder && n.Code == paramNode.Code && n.ParentId == paramNode.Id);
                }
                else if (paramNode.IsGroup)
                {
                    currentNode = nodes.SingleOrDefault(n => n.IsGroup && n.Code == paramNode.Code && n.Id == paramNode.Id);
                }
                else
                {
                    currentNode = nodes.SingleOrDefault(n => !(n.IsFolder || n.IsGroup) && n.Code == paramNode.Code && n.Id == paramNode.Id);
                }
                if (currentNode != null)
                {
                    nodes = TreeMenuRepository.GetChildNodeList(paramNode.Code, paramNode.Id, paramNode.IsFolder, paramNode.IsGroup, paramNode.GroupItemCode);
                    currentNode.ChildNodes  = nodes;
                    currentNode.HasChildren = nodes.Any();
                    nodeQueue.Enqueue(currentNode);
                }
            }

            return(nodeQueue.Any() ? nodeQueue.Dequeue() : null);
        }
示例#3
0
 /// <summary>
 /// Возвращает информацию о текущей сущности и всех предках
 /// </summary>
 /// <param name="entityTypeCode">код типа сущности</param>
 /// <param name="entityId">идентификатор сущности</param>
 /// <param name="parentEntityId">идентификатор родительской сущности</param>
 /// <returns>информация о текущей и родительской сущности</returns>
 public static IEnumerable <EntityInfo> GetParentsChain(string entityTypeCode, long entityId, long?parentEntityId) => EntityObjectRepository.GetParentsChain(entityTypeCode, entityId, parentEntityId);
示例#4
0
        public static IEnumerable <BackendActionStatus> ResolveStatus(string entityTypeCode, int entityId, int parentEntityId, BackendActionStatus[] statuses)
        {
            var testEntityTypeCode = entityTypeCode != EntityTypeCode.VirtualArticle ? entityTypeCode : EntityTypeCode.VirtualContent;
            var testEntityId       = entityTypeCode != EntityTypeCode.VirtualArticle ? entityId : parentEntityId;

            // Получить родительский контент и сайт
            IEnumerable <EntityInfo> bindableParentEntities =
                EntityObjectRepository.GetParentsChain(testEntityTypeCode, testEntityId)
                .Where(ei =>
                       ei.Id > 0 &&
                       (
                           ei.Code.Equals(EntityTypeCode.Site, StringComparison.InvariantCultureIgnoreCase) ||
                           ei.Code.Equals(EntityTypeCode.Content, StringComparison.InvariantCultureIgnoreCase) ||
                           ei.Code.Equals(EntityTypeCode.VirtualContent, StringComparison.InvariantCultureIgnoreCase)
                       )
                       )
                .ToArray();

            var customActions = CustomActionRepository.GetListByCodes(statuses.Select(s => s.Code).ToArray());

            // Если есть как минимум сайт - то проверяем
            if (customActions.Any())
            {
                if (bindableParentEntities.Any())
                {
                    var parentSiteInfo    = bindableParentEntities.FirstOrDefault(ei => ei.Code.Equals(EntityTypeCode.Site, StringComparison.InvariantCultureIgnoreCase));
                    var parentContentInfo = bindableParentEntities.FirstOrDefault(ei => ei.Code.Equals(EntityTypeCode.Content, StringComparison.InvariantCultureIgnoreCase) ||
                                                                                  ei.Code.Equals(EntityTypeCode.VirtualContent, StringComparison.InvariantCultureIgnoreCase)
                                                                                  );

                    foreach (var ca in customActions)
                    {
                        var status = statuses.Single(s => s.Code.Equals(ca.Action.Code, StringComparison.InvariantCultureIgnoreCase));
                        if (status.Visible)
                        {
                            var visibleBySite    = false;
                            var visibleByContent = false;

                            if (ca.Sites.Any(s => s.Id == parentSiteInfo.Id)) // сайт выбран для текущего Custom Action
                            {
                                visibleBySite = ca.SiteExcluded;
                            }
                            else
                            {
                                visibleBySite = !ca.SiteExcluded;
                            }

                            if (visibleBySite)
                            {
                                if (parentContentInfo != null)
                                {
                                    if (ca.Contents.Any(c => c.Id == parentContentInfo.Id)) // контент выбран для текущего Custom Action
                                    {
                                        visibleByContent = ca.ContentExcluded;
                                    }

                                    //else if (!ca.Contents.Any())
                                    //    visibleByContent = true;
                                    else
                                    {
                                        visibleByContent = !ca.ContentExcluded;
                                    }
                                }
                                else
                                {
                                    visibleByContent = visibleBySite;
                                }
                            }

                            // Побеждает всегда False если он есть
                            status.Visible = visibleBySite && visibleBySite == visibleByContent;

                            if (status.Visible && ca.Action.ExcludeCodes != null)
                            {
                                foreach (var code in ca.Action.ExcludeCodes)
                                {
                                    var excludedStatus = statuses.SingleOrDefault(s => s.Code.Equals(code, StringComparison.InvariantCultureIgnoreCase));
                                    if (excludedStatus != null)
                                    {
                                        excludedStatus.Visible = false;
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    foreach (var ca in customActions)
                    {
                        var status = statuses.Single(s => s.Code.Equals(ca.Action.Code, StringComparison.InvariantCultureIgnoreCase));
                        status.Visible = false;
                    }
                }
            }

            return(statuses);
        }