From 129133f6ba083f1e4d7f68e83de858a67e500f86 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 28 Mar 2014 01:28:23 +0100 Subject: [PATCH] Added Lists projection filter and sort criterion provider. --- src/Orchard.Web/Core/Orchard.Core.csproj | 10 ++-- .../Orchard.Lists/Forms/ListFilterForm.cs | 48 +++++++++++++++++++ .../Orchard.Lists/Orchard.Lists.csproj | 10 ++-- .../Orchard.Lists/Projections/ListFilter.cs | 48 +++++++++++++++++++ .../Projections/ListSortCriteria.cs | 34 +++++++++++++ .../Orchard.Lists/Services/IFilterProvider.cs | 7 +++ .../Orchard.Lists/Services/IFormProvider.cs | 7 +++ .../Services/ISortCriterionProvider.cs | 7 +++ 8 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Forms/ListFilterForm.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Projections/ListFilter.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Projections/ListSortCriteria.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Services/IFilterProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Services/IFormProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Services/ISortCriterionProvider.cs diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index ce7e251d7..16372c94a 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -104,11 +104,11 @@ - + @@ -123,9 +123,9 @@ - + @@ -398,12 +398,10 @@ Designer - - @@ -556,6 +554,10 @@ + + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Forms/ListFilterForm.cs b/src/Orchard.Web/Modules/Orchard.Lists/Forms/ListFilterForm.cs new file mode 100644 index 000000000..04bde06f5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Forms/ListFilterForm.cs @@ -0,0 +1,48 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Web.Mvc; +using Orchard.ContentManagement; +using Orchard.Core.Containers.Models; +using Orchard.Core.Containers.Services; +using Orchard.DisplayManagement; +using Orchard.Lists.Services; + +namespace Orchard.Lists.Forms { + public class ListFilterForm : Component, IFormProvider { + private readonly IContainerService _containerService; + private readonly IContentManager _contentManager; + + public ListFilterForm(IShapeFactory shapeFactory, IContainerService containerService, IContentManager contentManager) { + _containerService = containerService; + _contentManager = contentManager; + New = shapeFactory; + } + protected dynamic New { get; set; } + + public void Describe(dynamic context) { + Func form = + shape => { + var f = New.Form( + Id: "List", + _Lists: New.SelectList( + Id: "listId", Name: "ListId", + Title: T("List"), + Description: T("Select a list."), + Multiple: false)); + + foreach (var list in _containerService.GetContainers(VersionOptions.Latest).OrderBy(GetListName)) { + f._Lists.Add(new SelectListItem {Value = list.Id.ToString(CultureInfo.InvariantCulture), Text = GetListName(list)}); + } + + return f; + }; + + context.Form("ListFilter", form); + } + + private string GetListName(ContainerPart containerPart) { + return _contentManager.GetItemMetadata(containerPart).DisplayText; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj index 07dc0d358..dc555ddfd 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj +++ b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj @@ -66,10 +66,15 @@ + + + + + @@ -89,6 +94,7 @@ + @@ -193,9 +199,7 @@ - - - + diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListFilter.cs b/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListFilter.cs new file mode 100644 index 000000000..ceb713b87 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListFilter.cs @@ -0,0 +1,48 @@ +using System; +using Orchard.ContentManagement; +using Orchard.Core.Common.Models; +using Orchard.Core.Containers.Models; +using Orchard.Lists.Services; +using Orchard.Localization; + +namespace Orchard.Lists.Projections { + public class ListFilter : Component, IFilterProvider { + private readonly IContentManager _contentManager; + + public ListFilter(IContentManager contentManager) { + _contentManager = contentManager; + } + + public void Describe(dynamic describe) { + describe.For("Lists", T("Lists"), T("Lists")) + .Element("List", T("List"), T("Specific list"), + (Action)ApplyFilter, + (Func)DisplayFilter, + "ListFilter" + ); + } + + public void ApplyFilter(dynamic context) { + var selectedList = (string)context.State.ListId; + + if (String.IsNullOrWhiteSpace(selectedList)) + return; + + var query = (IHqlQuery)context.Query; + var listId = Int32.Parse(selectedList); + context.Query = query.Where(alias => alias.ContentPartRecord(), item => item.Eq("Container", listId)); + } + + public LocalizedString DisplayFilter(dynamic context) { + var selectedList = (string)context.State.ListId; + + if (String.IsNullOrWhiteSpace(selectedList)) + return T("No list was selected"); + + var listId = Int32.Parse(selectedList); + var list = _contentManager.Get(listId, VersionOptions.Latest, QueryHints.Empty); + var listName = _contentManager.GetItemMetadata(list).DisplayText; + return T("Show items from the following list: {0}", listName); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListSortCriteria.cs b/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListSortCriteria.cs new file mode 100644 index 000000000..498aa98a6 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Projections/ListSortCriteria.cs @@ -0,0 +1,34 @@ +using System; +using Orchard.ContentManagement; +using Orchard.Core.Containers.Models; +using Orchard.Lists.Services; +using Orchard.Localization; + +namespace Orchard.Lists.Projections { + public class ListSortCriteria : Component, ISortCriterionProvider { + + public void Describe(dynamic describe) { + describe.For("List", new LocalizedString("List"), T("List item position")) + .Element("Position", T("Position"), T("Sorts the results by position"), + (Action)ApplySortCriterion, + (Func)DisplaySortCriterion, + "SortOrder" + ); + } + + public void ApplySortCriterion(dynamic context) { + bool ascending = Boolean.Parse(Convert.ToString(context.State.Sort)); + var query = (IHqlQuery)context.Query; + query = ascending + ? query.OrderBy(alias => alias.ContentPartRecord(), x => x.Asc("Position")) + : query.OrderBy(alias => alias.ContentPartRecord(), x => x.Desc("Position")); + + context.Query = query; + } + + public LocalizedString DisplaySortCriterion(dynamic context) { + bool ascending = Boolean.Parse(Convert.ToString(context.State.Sort)); + return T(@ascending ? "Ordered by {0}, ascending" : "Ordered by {0}, descending", T("Position")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Services/IFilterProvider.cs b/src/Orchard.Web/Modules/Orchard.Lists/Services/IFilterProvider.cs new file mode 100644 index 000000000..1221711cf --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Services/IFilterProvider.cs @@ -0,0 +1,7 @@ +using Orchard.Events; + +namespace Orchard.Lists.Services { + public interface IFilterProvider : IEventHandler { + void Describe(dynamic describe); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Services/IFormProvider.cs b/src/Orchard.Web/Modules/Orchard.Lists/Services/IFormProvider.cs new file mode 100644 index 000000000..68fda0d7e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Services/IFormProvider.cs @@ -0,0 +1,7 @@ +using Orchard.Events; + +namespace Orchard.Lists.Services { + public interface IFormProvider : IEventHandler { + void Describe(dynamic context); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Services/ISortCriterionProvider.cs b/src/Orchard.Web/Modules/Orchard.Lists/Services/ISortCriterionProvider.cs new file mode 100644 index 000000000..937a054e4 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Services/ISortCriterionProvider.cs @@ -0,0 +1,7 @@ +using Orchard.Events; + +namespace Orchard.Lists.Services { + public interface ISortCriterionProvider : IEventHandler { + void Describe(dynamic describe); + } +} \ No newline at end of file