diff options
Diffstat (limited to 'client/js/controllers')
| -rw-r--r-- | client/js/controllers/home_controller.js | 2 | ||||
| -rw-r--r-- | client/js/controllers/pool_controller.js | 8 | ||||
| -rw-r--r-- | client/js/controllers/pool_list_controller.js | 2 | ||||
| -rw-r--r-- | client/js/controllers/post_list_controller.js | 51 | ||||
| -rw-r--r-- | client/js/controllers/post_main_controller.js | 12 | ||||
| -rw-r--r-- | client/js/controllers/post_upload_controller.js | 68 | ||||
| -rw-r--r-- | client/js/controllers/tag_controller.js | 6 | ||||
| -rw-r--r-- | client/js/controllers/user_controller.js | 17 |
8 files changed, 119 insertions, 47 deletions
diff --git a/client/js/controllers/home_controller.js b/client/js/controllers/home_controller.js index ea2a411..528ce62 100644 --- a/client/js/controllers/home_controller.js +++ b/client/js/controllers/home_controller.js @@ -17,7 +17,7 @@ class HomeController { buildDate: config.meta.buildDate, canListSnapshots: api.hasPrivilege("snapshots:list"), canListPosts: api.hasPrivilege("posts:list"), - isDevelopmentMode: config.environment == "development" + isDevelopmentMode: config.environment == "development", }); Info.get().then( diff --git a/client/js/controllers/pool_controller.js b/client/js/controllers/pool_controller.js index ad0b956..f49827f 100644 --- a/client/js/controllers/pool_controller.js +++ b/client/js/controllers/pool_controller.js @@ -91,16 +91,16 @@ class PoolController { _evtUpdate(e) { this._view.clearMessages(); this._view.disableForm(); - if (e.detail.names !== undefined) { + if (e.detail.names !== undefined && e.detail.names !== null) { e.detail.pool.names = e.detail.names; } - if (e.detail.category !== undefined) { + if (e.detail.category !== undefined && e.detail.category !== null) { e.detail.pool.category = e.detail.category; } - if (e.detail.description !== undefined) { + if (e.detail.description !== undefined && e.detail.description !== null) { e.detail.pool.description = e.detail.description; } - if (e.detail.posts !== undefined) { + if (e.detail.posts !== undefined && e.detail.posts !== null) { e.detail.pool.posts.clear(); for (let postId of e.detail.posts) { e.detail.pool.posts.add( diff --git a/client/js/controllers/pool_list_controller.js b/client/js/controllers/pool_list_controller.js index 91d655c..a66f816 100644 --- a/client/js/controllers/pool_list_controller.js +++ b/client/js/controllers/pool_list_controller.js @@ -43,6 +43,8 @@ class PoolListController { this._headerView.addEventListener( "submit", (e) => this._evtSubmit(e), + ); + this._headerView.addEventListener( "navigate", (e) => this._evtNavigate(e) ); diff --git a/client/js/controllers/post_list_controller.js b/client/js/controllers/post_list_controller.js index 7a8ff9e..0146e9e 100644 --- a/client/js/controllers/post_list_controller.js +++ b/client/js/controllers/post_list_controller.js @@ -47,6 +47,7 @@ class PostListController { canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"), canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"), canViewMetrics: api.hasPrivilege("metrics:list"), + canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"), bulkEdit: { tags: this._bulkEditTags, }, @@ -55,6 +56,16 @@ class PostListController { this._evtNavigate(e) ); + if (this._headerView._bulkDeleteEditor) { + this._headerView._bulkDeleteEditor.addEventListener( + "deleteSelectedPosts", + (e) => { + this._evtDeleteSelectedPosts(e); + } + ); + } + + this._postsMarkedForDeletion = []; this._syncPageController(); } @@ -143,6 +154,38 @@ class PostListController { this._ctx.parameters.relations = relations.join(" ") || " "; } + _evtMarkForDeletion(e) { + const postId = e.detail; + + // Add or remove post from delete list + if (e.detail.delete) { + this._postsMarkedForDeletion.push(e.detail.post); + } else { + this._postsMarkedForDeletion = this._postsMarkedForDeletion.filter( + (x) => x.id != e.detail.post.id + ); + } + } + + _evtDeleteSelectedPosts(e) { + if (this._postsMarkedForDeletion.length == 0) return; + + if ( + confirm( + `Are you sure you want to delete ${this._postsMarkedForDeletion.length} posts?` + ) + ) { + Promise.all( + this._postsMarkedForDeletion.map((post) => post.delete()) + ) + .catch((error) => window.alert(error.message)) + .then(() => { + this._postsMarkedForDeletion = []; + this._headerView._navigate(); + }); + } + } + _syncPageController() { this._pageController.run({ parameters: this._ctx.parameters, @@ -177,6 +220,11 @@ class PostListController { tags: this._bulkEditTags, relations: this._ctx.parameters.relations, }, + canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"), + bulkEdit: { + tags: this._bulkEditTags, + markedForDeletion: this._postsMarkedForDeletion, + }, postFlow: settings.get().postFlow, }); const view = new PostsPageView(pageCtx); @@ -191,6 +239,9 @@ class PostListController { view.addEventListener("removeRelation", (e) => this._evtRemoveRelation(e) ); + view.addEventListener("markForDeletion", (e) => + this._evtMarkForDeletion(e) + ); return view; }, readPageFromCache: (rawPage) => PostList.fromResponse(rawPage), diff --git a/client/js/controllers/post_main_controller.js b/client/js/controllers/post_main_controller.js index d473788..7d6dcd3 100644 --- a/client/js/controllers/post_main_controller.js +++ b/client/js/controllers/post_main_controller.js @@ -160,22 +160,22 @@ class PostMainController extends BasePostController { this._view.sidebarControl.disableForm(); this._view.sidebarControl.clearMessages(); const post = e.detail.post; - if (e.detail.safety !== undefined) { + if (e.detail.safety !== undefined && e.detail.safety !== null) { post.safety = e.detail.safety; } - if (e.detail.flags !== undefined) { + if (e.detail.flags !== undefined && e.detail.flags !== null) { post.flags = e.detail.flags; } - if (e.detail.relations !== undefined) { + if (e.detail.relations !== undefined && e.detail.relations !== null) { post.relations = e.detail.relations; } - if (e.detail.content !== undefined) { + if (e.detail.content !== undefined && e.detail.content !== null) { post.newContent = e.detail.content; } - if (e.detail.thumbnail !== undefined) { + if (e.detail.thumbnail !== undefined && e.detail.thumbnail !== null) { post.newThumbnail = e.detail.thumbnail; } - if (e.detail.source !== undefined) { + if (e.detail.source !== undefined && e.detail.source !== null) { post.source = e.detail.source; } post.save().then( diff --git a/client/js/controllers/post_upload_controller.js b/client/js/controllers/post_upload_controller.js index 360dd4f..7ee63ac 100644 --- a/client/js/controllers/post_upload_controller.js +++ b/client/js/controllers/post_upload_controller.js @@ -13,7 +13,7 @@ const PostUploadView = require("../views/post_upload_view.js"); const EmptyView = require("../views/empty_view.js"); const genericErrorMessage = - "One of the posts needs your attention; " + + "One or more posts needs your attention; " + 'click "resume upload" when you\'re ready.'; class PostUploadController { @@ -58,6 +58,7 @@ class PostUploadController { this._view.disableForm(); this._view.clearMessages(); const tagErrors = []; // to be displayed after all uploads + let anyFailures = false; e.detail.uploadables .reduce( @@ -66,11 +67,45 @@ class PostUploadController { this._uploadSinglePost( uploadable, e.detail.skipDuplicates, - e.detail.copyTagsToOriginals - ) + e.detail.copyTagsToOriginals, + e.detail.alwaysUploadSimilar + ).catch((error) => { + anyFailures = true; + if (error.uploadable) { + if (error.similarPosts) { + error.uploadable.lookalikes = + error.similarPosts; + this._view.updateUploadable( + error.uploadable + ); + this._view.showInfo( + error.message, + error.uploadable + ); + } else { + this._view.showError( + error.message, + error.uploadable + ); + } + } else { + this._view.showError( + error.message, + uploadable + ); + } + if (e.detail.pauseRemainOnError) { + return Promise.reject(); + } + }) ), Promise.resolve() ) + .then(() => { + if (anyFailures) { + return Promise.reject(); + } + }) .then( () => { this._view.clearMessages(); @@ -82,31 +117,13 @@ class PostUploadController { } }, (error) => { - if (error.uploadable) { - if (error.similarPosts) { - error.uploadable.lookalikes = error.similarPosts; - this._view.updateUploadable(error.uploadable); - this._view.showInfo(genericErrorMessage); - this._view.showInfo( - error.message, - error.uploadable - ); - } else { - this._view.showError(genericErrorMessage); - this._view.showError( - error.message, - error.uploadable - ); - } - } else { - this._view.showError(error.message); - } + this._view.showError(genericErrorMessage); this._view.enableForm(); } ); } - _uploadSinglePost(uploadable, skipDuplicates, copyTagsToOriginals) { + _uploadSinglePost(uploadable, skipDuplicates, copyTagsToOriginals, alwaysUploadSimilar) { progress.start(); let reverseSearchPromise = Promise.resolve(); if (!uploadable.lookalikesConfirmed) { @@ -145,7 +162,10 @@ class PostUploadController { } // notify about similar posts - if (searchResult.similarPosts.length) { + if ( + searchResult.similarPosts.length && + !alwaysUploadSimilar + ) { let error = new Error( `Found ${searchResult.similarPosts.length} similar ` + "posts.\nYou can resume or discard this upload." diff --git a/client/js/controllers/tag_controller.js b/client/js/controllers/tag_controller.js index 326430b..b7e6ce3 100644 --- a/client/js/controllers/tag_controller.js +++ b/client/js/controllers/tag_controller.js @@ -105,13 +105,13 @@ class TagController { _evtUpdate(e) { this._view.clearMessages(); this._view.disableForm(); - if (e.detail.names !== undefined) { + if (e.detail.names !== undefined && e.detail.names !== null) { e.detail.tag.names = e.detail.names; } - if (e.detail.category !== undefined) { + if (e.detail.category !== undefined && e.detail.category !== null) { e.detail.tag.category = e.detail.category; } - if (e.detail.description !== undefined) { + if (e.detail.description !== undefined && e.detail.description !== null) { e.detail.tag.description = e.detail.description; } e.detail.tag.save().then( diff --git a/client/js/controllers/user_controller.js b/client/js/controllers/user_controller.js index 326736b..8cf4658 100644 --- a/client/js/controllers/user_controller.js +++ b/client/js/controllers/user_controller.js @@ -31,9 +31,8 @@ class UserController { userTokenPromise = UserToken.get(userName).then( (userTokens) => { return userTokens.map((token) => { - token.isCurrentAuthToken = api.isCurrentAuthToken( - token - ); + token.isCurrentAuthToken = + api.isCurrentAuthToken(token); return token; }); }, @@ -176,21 +175,21 @@ class UserController { const isLoggedIn = api.isLoggedIn(e.detail.user); const infix = isLoggedIn ? "self" : "any"; - if (e.detail.name !== undefined) { + if (e.detail.name !== undefined && e.detail.name !== null) { e.detail.user.name = e.detail.name; } - if (e.detail.email !== undefined) { + if (e.detail.email !== undefined && e.detail.email !== null) { e.detail.user.email = e.detail.email; } - if (e.detail.rank !== undefined) { + if (e.detail.rank !== undefined && e.detail.rank !== null) { e.detail.user.rank = e.detail.rank; } - if (e.detail.password !== undefined) { + if (e.detail.password !== undefined && e.detail.password !== null) { e.detail.user.password = e.detail.password; } - if (e.detail.avatarStyle !== undefined) { + if (e.detail.avatarStyle !== undefined && e.detail.avatarStyle !== null) { e.detail.user.avatarStyle = e.detail.avatarStyle; if (e.detail.avatarContent) { e.detail.user.avatarContent = e.detail.avatarContent; @@ -303,7 +302,7 @@ class UserController { this._view.clearMessages(); this._view.disableForm(); - if (e.detail.note !== undefined) { + if (e.detail.note !== undefined && e.detail.note !== null) { e.detail.userToken.note = e.detail.note; } |