}]);
- // 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});
- let vm = this;
-
- 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 reqObj = {
- text: comment,
- html: commentHTML
- };
-
- if ($scope.isEdit === true) {
- // this will be set when editing the comment.
- serviceUrl = `/ajax/page/${pageId}/comment/${$scope.comment.id}`;
- httpMethod = 'put';
- } 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 (!isCommentOpSuccess(resp)) {
- return;
- }
- // hide the comments first, and then retrigger the refresh
- if ($scope.isEdit) {
- updateComment($scope.comment, resp.data);
- $scope.$emit('evt.comment-success', $scope.comment.id);
- } else {
- $scope.comment.text = '';
- if ($scope.isReply === true && $scope.parent.sub_comments) {
- $scope.parent.sub_comments.push(resp.data.comment);
- } else {
- $scope.$emit('evt.new-comment', resp.data.comment);
- }
- $scope.$emit('evt.comment-success', null, true);
- }
- $scope.comment.is_hidden = true;
- $timeout(function() {
- $scope.comment.is_hidden = false;
- });
-
- events.emit('success', trans(resp.data.message));
-
- }, checkError);
-
- };
-
- 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');
- }
- 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 (!isCommentOpSuccess(resp)) {
- return;
- }
- updateComment(comment, resp.data, $timeout, true);
- }, function (resp) {
- if (isCommentOpSuccess(resp)) {
- events.emit('success', trans('entities.comment_deleted'));
- } else {
- events.emit('error', trans('error.comment_delete'));
- }
- });
- };
- }]);
-
// Controller used to fetch all comments for a page
ngApp.controller('CommentListController', ['$scope', '$http', '$timeout', '$location', function ($scope, $http, $timeout, $location) {
- let vm = this;
- $scope.errors = {};
- // keep track of comment levels
- $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.
- vm.comments.push(comment);
- ++vm.totalComments;
- setTotalCommentMsg();
- event.stopPropagation();
- event.preventDefault();
- });
-
- vm.canEditDelete = function (comment, prop) {
- if (!comment.active) {
- return false;
- }
- let propAll = prop + '_all';
- let propOwn = prop + '_own';
-
- if (vm.permissions[propAll]) {
- return true;
- }
-
- if (vm.permissions[propOwn] && comment.created_by.id === vm.current_user_id) {
- return true;
- }
-
- return false;
- };
-
- vm.canComment = function () {
- return vm.permissions.comment_create;
- };
-
- // check if there are is any direct linking
- let linkedCommentId = $location.search().cm;
-
- $timeout(function() {
- $http.get(window.baseUrl(`/ajax/page/${$scope.pageId}/comments/`)).then(resp => {
- if (!isCommentOpSuccess(resp)) {
- // just show that no comments are available.
- vm.totalComments = 0;
- setTotalCommentMsg();
- return;
- }
- vm.comments = resp.data.comments;
- vm.totalComments = +resp.data.total;
- vm.permissions = resp.data.permissions;
- vm.current_user_id = resp.data.user_id;
- setTotalCommentMsg();
- if (!linkedCommentId) {
- return;
- }
- $timeout(function() {
- // wait for the UI to render.
- focusLinkedComment(linkedCommentId);
- });
- }, checkError);
- });
-
- function setTotalCommentMsg () {
- if (vm.totalComments === 0) {
- vm.totalCommentsStr = trans('entities.no_comments');
- } else if (vm.totalComments === 1) {
- vm.totalCommentsStr = trans('entities.one_comment');
- } else {
- vm.totalCommentsStr = trans('entities.x_comments', {
- numComments: vm.totalComments
- });
- }
- }
function focusLinkedComment(linkedCommentId) {
let comment = angular.element('#' + linkedCommentId);
window.setupPageShow.goToText(linkedCommentId);
}
-
- 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_list');
- }
- if (msg) {
- events.emit('success', msg);
- }
- }
}]);
-
- function updateComment(comment, resp, $timeout, isDelete) {
- comment.text = resp.comment.text;
- comment.updated = resp.comment.updated;
- comment.updated_by = resp.comment.updated_by;
- comment.active = resp.comment.active;
- if (isDelete && !resp.comment.active) {
- comment.html = trans('entities.comment_deleted');
- } else {
- comment.html = resp.comment.html;
- }
- if (!$timeout) {
- return;
- }
- comment.is_hidden = true;
- $timeout(function() {
- 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>
- <li v-if="(level < 3 && canComment)">
+ <li v-if="(level < 4 && canComment)">
<a href="#" comment="comment" v-on:click.prevent="replyComment">{{ trans('entities.comment_reply') }}</a>
</li>
- <li v-if="canUpdate">
+ <li v-if="canEditOrDelete('update')">
<a href="#" comment="comment" v-on:click.prevent="editComment">{{ trans('entities.comment_edit') }}</a>
</li>
- <li v-if="canDelete">
+ <li v-if="canEditOrDelete('delete')">
<a href="#" comment="comment" v-on:click.prevent="deleteComment">{{ trans('entities.comment_delete') }}</a>
</li>
<li>{{ trans('entities.comment_create') }}
:is-reply="isReply" :is-edit="isEdit">
</comment-reply>
</div>
- <comment v-for="(comment, index) in comments" :initial-comment="comment"
- :index="index" :level="nextLevel" :key="comment.id"
+ <comment v-for="(comment, index) in comments" :initial-comment="comment" :index="index"
+ :level="nextLevel" :key="comment.id" :permissions="permissions" :current-user-id="currentUserId"
v-on:comment-added.stop="commentAdded"></comment>
</div>
</div>
`;
-const props = ['initialComment', 'index', 'level'];
+const props = ['initialComment', 'index', 'level', 'permissions', 'currentUserId'];
function data () {
return {
// this is to handle non-parent child relationship
// we want to make it go up.
this.$emit('comment-added', event);
+ },
+ canEditOrDelete: function (prop) {
+ if (!this.comment.active) {
+ return false;
+ }
+
+ if (!this.permissions) {
+ return false;
+ }
+
+ let propAll = 'comment_' + prop + '_all';
+ let propOwn = 'comment_' + prop + '_own';
+
+ if (this.permissions[propAll]) {
+ return true;
+ }
+
+ if (this.permissions[propOwn] && this.comment.created_by.id === this.currentUserId) {
+ return true;
+ }
+
+ return false;
+ },
+ canComment: function () {
+ if (!this.permissions) {
+ return false;
+ }
+ return this.permissions.comment_create === true;
}
};
set: function () {
this.commentHref = `#?cm=${this.commentId}`
}
- },
- canUpdate: function () {
- return true;
- },
- canDelete: function () {
- return true;
- },
- canComment: function () {
- return true;
- },
- canUpdate: function () {
- return true;
}
};