From 2d38938d866d93d23ea19dc495e31693013934fe Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 30 Jul 2013 14:23:39 +1000 Subject: [PATCH] Added native events to base tree class so they will all have them. --- .../Trees/ContentTreeController.cs | 30 ------ .../Trees/ContentTreeControllerBase.cs | 37 +++++++ src/Umbraco.Web/Trees/TreeApiController.cs | 102 +++++++++++------- .../Trees/TreeNodeRenderingEventArgs.cs | 15 +++ .../Trees/TreeNodesRenderingEventArgs.cs | 15 +++ .../Trees/TreeRenderingEventArgs.cs | 15 +++ src/Umbraco.Web/Umbraco.Web.csproj | 4 + 7 files changed, 149 insertions(+), 69 deletions(-) create mode 100644 src/Umbraco.Web/Trees/ContentTreeControllerBase.cs create mode 100644 src/Umbraco.Web/Trees/TreeNodeRenderingEventArgs.cs create mode 100644 src/Umbraco.Web/Trees/TreeNodesRenderingEventArgs.cs create mode 100644 src/Umbraco.Web/Trees/TreeRenderingEventArgs.cs diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs index a1fbdabaeb..5869d54da9 100644 --- a/src/Umbraco.Web/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTreeController.cs @@ -13,36 +13,6 @@ using umbraco.interfaces; namespace Umbraco.Web.Trees { - public abstract class ContentTreeControllerBase : TreeApiController - { - /// - /// Based on the allowed actions, this will filter the ones that the current user is allowed - /// - /// - /// - /// - protected MenuItemCollection GetUserAllowedMenuItems(IEnumerable allMenuItems, IEnumerable userAllowedMenuItems) - { - var userAllowedActions = userAllowedMenuItems.Where(x => x.Action != null).Select(x => x.Action).ToArray(); - return new MenuItemCollection(allMenuItems.Where( - a => (a.Action == null - || a.Action.CanBePermissionAssigned == false - || (a.Action.CanBePermissionAssigned && userAllowedActions.Contains(a.Action))))); - } - - internal MenuItemCollection GetUserMenuItemsForNode(UmbracoEntity dd) - { - var actions = global::umbraco.BusinessLogic.Actions.Action.FromString(UmbracoUser.GetPermissions(dd.Path)); - - // A user is allowed to delete their own stuff - if (dd.CreatorId == UmbracoUser.Id && actions.Contains(ActionDelete.Instance) == false) - actions.Add(ActionDelete.Instance); - - return new MenuItemCollection(actions.Select(x => new MenuItem(x))); - } - - } - [Tree(Constants.Applications.Content, Constants.Trees.Content, "Content")] public class ContentTreeController : ContentTreeControllerBase { diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs new file mode 100644 index 0000000000..3ec11f2bb0 --- /dev/null +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Models; +using umbraco.BusinessLogic.Actions; + +namespace Umbraco.Web.Trees +{ + public abstract class ContentTreeControllerBase : TreeApiController + { + /// + /// Based on the allowed actions, this will filter the ones that the current user is allowed + /// + /// + /// + /// + protected MenuItemCollection GetUserAllowedMenuItems(IEnumerable allMenuItems, IEnumerable userAllowedMenuItems) + { + var userAllowedActions = userAllowedMenuItems.Where(x => x.Action != null).Select(x => x.Action).ToArray(); + return new MenuItemCollection(allMenuItems.Where( + a => (a.Action == null + || a.Action.CanBePermissionAssigned == false + || (a.Action.CanBePermissionAssigned && userAllowedActions.Contains(a.Action))))); + } + + internal MenuItemCollection GetUserMenuItemsForNode(UmbracoEntity dd) + { + var actions = global::umbraco.BusinessLogic.Actions.Action.FromString(UmbracoUser.GetPermissions(dd.Path)); + + // A user is allowed to delete their own stuff + if (dd.CreatorId == UmbracoUser.Id && actions.Contains(ActionDelete.Instance) == false) + actions.Add(ActionDelete.Instance); + + return new MenuItemCollection(actions.Select(x => new MenuItem(x))); + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/TreeApiController.cs b/src/Umbraco.Web/Trees/TreeApiController.cs index e495b6ae08..4d2cf550dc 100644 --- a/src/Umbraco.Web/Trees/TreeApiController.cs +++ b/src/Umbraco.Web/Trees/TreeApiController.cs @@ -26,20 +26,20 @@ namespace Umbraco.Web.Trees } protected TreeApiController() - { + { //Locate the tree attribute var treeAttributes = GetType() - .GetCustomAttributes(typeof (TreeAttribute), false) + .GetCustomAttributes(typeof(TreeAttribute), false) .OfType() .ToArray(); - + if (treeAttributes.Any() == false) { throw new InvalidOperationException("The Tree controller is missing the " + typeof(TreeAttribute).FullName + " attribute"); } //assign the properties of this object to those of the metadata attribute - _attribute = treeAttributes.First(); + _attribute = treeAttributes.First(); } /// @@ -62,7 +62,7 @@ namespace Umbraco.Web.Trees /// /// protected abstract MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings); - + /// /// The name to display on the root node /// @@ -80,7 +80,22 @@ namespace Umbraco.Web.Trees public TreeNode GetRootNode(FormDataCollection queryStrings) { if (queryStrings == null) queryStrings = new FormDataCollection(""); - return CreateRootNode(queryStrings); + var node = CreateRootNode(queryStrings); + + //add the tree type to the root + node.AdditionalData.Add("treeType", GetType().FullName); + + AddQueryStringsToAdditionalData(node, queryStrings); + + //check if the tree is searchable and add that to the meta data as well + if (this is ISearchableTree) + { + node.AdditionalData.Add("searchable", "true"); + } + + OnRootNodeRendering(this, new TreeNodeRenderingEventArgs(node, queryStrings)); + + return node; } /// @@ -99,7 +114,17 @@ namespace Umbraco.Web.Trees public TreeNodeCollection GetNodes(string id, FormDataCollection queryStrings) { if (queryStrings == null) queryStrings = new FormDataCollection(""); - return GetTreeData(id, queryStrings); + var nodes = GetTreeData(id, queryStrings); + + foreach (var node in nodes) + { + AddQueryStringsToAdditionalData(node, queryStrings); + } + + //raise the event + OnTreeNodesRendering(this, new TreeNodesRenderingEventArgs(nodes, queryStrings)); + + return nodes; } /// @@ -125,7 +150,7 @@ namespace Umbraco.Web.Trees var getChildNodesUrl = Url.GetTreeUrl( GetType(), - rootNodeAsString, + rootNodeAsString, queryStrings); var getMenuUrl = Url.GetMenuUrl( @@ -137,7 +162,7 @@ namespace Umbraco.Web.Trees //var node = new TreeNode(RootNodeId, BackOfficeRequestContext.RegisteredComponents.MenuItems, jsonUrl) var node = new TreeNode( - rootNodeAsString, + rootNodeAsString, getChildNodesUrl, getMenuUrl) { @@ -153,22 +178,7 @@ namespace Umbraco.Web.Trees Title = RootNodeDisplayName }; - //add the tree type to the root - node.AdditionalData.Add("treeType", GetType().FullName); - - ////add the tree-root css class - //node.Style.AddCustom("tree-root"); - //node.AdditionalData.Add("id", node.HiveId.ToString()); - //node.AdditionalData.Add("title", node.Title); - - AddQueryStringsToAdditionalData(node, queryStrings); - - //check if the tree is searchable and add that to the meta data as well - if (this is ISearchableTree) - { - node.AdditionalData.Add("searchable", "true"); - } return node; } @@ -179,7 +189,7 @@ namespace Umbraco.Web.Trees /// /// /// - protected virtual void AddQueryStringsToAdditionalData(TreeNode node, FormDataCollection queryStrings) + protected void AddQueryStringsToAdditionalData(TreeNode node, FormDataCollection queryStrings) { // Add additional data, ensure treeId isn't added as we've already done that foreach (var q in queryStrings @@ -188,7 +198,7 @@ namespace Umbraco.Web.Trees node.AdditionalData.Add(q.Key, q.Value); } } - + #region Create TreeNode methods /// @@ -221,7 +231,7 @@ namespace Umbraco.Web.Trees var node = new TreeNode(id, jsonUrl, menuUrl) { Title = title, Icon = icon }; return node; } - + /// /// Helper method to create tree nodes /// @@ -234,7 +244,7 @@ namespace Umbraco.Web.Trees public TreeNode CreateTreeNode(string id, FormDataCollection queryStrings, string title, string icon, string routePath) { var jsonUrl = Url.GetTreeUrl(GetType(), id, queryStrings); - var menuUrl = Url.GetMenuUrl(GetType(), id, queryStrings); + var menuUrl = Url.GetMenuUrl(GetType(), id, queryStrings); var node = new TreeNode(id, jsonUrl, menuUrl) { Title = title, RoutePath = routePath, Icon = icon }; return node; } @@ -275,18 +285,32 @@ namespace Umbraco.Web.Trees #endregion - /// - /// The tree name based on the controller type so that everything is based on naming conventions - /// - public string TreeType + ///// + ///// The tree name based on the controller type so that everything is based on naming conventions + ///// + //public string TreeType + //{ + // get + // { + // var name = GetType().Name; + // return name.Substring(0, name.LastIndexOf("TreeController", StringComparison.Ordinal)); + // } + //} + + public static event EventHandler TreeNodesRendering; + + private static void OnTreeNodesRendering(TreeApiController instance, TreeNodesRenderingEventArgs e) { - get - { - var name = GetType().Name; - return name.Substring(0, name.LastIndexOf("TreeController", StringComparison.Ordinal)); - } + var handler = TreeNodesRendering; + if (handler != null) handler(instance, e); + } + + public static event EventHandler RootNodeRendering; + + private static void OnRootNodeRendering(TreeApiController instance, TreeNodeRenderingEventArgs e) + { + var handler = RootNodeRendering; + if (handler != null) handler(instance, e); } - - } } diff --git a/src/Umbraco.Web/Trees/TreeNodeRenderingEventArgs.cs b/src/Umbraco.Web/Trees/TreeNodeRenderingEventArgs.cs new file mode 100644 index 0000000000..f4da5b5724 --- /dev/null +++ b/src/Umbraco.Web/Trees/TreeNodeRenderingEventArgs.cs @@ -0,0 +1,15 @@ +using System.Net.Http.Formatting; + +namespace Umbraco.Web.Trees +{ + public class TreeNodeRenderingEventArgs : TreeRenderingEventArgs + { + public TreeNode Node { get; private set; } + + public TreeNodeRenderingEventArgs(TreeNode node, FormDataCollection queryStrings) + : base(queryStrings) + { + Node = node; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/TreeNodesRenderingEventArgs.cs b/src/Umbraco.Web/Trees/TreeNodesRenderingEventArgs.cs new file mode 100644 index 0000000000..d6c84a6236 --- /dev/null +++ b/src/Umbraco.Web/Trees/TreeNodesRenderingEventArgs.cs @@ -0,0 +1,15 @@ +using System.Net.Http.Formatting; + +namespace Umbraco.Web.Trees +{ + public class TreeNodesRenderingEventArgs : TreeRenderingEventArgs + { + public TreeNodeCollection Nodes { get; private set; } + + public TreeNodesRenderingEventArgs(TreeNodeCollection nodes, FormDataCollection queryStrings) + : base(queryStrings) + { + Nodes = nodes; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/TreeRenderingEventArgs.cs b/src/Umbraco.Web/Trees/TreeRenderingEventArgs.cs new file mode 100644 index 0000000000..9a853544af --- /dev/null +++ b/src/Umbraco.Web/Trees/TreeRenderingEventArgs.cs @@ -0,0 +1,15 @@ +using System; +using System.Net.Http.Formatting; + +namespace Umbraco.Web.Trees +{ + public class TreeRenderingEventArgs : EventArgs + { + public FormDataCollection QueryStrings { get; private set; } + + public TreeRenderingEventArgs(FormDataCollection queryStrings) + { + QueryStrings = queryStrings; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 08644b2413..929e9eeadd 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -344,6 +344,7 @@ + @@ -360,12 +361,15 @@ + + +