gallery.accords-library.com/client/js/controls/comment_control.js

126 lines
3.6 KiB
JavaScript

'use strict';
const api = require('../api.js');
const events = require('../events.js');
const views = require('../util/views.js');
const CommentFormControl = require('../controls/comment_form_control.js');
const template = views.getTemplate('comment');
const scoreTemplate = views.getTemplate('score');
class CommentControl extends events.EventTarget {
constructor(hostNode, comment) {
super();
this._hostNode = hostNode;
this._comment = comment;
comment.addEventListener('change', e => this._evtChange(e));
comment.addEventListener('changeScore', e => this._evtChangeScore(e));
const isLoggedIn = api.isLoggedIn(this._comment.user);
const infix = isLoggedIn ? 'own' : 'any';
views.replaceContent(this._hostNode, template({
comment: this._comment,
canViewUsers: api.hasPrivilege('users:view'),
canEditComment: api.hasPrivilege(`comments:edit:${infix}`),
canDeleteComment: api.hasPrivilege(`comments:delete:${infix}`),
}));
if (this._editButtonNode) {
this._editButtonNode.addEventListener(
'click', e => this._evtEditClick(e));
}
if (this._deleteButtonNode) {
this._deleteButtonNode.addEventListener(
'click', e => this._evtDeleteClick(e));
}
this._formControl = new CommentFormControl(
this._hostNode.querySelector('.comment-form-container'),
this._comment,
true);
events.proxyEvent(this._formControl, this, 'submit');
this._installScore();
}
get _scoreContainerNode() {
return this._hostNode.querySelector('.score-container');
}
get _editButtonNode() {
return this._hostNode.querySelector('.edit');
}
get _deleteButtonNode() {
return this._hostNode.querySelector('.delete');
}
get _upvoteButtonNode() {
return this._hostNode.querySelector('.upvote');
}
get _downvoteButtonNode() {
return this._hostNode.querySelector('.downvote');
}
_installScore() {
views.replaceContent(
this._scoreContainerNode,
scoreTemplate({
score: this._comment.score,
ownScore: this._comment.ownScore,
canScore: api.hasPrivilege('comments:score'),
}));
if (this._upvoteButtonNode) {
this._upvoteButtonNode.addEventListener(
'click', e => this._evtScoreClick(e, 1));
}
if (this._downvoteButtonNode) {
this._downvoteButtonNode.addEventListener(
'click', e => this._evtScoreClick(e, -1));
}
}
_evtEditClick(e) {
e.preventDefault();
this._formControl.enterEditMode();
}
_evtScoreClick(e, score) {
e.preventDefault();
if (!api.hasPrivilege('comments:score')) {
return;
}
this.dispatchEvent(new CustomEvent('score', {
detail: {
comment: this._comment,
score: this._comment.ownScore === score ? 0 : score,
},
}));
}
_evtDeleteClick(e) {
e.preventDefault();
if (!window.confirm('Are you sure you want to delete this comment?')) {
return;
}
this.dispatchEvent(new CustomEvent('delete', {
detail: {
comment: this._comment,
},
}));
}
_evtChange(e) {
this._formControl.exitEditMode();
}
_evtChangeScore(e) {
this._installScore();
}
};
module.exports = CommentControl;