Browse Source

Add filtered tags to UI

pull/17925/head
Enis Necipoglu 3 years ago
parent
commit
1f2e5e74cf
No known key found for this signature in database GPG Key ID: 1EC55E13241E1680
  1. 3
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs
  2. 14
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  3. 8
      modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs
  4. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml
  5. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml
  6. 71
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml
  7. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs

3
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs

@ -17,5 +17,8 @@ public interface IBlogPostPublicAppService : IApplicationService
Task<PagedResultDto<CmsUserDto>> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); Task<PagedResultDto<CmsUserDto>> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input);
Task<CmsUserDto> GetAuthorHasBlogPostAsync(Guid id); Task<CmsUserDto> GetAuthorHasBlogPostAsync(Guid id);
Task DeleteAsync(Guid id); Task DeleteAsync(Guid id);
Task<string> GetTagNameAsync([NotNull] Guid tagId);
} }

14
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs

@ -12,6 +12,7 @@ using Volo.CmsKit.Blogs;
using Volo.CmsKit.Contents; using Volo.CmsKit.Contents;
using Volo.CmsKit.Features; using Volo.CmsKit.Features;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Tags;
using Volo.CmsKit.Users; using Volo.CmsKit.Users;
namespace Volo.CmsKit.Public.Blogs; namespace Volo.CmsKit.Public.Blogs;
@ -24,12 +25,16 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub
protected IBlogPostRepository BlogPostRepository { get; } protected IBlogPostRepository BlogPostRepository { get; }
protected ITagRepository TagRepository { get; }
public BlogPostPublicAppService( public BlogPostPublicAppService(
IBlogRepository blogRepository, IBlogRepository blogRepository,
IBlogPostRepository blogPostRepository) IBlogPostRepository blogPostRepository,
ITagRepository tagRepository)
{ {
BlogRepository = blogRepository; BlogRepository = blogRepository;
BlogPostRepository = blogPostRepository; BlogPostRepository = blogPostRepository;
TagRepository = tagRepository;
} }
public virtual async Task<BlogPostCommonDto> GetAsync( public virtual async Task<BlogPostCommonDto> GetAsync(
@ -85,4 +90,11 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub
await BlogPostRepository.DeleteAsync(id); await BlogPostRepository.DeleteAsync(id);
} }
public async Task<string> GetTagNameAsync([NotNull] Guid tagId)
{
var tag = await TagRepository.GetAsync(tagId);
return tag.Name;
}
} }

8
modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
@ -60,4 +61,11 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub
{ {
return BlogPostPublicAppService.DeleteAsync(id); return BlogPostPublicAppService.DeleteAsync(id);
} }
[HttpGet]
[Route("tags/{id}")]
public Task<string> GetTagNameAsync([NotNull] Guid tagId)
{
return BlogPostPublicAppService.GetTagNameAsync(tagId);
}
} }

4
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml

@ -10,14 +10,14 @@
{ {
if (Model.UrlFormat.IsNullOrWhiteSpace()) if (Model.UrlFormat.IsNullOrWhiteSpace())
{ {
<span class="badge rounded-pill bg-light text-dark px-3 py-2 cmskit-tag font-weight-normal"> <span class="badge rounded-pill text-bg-secondary cmskit-tag font-weight-normal">
@tag.Name @tag.Name
</span> </span>
} }
else else
{ {
var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name); var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name);
<a href="@formattedUrl"><span class="badge rounded-pill bg-light text-dark px-3 py-2 cmskit-tag font-weight-normal">@tag.Name</span></a> <a href="@formattedUrl"><span class="badge rounded-pill text-bg-secondary cmskit-tag font-weight-normal">@tag.Name</span></a>
} }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml

@ -10,6 +10,7 @@
@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs
@using Volo.CmsKit.Contents @using Volo.CmsKit.Contents
@using Volo.CmsKit.Web
@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents @using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents
@inherits CmsKitPublicPageBase @inherits CmsKitPublicPageBase
@ -62,7 +63,7 @@
<div class="col-lg-8 col-md-10 mx-auto pb-4"> <div class="col-lg-8 col-md-10 mx-auto pb-4">
<h1 class="mt-lg-4 mt-md-3">@Model.ViewModel.Title</h1> <h1 class="mt-lg-4 mt-md-3">@Model.ViewModel.Title</h1>
<p class="mb-lg-5 mb-md-3"> <p class="mb-lg-5 mb-md-3">
<a href="/blogs/@Model.BlogSlug?authorId=@Model.ViewModel.Author.Id"> <a href="/@CmsBlogsWebConsts.BlogsRoutePrefix/@Model.BlogSlug?authorId=@Model.ViewModel.Author.Id">
<span class="font-weight-bold">@@@Model.ViewModel.Author?.UserName</span> <span class="font-weight-bold">@@@Model.ViewModel.Author?.UserName</span>
</a> </a>
<small style="opacity:.65;">@Model.ViewModel.CreationTime</small> <small style="opacity:.65;">@Model.ViewModel.CreationTime</small>
@ -89,7 +90,7 @@
{ {
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
entityId = Model.ViewModel.Id.ToString(), entityId = Model.ViewModel.Id.ToString(),
urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" urlFormat = $"/{CmsBlogsWebConsts.BlogsRoutePrefix}/{Model.BlogSlug}?tagId={{TagId}}"
}) })
} }
} }

71
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml

@ -2,18 +2,19 @@
@using Volo.CmsKit.Public.Web.Pages @using Volo.CmsKit.Public.Web.Pages
@using Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs @using Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs
@using Volo.CmsKit.Web
@inherits CmsKitPublicPageBase @inherits CmsKitPublicPageBase
@model IndexModel @model IndexModel
@section styles{ @section styles {
<abp-style src="/Pages/Public/CmsKit/Blogs/index.css"/> <abp-style src="/Pages/Public/CmsKit/Blogs/index.css" />
} }
@section scripts { @section scripts {
<abp-script-bundle> <abp-script-bundle>
<abp-script src="/Pages/Public/CmsKit/Blogs/index.js"/> <abp-script src="/Pages/Public/CmsKit/Blogs/index.js" />
</abp-script-bundle> </abp-script-bundle>
} }
@ -21,29 +22,43 @@
const string dummyImageSource = "https://dummyimage.com/320x180/a3a3a3/fff.png"; const string dummyImageSource = "https://dummyimage.com/320x180/a3a3a3/fff.png";
} }
<abp-row id="blogs-filter-area"> @if (Model.AuthorId.HasValue)
<abp-column size="_4"> {
<div class="mb-3"> <abp-row id="blogs-filter-area">
<label class="form-label" asp-for="@Model.SelectedAuthor"></label> <abp-column size="_4">
<div class="mb-3">
<label class="form-label" asp-for="@Model.SelectedAuthor"></label>
<select id="AuthorSelect" asp-for="@Model.AuthorId" <select id="AuthorSelect" asp-for="@Model.AuthorId"
class="auto-complete-select" class="auto-complete-select"
data-placeholder="@L["SelectAnAuthor"]" data-placeholder="@L["SelectAnAuthor"]"
data-allow-clear="true" data-allow-clear="true"
data-autocomplete-api-url="/api/cms-kit-public/blog-posts/authors" data-autocomplete-api-url="/api/cms-kit-public/blog-posts/authors"
data-autocomplete-display-property="userName" data-autocomplete-display-property="userName"
data-autocomplete-value-property="id" data-autocomplete-value-property="id"
data-autocomplete-items-property="items" data-autocomplete-items-property="items"
data-autocomplete-filter-param-name="filter"> data-autocomplete-filter-param-name="filter">
@if (Model.SelectedAuthor != null)
{
<option selected value="@Model.AuthorId" selected="selected">@Model.SelectedAuthor.UserName</option>
}
</select>
</div>
</abp-column>
</abp-row>
<hr />
}
@if (Model.TagId.HasValue)
{
<h2>@L["Tags"]</h2>
<span class="badge rounded-pill text-bg-secondary">@Model.FilteredTagName
<a href="/@CmsBlogsWebConsts.BlogsRoutePrefix/@Model.BlogSlug" class="text-bg-secondary"><i class="fa fa-close ms-1"></i></a>
</span>
<hr />
}
@if(Model.SelectedAuthor != null)
{
<option selected value="@Model.AuthorId" selected="selected">@Model.SelectedAuthor.UserName</option>
}
</select>
</div>
</abp-column>
</abp-row>
<abp-row id="blogs-container"> <abp-row id="blogs-container">
@foreach (var blog in Model.Blogs.Items) @foreach (var blog in Model.Blogs.Items)
{ {
@ -51,11 +66,11 @@
<abp-card> <abp-card>
@if (blog.CoverImageMediaId != null) @if (blog.CoverImageMediaId != null)
{ {
<img src="/api/cms-kit/media/@blog.CoverImageMediaId" class="card-img-top" onerror="this.src='@dummyImageSource'"/> <img src="/api/cms-kit/media/@blog.CoverImageMediaId" class="card-img-top" onerror="this.src='@dummyImageSource'" />
} }
else else
{ {
<img src="@(dummyImageSource)?text=@blog.Title" class="card-img-top"/> <img src="@(dummyImageSource)?text=@blog.Title" class="card-img-top" />
} }
<abp-card-body class="p-4"> <abp-card-body class="p-4">
<h5>@blog.Title</h5> <h5>@blog.Title</h5>
@ -65,7 +80,7 @@
</p> </p>
<p style="min-height: 60px;">@blog.ShortDescription</p> <p style="min-height: 60px;">@blog.ShortDescription</p>
<div class="d-grid gap-2"> <div class="d-grid gap-2">
<a href="/blogs/@Model.BlogSlug/@blog.Slug" class="btn btn-light"> <a href="/@CmsBlogsWebConsts.BlogsRoutePrefix/@Model.BlogSlug/@blog.Slug" class="btn btn-light">
@L["Read"] @L["Read"]
</a> </a>
</div> </div>
@ -76,6 +91,6 @@
</abp-row> </abp-row>
<abp-row> <abp-row>
<abp-column> <abp-column>
<abp-paginator model="Model.PagerModel"/> <abp-paginator model="Model.PagerModel" />
</abp-column> </abp-column>
</abp-row> </abp-row>

9
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs

@ -31,6 +31,8 @@ public class IndexModel : CmsKitPublicPageModelBase
public CmsUserDto SelectedAuthor { get; protected set; } public CmsUserDto SelectedAuthor { get; protected set; }
public string FilteredTagName { get; protected set; }
protected IBlogPostPublicAppService BlogPostPublicAppService { get; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; }
public IndexModel(IBlogPostPublicAppService blogPostPublicAppService) public IndexModel(IBlogPostPublicAppService blogPostPublicAppService)
@ -54,7 +56,12 @@ public class IndexModel : CmsKitPublicPageModelBase
{ {
SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value); SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value);
} }
if (TagId is not null)
{
FilteredTagName = await BlogPostPublicAppService.GetTagNameAsync(TagId.Value);
}
return Page(); return Page();
} }
} }

Loading…
Cancel
Save