From 4da2e73f00253e102d7d9db8d857716dc4f0ce1d Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Mon, 17 May 2010 14:38:26 -0700 Subject: [PATCH 1/2] A round of markup refactoring for the feature managment UI - now the ascx is a mess...helpers needed --HG-- branch : dev --- .../Extensions/StringExtensionsTests.cs | 20 +++++ .../Controllers/AdminController.cs | 18 ++--- .../Orchard.Modules/Orchard.Modules.csproj | 3 - .../Modules/Orchard.Modules/Routes.cs | 75 ------------------- .../Routing/FeatureNameConstraint.cs | 28 ------- .../Routing/ModuleNameConstraint.cs | 27 ------- .../Orchard.Modules/Views/Admin/Features.ascx | 64 +++++++++------- .../Utility/Extensions/StringExtensions.cs | 16 ++-- 8 files changed, 76 insertions(+), 175 deletions(-) delete mode 100644 src/Orchard.Web/Modules/Orchard.Modules/Routes.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Modules/Routing/FeatureNameConstraint.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Modules/Routing/ModuleNameConstraint.cs diff --git a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs index 3240ab717..9266e08b6 100644 --- a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs +++ b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs @@ -4,6 +4,26 @@ using Orchard.Utility.Extensions; namespace Orchard.Tests.Utility.Extensions { [TestFixture] public class StringExtensionsTests { + [Test] + public void HtmlClassify_ValidSimpleClassNameReturnsSame() { + const string toClassify = "some-class"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("some-class")); + } + [Test] + public void HtmlClassify_SimpleStringReturnsSimpleClassName() { + const string toClassify = "this is something"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("this-is-something")); + } + [Test] + public void HtmlClassify_ValidComplexClassNameReturnsSimpleClassName() { + const string toClassify = @"some-class\&some.other.class"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("some-class-some-other-class")); + } + [Test] + public void HtmlClassify_CompletelyInvalidClassNameReturnsEmptyString() { + const string toClassify = @"0_1234_12"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("")); + } [Test] public void OrDefault_ReturnsDefaultForNull() { const string s = null; diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index f810492d4..3a577894b 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -28,11 +28,11 @@ namespace Orchard.Modules.Controllers { return View(new ModulesIndexViewModel {Modules = modules}); } - public ActionResult Edit(string moduleName) { + public ActionResult Edit(string id) { if (!Services.Authorizer.Authorize(Permissions.ManageModules, T("Not allowed to edit module"))) return new HttpUnauthorizedResult(); - var module = _moduleService.GetModuleByName(moduleName); + var module = _moduleService.GetModuleByName(id); if (module == null) return new NotFoundResult(); @@ -51,28 +51,28 @@ namespace Orchard.Modules.Controllers { } [ValidateAntiForgeryTokenOrchard] - public ActionResult Enable(string featureName) { + public ActionResult Enable(string id) { if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to manage features"))) return new HttpUnauthorizedResult(); - if (string.IsNullOrEmpty(featureName)) + if (string.IsNullOrEmpty(id)) return new NotFoundResult(); - _moduleService.EnableFeatures(new [] {featureName}); - Services.Notifier.Information(T("{0} was enabled", featureName)); + _moduleService.EnableFeatures(new [] {id}); + Services.Notifier.Information(T("{0} was enabled", id)); return RedirectToAction("Features"); } [ValidateAntiForgeryTokenOrchard] - public ActionResult Disable(string featureName) { + public ActionResult Disable(string id) { if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to manage features"))) return new HttpUnauthorizedResult(); - if (string.IsNullOrEmpty(featureName)) + if (string.IsNullOrEmpty(id)) return new NotFoundResult(); - _moduleService.DisableFeatures(new[] { featureName }); + _moduleService.DisableFeatures(new[] { id }); //Services.Notifier.Information(T("{0} was disabled", featureName)); return RedirectToAction("Features"); diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index 15dc4894a..31de20c52 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -65,13 +65,10 @@ - - - diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Routes.cs b/src/Orchard.Web/Modules/Orchard.Modules/Routes.cs deleted file mode 100644 index aaccb5679..000000000 --- a/src/Orchard.Web/Modules/Orchard.Modules/Routes.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Collections.Generic; -using System.Web.Mvc; -using System.Web.Routing; -using Orchard.Modules.Routing; -using Orchard.Mvc.Routes; - -namespace Orchard.Modules { - public class Routes : IRouteProvider { - private readonly IModuleNameConstraint _moduleNameConstraint; - private readonly IFeatureNameConstraint _featureNameConstraint; - - public Routes(IModuleNameConstraint moduleNameConstraint, IFeatureNameConstraint featureNameConstraint) { - _moduleNameConstraint = moduleNameConstraint; - _featureNameConstraint = featureNameConstraint; - } - - public IEnumerable GetRoutes() { - return new[] { - new RouteDescriptor { - Route = new Route( - "Admin/Modules/Edit/{moduleName}", - new RouteValueDictionary { - {"area", "Orchard.Modules"}, - {"controller", "Admin"}, - {"action", "Edit"} - }, - new RouteValueDictionary { - {"moduleName", _moduleNameConstraint} - }, - new RouteValueDictionary { - {"area", "Orchard.Modules"} - }, - new MvcRouteHandler()) - }, - new RouteDescriptor { - Route = new Route( - "Admin/Modules/Enable/{featureName}", - new RouteValueDictionary { - {"area", "Orchard.Modules"}, - {"controller", "Admin"}, - {"action", "Enable"} - }, - new RouteValueDictionary { - {"featureName", _featureNameConstraint} - }, - new RouteValueDictionary { - {"area", "Orchard.Modules"} - }, - new MvcRouteHandler()) - }, - new RouteDescriptor { - Route = new Route( - "Admin/Modules/Disable/{featureName}", - new RouteValueDictionary { - {"area", "Orchard.Modules"}, - {"controller", "Admin"}, - {"action", "Disable"} - }, - new RouteValueDictionary { - {"featureName", _featureNameConstraint} - }, - new RouteValueDictionary { - {"area", "Orchard.Modules"} - }, - new MvcRouteHandler()) - } - }; - } - - public void GetRoutes(ICollection routes) { - foreach (var routeDescriptor in GetRoutes()) - routes.Add(routeDescriptor); - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Routing/FeatureNameConstraint.cs b/src/Orchard.Web/Modules/Orchard.Modules/Routing/FeatureNameConstraint.cs deleted file mode 100644 index bee40d3c1..000000000 --- a/src/Orchard.Web/Modules/Orchard.Modules/Routing/FeatureNameConstraint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Linq; -using System.Web; -using System.Web.Routing; - -namespace Orchard.Modules.Routing { - public interface IFeatureNameConstraint : IRouteConstraint, ISingletonDependency { - } - - public class FeatureNameConstraint : IFeatureNameConstraint { - private readonly IModuleService _moduleService; - - public FeatureNameConstraint(IModuleService moduleService) { - _moduleService = moduleService; - } - - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { - if (routeDirection == RouteDirection.UrlGeneration) - return true; - - object value; - if (values.TryGetValue(parameterName, out value)) - return _moduleService.GetModuleByFeatureName(Convert.ToString(value)) != null; - - return false; - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Routing/ModuleNameConstraint.cs b/src/Orchard.Web/Modules/Orchard.Modules/Routing/ModuleNameConstraint.cs deleted file mode 100644 index 0b537b9e1..000000000 --- a/src/Orchard.Web/Modules/Orchard.Modules/Routing/ModuleNameConstraint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Web; -using System.Web.Routing; - -namespace Orchard.Modules.Routing { - public interface IModuleNameConstraint : IRouteConstraint, ISingletonDependency { - } - - public class ModuleNameConstraint : IModuleNameConstraint { - private readonly IModuleService _moduleService; - - public ModuleNameConstraint(IModuleService moduleService) { - _moduleService = moduleService; - } - - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { - if (routeDirection == RouteDirection.UrlGeneration) - return true; - - object value; - if (values.TryGetValue(parameterName, out value)) - return _moduleService.GetModuleByName(Convert.ToString(value)) != null; - - return false; - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx index a49952b68..a0ca5d2d0 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx +++ b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx @@ -1,45 +1,55 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Modules.ViewModels"%> +<%@ Import Namespace="Orchard.Utility.Extensions" %>

<%=Html.TitleForPage(T("Manage Features").ToString()) %>

<% if (Model.Features.Count() > 0) { %> -
    <% +
      <% var featureGroups = Model.Features.OrderBy(f => f.Descriptor.Category).GroupBy(f => f.Descriptor.Category); - foreach (var featureGroup in featureGroups) { %> - > -

      <%=Html.Encode(featureGroup.First().Descriptor.Category ?? T("Uncategorized")) %>

      + foreach (var featureGroup in featureGroups) { + var categoryName = featureGroup.First().Descriptor.Category ?? T("Uncategorized"); + var categoryClassName = string.Format("category {0}", Html.Encode(categoryName.ToString().HtmlClassify())); + if (featureGroup == featureGroups.First()) + categoryClassName += " first"; + if (featureGroup == featureGroups.Last()) + categoryClassName += " last"; %> +
    • +

      <%=Html.Encode(categoryName) %>

        <% var features = featureGroup.OrderBy(f => f.Descriptor.Name); - foreach (var feature in features) {%> - id="<%=Html.Encode(feature.Descriptor.Name) %>"> + foreach (var feature in features) { + //hmmm...I feel like I've done this before... + var featureId = string.Format("{0} feature", feature.Descriptor.Name).HtmlClassify(); + var featureClassName = string.Format("feature {0}", feature.IsEnabled ? "enabled" : "disabled"); + if (feature == features.First()) + featureClassName += " first"; + if (feature == features.Last()) + featureClassName += " last"; %> +
      • -

        <%=Html.Encode(feature.Descriptor.Name) %>

        -
          -
        • <% - //enabled or not - if (feature.IsEnabled) { %> - " alt="<%=_Encoded("Enabled") %>" title="<%=_Encoded("This feature is currently enabled") %>" /><%=_Encoded("Enabled") %><% - } - else { %> - " alt="<%=_Encoded("Disabled") %>" title="<%=_Encoded("This feature is currently disabled") %>" /><%=_Encoded("Disabled")%><% - } %> -
        • <% - //dependencies - if (feature.Descriptor.Dependencies != null && feature.Descriptor.Dependencies.Count() > 0) { %> -
        •  | <%=T("Depends on: {0}", string.Join(", ", feature.Descriptor.Dependencies.Select(s => Html.Link(Html.Encode(s), string.Format("{0}#{1}", Url.Action("features", new { area = "Orchard.Modules" }), Html.Encode(s)))).OrderBy(s => s).ToArray())) %>
        • <% - } %> -
        +

        <%=Html.Encode(feature.Descriptor.Name) %>

        <% + if (feature.Descriptor.Dependencies != null) { %> +
        +

        <%=_Encoded("Depends on:")%>

        + <%=Html.UnorderedList( + feature.Descriptor.Dependencies.OrderBy(s => s), + (s, i) => Html.Link(s, string.Format("#{0}", string.Format("{0} feature", s).HtmlClassify())), + "", + "dependency", + "") %> +
        <% + } %>
        -