diff options
| author | rr- | 2016-10-22 10:03:38 +0200 |
|---|---|---|
| committer | rr- | 2016-10-22 14:05:56 +0200 |
| commit | f1445b9c24b286a9f74a2fead655ab5c169bc74b (patch) | |
| tree | eba026eb8dcd53f8d4db58e9dc50af1b857d92ed /client/js/views/post_merge_view.js | |
| parent | 8c0fa7f49ea24606e1887b76e89c2bfd155b1776 (diff) | |
client/posts: add post merging
Diffstat (limited to 'client/js/views/post_merge_view.js')
| -rw-r--r-- | client/js/views/post_merge_view.js | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/client/js/views/post_merge_view.js b/client/js/views/post_merge_view.js new file mode 100644 index 0000000..fb17527 --- /dev/null +++ b/client/js/views/post_merge_view.js @@ -0,0 +1,129 @@ +'use strict'; + +const config = require('../config.js'); +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() { + views.replaceContent( + this._leftSideNode, + sideTemplate(Object.assign({}, this._ctx, { + post: this._leftPost, + name: 'left', + editable: false}))); + } + + _refreshRightSide() { + views.replaceContent( + this._rightSideNode, + sideTemplate(Object.assign({}, this._ctx, { + post: this._rightPost, + name: 'right', + editable: true}))); + + if (this._targetPostFieldNode) { + this._targetPostFieldNode.addEventListener( + 'keydown', e => this._evtTargetPostFieldKeyDown(e)); + } + } + + _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, + }, + })); + } + + _evtTargetPostFieldKeyDown(e) { + const key = e.which; + if (key !== KEY_RETURN) { + return; + } + e.target.blur(); + e.preventDefault(); + this.dispatchEvent(new CustomEvent('select', { + detail: { + postId: this._targetPostFieldNode.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'); + } + + get _targetPostFieldNode() { + return this._formNode.querySelector( + '.post-mirror input:not([readonly])[type=text]'); + } +} + +module.exports = PostMergeView; |