Adding INavigationFilter to alter the menu dynamically

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros 2012-05-22 17:48:19 -07:00
parent f1d3458afa
commit 43232e2c63
7 changed files with 36 additions and 17 deletions

View File

@ -18,7 +18,7 @@ namespace Orchard.Tests.UI.Navigation {
public class NavigationManagerTests {
[Test]
public void EmptyMenuIfNameDoesntMatch() {
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var menuItems = manager.BuildMenu("primary");
Assert.That(menuItems.Count(), Is.EqualTo(0));
@ -35,7 +35,7 @@ namespace Orchard.Tests.UI.Navigation {
[Test]
public void NavigationManagerShouldUseProvidersToBuildNamedMenu() {
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] {}, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var menuItems = manager.BuildMenu("admin");
Assert.That(menuItems.Count(), Is.EqualTo(2));
@ -47,7 +47,7 @@ namespace Orchard.Tests.UI.Navigation {
[Test]
public void NavigationManagerShouldCatchProviderErrors() {
var manager = new NavigationManager(new[] { new BrokenProvider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var manager = new NavigationManager(new[] { new BrokenProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var menuItems = manager.BuildMenu("admin");
Assert.That(menuItems.Count(), Is.EqualTo(0));
@ -55,7 +55,7 @@ namespace Orchard.Tests.UI.Navigation {
[Test]
public void NavigationManagerShouldMergeAndOrderNavigation() {
var manager = new NavigationManager(new INavigationProvider[] { new StubProvider(), new Stub2Provider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var manager = new NavigationManager(new INavigationProvider[] { new StubProvider(), new Stub2Provider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
var menuItems = manager.BuildMenu("admin");
Assert.That(menuItems.Count(), Is.EqualTo(3));

View File

@ -268,6 +268,7 @@
<Compile Include="Time\TimeZoneSelectorResult.cs" />
<Compile Include="UI\FlatPositionComparer.cs" />
<Compile Include="UI\Navigation\IMenuProvider.cs" />
<Compile Include="UI\Navigation\INavigationFilter.cs" />
<Compile Include="UI\Navigation\NavigationHelper.cs" />
<Compile Include="UI\Navigation\Pager.cs" />
<Compile Include="UI\Navigation\PagerParameters.cs" />

View File

@ -0,0 +1,7 @@
using System.Collections.Generic;
namespace Orchard.UI.Navigation {
public interface INavigationFilter : IDependency {
IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems);
}
}

View File

@ -34,7 +34,5 @@ namespace Orchard.UI.Navigation {
_classes = value;
}
}
public int MenuId { get; set; }
}
}

View File

@ -41,6 +41,11 @@ namespace Orchard.UI.Navigation {
return Add(caption, null, x => { }, classes);
}
public NavigationBuilder Remove(MenuItem item) {
Contained.Remove(item);
return this;
}
public NavigationBuilder AddImageSet(string imageSet) {
_imageSets.Add(imageSet);
return this;
@ -49,6 +54,7 @@ namespace Orchard.UI.Navigation {
public IEnumerable<MenuItem> Build() {
return (Contained ?? Enumerable.Empty<MenuItem>()).ToList();
}
public IEnumerable<string> BuildImageSets() {
return _imageSets.Distinct();
}

View File

@ -23,11 +23,6 @@ namespace Orchard.UI.Navigation {
return this;
}
public NavigationItemBuilder MenuId(int menuId) {
_item.MenuId = menuId;
return this;
}
public NavigationItemBuilder Url(string url) {
_item.Url = url;
return this;

View File

@ -7,24 +7,28 @@ using Orchard.ContentManagement;
using Orchard.Logging;
using Orchard.Security;
using Orchard.Security.Permissions;
using Orchard.UI.Admin;
namespace Orchard.UI.Navigation {
public class NavigationManager : INavigationManager {
private readonly IEnumerable<INavigationProvider> _navigationProviders;
private readonly IEnumerable<IMenuProvider> _menuProviders;
private readonly IAuthorizationService _authorizationService;
private readonly IEnumerable<INavigationFilter> _navigationFilters;
private readonly UrlHelper _urlHelper;
private readonly IOrchardServices _orchardServices;
public NavigationManager(
IEnumerable<INavigationProvider> navigationProviders,
IEnumerable<IMenuProvider> menuProviders,
IAuthorizationService authorizationService,
IAuthorizationService authorizationService,
IEnumerable<INavigationFilter> navigationFilters,
UrlHelper urlHelper,
IOrchardServices orchardServices) {
_navigationProviders = navigationProviders;
_menuProviders = menuProviders;
_authorizationService = authorizationService;
_navigationFilters = navigationFilters;
_urlHelper = urlHelper;
_orchardServices = orchardServices;
Logger = NullLogger.Instance;
@ -39,7 +43,7 @@ namespace Orchard.UI.Navigation {
public IEnumerable<MenuItem> BuildMenu(IContent menu) {
var sources = GetSources(menu);
return FinishMenu(Reduce(Arrange(Merge(sources))).ToArray());
return FinishMenu(Reduce(Arrange(Filter(Merge(sources)))).ToArray());
}
public IEnumerable<string> BuildImageSets(string menuName) {
@ -55,6 +59,15 @@ namespace Orchard.UI.Navigation {
return menuItems;
}
private IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems) {
IEnumerable<MenuItem> result = menuItems;
foreach(var filter in _navigationFilters) {
result = filter.Filter(result);
}
return result;
}
public string GetUrl(string menuItemUrl, RouteValueDictionary routeValueDictionary) {
var url = string.IsNullOrEmpty(menuItemUrl) && (routeValueDictionary == null || routeValueDictionary.Count == 0)
? "~/"
@ -82,8 +95,8 @@ namespace Orchard.UI.Navigation {
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
foreach (var item in items) {
if (hasDebugShowAllMenuItems ||
!item.Permissions.Any() ||
item.Permissions.Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, null))) {
AdminFilter.IsApplied(_urlHelper.RequestContext) ||
item.Permissions.Concat(new [] { Permission.Named("ViewContent") }).Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, item.Content))) {
yield return new MenuItem {
Items = Reduce(item.Items),
Permissions = item.Permissions,
@ -96,7 +109,6 @@ namespace Orchard.UI.Navigation {
Url = item.Url,
LinkToFirstChild = item.LinkToFirstChild,
Href = item.Href,
MenuId = item.MenuId,
Content = item.Content
};
}
@ -225,9 +237,9 @@ namespace Orchard.UI.Navigation {
Items = Merge(items.Select(x => x.Items)).ToArray(),
Position = SelectBestPositionValue(items.Select(x => x.Position)),
Permissions = items.SelectMany(x => x.Permissions).Distinct(),
MenuId = items.First().MenuId,
Content = items.First().Content
};
return joined;
}