refactoring the code.

This commit is contained in:
Ben
2024-06-04 17:32:31 +08:00
parent 9d85ca07f4
commit 7f970d489f
51 changed files with 806 additions and 700 deletions

View File

@ -1,22 +1,26 @@
@using Oqtane.Modules.SearchResults.Services
@namespace Oqtane.Modules.SearchResults
@using Microsoft.AspNetCore.Http
@using Oqtane.Services
@using System.Net
@namespace Oqtane.Modules.Admin.SearchResults
@inherits ModuleBase
@inject ISearchResultsService SearchResultsService
@inject IStringLocalizer<Index> Localizer
@inject IHttpContextAccessor HttpContext
<div class="search-result-container">
<div class="row">
<div class="col">
<div class="input-group mb-3">
<span class="input-group-text">@Localizer["SearchPrefix"]</span>
<input type="text" class="form-control shadow-none" maxlength="50"
aria-label="Keywords"
placeholder="@Localizer["SearchPlaceholder"]"
@bind="_keywords"
@bind:event="oninput"
@onkeypress="KeywordsChanged">
<button class="btn btn-primary shadow-none" type="button" @onclick="@(async () => await Search())">@Localizer["Search"]</button>
</div>
<form method="post" @formname="SearchInputForm" @onsubmit="@(async () => await Search())" data-enhance>
<div class="input-group mb-3">
<span class="input-group-text">@Localizer["SearchPrefix"]</span>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<input type="text" name="keywords" class="form-control shadow-none" maxlength="50"
aria-label="Keywords"
placeholder="@Localizer["SearchPlaceholder"]"
@bind-value="_keywords">
<button class="btn btn-primary shadow-none" type="submit">@Localizer["Search"]</button>
</div>
</form>
</div>
</div>
<div class="row">
@ -35,12 +39,13 @@
Format="Grid"
PageSize="@_pageSize.ToString()"
DisplayPages="@_displayPages.ToString()"
CurrentPage="@_currentPage.ToString()" Columns="1"
Toolbar="Bottom">
CurrentPage="@_currentPage.ToString()"
Columns="1"
Toolbar="Bottom"
Parameters="@($"q={_keywords}")">
<Row>
<div class="search-item">
<h4 class="mb-1"><a href="@context.Url">@context.Title</a></h4>
<div class="font-13 text-success mb-3">@context.Url</div>
<p class="mb-0 text-muted">@((MarkupString)context.Snippet)</p>
</div>
</Row>
@ -59,13 +64,16 @@
</div>
</div>
@code {
public override string RenderMode => RenderModes.Static;
private const int SearchDefaultPageSize = 10;
private SearchSortDirections _searchSortDirection = SearchSortDirections.Descending; //default sort by
private SearchSortFields _searchSortField = SearchSortFields.Relevance;
private string _keywords;
private bool _loading;
private SearchResults _searchResults;
private int _currentPage = 0;
private int _pageSize = Constants.SearchDefaultPageSize;
private int _pageSize = SearchDefaultPageSize;
private int _displayPages = 7;
protected override async Task OnInitializedAsync()
@ -75,18 +83,9 @@
_pageSize = int.Parse(ModuleState.Settings["PageSize"]);
}
if (PageState.QueryString.ContainsKey("s"))
if (PageState.QueryString.ContainsKey("q"))
{
_keywords = PageState.QueryString["s"];
}
if (PageState.QueryString.ContainsKey("p"))
{
_currentPage = Convert.ToInt32(PageState.QueryString["p"]);
if (_currentPage < 1)
{
_currentPage = 1;
}
_keywords = WebUtility.UrlDecode(PageState.QueryString["q"]);
}
if (!string.IsNullOrEmpty(_keywords))
@ -95,19 +94,9 @@
}
}
private async Task KeywordsChanged(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
if (!string.IsNullOrEmpty(_keywords))
{
await Search();
}
}
}
private async Task Search()
{
_keywords = HttpContext.HttpContext.Request.Form["keywords"];
if (string.IsNullOrEmpty(_keywords))
{
AddModuleMessage(Localizer["MissingKeywords"], MessageType.Warning);
@ -116,7 +105,6 @@
{
ClearModuleMessage();
_currentPage = 0;
await PerformSearch();
}

View File

@ -3,19 +3,18 @@ using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.SearchResults
namespace Oqtane.Modules.Admin.SearchResults
{
[PrivateApi("Mark SearchResults classes as private, since it's not very useful in the public docs")]
[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 = "Display Search Results",
Version = "1.0.0",
Version = Constants.Version,
ServerManagerType = "",
ReleaseVersions = "1.0.0",
SettingsType = "Oqtane.Modules.SearchResults.Settings, Oqtane.Client",
SettingsType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client",
Resources = new List<Resource>()
{
new Resource { ResourceType = ResourceType.Stylesheet, Url = "~/Module.css" }

View File

@ -1,7 +1,7 @@
@namespace Oqtane.Modules.SearchResults
@namespace Oqtane.Modules.Admin.SearchResults
@inherits ModuleBase
@inject ISettingService SettingService
@implements Oqtane.Interfaces.ISettingsControl
@inject ISettingService SettingService
@inject IStringLocalizer<Settings> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@ -15,14 +15,16 @@
</div>
@code {
private string resourceType = "Oqtane.Modules.SearchResults.Settings, Oqtane.Client"; // for localization
private const string SearchDefaultPageSize = "10";
private string resourceType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client"; // for localization
private string _pageSize;
protected override void OnInitialized()
{
try
{
_pageSize = SettingService.GetSetting(ModuleState.Settings, "PageSize", Constants.SearchDefaultPageSize.ToString());
_pageSize = SettingService.GetSetting(ModuleState.Settings, "PageSize", SearchDefaultPageSize);
}
catch (Exception ex)
{

View File

@ -1,23 +0,0 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Services;
using Oqtane.Shared;
namespace Oqtane.Modules.SearchResults.Services
{
[PrivateApi("Mark SearchResults classes as private, since it's not very useful in the public docs")]
public class SearchResultsService : ServiceBase, ISearchResultsService, IClientService
{
public SearchResultsService(HttpClient http, SiteState siteState) : base(http, siteState) {}
private string ApiUrl => CreateApiUrl("SearchResults");
public async Task<Models.SearchResults> SearchAsync(int moduleId, SearchQuery searchQuery)
{
return await PostJsonAsync<SearchQuery, Models.SearchResults>(CreateAuthorizationPolicyUrl(ApiUrl, EntityNames.Module, moduleId), searchQuery);
}
}
}

View File

@ -3,11 +3,11 @@ using System.Threading.Tasks;
using Oqtane.Documentation;
using Oqtane.Models;
namespace Oqtane.Modules.SearchResults.Services
namespace Oqtane.Services
{
[PrivateApi("Mark SearchResults classes as private, since it's not very useful in the public docs")]
public interface ISearchResultsService
{
Task<Models.SearchResults> SearchAsync(int moduleId, SearchQuery searchQuery);
Task<SearchResults> SearchAsync(int moduleId, SearchQuery searchQuery);
}
}

View File

@ -0,0 +1,23 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Modules;
using Oqtane.Shared;
namespace Oqtane.Services
{
[PrivateApi("Don't show in the documentation, as everything should use the Interface")]
public class SearchResultsService : ServiceBase, ISearchResultsService, IClientService
{
public SearchResultsService(HttpClient http, SiteState siteState) : base(http, siteState) { }
private string ApiUrl => CreateApiUrl("SearchResults");
public async Task<SearchResults> SearchAsync(int moduleId, SearchQuery searchQuery)
{
return await PostJsonAsync<SearchQuery, SearchResults>(CreateAuthorizationPolicyUrl(ApiUrl, EntityNames.Module, moduleId), searchQuery);
}
}
}

View File

@ -16,7 +16,7 @@
@bind-value="_keywords"
placeholder="@Localizer["SearchPlaceHolder"]"
aria-label="Search" />
<button type="submit" class="btn btn-search" @onclick="PerformSearch">
<button type="submit" class="btn btn-search">
<span class="oi oi-magnifying-glass align-middle"></span>
</button>
</form>
@ -26,7 +26,7 @@
@code {
private const string SearchResultPagePath = "search-results";
private const string SearchResultPagePath = "search";
private Page _searchResultsPage;
private string _keywords = "";
@ -48,7 +48,7 @@
var keywords = HttpContext.HttpContext.Request.Form["keywords"];
if (!string.IsNullOrEmpty(keywords) && _searchResultsPage != null)
{
var url = NavigateUrl(_searchResultsPage.Path, $"s={keywords}");
var url = NavigateUrl(_searchResultsPage.Path, $"q={keywords}");
NavigationManager.NavigateTo(url);
}
}