/// <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)); }
/// <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); }
/// <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);
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); }