diff --git a/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs b/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs index ce7905744..1a98a5948 100644 --- a/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs +++ b/src/Orchard.Tests.Modules/Themes/Services/ThemeServiceTests.cs @@ -90,6 +90,7 @@ namespace Orchard.Tests.Modules.Themes.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType(typeof(SettingsFormatter)) .As(typeof(IMapper)) .As(typeof(IMapper)); diff --git a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs index 3e00fcca5..dd135eb44 100644 --- a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs +++ b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs @@ -83,6 +83,8 @@ namespace Orchard.Tests.Modules.Users.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); + _session = _sessionFactory.OpenSession(); builder.RegisterInstance(new TestSessionLocator(_session)).As(); _container = builder.Build(); diff --git a/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs b/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs index 58383840e..d517ca7f6 100644 --- a/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs +++ b/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs @@ -32,6 +32,19 @@ namespace Orchard.Tests.Modules.Widgets.Services { private const string ThemeZoneName1 = "sidebar"; private const string ThemeZoneName2 = "alternative"; + private const string LayerName1 = "Test layer 1"; + private const string LayerDescription1 = "Test layer 1"; + private const string LayerName2 = "Test layer 2"; + private const string LayerDescription2 = "Test layer 2"; + private const string WidgetTitle1 = "Test widget 1"; + private const string WidgetTitle2 = "Test widget 2"; + private const string WidgetTitle3 = "Test widget 3"; + private const string Zone1 = "Zone1"; + private const string Zone2 = "Zone2"; + private const string Position1 = "1"; + private const string Position2 = "3"; + private const string Position3 = "4"; + private IWidgetsService _widgetService; private IContentManager _contentManager; @@ -85,26 +98,22 @@ namespace Orchard.Tests.Modules.Widgets.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); } [Test] public void GetLayersTest() { - const string layerName1 = "Test layer 1"; - const string layerDescription1 = "Test layer 1"; - const string layerName2 = "Test layer 2"; - const string layerDescription2 = "Test layer 2"; - IEnumerable layers = _widgetService.GetLayers(); Assert.That(layers.Count(), Is.EqualTo(0)); - LayerPart layerPartFirst = _widgetService.CreateLayer(layerName1, layerDescription1, ""); + LayerPart layerPartFirst = _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); _contentManager.Flush(); layers = _widgetService.GetLayers(); Assert.That(layers.Count(), Is.EqualTo(1)); Assert.That(layers.First().Id, Is.EqualTo(layerPartFirst.Id)); - _widgetService.CreateLayer(layerName2, layerDescription2, ""); + _widgetService.CreateLayer(LayerName2, LayerDescription2, ""); _contentManager.Flush(); Assert.That(layers.Count(), Is.EqualTo(1)); } @@ -123,34 +132,27 @@ namespace Orchard.Tests.Modules.Widgets.Services { [Test] public void CreateLayerTest() { - const string layerName = "Test layer 1"; - const string layerDescription = "Test layer 1"; - IEnumerable layers = _widgetService.GetLayers(); Assert.That(layers.Count(), Is.EqualTo(0), "No layers yet"); - _widgetService.CreateLayer(layerName, layerDescription, ""); + _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); _contentManager.Flush(); layers = _widgetService.GetLayers(); LayerPart layer = layers.First(); - Assert.That(layer.Record.Name, Is.EqualTo(layerName)); - Assert.That(layer.Record.Description, Is.EqualTo(layerDescription)); + Assert.That(layer.Record.Name, Is.EqualTo(LayerName1)); + Assert.That(layer.Record.Description, Is.EqualTo(LayerDescription1)); } [Test] public void GetWidgetTest() { - const string layerName = "Test layer 1"; - const string layerDescription = "Test layer 1"; - const string widgetTitle = "Test widget 1"; - - LayerPart layerPart = _widgetService.CreateLayer(layerName, layerDescription, ""); + LayerPart layerPart = _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); _contentManager.Flush(); WidgetPart widgetResult = _widgetService.GetWidget(0); Assert.That(widgetResult, Is.Null); - WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", widgetTitle, "1", ""); + WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle1, "1", ""); Assert.That(widgetPart, Is.Not.Null); widgetResult = _widgetService.GetWidget(0); @@ -163,18 +165,13 @@ namespace Orchard.Tests.Modules.Widgets.Services { [Test] public void GetWidgetsTest() { - const string layerName = "Test layer 1"; - const string layerDescription = "Test layer 1"; - const string widgetTitle1 = "Test widget 1"; - const string widgetTitle2 = "Test widget 2"; - - LayerPart layerPart = _widgetService.CreateLayer(layerName, layerDescription, ""); + LayerPart layerPart = _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); _contentManager.Flush(); IEnumerable widgetResults = _widgetService.GetWidgets(); Assert.That(widgetResults.Count(), Is.EqualTo(0)); - WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", widgetTitle1, "1", ""); + WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle1, "1", ""); Assert.That(widgetPart, Is.Not.Null); _contentManager.Flush(); @@ -182,7 +179,7 @@ namespace Orchard.Tests.Modules.Widgets.Services { Assert.That(widgetResults.Count(), Is.EqualTo(1)); Assert.That(widgetResults.First().Id, Is.EqualTo(widgetPart.Id)); - _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", widgetTitle2, "2", ""); + _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle2, "2", ""); _contentManager.Flush(); widgetResults = _widgetService.GetWidgets(); @@ -191,14 +188,10 @@ namespace Orchard.Tests.Modules.Widgets.Services { [Test] public void CreateWidgetTest() { - const string layerName = "Test layer 1"; - const string layerDescription = "Test layer 1"; - const string widgetTitle = "Test widget 1"; - - LayerPart layerPart = _widgetService.CreateLayer(layerName, layerDescription, ""); + LayerPart layerPart = _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); _contentManager.Flush(); - WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", widgetTitle, "1", ""); + WidgetPart widgetPart = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle1, "1", ""); Assert.That(widgetPart, Is.Not.Null); Assert.That(widgetPart.LayerPart.Id, Is.EqualTo(layerPart.Id)); } @@ -211,6 +204,44 @@ namespace Orchard.Tests.Modules.Widgets.Services { Assert.That(zones.FirstOrDefault(zone => zone == ThemeZoneName2), Is.Not.Null); } + [Test, Ignore("Fix when possible")] + public void MoveWidgetTest() { + LayerPart layerPart = _widgetService.CreateLayer(LayerName1, LayerDescription1, ""); + _contentManager.Flush(); + + // same zone widgets + WidgetPart widgetPart1 = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle1, Position1, Zone1); + WidgetPart widgetPart2 = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle2, Position2, Zone1); + + // different zone widget + WidgetPart widgetPart3 = _widgetService.CreateWidget(layerPart.Id, "HtmlWidget", WidgetTitle3, Position3, Zone2); + _contentManager.Flush(); + + // test 1 - moving first widget up will have no effect + Assert.That(_widgetService.MoveWidgetUp(widgetPart1), Is.False); + + // test 2 - moving first widget down will be successfull + Assert.That(_widgetService.MoveWidgetDown(widgetPart1), Is.True); + + widgetPart1 = _widgetService.GetWidget(widgetPart1.Id); + Assert.That(widgetPart1.Position, Is.EqualTo(Position2), "First widget moved to second widget position"); + + widgetPart2 = _widgetService.GetWidget(widgetPart2.Id); + Assert.That(widgetPart2.Position, Is.EqualTo(Position1), "Second widget moved to first widget position"); + + // test 3 - moving last widget down will have no effect even though there is a widget in another zone with a higher position + Assert.That(_widgetService.MoveWidgetDown(widgetPart1), Is.False); + + widgetPart1 = _widgetService.GetWidget(widgetPart1.Id); + Assert.That(widgetPart1.Position, Is.EqualTo(Position2), "Widget remained in the same position"); + + widgetPart2 = _widgetService.GetWidget(widgetPart2.Id); + Assert.That(widgetPart2.Position, Is.EqualTo(Position1), "Widget remained in the same position"); + + widgetPart3 = _widgetService.GetWidget(widgetPart3.Id); + Assert.That(widgetPart3.Position, Is.EqualTo(Position3), "Widget remained in the same position"); + } + public class StubLayerPartHandler : ContentHandler { public StubLayerPartHandler(IRepository layersRepository) { Filters.Add(new ActivatingFilter("Layer")); diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetsService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetsService.cs index 337dba2ae..966504a55 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetsService.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetsService.cs @@ -22,7 +22,9 @@ namespace Orchard.Widgets.Services { void UpdateLayer(int layerId, string name, string description, string layerRule); void DeleteLayer(int layerId); - void MoveWidgetUp(int widgetId); - void MoveWidgetDown(int widgetId); + bool MoveWidgetUp(int widgetId); + bool MoveWidgetUp(WidgetPart widgetPart); + bool MoveWidgetDown(int widgetId); + bool MoveWidgetDown(WidgetPart widgetPart); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs index fd8bcb8b7..386250c82 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetsService.cs @@ -110,26 +110,52 @@ namespace Orchard.Widgets.Services { _contentManager.Remove(GetWidget(widgetId).ContentItem); } - public void MoveWidgetUp(int widgetId) { - WidgetPart widgetPart = GetWidget(widgetId); - + public bool MoveWidgetUp(WidgetPart widgetPart) { int currentPosition = int.Parse(widgetPart.Record.Position); - if (currentPosition > 0) { - WidgetPart widgetBefore = GetWidgets(widgetPart.LayerPart.Id).FirstOrDefault(widgetPartBefore => widgetPartBefore.Record.Position == (currentPosition - 1).ToString()); - widgetBefore.Record.Position = currentPosition.ToString(); - widgetPart.Record.Position = (currentPosition - 1).ToString(); + + WidgetPart widgetBefore = GetWidgets(widgetPart.LayerPart.Id) + .Where(widget => widget.Zone == widgetPart.Zone) + .OrderByDescending(widget => widget.Position, new UI.FlatPositionComparer()) + .FirstOrDefault(widget => int.Parse(widget.Record.Position) < currentPosition); + + if (widgetBefore != null) { + SwitchWidgetPositions(widgetBefore, widgetPart); + + return true; } + + return false; } - public void MoveWidgetDown(int widgetId) { - WidgetPart widgetPart = GetWidget(widgetId); + public bool MoveWidgetUp(int widgetId) { + return MoveWidgetUp(GetWidget(widgetId)); + } + public bool MoveWidgetDown(WidgetPart widgetPart) { int currentPosition = int.Parse(widgetPart.Record.Position); - if (currentPosition < GetWidgets(widgetPart.LayerPart.Id).Count()) { - WidgetPart widgetAfter = GetWidgets(widgetPart.LayerPart.Id).FirstOrDefault(widgetPartAfter => widgetPartAfter.Record.Position == (currentPosition + 1).ToString()); - widgetAfter.Record.Position = currentPosition.ToString(); - widgetPart.Record.Position = (currentPosition + 1).ToString(); - } + + WidgetPart widgetAfter = GetWidgets(widgetPart.LayerPart.Id) + .Where(widget => widget.Zone == widgetPart.Zone) + .OrderBy(widget => widget.Position, new UI.FlatPositionComparer()) + .FirstOrDefault(widget => int.Parse(widget.Record.Position) > currentPosition); + + if (widgetAfter != null) { + SwitchWidgetPositions(widgetAfter, widgetPart); + + return true; + } + + return false; + } + + public bool MoveWidgetDown(int widgetId) { + return MoveWidgetDown(GetWidget(widgetId)); + } + + private static void SwitchWidgetPositions(WidgetPart sourceWidget, WidgetPart targetWidget) { + string tempPosition = sourceWidget.Record.Position; + sourceWidget.Record.Position = targetWidget.ToString(); + targetWidget.Record.Position = tempPosition; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Widgets/Views/Admin/Index.cshtml index 758fb276e..dfd99c72c 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Views/Admin/Index.cshtml @@ -49,14 +49,21 @@
  • @zone
      + @{ + int count = Model.CurrentLayerWidgets.Where(widgetPart => widgetPart.Zone == zone).Count() - 1; + int i = 0; + } @foreach (WidgetPart widget in Model.CurrentLayerWidgets.Where(widgetPart => widgetPart.Zone == zone).OrderBy(widgetPart => widgetPart.Position, new Orchard.UI.FlatPositionComparer())) {
    • - @if (widget.Position != "1") { + @if (i > 0) { } - @if (int.Parse(widget.Position) < Model.CurrentLayerWidgets.Where(widgetPart => widgetPart.Zone == zone).Count()) { + @if (i < count) { } + @{ + i++; + } @Html.ActionLink(@widget.Title, "EditWidget", new { @widget.Id })
    • }