From b88d08b0ff33bc15c840c4307ea5c25f33c44bd7 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 18 Apr 2015 19:48:25 +0200 Subject: [PATCH 1/2] Initial work on configurable search widget. --- .../Controllers/SearchController.cs | 20 ++++---- .../Drivers/SearchFormPartDriver.cs | 46 +++++++++++++++---- .../Helpers/SearchSettingsHelper.cs | 6 ++- .../Orchard.Search/Models/SearchFormPart.cs | 9 ++++ .../Orchard.Search/Orchard.Search.csproj | 7 ++- .../Modules/Orchard.Search/Placement.info | 9 ++-- .../Orchard.Search/ResourceManifest.cs | 1 - .../Modules/Orchard.Search/Routes.cs | 32 ++++++------- .../Styles/orchard-search-admin.css | 5 +- .../Styles/orchard-search-search.css | 3 +- .../ViewModels/SearchFormViewModel.cs | 9 ++++ .../Parts/Search.SearchForm.cshtml | 19 ++++++++ .../Parts/Search.SiteSettings.cshtml | 40 ++++++++-------- .../Views/Parts/Search.SearchForm.cshtml | 17 +++++-- 14 files changed, 155 insertions(+), 68 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchFormViewModel.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SearchForm.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs index 17226947c..78dffda8a 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs @@ -30,6 +30,7 @@ namespace Orchard.Search.Controllers { IContentManager contentManager, ISiteService siteService, IShapeFactory shapeFactory) { + Services = services; _searchService = searchService; _contentManager = contentManager; @@ -45,23 +46,24 @@ namespace Orchard.Search.Controllers { public ILogger Logger { get; set; } dynamic Shape { get; set; } - public ActionResult Index(PagerParameters pagerParameters, string q = "") { + public ActionResult Index(PagerParameters pagerParameters, string searchIndex = null, string q = "") { var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); var searchSettingPart = Services.WorkContext.CurrentSite.As(); + var index = !String.IsNullOrWhiteSpace(searchIndex) ? searchIndex.Trim() : searchSettingPart.SearchIndex; - if (String.IsNullOrEmpty(searchSettingPart.SearchIndex)) { - Services.Notifier.Error(T("Please define a default search index")); + if (String.IsNullOrEmpty(index)) { + Services.Notifier.Error(T("Please define a default search index.")); return HttpNotFound(); } IPageOfItems searchHits = new PageOfItems(new ISearchHit[] { }); try { - - searchHits = _searchService.Query(q, pager.Page, pager.PageSize, - Services.WorkContext.CurrentSite.As().FilterCulture, - searchSettingPart.SearchIndex, - searchSettingPart.GetSearchFields(), - searchHit => searchHit); + searchHits = _searchService.Query( + q, pager.Page, pager.PageSize, + Services.WorkContext.CurrentSite.As().FilterCulture, + index, + searchSettingPart.GetSearchFields(index), + searchHit => searchHit); } catch(Exception exception) { Logger.Error(T("Invalid search query: {0}", exception.Message).Text); Services.Notifier.Error(T("Invalid search query: {0}", exception.Message)); diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs index 1400a1873..a0f1af8ac 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs @@ -1,19 +1,49 @@ -using Orchard.ContentManagement.Drivers; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Indexing; using Orchard.Search.Models; using Orchard.Search.ViewModels; namespace Orchard.Search.Drivers { public class SearchFormPartDriver : ContentPartDriver { + private readonly IIndexManager _indexManager; + public SearchFormPartDriver(IIndexManager indexManager) { + _indexManager = indexManager; + } protected override DriverResult Display(SearchFormPart part, string displayType, dynamic shapeHelper) { var model = new SearchViewModel(); - return ContentShape("Parts_Search_SearchForm", - () => { - var shape = shapeHelper.Parts_Search_SearchForm(); - shape.ContentPart = part; - shape.ViewModel = model; - return shape; - }); + return ContentShape("Parts_Search_SearchForm", () => { + var shape = shapeHelper.Parts_Search_SearchForm(); + shape.AvailableIndexes = _indexManager.GetSearchIndexProvider().List().ToList(); + shape.ContentPart = part; + shape.ViewModel = model; + return shape; + }); + } + + protected override DriverResult Editor(SearchFormPart part, dynamic shapeHelper) { + return Editor(part, null, shapeHelper); + } + + protected override DriverResult Editor(SearchFormPart part, IUpdateModel updater, dynamic shapeHelper) { + return ContentShape("Parts_Search_SearchForm_Edit", () => { + var viewModel = new SearchFormViewModel { + OverrideIndex = part.OverrideIndex, + AvailableIndexes = _indexManager.GetSearchIndexProvider().List().ToList(), + SelectedIndex = part.SelectedIndex + }; + + if (updater != null) { + if (updater.TryUpdateModel(viewModel, Prefix, null, new[] {"AvailableIndexes"})) { + part.OverrideIndex = viewModel.OverrideIndex; + part.SelectedIndex = viewModel.SelectedIndex; + } + } + + return shapeHelper.EditorTemplate(TemplateName: "Parts/Search.SearchForm", Model: viewModel, Prefix: Prefix); + }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs b/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs index a3f334e27..85161ea28 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs @@ -33,7 +33,11 @@ namespace Orchard.Search.Helpers { } public static string[] GetSearchFields(this SearchSettingsPart part) { - return part.SearchFields.ContainsKey(part.SearchIndex) ? part.SearchFields[part.SearchIndex] : new string[0]; + return GetSearchFields(part, part.SearchIndex); + } + + public static string[] GetSearchFields(this SearchSettingsPart part, string index) { + return part.SearchFields.ContainsKey(index) ? part.SearchFields[index] : new string[0]; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Models/SearchFormPart.cs b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchFormPart.cs index 4c804773e..14cab0891 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Models/SearchFormPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchFormPart.cs @@ -5,5 +5,14 @@ namespace Orchard.Search.Models { /// Content part for the search form widget /// public class SearchFormPart : ContentPart { + public bool OverrideIndex { + get { return this.Retrieve(x => x.OverrideIndex); } + set { this.Store(x => x.OverrideIndex, value); } + } + + public string SelectedIndex { + get { return this.Retrieve(x => x.SelectedIndex); } + set { this.Store(x => x.SelectedIndex, value); } + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj index a04b2335f..e6abe181b 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj +++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj @@ -88,6 +88,7 @@ + @@ -95,9 +96,8 @@ - {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} + {2d1d92bb-4555-4cbe-8d0e-63563d6ce4c6} Orchard.Framework - false {73a7688a-5bd3-4f7e-adfa-ce36c5a10e3b} @@ -160,6 +160,9 @@ Designer + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Placement.info b/src/Orchard.Web/Modules/Orchard.Search/Placement.info index d2f515e83..de2ef3913 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Placement.info +++ b/src/Orchard.Web/Modules/Orchard.Search/Placement.info @@ -2,10 +2,11 @@ + - - + diff --git a/src/Orchard.Web/Modules/Orchard.Search/ResourceManifest.cs b/src/Orchard.Web/Modules/Orchard.Search/ResourceManifest.cs index ed9a06e9e..3aec38f86 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/ResourceManifest.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/ResourceManifest.cs @@ -3,7 +3,6 @@ using Orchard.UI.Resources; namespace Orchard.Search { public class ResourceManifest : IResourceManifestProvider { public void BuildManifests(ResourceManifestBuilder builder) { - builder.Add().DefineStyle("SearchAdmin").SetUrl("orchard-search-admin.css"); // todo: this does not appear to be used anywhere builder.Add().DefineStyle("Search").SetUrl("orchard-search-search.css"); } } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Routes.cs b/src/Orchard.Web/Modules/Orchard.Search/Routes.cs index f26c20a65..de55ecbb5 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Routes.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Routes.cs @@ -13,22 +13,22 @@ namespace Orchard.Search { public IEnumerable GetRoutes() { return new[] { - new RouteDescriptor { - Priority = 5, - Route = new Route( - "Search", - new RouteValueDictionary { - {"area", "Orchard.Search"}, - {"controller", "search"}, - {"action", "index"} - }, - null, - new RouteValueDictionary { - {"area", "Orchard.Search"} - }, - new MvcRouteHandler()) - } - }; + new RouteDescriptor { + Priority = 5, + Route = new Route("Search/{searchIndex}", + new RouteValueDictionary { + {"area", "Orchard.Search"}, + {"controller", "Search"}, + {"action", "Index"}, + {"searchIndex", UrlParameter.Optional} + }, + null, + new RouteValueDictionary { + {"area", "Orchard.Search"} + }, + new MvcRouteHandler()) + } + }; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-admin.css b/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-admin.css index 057874152..53bbe4e69 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-admin.css +++ b/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-admin.css @@ -1,3 +1,4 @@ -#main button { - display:block; +.search-indexes > li { + float: left; + margin: 0 2em 2em 0; } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-search.css b/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-search.css index baae17673..8da8c5d12 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-search.css +++ b/src/Orchard.Web/Modules/Orchard.Search/Styles/orchard-search-search.css @@ -23,5 +23,4 @@ form.search input { /*Search widget styles. More syles could be added here to target specific zones.*/ .widget-search-form { float:right; - } - + } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchFormViewModel.cs b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchFormViewModel.cs new file mode 100644 index 000000000..ac7d37056 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchFormViewModel.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Orchard.Search.ViewModels { + public class SearchFormViewModel { + public bool OverrideIndex { get; set; } + public string SelectedIndex { get; set; } + public IList AvailableIndexes { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SearchForm.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SearchForm.cshtml new file mode 100644 index 000000000..55366ab64 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SearchForm.cshtml @@ -0,0 +1,19 @@ +@model Orchard.Search.ViewModels.SearchFormViewModel +@{ + Script.Require("ShapesBase"); +} +@{ + var indexOptions = Model.AvailableIndexes.Select(x => new SelectListItem { Text = x, Value = x, Selected = x == Model.SelectedIndex }); +} +
+
+ @Html.CheckBoxFor(m => m.OverrideIndex) + @Html.LabelFor(m => m.OverrideIndex, T("Override Search Index").Text, new { @class = "forcheckbox" }) + @Html.Hint(T("Check this if you want to specify a different index for this widget to search.")) +
+
+ @Html.LabelFor(m => m.SelectedIndex, T("Index")) + @Html.DropDownListFor(m => m.SelectedIndex, indexOptions) + @Html.Hint(T("The index to search.")) +
+
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml index 1fe2c6321..044de04db 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml @@ -1,50 +1,52 @@ @using Orchard.Search.ViewModels @model SearchSettingsViewModel @{ - Script.Require("jQuery"); - Script.Include("orchard-search-settings.js"); + Style.Include("orchard-search-admin.css"); }
@T("Search") -
- - +
+ @if (Model.Entries != null && Model.Entries.Any()) { if (String.IsNullOrWhiteSpace(Model.SelectedIndex)) { Model.Entries.Insert(0, new IndexSettingsEntry { Index = "" }); } - - @T("Select which index to use in search queries.") + @Html.Hint(T("Select which index to use by default in search queries.")) -
    - @{var entryIndex = 0;} - @foreach (var modelEntry in Model.Entries) { - @Html.HiddenFor(m => m.Entries[entryIndex].Index) -
  • - @if (modelEntry.Fields != null && modelEntry.Fields.Any()) { +
      + @{ + var indexes = Model.Entries.Select(x => x.Index); + var entryIndex = 0; + foreach (var index in indexes) { + var fieldEntries = Model.Entries.Single(x => x.Index == index).Fields; + var entryIndexClosure = entryIndex; + @Html.HiddenFor(m => m.Entries[entryIndex].Index) +
    • +

      @index

        - @{ var fieldIndex = 0;} - @foreach (var fieldEntry in Model.Entries[entryIndex].Fields) { + @{ var fieldIndex = 0; } + @foreach (var fieldEntry in fieldEntries) { + var fieldIndexClosure = fieldIndex;
      • @Html.EditorFor(m => m.Entries[entryIndex].Fields[fieldIndex].Selected) @Html.HiddenFor(m => m.Entries[entryIndex].Fields[fieldIndex].Field) - +
      • fieldIndex++; }
      - } -
    • + entryIndex++; + } }
    - @T("Check any property which should be used for search queries.") + @T("Check any field for each index which should be used for search queries.") } else { diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/Parts/Search.SearchForm.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/Parts/Search.SearchForm.cshtml index b6fe2594a..569584a6d 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Views/Parts/Search.SearchForm.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/Parts/Search.SearchForm.cshtml @@ -1,11 +1,20 @@ -@using Orchard.Search.ViewModels; - +@using Orchard.ContentManagement +@using Orchard.Search.Models +@using Orchard.Search.ViewModels; @{ Style.Require("Search"); } +@{ + var settings = WorkContext.CurrentSite.As(); + var part = (SearchFormPart)Model.ContentPart; + var index = part.OverrideIndex && part.SelectedIndex != settings.SearchIndex ? part.SelectedIndex : default(string); + var routeValues = new RouteValueDictionary { { "area", "Orchard.Search" } }; - -@using(Html.BeginForm("index", "search", new { area = "Orchard.Search" }, FormMethod.Get, new { @class = "search-form" })) { + if (!String.IsNullOrEmpty(index)) { + routeValues.Add("searchIndex", index); + } +} +@using (Html.BeginForm("Index", "Search", routeValues, FormMethod.Get, new RouteValueDictionary { { "class", "search-form" } })) {
    @Html.TextBox("q", (SearchViewModel)Model.ViewModel.Query) @Html.Hidden("culture", WorkContext.CurrentCulture) From d6a0242433ea482ec1fd59886eba739effee33fa Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 18 Apr 2015 20:16:40 +0200 Subject: [PATCH 2/2] Simplified Admin Search. --- .../Controllers/AdminController.cs | 14 ++- .../Controllers/ContentPickerController.cs | 2 +- .../Drivers/AdminSearchSettingsPartDriver.cs | 57 ++------- .../Drivers/SearchSettingsPartDriver.cs | 63 ++++++---- .../AdminSearchSettingsPartHandler.cs | 2 +- .../Helpers/SearchSettingsHelper.cs | 8 -- .../Models/AdminSearchSettingsPart.cs | 21 +--- .../Orchard.Search/Orchard.Search.csproj | 8 +- .../Modules/Orchard.Search/Placement.info | 5 +- .../AdminSearchSettingsViewModel.cs | 12 ++ ...del.cs => SearchSettingsIndexViewModel.cs} | 61 +++++----- .../Parts/AdminSearch.SiteSettings.cshtml | 61 +--------- ...html => Search.SiteSettings.Fields.cshtml} | 109 ++++++++---------- .../Parts/Search.SiteSettings.Index.cshtml | 19 +++ 14 files changed, 185 insertions(+), 257 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/ViewModels/AdminSearchSettingsViewModel.cs rename src/Orchard.Web/Modules/Orchard.Search/ViewModels/{SearchSettingsViewModel.cs => SearchSettingsIndexViewModel.cs} (69%) rename src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/{Search.SiteSettings.cshtml => Search.SiteSettings.Fields.cshtml} (72%) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Index.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs index d919fb4a4..9a5daef45 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs @@ -37,16 +37,18 @@ namespace Orchard.Search.Controllers { public ActionResult Index(PagerParameters pagerParameters, string searchText = "") { var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); - var searchSettingsPart = Services.WorkContext.CurrentSite.As(); + var adminSearchSettingsPart = Services.WorkContext.CurrentSite.As(); + var searchSettingsPart = Services.WorkContext.CurrentSite.As(); IPageOfItems searchHits = new PageOfItems(new ISearchHit[] { }); try { - searchHits = _searchService.Query(searchText, pager.Page, pager.PageSize, - Services.WorkContext.CurrentSite.As().FilterCulture, - searchSettingsPart.SearchIndex, - searchSettingsPart.GetSearchFields(), - searchHit => searchHit); + searchHits = _searchService.Query( + searchText, pager.Page, pager.PageSize, + searchSettingsPart.FilterCulture, + adminSearchSettingsPart.SearchIndex, + searchSettingsPart.GetSearchFields(adminSearchSettingsPart.SearchIndex), + searchHit => searchHit); } catch (Exception exception) { Logger.Error(T("Invalid search query: {0}", exception.Message).Text); diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs index ac0203bef..d7f35f1f7 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs @@ -48,7 +48,7 @@ namespace Orchard.Search.Controllers { var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); var searchSettingsPart = Services.WorkContext.CurrentSite.As(); var searchIndex = searchSettingsPart.SearchIndex; - var searchFields = searchSettingsPart.GetSearchFields(); + var searchFields = searchSettingsPart.GetSearchFields(searchSettingsPart.SearchIndex); var totalCount = 0; var foundIds = new int[0]; diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/AdminSearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/AdminSearchSettingsPartDriver.cs index 1a4d4fab0..8c8bd3dd6 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/AdminSearchSettingsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/AdminSearchSettingsPartDriver.cs @@ -1,12 +1,8 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; +using System.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; -using Orchard.ContentManagement.Handlers; using Orchard.Environment.Extensions; using Orchard.Indexing; -using Orchard.Localization; using Orchard.Search.Models; using Orchard.Search.ViewModels; @@ -18,13 +14,8 @@ namespace Orchard.Search.Drivers { public AdminSearchSettingsPartDriver(IIndexManager indexManager) { _indexManager = indexManager; - T = NullLocalizer.Instance; } - public Localizer T { get; set; } - - protected override string Prefix { get { return "AdminSearchSettings"; } } - protected override DriverResult Editor(AdminSearchSettingsPart part, dynamic shapeHelper) { return Editor(part, null, shapeHelper); @@ -32,51 +23,19 @@ namespace Orchard.Search.Drivers { protected override DriverResult Editor(AdminSearchSettingsPart part, IUpdateModel updater, dynamic shapeHelper) { return ContentShape("Parts_AdminSearch_SiteSettings", () => { - var model = new SearchSettingsViewModel(); - var searchFields = part.SearchFields; + var model = new AdminSearchSettingsViewModel { + AvailableIndexes = _indexManager.GetSearchIndexProvider().List().ToList(), + SelectedIndex = part.SearchIndex + }; if (updater != null) { - if (updater.TryUpdateModel(model, Prefix, null, null)) { + if (updater.TryUpdateModel(model, Prefix, null, new[] { "AvailableIndexes" })) { part.SearchIndex = model.SelectedIndex; - part.SearchFields = model.Entries.ToDictionary(x => x.Index, x => x.Fields.Where(e => e.Selected).Select(e => e.Field).ToArray()); - part.FilterCulture = model.FilterCulture; } } - else if (_indexManager.HasIndexProvider()) { - // viewing editor: build model from part - model.FilterCulture = part.FilterCulture; - model.SelectedIndex = part.SearchIndex; - model.Entries = _indexManager.GetSearchIndexProvider().List().Select(x => { - var indexSettings = new IndexSettingsEntry { - Index = x, - Fields = new List() - }; - foreach (var field in _indexManager.GetSearchIndexProvider().GetFields(x)) { - indexSettings.Fields.Add(new SearchSettingsEntry { Field = field, Selected = (searchFields.ContainsKey(x) && searchFields[x].Contains(field)) }); - } - - return indexSettings; - }).ToList(); - } - + return shapeHelper.EditorTemplate(TemplateName: "Parts/AdminSearch.SiteSettings", Model: model, Prefix: Prefix); - }).OnGroup("admin search"); - } - - protected override void Exporting(AdminSearchSettingsPart part, ExportContentContext context) { - context.Element(part.PartDefinition.Name).Add(new XAttribute("SearchFields", part.Retrieve("SearchFields"))); - } - - protected override void Importing(AdminSearchSettingsPart part, ImportContentContext context) { - var xElement = context.Data.Element(part.PartDefinition.Name); - if (xElement == null) return; - - var searchFields = xElement.Attribute("SearchFields"); - if (searchFields != null) { - searchFields.Remove(); - - part.Store("SearchFields", searchFields.Value); - } + }).OnGroup("search"); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs index cf5b0c8fc..71ffd76b8 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs @@ -29,35 +29,48 @@ namespace Orchard.Search.Drivers { } protected override DriverResult Editor(SearchSettingsPart part, IUpdateModel updater, dynamic shapeHelper) { - return ContentShape("Parts_Search_SiteSettings", () => { - var model = new SearchSettingsViewModel(); - var searchFields = part.SearchFields; + return Combined( + ContentShape("Parts_Search_SiteSettings_Index", () => { + var model = new SearchSettingsIndexViewModel { + SelectedIndex = part.SearchIndex, + AvailableIndexes = _indexManager.GetSearchIndexProvider().List().ToList() + }; - if (updater != null) { - if (updater.TryUpdateModel(model, Prefix, null, null)) { - part.SearchIndex = model.SelectedIndex; - part.SearchFields = model.Entries.ToDictionary(x => x.Index, x => x.Fields.Where(e => e.Selected).Select(e => e.Field).ToArray()); - part.FilterCulture = model.FilterCulture; - } - } - else if (_indexManager.HasIndexProvider()) { - model.FilterCulture = part.FilterCulture; - model.SelectedIndex = part.SearchIndex; - model.Entries = _indexManager.GetSearchIndexProvider().List().Select(x => { - var indexSettings = new IndexSettingsEntry { - Index = x, - Fields = new List() - }; - foreach (var field in _indexManager.GetSearchIndexProvider().GetFields(x)) { - indexSettings.Fields.Add(new SearchSettingsEntry {Field = field, Selected = (searchFields.ContainsKey(x) && searchFields[x].Contains(field))}); + if (updater != null) { + if (updater.TryUpdateModel(model, Prefix, null, null)) { + part.SearchIndex = model.SelectedIndex; } + } - return indexSettings; - }).ToList(); - } + return shapeHelper.EditorTemplate(TemplateName: "Parts/Search.SiteSettings.Index", Model: model, Prefix: Prefix); + }).OnGroup("search"), + ContentShape("Parts_Search_SiteSettings_Fields", () => { + var model = new SearchSettingsFieldsViewModel(); + var searchFields = part.SearchFields; - return shapeHelper.EditorTemplate(TemplateName: "Parts/Search.SiteSettings", Model: model, Prefix: Prefix); - }).OnGroup("search"); + if (updater != null) { + if (updater.TryUpdateModel(model, Prefix, null, null)) { + part.SearchFields = model.Entries.ToDictionary(x => x.Index, x => x.Fields.Where(e => e.Selected).Select(e => e.Field).ToArray()); + part.FilterCulture = model.FilterCulture; + } + } + else if (_indexManager.HasIndexProvider()) { + model.FilterCulture = part.FilterCulture; + model.Entries = _indexManager.GetSearchIndexProvider().List().Select(x => { + var indexSettings = new IndexSettingsEntry { + Index = x, + Fields = new List() + }; + foreach (var field in _indexManager.GetSearchIndexProvider().GetFields(x)) { + indexSettings.Fields.Add(new SearchSettingsEntry { Field = field, Selected = (searchFields.ContainsKey(x) && searchFields[x].Contains(field)) }); + } + + return indexSettings; + }).ToList(); + } + + return shapeHelper.EditorTemplate(TemplateName: "Parts/Search.SiteSettings.Fields", Model: model, Prefix: Prefix); + }).OnGroup("search")); } protected override void Exporting(SearchSettingsPart part, ExportContentContext context) { diff --git a/src/Orchard.Web/Modules/Orchard.Search/Handlers/AdminSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Search/Handlers/AdminSearchSettingsPartHandler.cs index 7d3dfd172..214be3cce 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Handlers/AdminSearchSettingsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Handlers/AdminSearchSettingsPartHandler.cs @@ -18,7 +18,7 @@ namespace Orchard.Search.Handlers { if (context.ContentItem.ContentType != "Site") return; base.GetItemMetadata(context); - context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Admin Search"))); + context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Search"))); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs b/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs index 85161ea28..c4dc9b9fa 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Helpers/SearchSettingsHelper.cs @@ -28,14 +28,6 @@ namespace Orchard.Search.Helpers { return data; } - public static string[] GetSearchFields(this AdminSearchSettingsPart part) { - return part.SearchFields.ContainsKey(part.SearchIndex) ? part.SearchFields[part.SearchIndex] : new string[0]; - } - - public static string[] GetSearchFields(this SearchSettingsPart part) { - return GetSearchFields(part, part.SearchIndex); - } - public static string[] GetSearchFields(this SearchSettingsPart part, string index) { return part.SearchFields.ContainsKey(index) ? part.SearchFields[index] : new string[0]; } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Models/AdminSearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.Search/Models/AdminSearchSettingsPart.cs index 9df92e714..3ce1c6f7c 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Models/AdminSearchSettingsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Models/AdminSearchSettingsPart.cs @@ -1,27 +1,10 @@ -using System.Collections.Generic; -using Orchard.ContentManagement; +using Orchard.ContentManagement; using Orchard.Environment.Extensions; -using Orchard.Search.Helpers; namespace Orchard.Search.Models { [OrchardFeature("Orchard.Search.Content")] public class AdminSearchSettingsPart : ContentPart { - public IDictionary SearchFields { - get { - var data = Retrieve("SearchFields") ?? "Admin:body,title"; - return SearchSettingsHelper.DeserializeSearchFields(data); - } - set { - var data = SearchSettingsHelper.SerializeSearchFields(value); - Store("SearchFields", data); - } - } - - public bool FilterCulture { - get { return this.Retrieve(x => x.FilterCulture); } - set { this.Store(x => x.FilterCulture, value); } - } - + public string SearchIndex { get { return this.Retrieve(x => x.SearchIndex); } set { this.Store(x => x.SearchIndex, value); } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj index e6abe181b..8666ebd09 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj +++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj @@ -88,8 +88,9 @@ + - + @@ -114,7 +115,7 @@ - + @@ -163,6 +164,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Placement.info b/src/Orchard.Web/Modules/Orchard.Search/Placement.info index de2ef3913..7d0dc16f1 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Placement.info +++ b/src/Orchard.Web/Modules/Orchard.Search/Placement.info @@ -1,6 +1,7 @@  - - + + + diff --git a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/AdminSearchSettingsViewModel.cs b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/AdminSearchSettingsViewModel.cs new file mode 100644 index 000000000..c6e5ca6ca --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/AdminSearchSettingsViewModel.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Orchard.Search.ViewModels { + public class AdminSearchSettingsViewModel { + public AdminSearchSettingsViewModel() { + AvailableIndexes = new List(); + } + + public string SelectedIndex { get; set; } + public IList AvailableIndexes { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsIndexViewModel.cs similarity index 69% rename from src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs rename to src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsIndexViewModel.cs index d5541734c..5be47b5b5 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsIndexViewModel.cs @@ -1,28 +1,35 @@ -using System.Collections.Generic; - -namespace Orchard.Search.ViewModels { - public class SearchSettingsViewModel { - public SearchSettingsViewModel() { - Entries = new List(); - } - - public string SelectedIndex { get; set; } - public IList Entries { get; set; } - public bool FilterCulture { get; set; } - } - - public class IndexSettingsEntry { - public IndexSettingsEntry() { - Fields = new List(); - } - - public string Index { get; set; } - public IList Fields { get; set; } - } - - public class SearchSettingsEntry { - public string Field { get; set; } - public bool Selected { get; set; } - public int Weight { get; set; } - } +using System.Collections.Generic; + +namespace Orchard.Search.ViewModels { + public class SearchSettingsIndexViewModel { + public SearchSettingsIndexViewModel() { + AvailableIndexes = new List(); + } + public string SelectedIndex { get; set; } + public IList AvailableIndexes { get; set; } + } + + public class SearchSettingsFieldsViewModel { + public SearchSettingsFieldsViewModel() { + Entries = new List(); + } + + public IList Entries { get; set; } + public bool FilterCulture { get; set; } + } + + public class IndexSettingsEntry { + public IndexSettingsEntry() { + Fields = new List(); + } + + public string Index { get; set; } + public IList Fields { get; set; } + } + + public class SearchSettingsEntry { + public string Field { get; set; } + public bool Selected { get; set; } + public int Weight { get; set; } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/AdminSearch.SiteSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/AdminSearch.SiteSettings.cshtml index b0748ef15..de6d071f1 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/AdminSearch.SiteSettings.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/AdminSearch.SiteSettings.cshtml @@ -1,61 +1,12 @@ @using Orchard.Search.ViewModels -@model SearchSettingsViewModel +@model AdminSearchSettingsViewModel @{ - Script.Require("jQuery"); - Script.Include("orchard-search-settings.js"); + var indexOptions = Model.AvailableIndexes.Select(x => new SelectListItem { Text = x, Value = x, Selected = x == Model.SelectedIndex }); }
    - @T("Admin Search") -
    - - - @if (Model.Entries != null && Model.Entries.Any()) { - if (String.IsNullOrWhiteSpace(Model.SelectedIndex)) { - Model.Entries.Insert(0, new IndexSettingsEntry { Index = "" }); - } - - - @T("Select which index to use in search queries.") - - -
      - @{var entryIndex = 0;} - @foreach (var modelEntry in Model.Entries) { - @Html.HiddenFor(m => m.Entries[entryIndex].Index) -
    • - @if (modelEntry.Fields != null && modelEntry.Fields.Any()) { -
        - @{ var fieldIndex = 0;} - @foreach (var fieldEntry in Model.Entries[entryIndex].Fields) { -
      • - @Html.EditorFor(m => m.Entries[entryIndex].Fields[fieldIndex].Selected) - @Html.HiddenFor(m => m.Entries[entryIndex].Fields[fieldIndex].Field) - -
      • - fieldIndex++; - } -
      - } -
    • - entryIndex++; - } -
    - @T("Check any property which should be used for search queries.") - - } - else { - @T("There is currently no index to search from. Please update your index, and check if some indexable content exists.") - } +
    + @Html.LabelFor(m => m.SelectedIndex, T("Admin Index")) + @Html.DropDownListFor(m => m.SelectedIndex, indexOptions) + @Html.Hint(T("The index to search when used in the dashboard."))
    -
    - - @Html.EditorFor(m => m.FilterCulture) - - @T("If checked, search results will only include content items localized in the current culture of the request.") -
    -
    \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Fields.cshtml similarity index 72% rename from src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml rename to src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Fields.cshtml index 044de04db..2f80a7095 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Fields.cshtml @@ -1,63 +1,48 @@ -@using Orchard.Search.ViewModels -@model SearchSettingsViewModel -@{ - Style.Include("orchard-search-admin.css"); -} -
    - @T("Search") -
    - - @if (Model.Entries != null && Model.Entries.Any()) { - if (String.IsNullOrWhiteSpace(Model.SelectedIndex)) { - Model.Entries.Insert(0, new IndexSettingsEntry { Index = "" }); - } - - @Html.Hint(T("Select which index to use by default in search queries.")) - - -
      - @{ - var indexes = Model.Entries.Select(x => x.Index); - var entryIndex = 0; - foreach (var index in indexes) { - var fieldEntries = Model.Entries.Single(x => x.Index == index).Fields; - var entryIndexClosure = entryIndex; - @Html.HiddenFor(m => m.Entries[entryIndex].Index) -
    • -

      @index

      -
        - @{ var fieldIndex = 0; } - @foreach (var fieldEntry in fieldEntries) { - var fieldIndexClosure = fieldIndex; -
      • - @Html.EditorFor(m => m.Entries[entryIndex].Fields[fieldIndex].Selected) - @Html.HiddenFor(m => m.Entries[entryIndex].Fields[fieldIndex].Field) - -
      • - fieldIndex++; - } -
      -
    • - entryIndex++; - } - } -
    - @T("Check any field for each index which should be used for search queries.") - - } - else { - @T("There is currently no index to search from. Please update your index, and check if some indexable content exists.") - } -
    -
    - - @Html.EditorFor(m => m.FilterCulture) - - @T("If checked, search results will only include content items localized in the current culture of the request.") -
    - +@using Orchard.Search.ViewModels +@model SearchSettingsFieldsViewModel +@{ + Style.Include("orchard-search-admin.css"); +} +
    +
    + @if (Model.Entries != null && Model.Entries.Any()) { + +
      + @{ + var indexes = Model.Entries.Select(x => x.Index); + var entryIndex = 0; + foreach (var index in indexes) { + var fieldEntries = Model.Entries.Single(x => x.Index == index).Fields; + var entryIndexClosure = entryIndex; + @Html.HiddenFor(m => m.Entries[entryIndex].Index) +
    • +

      @index

      +
        + @{ var fieldIndex = 0; } + @foreach (var fieldEntry in fieldEntries) { + var fieldIndexClosure = fieldIndex; +
      • + @Html.EditorFor(m => m.Entries[entryIndex].Fields[fieldIndex].Selected) + @Html.HiddenFor(m => m.Entries[entryIndex].Fields[fieldIndex].Field) + +
      • + fieldIndex++; + } +
      +
    • + entryIndex++; + } + } +
    + @T("Check any field for each index which should be used for search queries.") + + } +
    +
    + + @Html.EditorFor(m => m.FilterCulture) + + @T("If checked, search results will only include content items localized in the current culture of the request.") +
    +
    \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Index.cshtml b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Index.cshtml new file mode 100644 index 000000000..74a913e1e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.Index.cshtml @@ -0,0 +1,19 @@ +@using Orchard.Search.ViewModels +@model SearchSettingsIndexViewModel +@{ + var indexOptions = Model.AvailableIndexes.Select(x => new SelectListItem { Text = x, Value = x, Selected = x == Model.SelectedIndex }); +} +
    + @T("Search") +
    + + @if (Model.AvailableIndexes.Any()) { + @Html.LabelFor(m => m.SelectedIndex, T("Index")) + @Html.DropDownListFor(m => m.SelectedIndex, indexOptions) + @Html.Hint(T("Select which index to use by default in search queries.")) + } + else { + @T("There is currently no index to search from. Please update your index, and check if some indexable content exists.") + } +
    +
    \ No newline at end of file