diff --git a/resources/assets/js/vues/components/comments/comment-reply.js b/resources/assets/js/vues/components/comments/comment-reply.js index 83cbdf467..0f65fc237 100644 --- a/resources/assets/js/vues/components/comments/comment-reply.js +++ b/resources/assets/js/vues/components/comments/comment-reply.js @@ -1,5 +1,5 @@ const MarkdownIt = require("markdown-it"); -const md = new MarkdownIt({html: true}); +const md = new MarkdownIt({ html: true }); var template = ` <div class="comment-editor" v-cloak> @@ -13,113 +13,101 @@ var template = ` `; const props = { - pageId: {}, - commentObj: {}, - isReply: { - default: false, - type: Boolean - }, isEdit: { - default: false, - type: Boolean - }}; + pageId: {}, + commentObj: {}, + isReply: { + default: false, + type: Boolean + }, isEdit: { + default: false, + type: Boolean + } +}; -function data () { - var comment = null; - // initialize comment if not passed. - if (!this.commentObj || this.isReply) { - comment = { - text: '' +function data() { + let comment = { + text: '' }; if (this.isReply) { - comment.page_id = this.commentObj.page_id; - comment.id = this.commentObj.id; + comment.page_id = this.commentObj.page_id; + comment.id = this.commentObj.id; + } else if (this.isEdit) { + comment = this.commentObj; } - } else { - comment = this.commentObj; - } - return { - trans: trans, - parentId: null, - comment: comment - }; + return { + comment: comment, + trans: trans + }; } const methods = { - saveComment: function (event) { - let pageId = this.comment.page_id || this.pageId; - let commentText = this.comment.text; - if (!commentText) { - return this.$emit('evt.empty-comment'); - } - let commentHTML = md.render(commentText); - let serviceUrl = `/ajax/page/${pageId}/comment/`; - let httpMethod = 'post'; - let reqObj = { - text: commentText, - html: commentHTML - }; - - if (this.isEdit === true) { - // this will be set when editing the comment. - serviceUrl = `/ajax/page/${pageId}/comment/${this.comment.id}`; - httpMethod = 'put'; - } else if (this.isReply === true) { - // if its reply, get the parent comment id - reqObj.parent_id = this.comment.id; - } - - $http[httpMethod](window.baseUrl(serviceUrl), reqObj).then(resp => { - if (!isCommentOpSuccess(resp)) { - return; + saveComment: function (event) { + let pageId = this.comment.page_id || this.pageId; + let commentText = this.comment.text; + if (!commentText) { + return this.$events.emit('error', trans('errors.empty_comment')) } - // hide the comments first, and then retrigger the refresh - if (this.isEdit) { - this.$emit('comment-edited', event, resp.data.comment); - } else { - this.comment.text = ''; - this.$emit('comment-added', event); - if (this.isReply === true) { - this.$emit('comment-replied', event, resp.data.comment); - } else { - this.$parent.$emit('new-comment', event, resp.data.comment); + let commentHTML = md.render(commentText); + let serviceUrl = `/ajax/page/${pageId}/comment/`; + let httpMethod = 'post'; + let reqObj = { + text: commentText, + html: commentHTML + }; + + if (this.isEdit === true) { + // this will be set when editing the comment. + serviceUrl = `/ajax/page/${pageId}/comment/${this.comment.id}`; + httpMethod = 'put'; + } else if (this.isReply === true) { + // if its reply, get the parent comment id + reqObj.parent_id = this.comment.id; + } + $http[httpMethod](window.baseUrl(serviceUrl), reqObj).then(resp => { + if (!isCommentOpSuccess(resp)) { + this.$events.emit('error', getErrorMsg(resp)); + return; } - this.$emit('evt.comment-success', null, true); - } - - }, checkError); - }, - closeBox: function (event) { - this.$emit('editor-removed', event); - } + // hide the comments first, and then retrigger the refresh + if (this.isEdit) { + this.$emit('comment-edited', event, resp.data.comment); + } else { + this.comment.text = ''; + this.$emit('comment-added', event); + if (this.isReply === true) { + this.$emit('comment-replied', event, resp.data.comment); + } else { + this.$parent.$emit('new-comment', event, resp.data.comment); + } + } + this.$events.emit('success', resp.data.message); + }).catch(err => { + this.$events.emit('error', trans('errors.comment_add')) + }); + }, + closeBox: function (event) { + this.$emit('editor-removed', event); + } }; const computed = {}; function isCommentOpSuccess(resp) { - if (resp && resp.data && resp.data.status === 'success') { - return true; - } - return false; + if (resp && resp.data && resp.data.status === 'success') { + return true; + } + return false; } -function checkError(msgKey) { - return function(response) { - let msg = null; - if (isCommentOpSuccess(response)) { - // all good - return; - } else if (response.data) { - msg = response.data.message; +function getErrorMsg(response) { + if (response.data) { + return response.data.message; } else { - msg = trans(msgKey); + return trans('errors.comment_add'); } - if (msg) { - events.emit('success', msg); - } - } } -module.exports = {name: 'comment-reply', template, data, props, methods, computed}; +module.exports = { name: 'comment-reply', template, data, props, methods, computed }; diff --git a/resources/assets/js/vues/components/comments/comment.js b/resources/assets/js/vues/components/comments/comment.js index 4b0c0a50b..ada638526 100644 --- a/resources/assets/js/vues/components/comments/comment.js +++ b/resources/assets/js/vues/components/comments/comment.js @@ -37,7 +37,7 @@ const template = ` </li> </ul> </div> - <div v-if="showEditor && level <= 3"> + <div v-if="showEditor"> <comment-reply :page-id="comment.page_id" :comment-obj="comment" v-on:editor-removed.stop.prevent="hideComment" v-on:comment-replied.stop="commentReplied(...arguments)" @@ -57,134 +57,121 @@ const template = ` const props = ['initialComment', 'index', 'level', 'permissions', 'currentUserId']; -function data () { - return { - trans: trans, - commentHref: null, - comments: [], - showEditor: false, - comment: this.initialComment, - nextLevel: this.level + 1 - }; +function data() { + return { + commentHref: null, + trans: trans, + comments: [], + showEditor: false, + comment: this.initialComment, + nextLevel: this.level + 1 + }; } const methods = { - deleteComment: function () { - var resp = window.confirm(trans('entities.comment_delete_confirm')); - if (!resp) { - return; - } - this.$http.delete(window.baseUrl(`/ajax/comment/${this.comment.id}`)).then(resp => { - if (!isCommentOpSuccess(resp)) { - return; - } - updateComment(this.comment, resp.data, true); - }, function (resp) { - if (isCommentOpSuccess(resp)) { - this.$events.emit('success', trans('entities.comment_deleted')); - } else { - this.$events.emit('error', trans('error.comment_delete')); - } - }); - }, - replyComment: function () { - this.toggleEditor(false); - }, - editComment: function () { - this.toggleEditor(true); - }, - hideComment: function () { - this.showEditor = false; - }, - toggleEditor: function (isEdit) { - this.showEditor = false; - this.isEdit = isEdit; - this.isReply = !isEdit; - this.showEditor = true; - }, - commentReplied: function (event, comment) { - this.comments.push(comment); - this.showEditor = false; - }, - commentEdited: function (event, comment) { - this.comment = comment; - this.showEditor = false; - }, - commentAdded: function (event, comment) { - // 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; - } + deleteComment: function () { + var resp = window.confirm(trans('entities.comment_delete_confirm')); + if (!resp) { + return; + } + this.$http.delete(window.baseUrl(`/ajax/comment/${this.comment.id}`)).then(resp => { + if (!isCommentOpSuccess(resp)) { + this.$events.emit('error', trans('error.comment_delete')); + return; + } + this.$events.emit('success', trans('entities.comment_deleted')); + this.comment = resp.data.comment; + }).catch(err => { + this.$events.emit('error', trans('error.comment_delete')); + }); + }, + replyComment: function () { + this.toggleEditor(false); + }, + editComment: function () { + this.toggleEditor(true); + }, + hideComment: function () { + this.showEditor = false; + }, + toggleEditor: function (isEdit) { + this.showEditor = false; + this.isEdit = isEdit; + this.isReply = !isEdit; + this.showEditor = true; + }, + commentReplied: function (event, comment) { + this.comments.push(comment); + this.showEditor = false; + }, + commentEdited: function (event, comment) { + this.comment = comment; + this.showEditor = false; + }, + commentAdded: function (event, comment) { + // 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; - } + if (!this.permissions) { + return false; + } - let propAll = 'comment_' + prop + '_all'; - let propOwn = 'comment_' + prop + '_own'; + let propAll = 'comment_' + prop + '_all'; + let propOwn = 'comment_' + prop + '_own'; - if (this.permissions[propAll]) { - return true; - } + if (this.permissions[propAll]) { + return true; + } - if (this.permissions[propOwn] && this.comment.created_by.id === this.currentUserId) { - 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 false; + }, + canComment: function () { + if (!this.permissions) { + return false; + } + return this.permissions.comment_create === true; } - return this.permissions.comment_create === true; - } }; const computed = { - commentId: { - get: function () { - return `comment-${this.comment.page_id}-${this.comment.id}`; - }, - set: function () { - this.commentHref = `#?cm=${this.commentId}` + commentId: { + get: function () { + return `comment-${this.comment.page_id}-${this.comment.id}`; + }, + set: function () { + this.commentHref = `#?cm=${this.commentId}` + } } - } }; -function mounted () { - if (this.comment.sub_comments && this.comment.sub_comments.length) { - // set this so that we can render the next set of sub comments. - this.comments = this.comment.sub_comments; - } +function mounted() { + if (this.comment.sub_comments && this.comment.sub_comments.length) { + // set this so that we can render the next set of sub comments. + this.comments = this.comment.sub_comments; + } } function isCommentOpSuccess(resp) { - if (resp && resp.data && resp.data.status === 'success') { - return true; - } - return false; -} - -function updateComment(comment, resp, 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 (resp && resp.data && resp.data.status === 'success') { + return true; + } + return false; } module.exports = { - name: 'comment', - template, data, props, methods, computed, mounted, components: { - commentReply -}}; + name: 'comment', + template, data, props, methods, computed, mounted, components: { + commentReply + } +}; diff --git a/resources/assets/js/vues/page-comments.js b/resources/assets/js/vues/page-comments.js index d3ce3006d..76d11ac6c 100644 --- a/resources/assets/js/vues/page-comments.js +++ b/resources/assets/js/vues/page-comments.js @@ -2,107 +2,98 @@ const comment = require('./components/comments/comment'); const commentReply = require('./components/comments/comment-reply'); let data = { - totalCommentsStr: trans('entities.comments_loading'), - comments: [], - permissions: null, - currentUserId: null, - trans: trans, - commentCount: 0 + totalCommentsStr: trans('entities.comments_loading'), + comments: [], + permissions: null, + currentUserId: null, + trans: trans, + commentCount: 0 }; let methods = { - commentAdded: function () { - ++this.totalComments; - } + commentAdded: function () { + ++this.totalComments; + } } let computed = { - totalComments: { - get: function () { - return this.commentCount; + totalComments: { + get: function () { + return this.commentCount; + }, + set: function (value) { + this.commentCount = value; + if (value === 0) { + this.totalCommentsStr = trans('entities.no_comments'); + } else if (value === 1) { + this.totalCommentsStr = trans('entities.one_comment'); + } else { + this.totalCommentsStr = trans('entities.x_comments', { + numComments: value + }); + } + } }, - set: function (value) { - this.commentCount = value; - if (value === 0) { - this.totalCommentsStr = trans('entities.no_comments'); - } else if (value === 1) { - this.totalCommentsStr = trans('entities.one_comment'); - } else { - this.totalCommentsStr = trans('entities.x_comments', { - numComments: value - }); - } + canComment: function () { + if (!this.permissions) { + return false; + } + return this.permissions.comment_create === true; } - }, - canComment: function () { - if (!this.permissions) { - return false; - } - return this.permissions.comment_create === true; - } } function mounted() { - this.pageId = Number(this.$el.getAttribute('page-id')); - // let linkedCommentId = this.$route.query.cm; - let linkedCommentId = null; - this.$http.get(window.baseUrl(`/ajax/page/${this.pageId}/comments/`)).then(resp => { - if (!isCommentOpSuccess(resp)) { - // just show that no comments are available. - vm.totalComments = 0; - return; - } - this.comments = resp.data.comments; - this.totalComments = +resp.data.total; - this.permissions = resp.data.permissions; - this.currentUserId = resp.data.user_id; - if (!linkedCommentId) { - return; - } - $timeout(function() { - // wait for the UI to render. + this.pageId = Number(this.$el.getAttribute('page-id')); + // let linkedCommentId = this.$route.query.cm; + let linkedCommentId = null; + this.$http.get(window.baseUrl(`/ajax/page/${this.pageId}/comments/`)).then(resp => { + if (!isCommentOpSuccess(resp)) { + // just show that no comments are available. + vm.totalComments = 0; + this.$events.emit('error', getErrorMsg(resp)); + return; + } + this.comments = resp.data.comments; + this.totalComments = +resp.data.total; + this.permissions = resp.data.permissions; + this.currentUserId = resp.data.user_id; + if (!linkedCommentId) { + return; + } focusLinkedComment(linkedCommentId); + }).catch(err => { + this.$events.emit('error', 'errors.comment_list'); }); - }, checkError('errors.comment_list')); } function isCommentOpSuccess(resp) { - if (resp && resp.data && resp.data.status === 'success') { - return true; - } - return false; + if (resp && resp.data && resp.data.status === 'success') { + return true; + } + return false; } -function checkError(msgKey) { - return function(response) { - let msg = null; - if (isCommentOpSuccess(response)) { - // all good - return; - } else if (response.data) { - msg = response.data.message; +function getErrorMsg(response) { + if (response.data) { + return response.data.message; } else { - msg = trans(msgKey); + return trans('errors.comment_add'); } - if (msg) { - events.emit('success', msg); - } - } } -function created () { - this.$on('new-comment', function (event, comment) { - this.comments.push(comment); - }) +function created() { + this.$on('new-comment', function (event, comment) { + this.comments.push(comment); + }) } function beforeDestroy() { - this.$off('new-comment'); + this.$off('new-comment'); } module.exports = { - data, methods, mounted, computed, components : { - comment, commentReply - }, - created, beforeDestroy + data, methods, mounted, computed, components: { + comment, commentReply + }, + created, beforeDestroy }; \ No newline at end of file diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 71bcd1f9a..09158caac 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -63,7 +63,7 @@ return [ // Comments 'comment_list' => 'An error occurred while fetching the comments.', 'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.', - 'comment_add' => 'An error occurred while adding the comment.', + 'comment_add' => 'An error occurred while adding / updating the comment.', 'comment_delete' => 'An error occurred while deleting the comment.', 'empty_comment' => 'Cannot add an empty comment.',