diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs new file mode 100644 index 0000000000..96e4d2dfe8 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Admin.Blogs +{ + public class BlogPostGetListInput : PagedAndSortedResultRequestDto + { + public string Filter { get; set; } + + public Guid? BlogId { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index ba144167a8..cb7364247d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -1,8 +1,5 @@ using System; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.Content; namespace Volo.CmsKit.Admin.Blogs { @@ -10,7 +7,7 @@ namespace Volo.CmsKit.Admin.Blogs : ICrudAppService< BlogPostDto, Guid, - PagedAndSortedResultRequestDto, + BlogPostGetListInput, CreateBlogPostDto, UpdateBlogPostDto> { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 1d273f6a9c..670256b810 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -3,10 +3,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.BlobStoring; -using Volo.Abp.Content; -using Volo.Abp.Domain.Repositories; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; using Volo.CmsKit.Blogs; @@ -87,20 +83,15 @@ namespace Volo.CmsKit.Admin.Blogs } [Authorize(CmsKitAdminPermissions.BlogPosts.Default)] - public virtual async Task> GetListAsync(PagedAndSortedResultRequestDto input) + public virtual async Task> GetListAsync(BlogPostGetListInput input) { - if (input.Sorting.IsNullOrEmpty()) - { - input.Sorting = nameof(BlogPost.CreationTime) + " desc"; - } - - var blogPosts = await BlogPostRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, input.Sorting, includeDetails: true); + var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting); - var count = await BlogPostRepository.GetCountAsync(); + var count = await BlogPostRepository.GetCountAsync(input.Filter); - return new PagedResultDto( - count, - ObjectMapper.Map, List>(blogPosts)); + var dtoList = ObjectMapper.Map, List>(blogPosts); + + return new PagedResultDto(count, dtoList); } [Authorize(CmsKitAdminPermissions.BlogPosts.Delete)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index 09f1d3a6cc..a9b0727c17 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -49,7 +49,7 @@ namespace Volo.CmsKit.Admin.Blogs [HttpGet] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)] - public virtual Task> GetListAsync(PagedAndSortedResultRequestDto input) + public virtual Task> GetListAsync(BlogPostGetListInput input) { return BlogPostAdminAppService.GetListAsync(input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml index caea6d3754..09f3f7f447 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml @@ -1,5 +1,6 @@ @page +@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageSearchBox @using Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts @using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Menus @@ -27,7 +28,13 @@
- + + + @await Component.InvokeAsync(typeof(AbpPageSearchBoxViewComponent)) + + + +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index e2f19079b7..0218d360f0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -4,8 +4,12 @@ $(function () { var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; - var $blogPostWrapper = $('#CmsKitBlogPostsWrapper'); - + var getFilter = function () { + return { + filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val() + }; + }; + var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ processing: true, serverSide: true, @@ -16,7 +20,7 @@ $(function () { scrollX: true, ordering: true, order: [[1, "desc"]], - ajax: abp.libs.datatables.createAjax(blogsService.getList), + ajax: abp.libs.datatables.createAjax(blogsService.getList, getFilter), columnDefs: [ { title: l("Details"), @@ -61,6 +65,11 @@ $(function () { ] })); + $('#CmsKitBlogPostsWrapper form.page-search-form').submit(function (e) { + e.preventDefault(); + dataTable.ajax.reload(); + }); + $('#AbpContentToolbar button[name=CreateBlogPost]').on('click', function (e) { e.preventDefault(); window.location.href = "BlogPosts/Create" diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 943ea381f3..e54045ced4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -8,12 +8,21 @@ namespace Volo.CmsKit.Blogs { public interface IBlogPostRepository : IBasicRepository { + Task GetCountAsync( + string filter = null, + Guid? blogId = null, + CancellationToken cancellationToken = default); + + Task> GetListAsync( + string filter = null, + Guid? blogId = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string sorting = null, + CancellationToken cancellationToken = default); + Task SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); - - Task> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, string sorting, bool includeDetails = false, CancellationToken cancellationToken = default); - - Task GetCountAsync(Guid blogId, CancellationToken cancellationToken = default); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 81cc527800..037b60918f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -38,43 +38,53 @@ namespace Volo.CmsKit.Blogs return blogPost; } - public async Task GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) + public virtual async Task GetCountAsync( + string filter = null, + Guid? blogId = null, + CancellationToken cancellationToken = default) { - return await (await GetQueryableAsync()).CountAsync( - x => x.BlogId == blogId, - GetCancellationToken(cancellationToken)); + var queryable = (await GetDbSetAsync()) + .WhereIf(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); + + var count = await queryable.CountAsync(GetCancellationToken(cancellationToken)); + return count; } - public async Task> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, - string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) + public virtual async Task> GetListAsync( + string filter = null, + Guid? blogId = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string sorting = null, + CancellationToken cancellationToken = default) + { var dbContext = await GetDbContextAsync(); var blogPostsDbSet = dbContext.Set(); var usersDbSet = dbContext.Set(); var queryable = blogPostsDbSet - .Where(x => x.BlogId == blogId); - - if (!sorting.IsNullOrWhiteSpace()) - { - queryable = queryable.OrderBy(sorting); - } + .WhereIf(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); + queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc"); + var combinedResult = await queryable - .Join( - usersDbSet, - o => o.AuthorId, - i => i.Id, - (blogPost,user) => new { blogPost, user }) - .Skip(skipCount) - .Take(maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); + .Join( + usersDbSet, + o => o.AuthorId, + i => i.Id, + (blogPost,user) => new { blogPost, user }) + .Skip(skipCount) + .Take(maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); return combinedResult.Select(s => - { - s.blogPost.Author = s.user; - return s.blogPost; - }).ToList(); + { + s.blogPost.Author = s.user; + return s.blogPost; + }).ToList(); } public async Task SlugExistsAsync(Guid blogId, [NotNull] string slug, diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index d0c205d870..ee0b41d08a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -27,41 +27,51 @@ namespace Volo.CmsKit.MongoDB.Blogs { Check.NotNullOrEmpty(slug, nameof(slug)); + var token = GetCancellationToken(cancellationToken); + var blogPost = await GetAsync(x => x.BlogId == blogId && x.Slug.ToLower() == slug, - cancellationToken: GetCancellationToken(cancellationToken)); + cancellationToken: token); - var dbContext = await GetDbContextAsync(); + var dbContext = await GetDbContextAsync(token); - blogPost.Author = await dbContext.Collection().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId); + blogPost.Author = await dbContext.Collection().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId, token); return blogPost; } - public async Task GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) + public async Task GetCountAsync( + string filter = null, + Guid? blogId = null, + CancellationToken cancellationToken = default) { - return await AsyncExecuter.CountAsync( - await WithDetailsAsync(), - x => x.BlogId == blogId, - GetCancellationToken(cancellationToken)); + var token = GetCancellationToken(cancellationToken); + + return await (await GetMongoQueryableAsync(token)) + .WhereIf>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) + .WhereIf>(blogId.HasValue, x => x.BlogId == blogId) + .CountAsync(GetCancellationToken(cancellationToken)); } - public async Task> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, - string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) + public async Task> GetListAsync( + string filter = null, + Guid? blogId = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string sorting = null, + CancellationToken cancellationToken = default) { var token = GetCancellationToken(cancellationToken); var dbContext = await GetDbContextAsync(token); var blogPostQueryable = dbContext.Collection().AsQueryable(); var usersQueryable = dbContext.Collection().AsQueryable(); - IQueryable queryable = blogPostQueryable - .Where(x => x.BlogId == blogId); + var queryable = blogPostQueryable + .WhereIf(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); - if (!sorting.IsNullOrWhiteSpace()) - { - queryable = queryable.OrderBy(sorting); - } + queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc"); var combinedQueryable = queryable .Join( diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 1c8ef3eed5..550d0cf9a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -36,10 +36,10 @@ namespace Volo.CmsKit.Public.Blogs { var blog = await BlogRepository.GetBySlugAsync(blogSlug); - var blogPosts = await BlogPostRepository.GetPagedListAsync(blog.Id, input.SkipCount, input.MaxResultCount, input.Sorting); + var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id,input.MaxResultCount, input.SkipCount, input.Sorting); return new PagedResultDto( - await BlogPostRepository.GetCountAsync(blog.Id), + await BlogPostRepository.GetCountAsync(blogId: blog.Id), ObjectMapper.Map, List>(blogPosts)); } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs index 3cd7c3bce0..0c39c8ef46 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs @@ -98,7 +98,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetListAsync_ShouldWorkProperly_WithDefaultParameters() { - var list = await blogPostAdminAppService.GetListAsync(new PagedAndSortedResultRequestDto()); + var list = await blogPostAdminAppService.GetListAsync(new BlogPostGetListInput()); list.ShouldNotBeNull(); list.TotalCount.ShouldBe(2); diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs index c758711339..9b2b471bad 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs @@ -97,7 +97,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithoutSorting() { - var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); + var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id); result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); @@ -107,7 +107,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting() { - var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); + var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id); result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); @@ -119,7 +119,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting() { - var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 1, default); + var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, maxResultCount: 1); result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); @@ -129,7 +129,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1InPage2_WithoutSorting() { - var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 1, 1, default); + var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, skipCount: 1, maxResultCount: 1); result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); @@ -139,7 +139,7 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithSortingByTitle() { - var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 10, nameof(BlogPost.Title)); + var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, sorting: $"{nameof(BlogPost.Title)} asc"); result.ShouldNotBeNull(); result.ShouldNotBeEmpty();