From b8eb61cdec3ca833f773726f39158b31ad2c3694 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 16:00:10 +0300 Subject: [PATCH 1/7] Implements send to admin approval to publish --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 8 +++++-- .../Admin/Blogs/BlogPostAdminAppService.cs | 18 ++++++++++++++++ .../BlogPostAdminClientProxy.Generated.cs | 16 ++++++++++++++ .../Admin/Blogs/BlogPostAdminController.cs | 16 ++++++++++++++ .../Pages/CmsKit/BlogPosts/Create.cshtml | 5 ++++- .../Pages/CmsKit/BlogPosts/Create.cshtml.cs | 4 ++++ .../Pages/CmsKit/BlogPosts/create.js | 17 ++++++++++++++- .../Pages/CmsKit/BlogPosts/index.js | 21 ++++++++++++++++++- .../client-proxies/cms-kit-admin-proxy.js | 16 ++++++++++++++ .../Volo/CmsKit/Blogs/BlogPostStatus.cs | 3 ++- .../CmsKit/Localization/Resources/en.json | 8 ++++++- .../CmsKit/Localization/Resources/tr.json | 8 ++++++- .../Volo/CmsKit/Blogs/BlogPost.cs | 5 +++++ 13 files changed, 137 insertions(+), 8 deletions(-) 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 d8f74d6d66..061f9094b8 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 @@ -14,8 +14,12 @@ public interface IBlogPostAdminAppService UpdateBlogPostDto> { Task PublishAsync(Guid id); - + Task DraftAsync(Guid id); - + Task CreateAndPublishAsync(CreateBlogPostDto input); + + Task SendToReviewAsync(Guid id); + + Task CreateAndSendToReviewAsync(CreateBlogPostDto input); } 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 7e1c11bbcd..b512406454 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 @@ -139,4 +139,22 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.Status = BlogPostStatus.Published; return blogPost; } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual async Task SendToReviewAsync(Guid id) + { + var blogPost = await BlogPostRepository.GetAsync(id); + blogPost.SetWaitingForReview(); + } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual async Task CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + var blogPost = await CreateAsync(input); + await CurrentUnitOfWork.SaveChangesAsync(); + + await SendToReviewAsync(blogPost.Id); + blogPost.Status = BlogPostStatus.WaitingForReview; + return blogPost; + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 25d8bcf9fd..c3f94e1992 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -79,4 +79,20 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + return await RequestAsync(nameof(CreateAndSendToReviewAsync), new ClientProxyRequestTypeValue + { + { typeof(CreateBlogPostDto), input } + }); + } } 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 ccc2e4fd25..0efb2bf2d5 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 @@ -86,4 +86,20 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndPublishAsync(input); } + + [HttpPost] + [Route("sendtoreview/{id}")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual Task SendToReviewAsync(Guid id) + { + return BlogPostAdminAppService.SendToReviewAsync(id); + } + + [HttpPost] + [Route("createandsendtoreview")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual Task CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + return BlogPostAdminAppService.CreateAndSendToReviewAsync(input); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml index 70b17ea9ad..eefc59e849 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml @@ -87,10 +87,13 @@ - + @if ((await AuthorizationService.AuthorizeAsync(CmsKitAdminPermissions.BlogPosts.Publish)).Succeeded) { + }else + { + } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs index 3e0fcd30b0..a76385491a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs @@ -36,6 +36,10 @@ public class CreateModel : CmsKitAdminPageModel { createResult = await BlogPostAdminAppService.CreateAndPublishAsync(dto); } + else if (ViewModel.Status == BlogPostStatus.WaitingForReview) + { + createResult = await BlogPostAdminAppService.CreateAndSendToReviewAsync(dto); + } else { createResult = await BlogPostAdminAppService.CreateAsync(dto); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index b94e8b2353..adc2e53c85 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -4,7 +4,8 @@ $(function () { var blogPostStatus = { Draft: 0, - Published: 1 + Published: 1, + SendToReview: 2 }; var $selectBlog = $('#BlogSelectionSelect'); @@ -16,6 +17,7 @@ $(function () { var $status = $('#ViewModel_Status'); var $buttonSubmit = $('#button-blog-post-create'); var $buttonPublish = $('#button-blog-post-publish'); + var $buttonSendToReview = $('#button-blog-post-send-to-review'); var $pageContentInput = $('#ViewModel_Content'); var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); @@ -83,6 +85,19 @@ $(function () { ); }); + $buttonSendToReview.click(function (e) { + abp.message.confirm( + l('BlogPostSendToReviewConfirmationMessage', $title.val()), + function (isConfirmed) { + if (isConfirmed) { + e.preventDefault(); + $status.val(blogPostStatus.SendToReview); + submitCoverImage(); + } + } + ); + }); + function submitEntityTags(blogPostId) { var tags = $tagsInput.val().split(',').map(x => x.trim()).filter(x => x); 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 8b941f84b5..a813a612ea 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 @@ -3,7 +3,8 @@ $(function () { var l = abp.localization.getResource("CmsKit"); var blogPostStatus = { Draft: 0, - Published: 1 + Published: 1, + SendToReview: 2 }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; @@ -54,6 +55,24 @@ $(function () { }); } }, + { + text: l('SendToReview'), + visible: function(data) { + return data?.status === blogPostStatus.Draft && + !abp.auth.isGranted('CmsKit.BlogPosts.Publish'); + }, + confirmMessage: function (data) { + return l("BlogPostPublishConfirmationMessage", data.record.title) + }, + action: function (data) { + blogsService + .sendToReview(data.record.id) + .then(function () { + dataTable.ajax.reload(); + abp.notify.success(l('BlogPostSendToReviewSuccessMessage', data.record.title)); + }); + } + }, { text: l('Draft'), visible: function(data) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index aafdf7d245..4c97f154a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -415,6 +415,22 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/sendtoreview/' + id + '', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + + volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandsendtoreview', + type: 'POST', + data: JSON.stringify(input) + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs index e0a2385d7e..2d849e9d93 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs @@ -3,5 +3,6 @@ public enum BlogPostStatus { Draft, - Published + Published, + WaitingForReview } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 1083826bf7..48dc92ce92 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -168,10 +168,16 @@ "SavedSuccessfully": "Saved successfully", "CmsKit.BlogPost.Status.0": "Draft", "CmsKit.BlogPost.Status.1": "Published", + "CmsKit.BlogPost.Status.2": "Waiting for review", "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", "SuccessfullyPublished": "Successfully published!", "Draft": "Draft", "Publish": "Publish", - "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?" + "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", + "BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?", + "SaveAsDraft": "Save as draft", + "SendToReview": "Send to review", + "SendToReviewToPublish": "Send to review to publish", + "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 67ca5eeafd..38d8243ad6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -167,10 +167,16 @@ "SavedSuccessfully": "Başarıyla kaydedildi", "CmsKit.BlogPost.Status.0": "Taslak", "CmsKit.BlogPost.Status.1": "Yayınlandı", + "CmsKit.BlogPost.Status.2": "İnceleme Bekliyor", "BlogPostPublishConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak istediğinize emin misiniz?", "SuccessfullyPublished": "Başarıyla yayınlandı", "Draft": "Taslak olarak kaydet", "Publish": "Yayınla", - "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?" + "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?", + "BlogPostSendToReviewConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine göndermek istediğinize emin misiniz?", + "SaveAsDraft": "Taslak olarak kaydet", + "SendToReview": "İncelemeye gönder", + "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", + "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index 5116d0a95e..cca45bf4fe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -91,4 +91,9 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant { Status = BlogPostStatus.Published; } + + public virtual void SetWaitingForReview() + { + Status = BlogPostStatus.WaitingForReview; + } } From 7d190a3d9ff2011b136551851f9c416d82a8ef62 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 16:47:02 +0300 Subject: [PATCH 2/7] shows users with publish permission that they have blog posts waiting for review --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 2 ++ .../Admin/Blogs/BlogPostAdminAppService.cs | 6 ++++ .../BlogPostAdminClientProxy.Generated.cs | 5 +++ .../Admin/Blogs/BlogPostAdminController.cs | 10 +++++- .../Pages/CmsKit/BlogPosts/Index.cshtml | 7 +++- .../Pages/CmsKit/BlogPosts/index.js | 34 +++++++++++++++++-- .../client-proxies/cms-kit-admin-proxy.js | 7 ++++ .../CmsKit/Localization/Resources/en.json | 3 +- .../CmsKit/Localization/Resources/tr.json | 3 +- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 2 ++ .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 6 ++++ .../MongoDB/Blogs/MongoBlogPostRepository.cs | 8 +++++ 12 files changed, 87 insertions(+), 6 deletions(-) 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 061f9094b8..5b7868627f 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 @@ -22,4 +22,6 @@ public interface IBlogPostAdminAppService Task SendToReviewAsync(Guid id); Task CreateAndSendToReviewAsync(CreateBlogPostDto input); + + Task HasBlogPostWaitingForReviewAsync(); } 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 b512406454..1fef52f0c8 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 @@ -157,4 +157,10 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.Status = BlogPostStatus.WaitingForReview; return blogPost; } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public async Task HasBlogPostWaitingForReviewAsync() + { + return await BlogPostRepository.HasBlogPostWaitingForReviewAsync(); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index c3f94e1992..974d0a279b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -95,4 +95,9 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase HasBlogPostWaitingForReviewAsync() + { + return await RequestAsync(nameof(HasBlogPostWaitingForReviewAsync)); + } } 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 0efb2bf2d5..b48350a361 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 @@ -102,4 +102,12 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndSendToReviewAsync(input); } -} + + [HttpGet] + [Route("hasblogpostwaitingforreview")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public virtual Task HasBlogPostWaitingForReviewAsync() + { + return BlogPostAdminAppService.HasBlogPostWaitingForReviewAsync(); + } +} \ No newline at end of file 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 9eeb977e84..e9e882098a 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 @@ -27,6 +27,11 @@ @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new {pageName = typeof(IndexModel).FullName}) } + + +
@@ -43,4 +48,4 @@ - + \ 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 a813a612ea..1e3b898225 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 @@ -8,11 +8,18 @@ $(function () { }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; - + var _statusFilter; var getFilter = function () { - return { + var filter = { filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val() }; + + if (_statusFilter) { + filter.status = _statusFilter; + _statusFilter = null; + } + + return filter; }; var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ @@ -52,6 +59,7 @@ $(function () { .then(function () { dataTable.ajax.reload(); abp.notify.success(l('SuccessfullyPublished')); + checkHasBlogPostWaitingForReview(); }); } }, @@ -87,6 +95,7 @@ $(function () { .then(function () { dataTable.ajax.reload(); abp.notify.success(l('SuccessfullySaved')); + checkHasBlogPostWaitingForReview(); }); } }, @@ -149,4 +158,25 @@ $(function () { e.preventDefault(); window.location.href = "BlogPosts/Create" }); + + $('#button-show-waiting-for-review').on('click', function (e) { + e.preventDefault(); + _statusFilter = blogPostStatus.SendToReview; + dataTable.ajax.reload(); + }); + + function checkHasBlogPostWaitingForReview(){ + if (!abp.auth.isGranted('CmsKit.BlogPosts.Publish')){ + $('#alertHasBlogPostWaitingForReview').hide(); + } + + blogsService.hasBlogPostWaitingForReview().then(function (result) { + if (result) { + $('#alertHasBlogPostWaitingForReview').show('fast'); + } else { + $('#alertHasBlogPostWaitingForReview').hide('fast'); + } + }); + } + checkHasBlogPostWaitingForReview(); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 4c97f154a8..754efd41b5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -431,6 +431,13 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/hasblogpostwaitingforreview', + type: 'GET' + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 48dc92ce92..eeb81b7447 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -178,6 +178,7 @@ "SaveAsDraft": "Save as draft", "SendToReview": "Send to review", "SendToReviewToPublish": "Send to review to publish", - "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing." + "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", + "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 38d8243ad6..3dad725d5b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -177,6 +177,7 @@ "SaveAsDraft": "Taslak olarak kaydet", "SendToReview": "İncelemeye gönder", "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", - "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi." + "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi.", + "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın." } } 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 d73512a204..aa1b2e134a 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 @@ -31,4 +31,6 @@ public interface IBlogPostRepository : IBasicRepository Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default); + + Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default); } \ No newline at end of file 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 cc78ffa698..a5d36e2f01 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 @@ -109,4 +109,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.Author).Distinct() .ToListAsync(GetCancellationToken(cancellationToken)); } + + public virtual async Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); + } } 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 65a8bf9c13..8a8cf70d57 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 @@ -125,4 +125,12 @@ public class MongoBlogPostRepository : MongoDbRepository HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) + { + cancellationToken = GetCancellationToken(cancellationToken); + + return await (await GetMongoQueryableAsync(cancellationToken)) + .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, cancellationToken); + } } From df34d665e923b217e0b5a2d815de6759b3b80de7 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:14:18 +0300 Subject: [PATCH 3/7] implements filter by status to index page --- .../Pages/CmsKit/BlogPosts/Index.cshtml | 13 +++++++++++-- .../Pages/CmsKit/BlogPosts/index.js | 11 ++++++----- .../Volo/CmsKit/Localization/Resources/en.json | 4 +++- .../Volo/CmsKit/Localization/Resources/tr.json | 4 +++- 4 files changed, 23 insertions(+), 9 deletions(-) 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 e9e882098a..a3f8c7b37a 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 @@ -5,6 +5,7 @@ @using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Menus @using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar +@using Volo.CmsKit.Blogs @inherits CmsKitAdminPageBase @@ -27,7 +28,6 @@ @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new {pageName = typeof(IndexModel).FullName}) } - @@ -36,7 +36,16 @@
- + + + + @await Component.InvokeAsync(typeof(AbpPageSearchBoxViewComponent)) 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 1e3b898225..73e19a178a 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 @@ -1,6 +1,8 @@ $(function () { var l = abp.localization.getResource("CmsKit"); + var $statusFilter = $("#StatusSelect"); + var blogPostStatus = { Draft: 0, Published: 1, @@ -8,15 +10,14 @@ $(function () { }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; - var _statusFilter; + var getFilter = function () { var filter = { filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val() }; - if (_statusFilter) { - filter.status = _statusFilter; - _statusFilter = null; + if ($statusFilter.val()) { + filter.status = $statusFilter.val(); } return filter; @@ -161,7 +162,7 @@ $(function () { $('#button-show-waiting-for-review').on('click', function (e) { e.preventDefault(); - _statusFilter = blogPostStatus.SendToReview; + $statusFilter.val(blogPostStatus.SendToReview); dataTable.ajax.reload(); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index eeb81b7447..d81c3a8c89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -179,6 +179,8 @@ "SendToReview": "Send to review", "SendToReviewToPublish": "Send to review to publish", "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", - "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list." + "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", + "SelectAStatus": "Select a status", + "Status": "Status" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 3dad725d5b..975c644224 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -178,6 +178,8 @@ "SendToReview": "İncelemeye gönder", "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi.", - "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın." + "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın.", + "SelectAStatus": "Durum seçin", + "Status": "Durum" } } From d58c40f1eec1886ee85e4e0d562a02c8f8c86aeb Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:07:07 +0300 Subject: [PATCH 4/7] update blog post when it's status changed --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 1 + 1 file changed, 1 insertion(+) 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 8c8caecb76..e0af645131 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 @@ -147,6 +147,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogPost = await BlogPostRepository.GetAsync(id); blogPost.SetWaitingForReview(); + await BlogPostRepository.UpdateAsync(blogPost); } [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] From 6a7ea6a0ffd6ac6c58bb2f7f40f2f385615c9b46 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:11:34 +0300 Subject: [PATCH 5/7] use kebap case in route --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 6 +++--- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) 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 f285e3a542..85f53bed42 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 @@ -88,7 +88,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("sendtoreview/{id}")] + [Route("{id}/send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual Task SendToReviewAsync(Guid id) { @@ -96,7 +96,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("createandsendtoreview")] + [Route("create-and-send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual Task CreateAndSendToReviewAsync(CreateBlogPostDto input) { @@ -104,7 +104,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpGet] - [Route("hasblogpostwaitingforreview")] + [Route("has-blogpost-waiting-for-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] public virtual Task HasBlogPostWaitingForReviewAsync() { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index af615bfb86..f424c921ee 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -417,7 +417,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/sendtoreview/' + id + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/send-to-review', type: 'POST', dataType: null }, ajaxParams)); @@ -425,7 +425,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandsendtoreview', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review', type: 'POST', data: JSON.stringify(input) }, ajaxParams)); @@ -433,7 +433,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/hasblogpostwaitingforreview', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review', type: 'GET' }, ajaxParams)); }; From 50a11f2f53272250177072a099c34bcce6899923 Mon Sep 17 00:00:00 2001 From: Musa Demir <48536631+demirmusa@users.noreply.github.com> Date: Fri, 25 Mar 2022 19:01:49 +0300 Subject: [PATCH 6/7] use form select for select item --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a3f8c7b37a..6587509d11 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 @@ -37,7 +37,7 @@
- @foreach (var status in (BlogPostStatus[]) Enum.GetValues(typeof(BlogPostStatus))) { @@ -57,4 +57,4 @@ - \ No newline at end of file + From a6cecec7b13f750af8508050310b6fa5cea61ab3 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 30 Mar 2022 11:11:05 +0300 Subject: [PATCH 7/7] Fix wrong conflict merging from dev --- .../Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 fc89b19cb5..129c5e10b7 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 @@ -111,7 +111,7 @@ public class MongoBlogPostRepository : MongoDbRepository> GetAuthorsHasBlogPostsAsync(int skipCount, int maxResultCount, string sorting, string filter, CancellationToken cancellationToken = default) { - var queryable = (await CreateAuthorsQueryableAsync()) + var queryable = (await CreateAuthorsQueryableAsync(cancellationToken)) .Skip(skipCount) .Take(maxResultCount) .OrderBy(sorting.IsNullOrEmpty() ? nameof(CmsUser.UserName) : sorting) @@ -123,17 +123,17 @@ public class MongoBlogPostRepository : MongoDbRepository GetAuthorsHasBlogPostsCountAsync(string filter, CancellationToken cancellationToken = default) { return await AsyncExecuter.CountAsync( - (await CreateAuthorsQueryableAsync()) + (await CreateAuthorsQueryableAsync(cancellationToken)) .WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower()))); } public async Task GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default) { - return await AsyncExecuter.FirstOrDefaultAsync(await CreateAuthorsQueryableAsync(), x => x.Id == id) + return await AsyncExecuter.FirstOrDefaultAsync(await CreateAuthorsQueryableAsync(cancellationToken), x => x.Id == id) ?? throw new EntityNotFoundException(typeof(CmsUser), id); } - private async Task> CreateAuthorsQueryableAsync() + private async Task> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default) { cancellationToken = GetCancellationToken(cancellationToken);