@page "/articles/search"
@page "/articles/search/{SearchTerms}"
@using Microsoft.EntityFrameworkCore
@using Microsoft.Extensions.Logging
@using MudBlazor
@using OpenArchival.DataAccess
@using System.Linq
@using System.Text.RegularExpressions
@using System.Net
@{
if (_showMostRecent && PostSearch.TotalResults > 0)
{
Most Recent Posts:
}
else if (PostSearch.TotalResults > 0)
{
@PostSearch.TotalResults results found
Clear
}
}
@if (PostSearch.SearchResults.Count > 0)
{
@foreach (var post in PostSearch.SearchResults)
{
@if (post.MainPhoto != null)
{
}
else
{
}
@post.Title
@CreateContentSnippet(post.Content)
}
}
@inject IDbContextFactory ContextFactory;
@inject ILogger Logger;
@inject NavigationManager NavigationManager;
@inject BlogPostSearch PostSearch;
@code {
[Parameter]
public string SearchTerms { get; set; } = "";
private BlogSearchFilterType _selectedFilter = BlogSearchFilterType.All;
private BlogPostSearchBar _searchBar = default!;
// List for the "no results" slider display
private List _sliderEntries { get; set; } = [];
private bool _showMostRecent = true;
protected override async Task OnParametersSetAsync()
{
// This runs when the page loads, checking for search terms in the URL
if (string.IsNullOrWhiteSpace(SearchTerms))
{
await PostSearch.Search("", _selectedFilter, 1);
_showMostRecent = true;
}
else
{
await PostSearch.Search(SearchTerms, _selectedFilter, 1);
_showMostRecent = false;
}
}
///
/// This is called by the SearchBar component's 'SearchTermsChanged' event.
///
private async Task PerformSearchAsyncCallback(string searchTerms)
{
if (string.IsNullOrEmpty(searchTerms))
{
_showMostRecent = true;
} else
{
_showMostRecent = false;
}
SearchTerms = searchTerms; // Update the page's parameter
// Update the URL to reflect the new search
NavigationManager.NavigateTo($"/articles/search/{Uri.EscapeDataString(searchTerms)}", replace: true);
// Perform the search (always start on page 1)
await PostSearch.Search(searchTerms, _selectedFilter, 1);
StateHasChanged(); // Re-render the page with results
}
///
/// This is called by the MudPagination's 'SelectedChanged' event.
///
private async Task OnPageChangedAsync(int page)
{
// Load the specific page using the service
await PostSearch.LoadPageAsync(page);
StateHasChanged(); // Re-render with the new page's data
}
///
/// Clears the search results and state.
///
private void OnClearResults()
{
PostSearch.ClearResults();
SearchTerms = "";
// Navigate back to the base search page
NavigationManager.NavigateTo("/articles/search", replace: true);
StateHasChanged();
}
public static string CreateContentSnippet(string html, int maxLength = 150)
{
if (string.IsNullOrEmpty(html))
{
return string.Empty;
}
// Strip HTML tags
string plainText = Regex.Replace(html, @"<[^>]+>", string.Empty);
// Decode HTML entities
plainText = WebUtility.HtmlDecode(plainText).Trim();
if (plainText.Length > maxLength)
{
return plainText.Substring(0, maxLength) + "...";
}
return plainText;
}
}