From 4a4ac2ef0790ce87bbb2a5e91eb1eec2a1f77f12 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 26 Feb 2011 18:29:00 -0800 Subject: [PATCH] Changing MenuItem .Text to LocalizedString Updating comparer to avoid collapsing url and routevalue items together Flattened the navigation admin controller to avoid using MenuItem class in editor model HtmlEncode the text of the menu item to be displayed Updated TheMenu templates to use .text and .hinttext properties of LocalizedString --HG-- branch : dev --- .../UI/Navigation/MenuFilterTests.cs | 4 +- .../UI/Navigation/MenuItemComparerTests.cs | 39 ++++++++++--------- .../UI/Navigation/NavigationManagerTests.cs | 10 ++--- .../Navigation/Controllers/AdminController.cs | 28 +++++++------ .../Services/MainMenuNavigationProvider.cs | 7 ++-- .../Navigation/ViewModels/MenuItemEntry.cs | 5 ++- .../Core/Navigation/Views/Admin/Index.cshtml | 6 +-- .../Themes/TheAdmin/Views/LocalMenu.cshtml | 2 +- .../Themes/TheAdmin/Views/Menu.cshtml | 6 +-- src/Orchard/Localization/LocalizedString.cs | 5 ++- src/Orchard/UI/Navigation/MenuFilter.cs | 2 - src/Orchard/UI/Navigation/MenuItem.cs | 4 +- src/Orchard/UI/Navigation/MenuItemComparer.cs | 18 +++++++-- .../UI/Navigation/NavigationBuilder.cs | 3 +- .../UI/Navigation/NavigationItemBuilder.cs | 9 ++--- .../UI/Navigation/NavigationManager.cs | 4 +- 16 files changed, 80 insertions(+), 72 deletions(-) diff --git a/src/Orchard.Tests/UI/Navigation/MenuFilterTests.cs b/src/Orchard.Tests/UI/Navigation/MenuFilterTests.cs index 514765b6b..a2295f24f 100644 --- a/src/Orchard.Tests/UI/Navigation/MenuFilterTests.cs +++ b/src/Orchard.Tests/UI/Navigation/MenuFilterTests.cs @@ -63,8 +63,8 @@ namespace Orchard.Tests.UI.Navigation { } private static Mock GetNavigationManager() { - var mainMenu = new[] { new MenuItem { Text = "The Main Menu" } }; - var adminMenu = new[] { new MenuItem { Text = "The Admin Menu" } }; + var mainMenu = new[] { new MenuItem { Text = new LocalizedString("The Main Menu") } }; + var adminMenu = new[] { new MenuItem { Text = new LocalizedString("The Admin Menu") } }; var navigationManager = new Mock(); navigationManager.Setup(x => x.BuildMenu("main")).Returns(mainMenu); navigationManager.Setup(x => x.BuildMenu("admin")).Returns(adminMenu); diff --git a/src/Orchard.Tests/UI/Navigation/MenuItemComparerTests.cs b/src/Orchard.Tests/UI/Navigation/MenuItemComparerTests.cs index 36170d6d9..4f24b2d7d 100644 --- a/src/Orchard.Tests/UI/Navigation/MenuItemComparerTests.cs +++ b/src/Orchard.Tests/UI/Navigation/MenuItemComparerTests.cs @@ -1,5 +1,6 @@ using System.Web.Routing; using NUnit.Framework; +using Orchard.Localization; using Orchard.UI.Navigation; namespace Orchard.Tests.UI.Navigation { @@ -7,50 +8,50 @@ namespace Orchard.Tests.UI.Navigation { public class MenuItemComparerTests { [Test] public void TextShouldCauseDifferenceAndNullRouteValuesAreEqual() { - var item1 = new MenuItem { TextHint = "hello" }; - var item2 = new MenuItem { TextHint = "hello" }; - var item3 = new MenuItem { TextHint = "hello3" }; + var item1 = new MenuItem { Text = new LocalizedString("hello") }; + var item2 = new MenuItem { Text = new LocalizedString("hello") }; + var item3 = new MenuItem { Text = new LocalizedString("hello3") }; AssertSameSameDifferent(item1, item2, item3); } [Test] public void NullRouteValuesShouldEqualEmptyRouteValues() { - var item1 = new MenuItem { TextHint = "hello" }; - var item2 = new MenuItem { TextHint = "hello" }; - var item3 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary() }; - var item4 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary() }; + var item1 = new MenuItem { Text = new LocalizedString("hello") }; + var item2 = new MenuItem { Text = new LocalizedString("hello") }; + var item3 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary() }; + var item4 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary() }; AssertSameSameSame(item1, item2, item3); AssertSameSameSame(item3, item4, item1); } [Test] public void AdditionalPropertiesShouldMismatch() { - var item1 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = 1 }) }; - var item2 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = 1 }) }; - var item3 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = 1, two = 2 }) }; + var item1 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = 1 }) }; + var item2 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = 1 }) }; + var item3 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = 1, two = 2 }) }; AssertSameSameDifferent(item1, item2, item3); } [Test] public void ValueTypeShouldMismatch() { - var item1 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = 1 }) }; - var item2 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = 1 }) }; - var item3 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1" }) }; + var item1 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = 1 }) }; + var item2 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = 1 }) }; + var item3 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1" }) }; AssertSameSameDifferent(item1, item2, item3); } [Test] public void ValuesShouldMismatch() { - var item1 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; - var item2 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; - var item3 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "3" }) }; + var item1 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; + var item2 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; + var item3 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "3" }) }; AssertSameSameDifferent(item1, item2, item3); } [Test] public void PositionAndChildrenDontMatter() { - var item1 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; - var item2 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }), Position = "4.0" }; - var item3 = new MenuItem { TextHint = "hello", RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }), Items = new[] { new MenuItem() } }; + var item1 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }) }; + var item2 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }), Position = "4.0" }; + var item3 = new MenuItem { Text = new LocalizedString("hello"), RouteValues = new RouteValueDictionary(new { one = "1", two = "2" }), Items = new[] { new MenuItem() } }; AssertSameSameSame(item1, item2, item3); } diff --git a/src/Orchard.Tests/UI/Navigation/NavigationManagerTests.cs b/src/Orchard.Tests/UI/Navigation/NavigationManagerTests.cs index 85940f366..adc9c9fec 100644 --- a/src/Orchard.Tests/UI/Navigation/NavigationManagerTests.cs +++ b/src/Orchard.Tests/UI/Navigation/NavigationManagerTests.cs @@ -56,19 +56,19 @@ namespace Orchard.Tests.UI.Navigation { var item2 = menuItems.Skip(1).First(); var item3 = menuItems.Skip(2).First(); - Assert.That(item1.TextHint, Is.EqualTo("Foo")); + Assert.That(item1.Text, Is.EqualTo("Foo")); Assert.That(item1.Position, Is.EqualTo("1.0")); - Assert.That(item2.TextHint, Is.EqualTo("Bar")); + Assert.That(item2.Text, Is.EqualTo("Bar")); Assert.That(item2.Position, Is.EqualTo("2.0")); - Assert.That(item3.TextHint, Is.EqualTo("Frap")); + Assert.That(item3.Text, Is.EqualTo("Frap")); Assert.That(item3.Position, Is.EqualTo("3.0")); Assert.That(item2.Items.Count(), Is.EqualTo(2)); var subitem1 = item2.Items.First(); var subitem2 = item2.Items.Last(); - Assert.That(subitem1.TextHint, Is.EqualTo("Quad")); + Assert.That(subitem1.Text, Is.EqualTo("Quad")); Assert.That(subitem1.Position, Is.EqualTo("1.a")); - Assert.That(subitem2.TextHint, Is.EqualTo("Frap")); + Assert.That(subitem2.Text, Is.EqualTo("Frap")); Assert.That(subitem2.Position, Is.EqualTo("1.b")); } diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index 98bfb0b72..8246dd97b 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -42,7 +42,7 @@ namespace Orchard.Core.Navigation.Controllers { model = new NavigationManagementViewModel(); if (model.MenuItemEntries == null || model.MenuItemEntries.Count() < 1) - model.MenuItemEntries = _menuService.Get().Select(CreateMenuItemEntries).OrderBy(menuPartEntry => menuPartEntry.MenuItem.Position, new FlatPositionComparer()).ToList(); + model.MenuItemEntries = _menuService.Get().Select(CreateMenuItemEntries).OrderBy(menuPartEntry => menuPartEntry.Position, new FlatPositionComparer()).ToList(); // need action name as this action is referenced from another action return View("Index", model); @@ -58,10 +58,10 @@ namespace Orchard.Core.Navigation.Controllers { foreach (var menuItemEntry in menuItemEntries) { MenuPart menuPart = _menuService.Get(menuItemEntry.MenuItemId); - menuPart.MenuText = menuItemEntry.MenuItem.Text; - menuPart.MenuPosition = menuItemEntry.MenuItem.Position; + menuPart.MenuText = menuItemEntry.Text; + menuPart.MenuPosition = menuItemEntry.Position; if (menuPart.Is()) - menuPart.As().Url = menuItemEntry.MenuItem.Url; + menuPart.As().Url = menuItemEntry.Url; } } @@ -70,16 +70,14 @@ namespace Orchard.Core.Navigation.Controllers { private MenuItemEntry CreateMenuItemEntries(MenuPart menuPart) { return new MenuItemEntry { - MenuItem = new MenuItem { - Text = menuPart.MenuText, - Position = menuPart.MenuPosition, - Url = menuPart.Is() - ? menuPart.As().Url - : _navigationManager.GetUrl(null, _services.ContentManager.GetItemMetadata(menuPart).DisplayRouteValues) - }, - MenuItemId = menuPart.Id, - IsMenuItem = menuPart.Is() - }; + MenuItemId = menuPart.Id, + IsMenuItem = menuPart.Is(), + Text = menuPart.MenuText, + Position = menuPart.MenuPosition, + Url = menuPart.Is() + ? menuPart.As().Url + : _navigationManager.GetUrl(null, _services.ContentManager.GetItemMetadata(menuPart).DisplayRouteValues), + }; } public ActionResult Create() { @@ -96,7 +94,7 @@ namespace Orchard.Core.Navigation.Controllers { if (!ModelState.IsValid) { _services.TransactionManager.Cancel(); - return Index(new NavigationManagementViewModel {NewMenuItem = model}); + return Index(new NavigationManagementViewModel { NewMenuItem = model }); } if (string.IsNullOrEmpty(menuPart.MenuPosition)) diff --git a/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs b/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs index 32e6e185e..46953dac8 100644 --- a/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs +++ b/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using System.Web; +using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.Core.Navigation.Models; using Orchard.Localization; @@ -23,11 +24,11 @@ namespace Orchard.Core.Navigation.Services { if (part.Is()) builder.Add( - menu => menu.Add(new LocalizedString(part.MenuText), part.MenuPosition, nib => nib.Url(part.As().Url))); + menu => menu.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, nib => nib.Url(part.As().Url))); else builder.Add( menu => - menu.Add(new LocalizedString(part.MenuText), part.MenuPosition, + menu.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, nib => nib.Action(_contentManager.GetItemMetadata(part.ContentItem).DisplayRouteValues))); } diff --git a/src/Orchard.Web/Core/Navigation/ViewModels/MenuItemEntry.cs b/src/Orchard.Web/Core/Navigation/ViewModels/MenuItemEntry.cs index dd71b76fd..f4aa15afc 100644 --- a/src/Orchard.Web/Core/Navigation/ViewModels/MenuItemEntry.cs +++ b/src/Orchard.Web/Core/Navigation/ViewModels/MenuItemEntry.cs @@ -2,8 +2,11 @@ namespace Orchard.Core.Navigation.ViewModels { public class MenuItemEntry { - public MenuItem MenuItem { get; set; } public int MenuItemId { get; set; } public bool IsMenuItem { get; set; } + + public string Text { get; set; } + public string Url { get; set; } + public string Position { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml index 0a1ee74f3..140fcfd5b 100644 --- a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml @@ -26,9 +26,9 @@ foreach (var menuPartEntry in Model.MenuItemEntries) { var i = menuPartEntryIndex; - - - @if (!menuPartEntry.IsMenuItem) { } else {} + + + @if (!menuPartEntry.IsMenuItem) { } else {} @T("Remove") ++menuPartEntryIndex; diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/LocalMenu.cshtml b/src/Orchard.Web/Themes/TheAdmin/Views/LocalMenu.cshtml index 9e50483e6..93cabe5d5 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Views/LocalMenu.cshtml +++ b/src/Orchard.Web/Themes/TheAdmin/Views/LocalMenu.cshtml @@ -9,7 +9,7 @@ @tag.StartElement @foreach(var firstLevelMenuItem in Model) { if (firstLevelMenuItem.LocalNav) { - string sectionHeaderText = firstLevelMenuItem.Text; + string sectionHeaderText = firstLevelMenuItem.Text.Text; var sectionHeaderMarkup = firstLevelMenuItem.RouteValues != null || HasText(firstLevelMenuItem.Url) ? Html.Link(sectionHeaderText, (string)firstLevelMenuItem.Href) diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/Menu.cshtml b/src/Orchard.Web/Themes/TheAdmin/Views/Menu.cshtml index 0e6a5ef9b..88091e6a6 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Views/Menu.cshtml +++ b/src/Orchard.Web/Themes/TheAdmin/Views/Menu.cshtml @@ -16,8 +16,8 @@ @foreach(var firstLevelMenuItem in Model) { IEnumerable secondLevelMenuItems = firstLevelMenuItem; - string sectionHeaderText = firstLevelMenuItem.Text; - string sectionHeaderTextHint = firstLevelMenuItem.TextHint; + string sectionHeaderText = firstLevelMenuItem.Text.Text; + string sectionHeaderTextHint = firstLevelMenuItem.Text.TextHint; var firstOfTheSecond = secondLevelMenuItems.FirstOrDefault(); var itemClassName = HasText(sectionHeaderTextHint) @@ -64,7 +64,7 @@ if (secondLevelMenuItems.Where(menuItem => !menuItem.LocalNav).Count() > 1 || !firstLevelMenuItem.LinkToFirstChild) {