feat: add links to next and prev articles
This commit is contained in:
parent
2fd4b704cd
commit
d114870f87
@ -1,6 +1,8 @@
|
||||
@page "/blog/{year:int}/{month:int}/{day:int}/{slug}"
|
||||
@using Humanizer
|
||||
@using OliverBooth.Data.Blog
|
||||
@using OliverBooth.Services
|
||||
@inject IBlogPostService BlogPostService
|
||||
@model Article
|
||||
|
||||
@if (Model.Post is not { } post)
|
||||
@ -54,6 +56,41 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-6">
|
||||
@if (BlogPostService.GetPreviousPost(post) is { } previousPost)
|
||||
{
|
||||
<small>Previous Post</small>
|
||||
<p class="lead">
|
||||
<a asp-page="Article"
|
||||
asp-route-year="@previousPost.Published.Year.ToString("0000")"
|
||||
asp-route-month="@previousPost.Published.Month.ToString("00")"
|
||||
asp-route-day="@previousPost.Published.Day.ToString("00")"
|
||||
asp-route-slug="@previousPost.Slug">
|
||||
@previousPost.Title
|
||||
</a>
|
||||
</p>
|
||||
}
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-6" style="text-align: right;">
|
||||
@if (BlogPostService.GetNextPost(post) is { } nextPost)
|
||||
{
|
||||
<small>Next Post</small>
|
||||
<p class="lead">
|
||||
<a asp-page="Article"
|
||||
asp-route-year="@nextPost.Published.Year.ToString("0000")"
|
||||
asp-route-month="@nextPost.Published.Month.ToString("00")"
|
||||
asp-route-day="@nextPost.Published.Day.ToString("00")"
|
||||
asp-route-slug="@nextPost.Slug">
|
||||
@nextPost.Title
|
||||
</a>
|
||||
</p>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
@if (post.EnableComments)
|
||||
{
|
||||
<div id="disqus_thread"></div>
|
||||
|
@ -66,6 +66,26 @@ internal sealed class BlogPostService : IBlogPostService
|
||||
.ToArray().Select(CacheAuthor).ToArray();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IBlogPost? GetNextPost(IBlogPost blogPost)
|
||||
{
|
||||
using BlogContext context = _dbContextFactory.CreateDbContext();
|
||||
return context.BlogPosts
|
||||
.Where(p => p.Visibility == BlogPostVisibility.Published)
|
||||
.OrderBy(post => post.Published)
|
||||
.FirstOrDefault(post => post.Published > blogPost.Published);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IBlogPost? GetPreviousPost(IBlogPost blogPost)
|
||||
{
|
||||
using BlogContext context = _dbContextFactory.CreateDbContext();
|
||||
return context.BlogPosts
|
||||
.Where(p => p.Visibility == BlogPostVisibility.Published)
|
||||
.OrderByDescending(post => post.Published)
|
||||
.FirstOrDefault(post => post.Published < blogPost.Published);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public string RenderExcerpt(IBlogPost post, out bool wasTrimmed)
|
||||
{
|
||||
|
@ -34,6 +34,20 @@ public interface IBlogPostService
|
||||
/// <returns>A collection of blog posts.</returns>
|
||||
IReadOnlyList<IBlogPost> GetBlogPosts(int page, int pageSize = 10);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the next blog post from the specified blog post.
|
||||
/// </summary>
|
||||
/// <param name="blogPost">The blog post whose next post to return.</param>
|
||||
/// <returns>The next blog post from the specified blog post.</returns>
|
||||
IBlogPost? GetNextPost(IBlogPost blogPost);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the previous blog post from the specified blog post.
|
||||
/// </summary>
|
||||
/// <param name="blogPost">The blog post whose previous post to return.</param>
|
||||
/// <returns>The previous blog post from the specified blog post.</returns>
|
||||
IBlogPost? GetPreviousPost(IBlogPost blogPost);
|
||||
|
||||
/// <summary>
|
||||
/// Renders the excerpt of the specified blog post.
|
||||
/// </summary>
|
||||
|
Loading…
Reference in New Issue
Block a user