3972b902d8
Permissions, regex filters, app title, email info, and safety now fetched using server's Info API
136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
'use strict';
|
|
|
|
const events = require('../events.js');
|
|
const views = require('../util/views.js');
|
|
|
|
const KEY_RETURN = 13;
|
|
const template = views.getTemplate('post-merge');
|
|
const sideTemplate = views.getTemplate('post-merge-side');
|
|
|
|
class PostMergeView extends events.EventTarget {
|
|
constructor(ctx) {
|
|
super();
|
|
|
|
this._ctx = ctx;
|
|
this._post = ctx.post;
|
|
this._hostNode = ctx.hostNode;
|
|
|
|
this._leftPost = ctx.post;
|
|
this._rightPost = null;
|
|
views.replaceContent(this._hostNode, template(this._ctx));
|
|
views.decorateValidator(this._formNode);
|
|
|
|
this._refreshLeftSide();
|
|
this._refreshRightSide();
|
|
|
|
this._formNode.addEventListener('submit', e => this._evtSubmit(e));
|
|
}
|
|
|
|
clearMessages() {
|
|
views.clearMessages(this._hostNode);
|
|
}
|
|
|
|
enableForm() {
|
|
views.enableForm(this._formNode);
|
|
}
|
|
|
|
disableForm() {
|
|
views.disableForm(this._formNode);
|
|
}
|
|
|
|
showSuccess(message) {
|
|
views.showSuccess(this._hostNode, message);
|
|
}
|
|
|
|
showError(message) {
|
|
views.showError(this._hostNode, message);
|
|
}
|
|
|
|
selectPost(post) {
|
|
this._rightPost = post;
|
|
this._refreshRightSide();
|
|
}
|
|
|
|
_refreshLeftSide() {
|
|
this._refreshSide(this._leftPost, this._leftSideNode, 'left', false);
|
|
}
|
|
|
|
_refreshRightSide() {
|
|
this._refreshSide(this._rightPost, this._rightSideNode, 'right', true);
|
|
}
|
|
|
|
_refreshSide(post, sideNode, sideName, isEditable) {
|
|
views.replaceContent(
|
|
sideNode,
|
|
sideTemplate(Object.assign({}, this._ctx, {
|
|
post: post,
|
|
name: sideName,
|
|
editable: isEditable})));
|
|
|
|
let postIdNode = sideNode.querySelector('input[type=text]');
|
|
let searchButtonNode = sideNode.querySelector('input[type=button]');
|
|
if (isEditable) {
|
|
postIdNode.addEventListener(
|
|
'keydown', e => this._evtPostSearchFieldKeyDown(e));
|
|
searchButtonNode.addEventListener(
|
|
'click', e => this._evtPostSearchButtonClick(e, postIdNode));
|
|
}
|
|
}
|
|
|
|
_evtSubmit(e) {
|
|
e.preventDefault();
|
|
const checkedTargetPost = this._formNode.querySelector(
|
|
'.target-post :checked').value;
|
|
const checkedTargetPostContent = this._formNode.querySelector(
|
|
'.target-post-content :checked').value;
|
|
this.dispatchEvent(new CustomEvent('submit', {
|
|
detail: {
|
|
post: checkedTargetPost == 'left' ?
|
|
this._rightPost :
|
|
this._leftPost,
|
|
targetPost: checkedTargetPost == 'left' ?
|
|
this._leftPost :
|
|
this._rightPost,
|
|
useOldContent: checkedTargetPostContent !== checkedTargetPost,
|
|
},
|
|
}));
|
|
}
|
|
|
|
_evtPostSearchFieldKeyDown(e) {
|
|
const key = e.which;
|
|
if (key !== KEY_RETURN) {
|
|
return;
|
|
}
|
|
e.target.blur();
|
|
e.preventDefault();
|
|
this.dispatchEvent(new CustomEvent('select', {
|
|
detail: {
|
|
postId: e.target.value,
|
|
},
|
|
}));
|
|
}
|
|
|
|
_evtPostSearchButtonClick(e, textNode) {
|
|
e.target.blur();
|
|
e.preventDefault();
|
|
this.dispatchEvent(new CustomEvent('select', {
|
|
detail: {
|
|
postId: textNode.value,
|
|
},
|
|
}));
|
|
}
|
|
|
|
get _formNode() {
|
|
return this._hostNode.querySelector('form');
|
|
}
|
|
|
|
get _leftSideNode() {
|
|
return this._hostNode.querySelector('.left-post-container');
|
|
}
|
|
|
|
get _rightSideNode() {
|
|
return this._hostNode.querySelector('.right-post-container');
|
|
}
|
|
}
|
|
|
|
module.exports = PostMergeView;
|