diff --git a/app/Comment.php b/app/Comment.php index 8588982e5..de01b6212 100644 --- a/app/Comment.php +++ b/app/Comment.php @@ -34,6 +34,9 @@ class Comment extends Ownable return $this->belongsTo(User::class); } + /* + * Not being used, but left here because might be used in the future for performance reasons. + */ public function getPageComments($pageId) { $query = static::newQuery(); $query->join('users AS u', 'comments.created_by', '=', 'u.id'); diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php index a08279e8c..e8d5eab30 100644 --- a/app/Http/Controllers/CommentController.php +++ b/app/Http/Controllers/CommentController.php @@ -5,7 +5,6 @@ use BookStack\Repos\EntityRepo; use BookStack\Comment; use Illuminate\Http\Request; -// delete -checkOwnablePermission \ class CommentController extends Controller { protected $entityRepo; @@ -68,12 +67,12 @@ class CommentController extends Controller $comment = $this->comment->findOrFail($id); $this->checkOwnablePermission('comment-delete', $comment); $this->commentRepo->delete($comment); - $comment = $this->commentRepo->getCommentById($comment->id); + $updatedComment = $this->commentRepo->getCommentById($comment->id); return response()->json([ - 'success' => true, + 'status' => 'success', 'message' => trans('entities.comment_deleted'), - 'comment' => $comment + 'comment' => $updatedComment ]); } @@ -85,18 +84,10 @@ class CommentController extends Controller return response('Not found', 404); } - if($page->draft) { - // cannot add comments to drafts. - return response()->json([ - 'status' => 'error', - 'message' => trans('errors.no_comments_for_draft'), - ], 400); - } - $this->checkOwnablePermission('page-view', $page); $comments = $this->commentRepo->getPageComments($pageId); - return response()->json(['success' => true, 'comments'=> $comments['comments'], + return response()->json(['status' => 'success', 'comments'=> $comments['comments'], 'total' => $comments['total'], 'permissions' => [ 'comment_create' => $this->currentUser->can('comment-create-all'), 'comment_update_own' => $this->currentUser->can('comment-update-own'), diff --git a/resources/assets/js/controllers.js b/resources/assets/js/controllers.js index 67e77a542..3ef02d41f 100644 --- a/resources/assets/js/controllers.js +++ b/resources/assets/js/controllers.js @@ -682,7 +682,7 @@ module.exports = function (ngApp, events) { }]); - // CommentCrudController + // Controller used to reply to and add new comments ngApp.controller('CommentReplyController', ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { const MarkdownIt = require("markdown-it"); const md = new MarkdownIt({html: true}); @@ -692,10 +692,12 @@ module.exports = function (ngApp, events) { vm.saveComment = function () { let pageId = $scope.comment.pageId || $scope.pageId; let comment = $scope.comment.text; + if (!comment) { + return events.emit('warning', trans('errors.empty_comment')); + } let commentHTML = md.render($scope.comment.text); let serviceUrl = `/ajax/page/${pageId}/comment/`; let httpMethod = 'post'; - let errorOp = 'add'; let reqObj = { text: comment, html: commentHTML @@ -705,14 +707,13 @@ module.exports = function (ngApp, events) { // this will be set when editing the comment. serviceUrl = `/ajax/page/${pageId}/comment/${$scope.comment.id}`; httpMethod = 'put'; - errorOp = 'update'; } else if ($scope.isReply === true) { // if its reply, get the parent comment id reqObj.parent_id = $scope.parentId; } $http[httpMethod](window.baseUrl(serviceUrl), reqObj).then(resp => { - if (!resp.data || resp.data.status !== 'success') { - return events.emit('error', trans('error')); + if (!isCommentOpSuccess(resp)) { + return; } // hide the comments first, and then retrigger the refresh if ($scope.isEdit) { @@ -734,44 +735,47 @@ module.exports = function (ngApp, events) { events.emit('success', trans(resp.data.message)); - }, checkError(errorOp)); + }, checkError); }; - function checkError(errorGroupName) { - $scope.errors[errorGroupName] = {}; - return function(response) { - if (typeof response.data !== 'undefined' && typeof response.data.error !== 'undefined') { - events.emit('error', response.data.error); - } - if (typeof response.data !== 'undefined' && typeof response.data.validation !== 'undefined') { - $scope.errors[errorGroupName] = response.data.validation; - console.log($scope.errors[errorGroupName]) - } + function checkError(response) { + let msg = null; + if (isCommentOpSuccess(response)) { + // all good + return; + } else if (response.data) { + msg = response.data.message; + } else { + msg = trans('errors.comment_add_error'); + } + if (msg) { + events.emit('success', msg); } } }]); + // Controller used to delete comments ngApp.controller('CommentDeleteController', ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { let vm = this; vm.delete = function(comment) { $http.delete(window.baseUrl(`/ajax/comment/${comment.id}`)).then(resp => { - if (!resp.data || resp.data.success !== true) { + if (isCommentOpSuccess(resp)) { return; } updateComment(comment, resp.data, $timeout, true); }, function (resp) { - if (!resp || !resp.data || resp.data.success !== true) { - events.emit('error', trans('entities.comment_delete_fail')); - } else { + if (isCommentOpSuccess(resp)) { events.emit('success', trans('entities.comment_delete_success')); + } else { + events.emit('error', trans('entities.comment_delete_fail')); } }); }; }]); - // CommentListController + // Controller used to fetch all comments for a page ngApp.controller('CommentListController', ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { let vm = this; $scope.errors = {}; @@ -779,6 +783,7 @@ module.exports = function (ngApp, events) { $scope.level = 1; vm.totalCommentsStr = trans('entities.comments_loading'); vm.permissions = {}; + vm.trans = window.trans; $scope.$on('evt.new-comment', function (event, comment) { // add the comment to the comment list. @@ -809,8 +814,7 @@ module.exports = function (ngApp, events) { $timeout(function() { $http.get(window.baseUrl(`/ajax/page/${$scope.pageId}/comments/`)).then(resp => { - if (!resp.data || resp.data.success !== true) { - // TODO : Handle error + if (!isCommentOpSuccess(resp)) { return; } vm.comments = resp.data.comments; @@ -818,11 +822,10 @@ module.exports = function (ngApp, events) { vm.permissions = resp.data.permissions; vm.current_user_id = resp.data.user_id; setTotalCommentMsg(); - }, checkError('app')); + }, checkError); }); function setTotalCommentMsg () { - // TODO : Fetch message from translate. if (vm.totalComments === 0) { vm.totalCommentsStr = trans('entities.no_comments'); } else if (vm.totalComments === 1) { @@ -834,11 +837,19 @@ module.exports = function (ngApp, events) { } } - function checkError(errorGroupName) { - $scope.errors[errorGroupName] = {}; - return function(response) { - console.log(response); - }; + function checkError(response) { + let msg = null; + if (isCommentOpSuccess(response)) { + // all good + return; + } else if (response.data) { + msg = response.data.message; + } else { + msg = trans('errors.comment_error'); + } + if (msg) { + events.emit('success', msg); + } } }]); @@ -860,4 +871,11 @@ module.exports = function (ngApp, events) { comment.is_hidden = false; }); } + + function isCommentOpSuccess(resp) { + if (resp && resp.data && resp.data.status === 'success') { + return true; + } + return false; + } }; diff --git a/resources/assets/js/directives.js b/resources/assets/js/directives.js index 3577cf396..0b9402a6b 100644 --- a/resources/assets/js/directives.js +++ b/resources/assets/js/directives.js @@ -845,9 +845,9 @@ module.exports = function (ngApp, events) { scope.closeBox = function () { element.remove(); scope.$destroy(); - } + }; } - } + }; }]); ngApp.directive('commentEdit', [function () { @@ -855,7 +855,7 @@ module.exports = function (ngApp, events) { restrict: 'E', templateUrl: 'comment-reply.html', scope: { - comment: '=', + comment: '=' }, link: function (scope, element) { scope.isEdit = true; @@ -872,9 +872,9 @@ module.exports = function (ngApp, events) { scope.closeBox = function () { element.remove(); scope.$destroy(); - } + }; } - } + }; }]); diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index c0439f0e1..08e11cfde 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -246,6 +246,12 @@ return [ 'one_comment' => '1 Comment', 'comments_loading' => 'Loading...', 'comment_save' => 'Save Comment', + 'comment_reply' => 'Reply', + 'comment_edit' => 'Edit', + 'comment_delete' => 'Delete', 'comment_cancel' => 'Cancel', - 'comment_deleted' => 'This comment has been deleted.' + 'comment_created' => 'Comment added', + 'comment_updated' => 'Comment updated', + 'comment_deleted' => 'Comment deleted', + 'comment_updated_text' => 'Updated :updateDiff by' ]; \ No newline at end of file diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index c4578a37a..fc2ac73b5 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -60,6 +60,12 @@ return [ 'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted', 'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role', + // Comments + 'comment_error' => 'An error occurred while fetching the comments.', + 'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.', + 'comment_add_error' => 'An error occurred while adding the comment.', + 'empty_comment' => 'Cannot add an empty comment.', + // Error pages '404_page_not_found' => 'Page Not Found', 'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.', diff --git a/resources/views/comments/comment-reply.blade.php b/resources/views/comments/comment-reply.blade.php index 16fa2bff0..9c698bf0d 100644 --- a/resources/views/comments/comment-reply.blade.php +++ b/resources/views/comments/comment-reply.blade.php @@ -1,8 +1,6 @@
- + diff --git a/resources/views/comments/list-item.blade.php b/resources/views/comments/list-item.blade.php index ec0b13f17..eb2bcf8ab 100644 --- a/resources/views/comments/list-item.blade.php +++ b/resources/views/comments/list-item.blade.php @@ -14,12 +14,12 @@