@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; } }