szurubooru/client/js/views/post_merge_view.js

153 lines
4 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;