$scope.draftsEnabled = $attrs.draftsEnabled === 'true';
$scope.isUpdateDraft = Number($attrs.pageUpdateDraft) === 1;
$scope.isNewPageDraft = Number($attrs.pageNewDraft) === 1;
- $scope.commentsLoaded = false;
// Set initial header draft text
if ($scope.isUpdateDraft || $scope.isNewPageDraft) {
}]);
- // 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});
let vm = this;
- $scope.errors = {};
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');
+ }
+ 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'));
+ if (isCommentOpSuccess(resp)) {
+ events.emit('success', trans('entities.comment_deleted'));
} else {
- events.emit('success', trans('entities.comment_delete_success'));
+ events.emit('error', trans('error.comment_delete'));
}
});
};
}]);
- // CommentListController
- ngApp.controller('CommentListController', ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) {
+ // 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.
event.preventDefault();
});
- vm.canEdit = function (comment) {
+ vm.canEditDelete = function (comment, prop) {
if (!comment.active) {
return false;
}
- if (vm.permissions.comment_update_all) {
+ let propAll = prop + '_all';
+ let propOwn = prop + '_own';
+
+ if (vm.permissions[propAll]) {
return true;
}
- if (vm.permissions.comment_update_own && comment.created_by.id === vm.current_user_id) {
+ if (vm.permissions[propOwn] && comment.created_by.id === vm.current_user_id) {
return true;
}
+
return false;
};
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 (!resp.data || resp.data.success !== true) {
- // TODO : Handle error
+ if (!isCommentOpSuccess(resp)) {
+ // just show that no comments are available.
+ vm.totalComments = 0;
+ setTotalCommentMsg();
return;
}
vm.comments = resp.data.comments;
vm.permissions = resp.data.permissions;
vm.current_user_id = resp.data.user_id;
setTotalCommentMsg();
- }, checkError('app'));
+ if (!linkedCommentId) {
+ return;
+ }
+ $timeout(function() {
+ // wait for the UI to render.
+ focusLinkedComment(linkedCommentId);
+ });
+ }, 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 focusLinkedComment(linkedCommentId) {
+ let comment = angular.element('#' + linkedCommentId);
+ if (comment.length === 0) {
+ return;
+ }
+
+ 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);
+ }
}
}]);
comment.updated_by = resp.comment.updated_by;
comment.active = resp.comment.active;
if (isDelete && !resp.comment.active) {
- comment.html = trans('activities.comment_deleted');
+ comment.html = trans('entities.comment_deleted');
} else {
comment.html = resp.comment.html;
}
comment.is_hidden = false;
});
}
+
+ function isCommentOpSuccess(resp) {
+ if (resp && resp.data && resp.data.status === 'success') {
+ return true;
+ }
+ return false;
+ }
};