From b8eb61cdec3ca833f773726f39158b31ad2c3694 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 16:00:10 +0300 Subject: [PATCH] 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; + } }