use BookStack\Comment;
use Illuminate\Http\Request;
-// delete -checkOwnablePermission \
class CommentController extends Controller
{
protected $entityRepo;
$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
]);
}
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'),
}]);
- // 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});
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
// 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) {
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 = {};
$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.
$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;
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) {
}
}
- 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);
+ }
}
}]);
comment.is_hidden = false;
});
}
+
+ function isCommentOpSuccess(resp) {
+ if (resp && resp.data && resp.data.status === 'success') {
+ return true;
+ }
+ return false;
+ }
};
</div>
<div class="comment-actions">
<ul ng-if="!comment.is_hidden">
- <li ng-if="::(level < 3 && vm.canComment())"><a href="#" comment-reply-link no-comment-reply-dupe="true" comment="comment" is-reply="true">Reply</a></li>
- <li ng-if="::vm.canEdit(comment)"><a href="#" comment-reply-link no-comment-reply-dupe="true" comment="comment" >Edit</a></li>
- <li ng-if="::vm.canEdit(comment, true)"><a href="#" comment-delete-link comment="comment" >Delete</a></li>
+ <li ng-if="::(level < 3 && vm.canComment())"><a href="#" comment-reply-link no-comment-reply-dupe="true" comment="comment" is-reply="true">{{ trans('entities.comment_reply') }}</a></li>
+ <li ng-if="::vm.canEdit(comment)"><a href="#" comment-reply-link no-comment-reply-dupe="true" comment="comment" >{{ trans('entities.comment_edit') }}</a></li>
+ <li ng-if="::vm.canEdit(comment, true)"><a href="#" comment-delete-link comment="comment" >{{ trans('entities.comment_delete') }}</a></li>
<li>Created <a title="@{{::comment.created.day_time_str}}" href="#comment-@{{::comment.id}}-@{{::pageId}}">@{{::comment.created.diff}}</a></li>
- <li ng-if="::comment.updated"><span title="@{{::comment.updated.day_time_str}}">Updated @{{::comment.updated.diff}} by
- <a href="@{{::comment.updated_by.profile_url}}">@{{::comment.updated_by.name}}</a></span></li>
+ <li ng-if="::comment.updated"><span title="@{{::comment.updated.day_time_str}}">@{{ ::vm.trans('entities.comment_updated_text', { updateDiff: comment.updated.diff }) }}
+ <a href="@{{::comment.updated_by.profile_url}}">@{{::comment.updated_by.name}}</a></span></li>
</ul>
</div>
<div class="comment-box" ng-repeat="comment in comments = comment.sub_comments track by comment.id" ng-init="level = level + 1">