From dc42c1ebb79ec439e3691176649778ffc4af2a26 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 2 Oct 2013 21:03:51 +1000 Subject: [PATCH] More work on streamlining package development for views and conventions. --- src/Umbraco.Web.UI.Client/src/routes.js | 8 ++- .../MyPackage/Trees/LegacyTestTree.cs | 7 +-- .../Trees/Menu/MenuItemCollection.cs | 2 +- src/Umbraco.Web/Trees/TreeController.cs | 61 +++++++++++++++++++ 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/routes.js b/src/Umbraco.Web.UI.Client/src/routes.js index bbda26b835..792fa23bd7 100644 --- a/src/Umbraco.Web.UI.Client/src/routes.js +++ b/src/Umbraco.Web.UI.Client/src/routes.js @@ -88,9 +88,15 @@ app.config(function ($routeProvider) { if (!rp.tree || !rp.method) { return "views/common/dashboard.html"; } - + + //TODO: Here we need to figure out if this route is for a package and if so then we need + // to change it's convention view path to: + // /App_Plugins/{mypackage}/umbraco/{treetype}/{method}.html + + //we don't need to put views into section folders since theoretically trees // could be moved among sections, we only need folders for specific trees. + return 'views/' + rp.tree + '/' + rp.method + '.html'; }, resolve: checkAuth(true) diff --git a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Trees/LegacyTestTree.cs b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Trees/LegacyTestTree.cs index 78a9085b7f..347c55503a 100644 --- a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Trees/LegacyTestTree.cs +++ b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Trees/LegacyTestTree.cs @@ -30,10 +30,9 @@ namespace Umbraco.Web.UI.App_Plugins.MyPackage.Trees } protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) - { - var menu = new MenuItemCollection("MyPackage"); - menu.AddMenuItem(new MenuItem("create", "Create")); - return menu; + { + MenuItems.AddMenuItem(new MenuItem("create", "Create")); + return MenuItems; } } diff --git a/src/Umbraco.Web/Trees/Menu/MenuItemCollection.cs b/src/Umbraco.Web/Trees/Menu/MenuItemCollection.cs index 4c99a255c7..5e4f305848 100644 --- a/src/Umbraco.Web/Trees/Menu/MenuItemCollection.cs +++ b/src/Umbraco.Web/Trees/Menu/MenuItemCollection.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.Trees.Menu { private readonly string _packageFolderName; private readonly List _menuItems; - + public MenuItemCollection() { _menuItems = new List(); diff --git a/src/Umbraco.Web/Trees/TreeController.cs b/src/Umbraco.Web/Trees/TreeController.cs index e6ea6abe75..e7df099c53 100644 --- a/src/Umbraco.Web/Trees/TreeController.cs +++ b/src/Umbraco.Web/Trees/TreeController.cs @@ -1,11 +1,14 @@ using System; +using System.Collections.Concurrent; using System.Globalization; using System.Linq; using System.Net.Http.Formatting; using Umbraco.Core; +using Umbraco.Web.Mvc; using Umbraco.Web.Trees.Menu; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; +using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Trees { @@ -15,6 +18,7 @@ namespace Umbraco.Web.Trees public abstract class TreeController : UmbracoAuthorizedApiController { private readonly TreeAttribute _attribute; + private readonly MenuItemCollection _menuItemCollection; /// /// Remove the xml formatter... only support JSON! @@ -41,6 +45,19 @@ namespace Umbraco.Web.Trees //assign the properties of this object to those of the metadata attribute _attribute = treeAttributes.First(); + + //Create the menu item collection with the area nem already specified + _menuItemCollection = Metadata.AreaName.IsNullOrWhiteSpace() + ? new MenuItemCollection() + : new MenuItemCollection(Metadata.AreaName); + } + + /// + /// Returns a menu item collection to be used to return the menu items from GetMenuForNode + /// + public MenuItemCollection MenuItems + { + get { return _menuItemCollection; } } /// @@ -300,6 +317,7 @@ namespace Umbraco.Web.Trees #endregion + #region Events public static event EventHandler TreeNodesRendering; private static void OnTreeNodesRendering(TreeController instance, TreeNodesRenderingEventArgs e) @@ -314,6 +332,49 @@ namespace Umbraco.Web.Trees { var handler = RootNodeRendering; if (handler != null) handler(instance, e); + } + #endregion + + #region Metadata + /// + /// stores the metadata about plugin controllers + /// + private static readonly ConcurrentDictionary MetadataStorage = new ConcurrentDictionary(); + + /// + /// Returns the metadata for this instance + /// + internal PluginControllerMetadata Metadata + { + get { return GetMetadata(this.GetType()); } } + + /// + /// Returns the metadata for a PluginController + /// + /// + /// + internal static PluginControllerMetadata GetMetadata(Type type) + { + + return MetadataStorage.GetOrAdd(type, type1 => + { + var attribute = type.GetCustomAttribute(false); + + var meta = new PluginControllerMetadata() + { + AreaName = attribute == null ? null : attribute.AreaName, + ControllerName = ControllerExtensions.GetControllerName(type), + ControllerNamespace = type.Namespace, + ControllerType = type + }; + + MetadataStorage.TryAdd(type, meta); + + return meta; + }); + + } + #endregion } }