/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { return; //Get Current User var currentUser = User.GetCurrent(); //This will only run on the ultimatree & if the user is NOT admin if (sender.TreeAlias.ToLower() == "ultimatree" && !currentUser.IsAdmin()) { //setting node to remove var settingNode = e.Nodes.SingleOrDefault(x => x.Id.ToString() == "settings"); //Ensure we found the node if (settingNode != null) { //Remove the settings node from the collection e.Nodes.Remove(settingNode); } } //This will only run on the ultimatree if (sender.TreeAlias.ToLower() == "ultimatree") { } }
/// <summary> /// Here we can manipulate nodes of other trees /// </summary> void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { //TODO: Generate A/B testing related context menu items for the Cotnent nodes //ex below deletes some nodes //if (sender.TreeAlias == "content") //{ // e.Nodes.RemoveAll(t => t.Name.EndsWith("[VARIATION]")); //} }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { //Get Current User var currentUser = User.GetCurrent(); //This will only run on the analyticsTree & if the user is NOT admin if (sender.TreeAlias == "analyticsTree" && !currentUser.IsAdmin()) { //setting node to remove var settingNode = e.Nodes.SingleOrDefault(x => x.Id.ToString() == "settings"); //Ensure we found the node if (settingNode != null) { //Remove the settings node from the collection e.Nodes.Remove(settingNode); } } //This will only run on the analyticsTree if (sender.TreeAlias == "analyticsTree") { AnalyticsApiController gaApi = new AnalyticsApiController(); Profile profile = AnalyticsHelpers.GetProfile(); if (profile != null) { var ecommerceNode = e.Nodes.SingleOrDefault(x => x.Id.ToString() == "ecommerce"); if (ecommerceNode != null) { try { // check if profile has any ecommerce data for last 3 years StatsApiResult transactions = gaApi.GetTransactions(profile.Id, DateTime.Now.AddYears(-3), DateTime.Now); if (!transactions.ApiResult.Rows.Any()) { //Remove the ecommerce node from the collection //If no Rows returned from API - then remove the node from the tree e.Nodes.Remove(ecommerceNode); } } catch { //Remove the ecommerce node from the collection //If the API throws an ex then remove the node from the tree as well e.Nodes.Remove(ecommerceNode); } } } } }
/// <summary> /// Loops through the nodes and updates the icon to the one from the type service /// </summary> /// <param name="e">Event args</param> /// <param name="nodeIcons">Dictionary of node icons</param> /// <param name="nodeTypeAlias">The node type alias we are interested in</param> private static void UpdateNodeIcons(TreeNodesRenderingEventArgs e, Dictionary <int, string> nodeIcons, string nodeTypeAlias) { foreach (var node in e.Nodes) { if (node.NodeType == nodeTypeAlias) { if (int.TryParse(node.Id.ToString(), out var nodeId) && nodeId > 0) { node.Icon = nodeIcons[nodeId]; } } } }
private void FilterTreeNodes(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (!Features.HideCodeFirstEntityTypesInTrees) { return; } string alias; try { alias = sender.TreeAlias == null?e.QueryStrings.Single(x => x.Key.InvariantEquals("treeType")).Value : sender.TreeAlias; } catch (Exception ex) { throw new CodeFirstException("No valid legacy or new-style tree alias found for a rendering tree.", ex); } if (!Modules.IsFrozen) { throw new CodeFirstException("The module resolver is not frozen. Cannot filter tree nodes."); } lock (_treeFilterLock) { if (!_treeFilters.ContainsKey(alias)) { var list = new List <IEntityTreeFilter>(); _treeFilters.Add(alias, list); foreach (var module in Modules) { if (module is IEntityTreeFilter && (module as IEntityTreeFilter).IsFilter(alias)) { list.Add(module as IEntityTreeFilter); } } } } bool changesMade = false; foreach (var module in _treeFilters[alias]) { module.Filter(e.Nodes, out changesMade); } if (changesMade) { //TODO show toast somehow? - functionality due in 7.3.0 - http://issues.umbraco.org/issue/U4-5927 } }
void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { var db = sender.ApplicationContext.DatabaseContext.Database; if (sender.TreeAlias == "content") { foreach (var node in e.Nodes) { var query = new Sql().Select("*").From("lookwhoseditingnow").Where <Edit>(x => x.NodeId == (int)node.Id && x.UserId != sender.Security.CurrentUser.Id); if (db.Fetch <Edit>(query).Any()) { node.CssClasses.Add("look-whos-editing-too"); } } } else { db.Execute("DELETE FROM lookwhoseditingnow WHERE userid=@0", sender.Security.CurrentUser.Id); } }
void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == "vendr" && e.QueryStrings["nodeType"] == Vendr.Core.Constants.Entities.EntityTypes.Store) { var index = e.Nodes.Count; var mainRoute = "commerce/vendrreviews"; var storeId = e.QueryStrings["id"]; var id = Constants.Trees.Reviews.Id; var reviewsNode = sender.CreateTreeNode(id, storeId, e.QueryStrings, "Reviews", Constants.Trees.Reviews.Icon, false, $"{mainRoute}/review-list/{storeId}"); reviewsNode.Path = $"-1,{storeId},{id}"; reviewsNode.NodeType = Constants.Trees.Reviews.NodeType; reviewsNode.AdditionalData.Add("storeId", storeId); reviewsNode.AdditionalData.Add("tree", Vendr.Web.Constants.Trees.Stores.Alias); reviewsNode.AdditionalData.Add("application", Vendr.Web.Constants.Sections.Commerce); e.Nodes.Insert(index, reviewsNode); } }
void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == Vendr.Core.Constants.System.ProductAlias && e.QueryStrings["nodeType"] == Vendr.Core.Constants.Entities.EntityTypes.Store) { var mainRoute = Vendr.Umbraco.Constants.Sections.Commerce + "/" + Constants.System.ProductAlias; var storeId = e.QueryStrings["id"]; var id = Constants.Trees.Reviews.Id; var reviewsNode = sender.CreateTreeNode(id, storeId, e.QueryStrings, "Reviews", Constants.Trees.Reviews.Icon, false, $"{mainRoute}/review-list/{storeId}"); reviewsNode.Path = $"-1,{storeId},{id}"; reviewsNode.NodeType = Constants.Trees.Reviews.NodeType; reviewsNode.AdditionalData.Add("storeId", storeId); reviewsNode.AdditionalData.Add("tree", Vendr.Umbraco.Constants.Trees.Stores.Alias); reviewsNode.AdditionalData.Add("application", Vendr.Umbraco.Constants.Sections.Commerce); var optNodeIndex = e.Nodes.FindIndex(x => x.NodeType == "Options"); var index = optNodeIndex >= 0 ? optNodeIndex : e.Nodes.Count; e.Nodes.Insert(index, reviewsNode); } }
// Hijack the rendering of each content node to customize the icon shown. void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == Constants.Trees.Content) { var customIcons = _contentNodeIconsService.GetIcons(); foreach (TreeNode treeNode in e.Nodes) { int nodeId = Convert.ToInt32(treeNode.Id); if (nodeId <= 0) { continue; } var node = customIcons.Where(x => x.ContentId.Equals(nodeId)).FirstOrDefault(); if (node == null) { continue; } treeNode.Icon = $"{node.Icon} {node.IconColor}"; } } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (!(sender.TreeAlias == Umbraco.Core.Constants.Applications.Content)) { return; } var settings = _settingsService.GetActiveSettings(); foreach (TreeNode treeNode in e.Nodes) { int id = Convert.ToInt32(treeNode.Id); IPublishedContent node = null; if (id > 0) { node = sender.UmbracoContext.Content.GetById(id); } if (node != null) { AddClassesToNode(treeNode, node, settings); } } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (e?.Nodes != null && sender.TreeAlias == "content" && !sender.Security.CurrentUser.Groups.Any((g) => g.Name.ToLower().Equals("admin"))) { var rootId = WebConfigurationManager.AppSettings["nlapp-root-id"]; if (sender.Umbraco.Content(rootId) is IPublishedContent rootNode) { var childPages = rootNode.Children().ToList(); foreach (var page in childPages) { var node = e.Nodes.SingleOrDefault(n => n.Id.ToString() == page.Id.ToString() && n.ParentId.ToString() == "-1"); if (node != null) { e.Nodes.Remove(node); } } } } }
public static void RenderMediaStartNodes(int userId, TreeControllerBase sender, TreeNodesRenderingEventArgs e) { StartNodeCollection startNodes = StartNodeRepository.GetCachedStartNodesByUserId(userId, sender.ApplicationContext, sender.DatabaseContext); if (startNodes.Media == null) { return; } if (startNodes.Media.Any()) { // Remove default start nodes e.Nodes.Clear(); IEnumerable <IUmbracoEntity> startNodesEntities = sender.Services.EntityService.GetAll(Umbraco.Core.Models.UmbracoObjectTypes.Media, startNodes.Media); foreach (IUmbracoEntity startNodeEntity in startNodesEntities) { UmbracoEntity entity = (UmbracoEntity)startNodeEntity; bool isContainer = (entity.AdditionalData.ContainsKey("IsContainer") && entity.AdditionalData["IsContainer"].ToString() == "True"); TreeNode node = sender.CreateTreeNode( startNodeEntity.Id.ToInvariantString(), "-1", e.QueryStrings, startNodeEntity.Name, entity.ContentTypeIcon, entity.HasChildren && (isContainer == false) ); node.AdditionalData.Add("contentType", entity.ContentTypeAlias); if (isContainer) { node.SetContainerStyle(); node.AdditionalData.Add("isContainer", true); } // TODO: How should we order nodes? e.Nodes.Add(node); } } }
public static void RenderContentStartNodes(int userId, TreeControllerBase sender, TreeNodesRenderingEventArgs e) { StartNodeCollection startNodes = StartNodeRepository.GetCachedStartNodesByUserId(userId, sender.ApplicationContext, sender.DatabaseContext); if (startNodes.Content == null) { return; } if (startNodes.Content.Any()) { // Remove default start nodes e.Nodes.Clear(); IEnumerable <IUmbracoEntity> startNodesEntities = sender.Services.EntityService.GetAll(Umbraco.Core.Models.UmbracoObjectTypes.Document, startNodes.Content); // Feels like a lot of duct tape. A lot taken from: // https://github.com/umbraco/Umbraco-CMS/blob/5397f2c53acbdeb0805e1fe39fda938f571d295a/src/Umbraco.Web/Trees/ContentTreeController.cs#L75 foreach (IUmbracoEntity startNodeEntity in startNodesEntities) { UmbracoEntity entity = (UmbracoEntity)startNodeEntity; // Not as safe as the approach in core // https://github.com/umbraco/Umbraco-CMS/blob/5397f2c53acbdeb0805e1fe39fda938f571d295a/src/Umbraco.Core/Models/UmbracoEntityExtensions.cs#L34 bool isContainer = (entity.AdditionalData.ContainsKey("IsContainer") && entity.AdditionalData["IsContainer"].ToString() == "True"); TreeNode node = sender.CreateTreeNode( startNodeEntity.Id.ToInvariantString(), "-1", e.QueryStrings, startNodeEntity.Name, entity.ContentTypeIcon, entity.HasChildren && (isContainer == false) ); AddQueryStringsToAdditionalData(node, e.QueryStrings); if (e.QueryStrings.Get("isDialog") == "true") { node.RoutePath = "#"; } // TODO: How should we order nodes? e.Nodes.Add(node); } } }
private void TreeControllerBaseOnTreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { // this example will filter any content tree node whose node name starts with // 'Private', for any user that is of the type 'customUser' var ticket = new HttpContextWrapper(HttpContext.Current).GetUmbracoAuthTicket(); if (ticket != null) { // Get a list of trees/nodes for Merchello var backoffice = MerchelloConfiguration.Current.BackOffice .GetTrees() .Where(x => x.Visible) .ToDictionary(x => x.Id, x => x.ChildSettings.AllSettings().FirstOrDefault(s => s.Alias == "allowedUserGroupAliases")); // Get the users groups from the ticket var userData = new { Name = "", Username = "", Roles = new List <string>() }; var jsonResponse = JsonConvert.DeserializeAnonymousType(ticket.UserData, userData); var toRemove = new List <object>(); foreach (var eNode in e.Nodes) { var nodeId = eNode.Id.ToString(); if (!string.IsNullOrWhiteSpace(nodeId) && backoffice.ContainsKey(nodeId)) { var allowedUserGroups = backoffice[nodeId]; if (allowedUserGroups != null && !string.IsNullOrWhiteSpace(allowedUserGroups.Value)) { var allowedUserGroupList = allowedUserGroups.Value.Split(',') .Select(x => x.Trim()) .Where(x => !string.IsNullOrWhiteSpace(x)) .ToArray(); var isAllowedAccess = false; foreach (var role in jsonResponse.Roles) { foreach (var s in allowedUserGroupList) { if (s == role) { isAllowedAccess = true; goto CheckAccess; } } } CheckAccess: if (isAllowedAccess == false) { toRemove.Add(eNode.Id); } } } } if (toRemove.Any()) { e.Nodes.RemoveAll(x => toRemove.Contains(x.Id)); } } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (!VisualiseRules) { return; } switch (sender.TreeAlias) { case "content": foreach (var node in e.Nodes) { // if the current node is secured by a rule, find it and colour the node var id = int.Parse(node.Id.ToString()); // need IContent object to gain access to Path, node Path is always null :( //var page = ApplicationContext.Current.Services.ContentService.GetById(id); // get IPublishedContent from cache var page = UmbracoContext.Current.ContentCache.GetById(id); if (page == null) { break; } var path = page.Path.Split(new[] { ',' }).ToList(); var hasRule = RulesPages.Intersect(path); if (hasRule.Any()) { var ruleIndex = RulesPages.IndexOf(hasRule.First()); // if multiple rules overlap, take the first var activeRule = Rules[ruleIndex]; node.CssClasses.Add("keepout"); node.CssClasses.Add(activeRule.Colour); } // colour the actual rule node to indicate the rule assignment if (page.ContentType.Alias == "keepOutSecurityRule") { node.CssClasses.Add("keepout"); var colourJson = page.GetProperty("contentColour").DataValue.ToString(); node.CssClasses.Add("keepout-" + KeepOutHelper.Json.Deserialize <RuleColour>(colourJson).Label); } } break; } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { switch (sender.TreeAlias) { case Constants.Trees.DocumentTypes: UpdateNodeIcons(e, _contentTypeService.GetAll()?.ToDictionary(c => c.Id, c => c.Icon), Constants.Trees.DocumentTypes); break; case Constants.Trees.MemberTypes: UpdateNodeIcons(e, _memberTypeService.GetAll()?.ToDictionary(c => c.Id, c => c.Icon), Constants.Trees.MemberTypes); break; case Constants.Trees.MediaTypes: UpdateNodeIcons(e, _mediaTypeService.GetAll()?.ToDictionary(c => c.Id, c => c.Icon), Constants.Trees.MediaTypes); break; } }
/// <summary> /// Rules visualisation in umbraco backoffice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (KeepOutRulesFolderId == 0) { return; } if (!VisualiseRules) { return; } if (sender.TreeAlias != "content") { return; } using (var context = _factory.EnsureUmbracoContext()) { foreach (var node in e.Nodes) { var intCurrentNodeId = int.Parse(node.Id.ToString()); var page = context.UmbracoContext.Content.GetById(intCurrentNodeId); if (page == null) { continue; } // if the current node is secured by a rule (or is the rule itself), colour the node var isRule = page.ContentType.Alias == "keepOutSecurityRule"; var path = page.Path.Split(',').ToList(); var hasRule = RulesPages.Intersect(path).ToList(); if (!hasRule.Any() && !isRule) { continue; } node.CssClasses.Add("keepout"); if (isRule) { // node is the rule itself var ruleColour = page.GetProperty("coverageColour").GetValue() as ColorPickerValueConverter.PickedColor; node.CssClasses.Add($"keepout-{ruleColour.Label}"); node.CssClasses.Add("keepoutrule"); } else { // node is content that is covered by a rule var ruleNdx = RulesPages.IndexOf(hasRule.Last()); // if multiple rules overlap, last wins var activeRule = Rules[ruleNdx]; node.CssClasses.Add(activeRule.CoverageColour); } } } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == "content" && sender.UmbracoContext.Security.CurrentUser.Groups.Any(x => x.Name.InvariantEquals("Managers"))) { var junk = new List <Umbraco.Web.Models.Trees.TreeNode>(); foreach (var branch in e.Nodes) { var helper = Umbraco.Web.Composing.Current.UmbracoHelper; var node = helper.Content(branch.Id); if (node != null) { if (node.ContentType.Alias != "totalCodeHomePage" && node.ContentType.Alias != "totalCodeCategoriesPage" && node.ContentType.Alias != "totalCodeCategoryPage" && node.ContentType.Alias != "totalCodeGenericPage" && node.ContentType.Alias != "totalCodeArticlePage" && node.ContentType.Alias != "totalCodeArticlePage" && node.ContentType.Alias != "totalCodeTermsPage" && node.ContentType.Alias != "totalCodeAffiliatePage") { junk.Add(branch); } if (node.HasProperty("gameType")) { if (node.GetProperty("gameType").Value().ToString() != "Casino") { junk.Add(branch); } } } } foreach (var j in junk) { e.Nodes.Remove(j); } } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == "documentTypes") { var contentTypes = _contentTypeService.GetAll().ToDictionary(c => c.Id); foreach (var node in e.Nodes) { if (node.NodeType == "documentTypes") { if (int.TryParse(node.Id.ToString(), out var nodeId) && nodeId > 0) { var contentType = contentTypes[nodeId]; node.Icon = contentType.Icon; } } } } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (sender.TreeAlias == "form") { // If this is the 'Entries' node under a form, remove it if (e.Nodes.Count == 1 && e.Nodes[0].Name == "Entries") { e.Nodes.Clear(); } else { // Otherwise it's the node for a form. 'Entries' was to be its only child, // so set HasChildren to false to remove the arrow indicating that the tree can be expanded. foreach (var node in e.Nodes) { node.HasChildren = false; } } } }
private void TreeControllerBaseOnTreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs eventArgs) { if (eventArgs.QueryStrings.HasKey("relationEditor")) { var parentType = (UmbracoObjectTypes)Enum.Parse(typeof(UmbracoObjectTypes), eventArgs.QueryStrings.Get("parentType")); var parentAlias = eventArgs.QueryStrings.Get("parentTypeAlias"); var relationAlias = eventArgs.QueryStrings.Get("relationAlias"); var config = Configuration.Get(parentType, parentAlias); if (!config.Enabled) { return; } var relConfig = config.Get(relationAlias); if (!relConfig.Enabled) { return; } var childTypes = relConfig.EnabledChildTypes.Select(t => t.Alias).ToArray(); if (!childTypes.Any()) { return; } var relation = UmbracoContext.Current.Application.Services.RelationService.GetRelationTypeByAlias(relationAlias); var childObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.ChildObjectType); foreach (var node in eventArgs.Nodes) { var id = Convert.ToInt32(node.Id); var alias = EntityHelper.FindAlias(childObjectType, id); if (!alias.IsNullOrWhiteSpace() && !childTypes.Contains(alias, IgnoreCase)) { node.SetNotPublishedStyle(); node.AdditionalData.Add("relationDisallowed", "true"); } } } }
/// <summary> /// Checks the tree alias and node alias to see if we should update the icon /// Gets the types from the type services and calls the method to update the node icons /// </summary> /// <param name="sender">Tree controller base</param> /// <param name="e">Event args</param> private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { switch (sender.TreeAlias) { case "documentTypes": var contentTypeIcons = _contentTypeService.GetAll().ToDictionary(c => c.Id, c => c.Icon); UpdateNodeIcons(e, contentTypeIcons, "documentTypes"); break; case "memberTypes": var memberTypeIcons = _memberTypeService.GetAll().ToDictionary(c => c.Id, c => c.Icon); UpdateNodeIcons(e, memberTypeIcons, "memberTypes"); break; case "mediaTypes": var mediaTypeIcons = _mediaTypeService.GetAll().ToDictionary(c => c.Id, c => c.Icon); UpdateNodeIcons(e, mediaTypeIcons, "mediaTypes"); break; default: // don't change the icon break; } }
private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (e.Nodes.Count > 0 && (e.Nodes.First().ParentId != null && e.Nodes.First().ParentId.ToString() == "-1") && (sender.TreeAlias == "content" || sender.TreeAlias == "media") && sender.Security.CurrentUser.UserType.Alias != "admin" && ((e.QueryStrings.Get("isDialog") == "false" || e.QueryStrings.Get("usestartnodes") == "true") || (e.QueryStrings.Get("isDialog") == "true" && Settings.LimitPickersToStartNodes)) ) { if (sender.TreeAlias == "content" && sender.Security.CurrentUser.StartContentId == -1) { BackOfficeUtils.RenderContentStartNodes(sender.Security.CurrentUser.Id, sender, e); } else if (sender.TreeAlias == "media" && sender.Security.CurrentUser.StartMediaId == -1) { BackOfficeUtils.RenderMediaStartNodes(sender.Security.CurrentUser.Id, sender, e); } } }
private void ContentTreeController_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) { if (e.QueryStrings.Contains(new System.Collections.Generic.KeyValuePair <string, string>("application", "content")) && e.QueryStrings["isDialog"].Equals("false") && string.IsNullOrWhiteSpace(e.QueryStrings["id"]) == false && e.QueryStrings["id"] != "-1") { var content = sender.Services.ContentService.GetById(int.Parse(e.QueryStrings["id"])); for (var i = e.Nodes.Count - 1; i > -1; i--) { var treeNode = e.Nodes[i]; if (treeNode.AdditionalData.ContainsKey("contentType")) { if (content.IsInListView(treeNode.AdditionalData["contentType"].ToString())) { e.Nodes.RemoveAt(i); continue; } if (treeNode.HasChildren) { var node = sender.Services.ContentService.GetById(int.Parse(treeNode.Id.ToString())); treeNode.HasChildren = node.TreeChildren().Any(); } } } } }