diff options
| author | Ruin0x11 | 2020-05-04 15:15:30 -0700 |
|---|---|---|
| committer | Ruin0x11 | 2020-05-04 15:15:51 -0700 |
| commit | 6b8e3f251f69c9d7d560148100cdb8df941a81c2 (patch) | |
| tree | 2370acc1c3119b506ad016e4350d482af98908fb /client/js | |
| parent | ffba010ae4b6efebd791a077125df92ef57274d0 (diff) | |
Implement pool merging
Diffstat (limited to 'client/js')
| -rw-r--r-- | client/js/controllers/pool_controller.js | 4 | ||||
| -rw-r--r-- | client/js/controls/pool_input_control.js | 25 | ||||
| -rw-r--r-- | client/js/models/post.js | 199 | ||||
| -rw-r--r-- | client/js/views/pool_merge_view.js | 9 |
4 files changed, 115 insertions, 122 deletions
diff --git a/client/js/controllers/pool_controller.js b/client/js/controllers/pool_controller.js index 99e2e9b..e243cd8 100644 --- a/client/js/controllers/pool_controller.js +++ b/client/js/controllers/pool_controller.js @@ -105,13 +105,13 @@ class PoolController { this._view.clearMessages(); this._view.disableForm(); e.detail.pool - .merge(e.detail.targetPoolName, e.detail.addAlias) + .merge(e.detail.targetPoolId, e.detail.addAlias) .then(() => { this._view.showSuccess('Pool merged.'); this._view.enableForm(); router.replace( uri.formatClientLink( - 'pool', e.detail.targetPoolName, 'merge'), + 'pool', e.detail.targetPoolId, 'merge'), null, false); }, error => { this._view.showError(error.message); diff --git a/client/js/controls/pool_input_control.js b/client/js/controls/pool_input_control.js index f53c8c9..a827206 100644 --- a/client/js/controls/pool_input_control.js +++ b/client/js/controls/pool_input_control.js @@ -64,10 +64,6 @@ class PoolInputControl extends events.EventTarget { verticalShift: -2 }); - // dom events - this._poolInputNode.addEventListener( - 'keydown', e => this._evtInputKeyDown(e)); - // show this._hostNode.style.display = 'none'; this._hostNode.parentNode.insertBefore( @@ -117,23 +113,6 @@ class PoolInputControl extends events.EventTarget { this.dispatchEvent(new CustomEvent('change')); } - _evtAddPoolButtonClick(e) { - // TODO - // e.preventDefault(); - // this.addPoolByName(this._poolInputNode.value, SOURCE_USER_INPUT); - // this._poolInputNode.value = ''; - } - - _evtInputKeyDown(e) { - // TODO - if (e.which == KEY_RETURN || e.which == KEY_SPACE) { - e.preventDefault(); - // this._hideAutoComplete(); - // this.addPoolByText(this._poolInputNode.value, SOURCE_USER_INPUT); - // this._poolInputNode.value = ''; - } - } - _createListItemNode(pool) { const className = pool.category ? misc.makeCssName(pool.category, 'pool') : @@ -159,10 +138,6 @@ class PoolInputControl extends events.EventTarget { 'href', uri.formatClientLink( 'posts', {query: "pool:" + pool.id})); searchLinkNode.textContent = pool.names[0] + ' '; - searchLinkNode.addEventListener('click', e => { - // TODO? - // e.preventDefault(); - }); const usagesNode = document.createElement('span'); usagesNode.classList.add('pool-usages'); diff --git a/client/js/models/post.js b/client/js/models/post.js index e3388ec..6022ae0 100644 --- a/client/js/models/post.js +++ b/client/js/models/post.js @@ -8,6 +8,7 @@ const TagList = require('./tag_list.js'); const NoteList = require('./note_list.js'); const CommentList = require('./comment_list.js'); const PoolList = require('./pool_list.js'); +const Pool = require('./pool.js'); const misc = require('../util/misc.js'); class Post extends events.EventTarget { @@ -98,22 +99,36 @@ class Post extends events.EventTarget { _savePoolPosts() { const difference = (a, b) => a.filter(post => !b.hasPoolId(post.id)); + + // find the pools where the post was added or removed const added = difference(this.pools, this._orig._pools); const removed = difference(this._orig._pools, this.pools); + let ops = []; + // update each pool's list of posts for (let pool of added) { - if (!pool.posts.hasPostId(this._id)) { - pool.posts.addById(this._id); - ops.push(pool.save()); - } + let op = Pool.get(pool.id).then(response => { + if (!response.posts.hasPostId(this._id)) { + response.posts.addById(this._id); + return response.save(); + } else { + return Promise.resolve(response); + } + }); + ops.push(op); } for (let pool of removed) { - if (pool.posts.hasPostId(this._id)) { - pool.posts.removeById(this._id); - ops.push(pool.save()); - } + let op = Pool.get(pool.id).then(response => { + if (response.posts.hasPostId(this._id)) { + response.posts.removeById(this._id); + return response.save(); + } else { + return Promise.resolve(response); + } + }); + ops.push(op); } return Promise.all(ops); @@ -156,34 +171,34 @@ class Post extends events.EventTarget { } let apiPromise = this._id ? - api.put(uri.formatApiLink('post', this.id), detail, files) : - api.post(uri.formatApiLink('posts'), detail, files); + api.put(uri.formatApiLink('post', this.id), detail, files) : + api.post(uri.formatApiLink('posts'), detail, files); return apiPromise.then(response => { - if (this._pools !== this._orig._pools) { + if (misc.arraysDiffer(this._pools, this._orig._pools)) { return this._savePoolPosts() - .then(() => Promise.resolve(response)); + .then(() => Promise.resolve(response)); } return Promise.resolve(response); }).then(response => { this._updateFromResponse(response); this.dispatchEvent( - new CustomEvent('change', {detail: {post: this}})); + new CustomEvent('change', {detail: {post: this}})); if (this._newContent) { this.dispatchEvent( - new CustomEvent('changeContent', {detail: {post: this}})); + new CustomEvent('changeContent', {detail: {post: this}})); } if (this._newThumbnail) { this.dispatchEvent( - new CustomEvent('changeThumbnail', {detail: {post: this}})); + new CustomEvent('changeThumbnail', {detail: {post: this}})); } return Promise.resolve(); }, error => { if (error.response && - error.response.name === 'PostAlreadyUploadedError') { + error.response.name === 'PostAlreadyUploadedError') { error.message = - `Post already uploaded (@${error.response.otherPostId})`; + `Post already uploaded (@${error.response.otherPostId})`; } return Promise.reject(error); }); @@ -191,118 +206,118 @@ class Post extends events.EventTarget { feature() { return api.post( - uri.formatApiLink('featured-post'), - {id: this._id}) - .then(response => { - return Promise.resolve(); - }); + uri.formatApiLink('featured-post'), + {id: this._id}) + .then(response => { + return Promise.resolve(); + }); } delete() { return api.delete( - uri.formatApiLink('post', this.id), - {version: this._version}) - .then(response => { - this.dispatchEvent(new CustomEvent('delete', { - detail: { - post: this, - }, - })); - return Promise.resolve(); - }); + uri.formatApiLink('post', this.id), + {version: this._version}) + .then(response => { + this.dispatchEvent(new CustomEvent('delete', { + detail: { + post: this, + }, + })); + return Promise.resolve(); + }); } merge(targetId, useOldContent) { return api.get(uri.formatApiLink('post', targetId)) - .then(response => { - return api.post(uri.formatApiLink('post-merge'), { - removeVersion: this._version, - remove: this._id, - mergeToVersion: response.version, - mergeTo: targetId, - replaceContent: useOldContent, + .then(response => { + return api.post(uri.formatApiLink('post-merge'), { + removeVersion: this._version, + remove: this._id, + mergeToVersion: response.version, + mergeTo: targetId, + replaceContent: useOldContent, + }); + }).then(response => { + this._updateFromResponse(response); + this.dispatchEvent(new CustomEvent('change', { + detail: { + post: this, + }, + })); + return Promise.resolve(); }); - }).then(response => { - this._updateFromResponse(response); - this.dispatchEvent(new CustomEvent('change', { - detail: { - post: this, - }, - })); - return Promise.resolve(); - }); } setScore(score) { return api.put( - uri.formatApiLink('post', this.id, 'score'), - {score: score}) - .then(response => { - const prevFavorite = this._ownFavorite; - this._updateFromResponse(response); - if (this._ownFavorite !== prevFavorite) { - this.dispatchEvent(new CustomEvent('changeFavorite', { + uri.formatApiLink('post', this.id, 'score'), + {score: score}) + .then(response => { + const prevFavorite = this._ownFavorite; + this._updateFromResponse(response); + if (this._ownFavorite !== prevFavorite) { + this.dispatchEvent(new CustomEvent('changeFavorite', { + detail: { + post: this, + }, + })); + } + this.dispatchEvent(new CustomEvent('changeScore', { detail: { post: this, }, })); - } - this.dispatchEvent(new CustomEvent('changeScore', { - detail: { - post: this, - }, - })); - return Promise.resolve(); - }); + return Promise.resolve(); + }); } addToFavorites() { return api.post(uri.formatApiLink('post', this.id, 'favorite')) - .then(response => { - const prevScore = this._ownScore; - this._updateFromResponse(response); - if (this._ownScore !== prevScore) { - this.dispatchEvent(new CustomEvent('changeScore', { + .then(response => { + const prevScore = this._ownScore; + this._updateFromResponse(response); + if (this._ownScore !== prevScore) { + this.dispatchEvent(new CustomEvent('changeScore', { + detail: { + post: this, + }, + })); + } + this.dispatchEvent(new CustomEvent('changeFavorite', { detail: { post: this, }, })); - } - this.dispatchEvent(new CustomEvent('changeFavorite', { - detail: { - post: this, - }, - })); - return Promise.resolve(); - }); + return Promise.resolve(); + }); } removeFromFavorites() { return api.delete(uri.formatApiLink('post', this.id, 'favorite')) - .then(response => { - const prevScore = this._ownScore; - this._updateFromResponse(response); - if (this._ownScore !== prevScore) { - this.dispatchEvent(new CustomEvent('changeScore', { + .then(response => { + const prevScore = this._ownScore; + this._updateFromResponse(response); + if (this._ownScore !== prevScore) { + this.dispatchEvent(new CustomEvent('changeScore', { + detail: { + post: this, + }, + })); + } + this.dispatchEvent(new CustomEvent('changeFavorite', { detail: { post: this, }, })); - } - this.dispatchEvent(new CustomEvent('changeFavorite', { - detail: { - post: this, - }, - })); - return Promise.resolve(); - }); + return Promise.resolve(); + }); } mutateContentUrl() { this._contentUrl = - this._orig._contentUrl + - '?bypass-cache=' + - Math.round(Math.random() * 1000); + this._orig._contentUrl + + '?bypass-cache=' + + Math.round(Math.random() * 1000); } _updateFromResponse(response) { diff --git a/client/js/views/pool_merge_view.js b/client/js/views/pool_merge_view.js index ea9fe6f..4bbef7e 100644 --- a/client/js/views/pool_merge_view.js +++ b/client/js/views/pool_merge_view.js @@ -14,6 +14,7 @@ class PoolMergeView extends events.EventTarget { this._pool = ctx.pool; this._hostNode = ctx.hostNode; + this._target_pool_id = null; ctx.poolNamePattern = api.getPoolNameRegex(); views.replaceContent(this._hostNode, template(ctx)); @@ -22,9 +23,11 @@ class PoolMergeView extends events.EventTarget { this._autoCompleteControl = new PoolAutoCompleteControl( this._targetPoolFieldNode, { - confirm: pool => + confirm: pool => { + this._target_pool_id = pool.id; this._autoCompleteControl.replaceSelectedText( - pool.names[0], false), + pool.names[0], false); + } }); } @@ -56,7 +59,7 @@ class PoolMergeView extends events.EventTarget { this.dispatchEvent(new CustomEvent('submit', { detail: { pool: this._pool, - targetPoolName: this._targetPoolFieldNode.value + targetPoolId: this._target_pool_id }, })); } |