137 lines
4.9 KiB
JavaScript
137 lines
4.9 KiB
JavaScript
|
const MarkdownIt = require("markdown-it");
|
||
|
const md = new MarkdownIt({ html: true });
|
||
|
|
||
|
class PageComments {
|
||
|
|
||
|
constructor(elem) {
|
||
|
this.elem = elem;
|
||
|
this.pageId = Number(elem.getAttribute('page-id'));
|
||
|
|
||
|
this.formContainer = elem.querySelector('[comment-form-container]');
|
||
|
this.form = this.formContainer.querySelector('form');
|
||
|
this.formInput = this.form.querySelector('textarea');
|
||
|
this.container = elem.querySelector('[comment-container]');
|
||
|
|
||
|
// TODO - Handle elem usage when no permissions
|
||
|
this.form.addEventListener('submit', this.saveComment.bind(this));
|
||
|
this.elem.addEventListener('click', this.handleAction.bind(this));
|
||
|
this.elem.addEventListener('submit', this.updateComment.bind(this));
|
||
|
|
||
|
this.editingComment = null;
|
||
|
}
|
||
|
|
||
|
handleAction(event) {
|
||
|
let actionElem = event.target.closest('[action]');
|
||
|
if (actionElem === null) return;
|
||
|
|
||
|
let action = actionElem.getAttribute('action');
|
||
|
if (action === 'edit') this.editComment(actionElem.closest('[comment]'));
|
||
|
if (action === 'closeUpdateForm') this.closeUpdateForm();
|
||
|
if (action === 'delete') this.deleteComment(actionElem.closest('[comment]'));
|
||
|
if (action === 'addComment') this.showForm();
|
||
|
if (action === 'hideForm') this.hideForm();
|
||
|
if (action === 'reply') this.setReply();
|
||
|
}
|
||
|
|
||
|
closeUpdateForm() {
|
||
|
if (!this.editingComment) return;
|
||
|
this.editingComment.querySelector('[comment-content]').style.display = 'block';
|
||
|
this.editingComment.querySelector('[comment-edit-container]').style.display = 'none';
|
||
|
}
|
||
|
|
||
|
editComment(commentElem) {
|
||
|
this.hideForm();
|
||
|
if (this.editingComment) this.closeUpdateForm();
|
||
|
commentElem.querySelector('[comment-content]').style.display = 'none';
|
||
|
commentElem.querySelector('[comment-edit-container]').style.display = 'block';
|
||
|
this.editingComment = commentElem;
|
||
|
}
|
||
|
|
||
|
updateComment(event) {
|
||
|
let form = event.target;
|
||
|
event.preventDefault();
|
||
|
let text = form.querySelector('textarea').value;
|
||
|
let reqData = {
|
||
|
text: text,
|
||
|
html: md.render(text),
|
||
|
// parent_id: this.parent_id TODO - Handle replies
|
||
|
};
|
||
|
// TODO - Loading indicator
|
||
|
let commentId = this.editingComment.getAttribute('comment');
|
||
|
window.$http.put(window.baseUrl(`/ajax/comment/${commentId}`), reqData).then(resp => {
|
||
|
let newComment = document.createElement('div');
|
||
|
newComment.innerHTML = resp.data;
|
||
|
this.editingComment.innerHTML = newComment.children[0].innerHTML;
|
||
|
window.$events.emit('success', window.trans('entities.comment_updated_success'));
|
||
|
this.closeUpdateForm();
|
||
|
this.editingComment = null;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
deleteComment(commentElem) {
|
||
|
let id = commentElem.getAttribute('comment');
|
||
|
// TODO - Loading indicator
|
||
|
// TODO - Confirm dropdown
|
||
|
window.$http.delete(window.baseUrl(`/ajax/comment/${id}`)).then(resp => {
|
||
|
commentElem.parentNode.removeChild(commentElem);
|
||
|
window.$events.emit('success', window.trans('entities.comment_deleted_success'));
|
||
|
this.updateCount();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
saveComment(event) {
|
||
|
event.preventDefault();
|
||
|
event.stopPropagation();
|
||
|
let text = this.formInput.value;
|
||
|
let reqData = {
|
||
|
text: text,
|
||
|
html: md.render(text),
|
||
|
// parent_id: this.parent_id TODO - Handle replies
|
||
|
};
|
||
|
// TODO - Loading indicator
|
||
|
window.$http.post(window.baseUrl(`/ajax/page/${this.pageId}/comment`), reqData).then(resp => {
|
||
|
let newComment = document.createElement('div');
|
||
|
newComment.innerHTML = resp.data;
|
||
|
this.container.appendChild(newComment.children[0]);
|
||
|
|
||
|
window.$events.emit('success', window.trans('entities.comment_created_success'));
|
||
|
this.resetForm();
|
||
|
this.updateCount();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
updateCount() {
|
||
|
let count = this.container.children.length;
|
||
|
this.elem.querySelector('[comments-title]').textContent = window.trans_choice('entities.comment_count', count, {count});
|
||
|
}
|
||
|
|
||
|
resetForm() {
|
||
|
this.formInput.value = '';
|
||
|
this.formContainer.appendChild(this.form);
|
||
|
this.hideForm();
|
||
|
}
|
||
|
|
||
|
showForm() {
|
||
|
this.formContainer.style.display = 'block';
|
||
|
this.formContainer.parentNode.style.display = 'block';
|
||
|
this.elem.querySelector('[comment-add-button]').style.display = 'none';
|
||
|
this.formInput.focus(); // TODO - Scroll to input on focus
|
||
|
}
|
||
|
|
||
|
hideForm() {
|
||
|
this.formContainer.style.display = 'none';
|
||
|
this.formContainer.parentNode.style.display = 'none';
|
||
|
this.elem.querySelector('[comment-add-button]').style.display = 'block';
|
||
|
}
|
||
|
|
||
|
setReply() {
|
||
|
|
||
|
this.showForm();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// TODO - Go to comment if url param set
|
||
|
|
||
|
|
||
|
module.exports = PageComments;
|