diff --git a/Oqtane.Client/Modules/Admin/SearchResults/Index.razor b/Oqtane.Client/Modules/Admin/SearchResults/Index.razor index 578d266d..ec21ebc1 100644 --- a/Oqtane.Client/Modules/Admin/SearchResults/Index.razor +++ b/Oqtane.Client/Modules/Admin/SearchResults/Index.razor @@ -4,6 +4,7 @@ @inherits ModuleBase @inject NavigationManager NavigationManager @inject ISearchResultsService SearchResultsService +@inject ISettingService SettingService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @@ -65,17 +66,33 @@ @code { public override string RenderMode => RenderModes.Static; - private SearchSortDirections _searchSortDirection = SearchSortDirections.Descending; //default sort by - private SearchSortFields _searchSortField = SearchSortFields.Relevance; + private string _includeEntities; + private string _excludeEntities; + private string _fromDate; + private string _toDate; + private string _pageSize; + private string _sortField; + private string _sortOrder; + private string _bodyLength; + private string _keywords; - private bool _loading; private SearchResults _searchResults; + private bool _loading; [SupplyParameterFromForm(FormName = "SearchInputForm")] public string KeyWords { get => ""; set => _keywords = value; } protected override async Task OnInitializedAsync() { + _includeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_IncludeEntities", ""); + _excludeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ExcludeEntities", ""); + _fromDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_FromDate", DateTime.MinValue.ToString()); + _toDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ToDate", DateTime.MaxValue.ToString()); + _pageSize = SettingService.GetSetting(ModuleState.Settings, "SearchResults_PageSize", int.MaxValue.ToString()); + _sortField = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortField", "Relevance"); + _sortOrder = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortOrder", "Descending"); + _bodyLength = SettingService.GetSetting(ModuleState.Settings, "SearchResults_BodyLength", "255"); + if (_keywords == null && PageState.QueryString.ContainsKey("q")) { _keywords = WebUtility.UrlDecode(PageState.QueryString["q"]); @@ -96,15 +113,20 @@ if (!string.IsNullOrEmpty(_keywords)) { var searchQuery = new SearchQuery - { - SiteId = PageState.Site.SiteId, - Alias = PageState.Alias, - Keywords = _keywords, - SortDirection = _searchSortDirection, - SortField = _searchSortField, - PageIndex = 0, - PageSize = int.MaxValue - }; + { + SiteId = PageState.Site.SiteId, + Alias = PageState.Alias, + Keywords = _keywords, + IncludeEntities = _includeEntities, + ExcludeEntities = _excludeEntities, + FromDate = (!string.IsNullOrEmpty(_fromDate)) ? DateTime.Parse(_fromDate) : DateTime.MinValue, + ToDate = (!string.IsNullOrEmpty(_toDate)) ? DateTime.Parse(_toDate) : DateTime.MaxValue, + PageSize = (!string.IsNullOrEmpty(_pageSize)) ? int.Parse(_pageSize) : int.MaxValue, + PageIndex = 0, + SortField = (!string.IsNullOrEmpty(_sortField)) ? (SearchSortField)Enum.Parse(typeof(SearchSortField), _sortField) : SearchSortField.Relevance, + SortOrder = (!string.IsNullOrEmpty(_sortOrder)) ? (SearchSortOrder)Enum.Parse(typeof(SearchSortOrder), _sortOrder) : SearchSortOrder.Descending, + BodyLength = (!string.IsNullOrEmpty(_bodyLength)) ? int.Parse(_bodyLength) : 255 + }; _searchResults = await SearchResultsService.GetSearchResultsAsync(searchQuery); } diff --git a/Oqtane.Client/Modules/Admin/SearchResults/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/SearchResults/ModuleInfo.cs new file mode 100644 index 00000000..e848f845 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/SearchResults/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Documentation; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Modules.Admin.SearchResults +{ + [PrivateApi("Mark this as private, since it's not very useful in the public docs")] + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "Search Results", + Description = "Search Results", + Categories = "Admin", + Version = Constants.Version, + SettingsType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client" + }; + } +} diff --git a/Oqtane.Client/Modules/Admin/SearchResults/Settings.razor b/Oqtane.Client/Modules/Admin/SearchResults/Settings.razor new file mode 100644 index 00000000..42b88063 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/SearchResults/Settings.razor @@ -0,0 +1,123 @@ +@namespace Oqtane.Modules.Admin.SearchResults +@inherits ModuleBase +@inject ISettingService SettingService +@implements Oqtane.Interfaces.ISettingsControl +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + @Localizer["To"] + +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +@code { + private string resourceType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client"; // for localization + + private ElementReference form; + private bool validated = false; + + private string _includeEntities; + private string _excludeEntities; + private DateTime? _fromDate = null; + private DateTime? _toDate = null; + private string _pageSize; + private string _sortField; + private string _sortOrder; + private string _bodyLength; + + protected override void OnInitialized() + { + try + { + _includeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_IncludeEntities", ""); + _excludeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ExcludeEntities", ""); + var fromDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_FromDate", ""); + _fromDate = (string.IsNullOrEmpty(fromDate)) ? null : DateTime.Parse(fromDate); + var toDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ToDate", ""); + _toDate = (string.IsNullOrEmpty(toDate)) ? null : DateTime.Parse(toDate); + _pageSize = SettingService.GetSetting(ModuleState.Settings, "SearchResults_PageSize", ""); + _sortField = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortField", "Relevance"); + _sortOrder = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortOrder", "Descending"); + _bodyLength = SettingService.GetSetting(ModuleState.Settings, "SearchResults_BodyLength", "255"); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } + + public async Task UpdateSettings() + { + try + { + var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + settings = SettingService.SetSetting(settings, "SearchResults_IncludeEntities", _includeEntities); + settings = SettingService.SetSetting(settings, "SearchResults_ExcludeEntities", _excludeEntities); + settings = SettingService.SetSetting(settings, "SearchResults_From", _fromDate.ToString()); + settings = SettingService.SetSetting(settings, "SearchResults_To", _toDate.ToString()); + settings = SettingService.SetSetting(settings, "SearchResults_PageSize", _pageSize); + settings = SettingService.SetSetting(settings, "SearchResults_SortField", _sortField); + settings = SettingService.SetSetting(settings, "SearchResults_SortOrder", _sortOrder); + settings = SettingService.SetSetting(settings, "SearchResults_BodyLength", _bodyLength); + await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } +} diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 3c53c820..32451d46 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -568,20 +568,24 @@ { if (!string.IsNullOrEmpty(resource.Url)) { - if (!resource.Reload) - { + // if (!resource.Reload) + // { var url = (resource.Url.Contains("://")) ? resource.Url : alias.BaseUrl + resource.Url; + if (resource.Reload) + { + url += "?" + Guid.NewGuid().ToString("N"); + } return ""; // src at end of element due to enhanced navigation patch algorithm - } - else - { - // use custom element which can execute script on every page transition - return ""; - } + // } + // else + // { + // // use custom element which can execute script on every page transition + // return ""; + // } } else { diff --git a/Oqtane.Server/Providers/DatabaseSearchProvider.cs b/Oqtane.Server/Providers/DatabaseSearchProvider.cs index a2313c59..0b5a1921 100644 --- a/Oqtane.Server/Providers/DatabaseSearchProvider.cs +++ b/Oqtane.Server/Providers/DatabaseSearchProvider.cs @@ -74,7 +74,7 @@ namespace Oqtane.Providers prefix = string.Empty; } - var length = searchQuery.BodySnippetLength; + var length = searchQuery.BodyLength; if (start + length >= content.Length) { length = content.Length - start; @@ -88,7 +88,7 @@ namespace Oqtane.Providers if (string.IsNullOrEmpty(snippet)) { - snippet = content.Substring(0, searchQuery.BodySnippetLength); + snippet = content.Substring(0, searchQuery.BodyLength); } foreach (var keyword in SearchUtils.GetKeywords(searchQuery.Keywords)) diff --git a/Oqtane.Server/Repository/SearchContentRepository.cs b/Oqtane.Server/Repository/SearchContentRepository.cs index cdc07513..8047ae95 100644 --- a/Oqtane.Server/Repository/SearchContentRepository.cs +++ b/Oqtane.Server/Repository/SearchContentRepository.cs @@ -37,14 +37,14 @@ namespace Oqtane.Repository searchContents = searchContents.Where(i => !searchQuery.ExcludeEntities.Split(',', StringSplitOptions.RemoveEmptyEntries).Contains(i.EntityName)); } - if (searchQuery.From != DateTime.MinValue) + if (searchQuery.FromDate != DateTime.MinValue) { - searchContents = searchContents.Where(i => i.ContentModifiedOn >= searchQuery.From); + searchContents = searchContents.Where(i => i.ContentModifiedOn >= searchQuery.FromDate); } - if (searchQuery.To != DateTime.MinValue) + if (searchQuery.ToDate != DateTime.MaxValue) { - searchContents = searchContents.Where(i => i.ContentModifiedOn <= searchQuery.To); + searchContents = searchContents.Where(i => i.ContentModifiedOn <= searchQuery.ToDate); } if (searchQuery.Properties != null && searchQuery.Properties.Any()) diff --git a/Oqtane.Server/Services/SearchService.cs b/Oqtane.Server/Services/SearchService.cs index 29323071..6bf7689d 100644 --- a/Oqtane.Server/Services/SearchService.cs +++ b/Oqtane.Server/Services/SearchService.cs @@ -45,14 +45,14 @@ namespace Oqtane.Services .DistinctBy(i => i.Url); // sort results - if (searchQuery.SortDirection == SearchSortDirections.Descending) + if (searchQuery.SortOrder == SearchSortOrder.Descending) { switch (searchQuery.SortField) { - case SearchSortFields.Relevance: + case SearchSortField.Relevance: results = results.OrderByDescending(i => i.Score).ThenByDescending(i => i.ContentModifiedOn); break; - case SearchSortFields.Title: + case SearchSortField.Title: results = results.OrderByDescending(i => i.Title).ThenByDescending(i => i.ContentModifiedOn); break; default: @@ -64,10 +64,10 @@ namespace Oqtane.Services { switch (searchQuery.SortField) { - case SearchSortFields.Relevance: + case SearchSortField.Relevance: results = results.OrderBy(i => i.Score).ThenByDescending(i => i.ContentModifiedOn); break; - case SearchSortFields.Title: + case SearchSortField.Title: results = results.OrderBy(i => i.Title).ThenByDescending(i => i.ContentModifiedOn); break; default: diff --git a/Oqtane.Shared/Enums/SearchSortFields.cs b/Oqtane.Shared/Enums/SearchSortField.cs similarity index 66% rename from Oqtane.Shared/Enums/SearchSortFields.cs rename to Oqtane.Shared/Enums/SearchSortField.cs index c8e16175..e84596b5 100644 --- a/Oqtane.Shared/Enums/SearchSortFields.cs +++ b/Oqtane.Shared/Enums/SearchSortField.cs @@ -1,8 +1,6 @@ -using System; - namespace Oqtane.Shared { - public enum SearchSortFields + public enum SearchSortField { Relevance, Title, diff --git a/Oqtane.Shared/Enums/SearchSortDirections.cs b/Oqtane.Shared/Enums/SearchSortOrder.cs similarity index 60% rename from Oqtane.Shared/Enums/SearchSortDirections.cs rename to Oqtane.Shared/Enums/SearchSortOrder.cs index 62c7f08d..7b6482ac 100644 --- a/Oqtane.Shared/Enums/SearchSortDirections.cs +++ b/Oqtane.Shared/Enums/SearchSortOrder.cs @@ -1,8 +1,6 @@ -using System; - namespace Oqtane.Shared { - public enum SearchSortDirections + public enum SearchSortOrder { Ascending, Descending diff --git a/Oqtane.Shared/Models/SearchQuery.cs b/Oqtane.Shared/Models/SearchQuery.cs index d3f8ac0c..3f08a639 100644 --- a/Oqtane.Shared/Models/SearchQuery.cs +++ b/Oqtane.Shared/Models/SearchQuery.cs @@ -16,9 +16,9 @@ namespace Oqtane.Models public string ExcludeEntities { get; set; } = ""; // comma delimited entities to exclude - public DateTime From { get; set; } + public DateTime FromDate { get; set; } - public DateTime To { get; set; } + public DateTime ToDate { get; set; } public IDictionary Properties { get; set; } = new Dictionary(); @@ -26,10 +26,10 @@ namespace Oqtane.Models public int PageSize { get; set; } - public SearchSortFields SortField { get; set; } + public SearchSortField SortField { get; set; } - public SearchSortDirections SortDirection { get; set; } + public SearchSortOrder SortOrder { get; set; } - public int BodySnippetLength { get; set;} = 255; + public int BodyLength { get; set;} = 255; } }