diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 47d8fc3a0..88a49866a 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -44,44 +44,12 @@ namespace Orchard.Modules.Controllers { }); } - public ActionResult Features(FeaturesOptions options) { + public ActionResult Features() { if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to manage features"))) return new HttpUnauthorizedResult(); var features = _moduleService.GetAvailableFeatures(); - return View(new FeaturesViewModel {Features = features, Options = options}); - } - - [HttpPost, ActionName("Features")] - [FormValueRequired("submit.BulkEdit")] - public ActionResult FeaturesPOST(FeaturesOptions options, IList selection) { - if (selection != null && selection.Count > 0) - { - switch (options.BulkAction) - { - case FeaturesBulkAction.None: - break; - case FeaturesBulkAction.Enable: - if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to enable features"))) - return new HttpUnauthorizedResult(); - _moduleService.EnableFeatures(selection); - //todo: (heskew) need better messages - //todo: (heskew) hmmm...need a helper to comma-separate all but last, which would get the " and " treatment...all localized, of course - Services.Notifier.Information(T("{0} were enabled", string.Join(", ", selection.ToArray()))); - break; - case FeaturesBulkAction.Disable: - if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to disable features"))) - return new HttpUnauthorizedResult(); - _moduleService.DisableFeatures(selection); - //todo: (heskew) need better messages - Services.Notifier.Information(T("{0} were disabled", string.Join(", ", selection.ToArray()))); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - return RedirectToAction("Features"); + return View(new FeaturesViewModel {Features = features}); } [ValidateAntiForgeryTokenOrchard] @@ -107,7 +75,7 @@ namespace Orchard.Modules.Controllers { return new NotFoundResult(); _moduleService.DisableFeatures(new[] { featureName }); - Services.Notifier.Information(T("{0} was disabled", featureName)); + //Services.Notifier.Information(T("{0} was disabled", featureName)); return RedirectToAction("Features"); } diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs b/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs index e75b70d45..b396398a5 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs @@ -48,10 +48,11 @@ namespace Orchard.Modules.Services { } public IEnumerable GetAvailableFeatures() { - var enabledFeatures = _shellDescriptorManager.GetShellDescriptor().EnabledFeatures; + var enabledFeatures = _shellDescriptorManager.GetShellDescriptor().EnabledFeatures.ToList(); return GetInstalledModules() .SelectMany(m => _extensionManager.LoadFeatures(m.Features)) - .Select(f => AssembleModuleFromDescriptor(f, enabledFeatures.FirstOrDefault(sf => string.Equals(sf.Name, f.Descriptor.Name, StringComparison.OrdinalIgnoreCase)) != null)); + .Select(f => AssembleModuleFromDescriptor(f, enabledFeatures.FirstOrDefault(sf => string.Equals(sf.Name, f.Descriptor.Name, StringComparison.OrdinalIgnoreCase)) != null)) + .ToList(); } public IEnumerable GetAvailableFeaturesByModule(string moduleName) { @@ -69,9 +70,20 @@ namespace Orchard.Modules.Services { public void DisableFeatures(IEnumerable featureNames) { var shellDescriptor = _shellDescriptorManager.GetShellDescriptor(); - var enabledFeatures = shellDescriptor.EnabledFeatures.ToList(); - enabledFeatures.RemoveAll(f => featureNames.Contains(f.Name)); + var features = GetAvailableFeatures(); + + foreach (var featureName in featureNames) { + var feature = featureName; + var dependants = features.Where(f => f.IsEnabled && f.Descriptor.Dependencies != null && f.Descriptor.Dependencies.Contains(feature)); + + if (dependants.Count() == 0) { + enabledFeatures.RemoveAll(f => f.Name == feature); + } + else { + // list what else will be disabled with ok/cancel + } + } _shellDescriptorManager.UpdateShellDescriptor(shellDescriptor.SerialNumber, enabledFeatures, shellDescriptor.Parameters); } diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeaturesViewModel.cs b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeaturesViewModel.cs index 210ce308c..fc98504a8 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeaturesViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/FeaturesViewModel.cs @@ -4,16 +4,5 @@ using Orchard.Mvc.ViewModels; namespace Orchard.Modules.ViewModels { public class FeaturesViewModel : BaseViewModel { public IEnumerable Features { get; set; } - public FeaturesOptions Options { get; set; } - } - - public class FeaturesOptions { - public FeaturesBulkAction BulkAction { get; set; } - } - - public enum FeaturesBulkAction { - None, - Enable, - Disable } } \ 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 73ceb2487..a49952b68 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx +++ b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Features.ascx @@ -2,62 +2,53 @@ <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Modules.ViewModels"%>

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

- -<% if (Model.Features.Count() > 0) { - -using (Html.BeginFormAntiForgeryPost()) { %> - <%=Html.ValidationSummary()%> -
- - - " /> -
-
-
    <% - foreach (var featureGroup in Model.Features.OrderBy(f => f.Descriptor.Category).GroupBy(f => f.Descriptor.Category)) { %> - > -

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

    -
      <% - foreach (var feature in featureGroup.OrderBy(f => f.Descriptor.Name)) {%> - id="<%=Html.Encode(feature.Descriptor.Name) %>"> -
      -
      - -

      <%=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())) %>
      • <% - } %> -
      -
      - -
      - <% - } %> -
    +<% 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")) %>

      +
        <% + var features = featureGroup.OrderBy(f => f.Descriptor.Name); + foreach (var feature in features) {%> + id="<%=Html.Encode(feature.Descriptor.Name) %>"> +
        +
        +

        <%=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())) %>
        • <% + } %> +
        +
        + +
        <% } %> -
      <% - } %> -
<% + + <% + } %> +<% } %> \ No newline at end of file