summaryrefslogtreecommitdiff
path: root/client/js/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'client/js/controllers')
-rw-r--r--client/js/controllers/home_controller.js2
-rw-r--r--client/js/controllers/pool_controller.js8
-rw-r--r--client/js/controllers/pool_list_controller.js2
-rw-r--r--client/js/controllers/post_list_controller.js51
-rw-r--r--client/js/controllers/post_main_controller.js12
-rw-r--r--client/js/controllers/post_upload_controller.js68
-rw-r--r--client/js/controllers/tag_controller.js6
-rw-r--r--client/js/controllers/user_controller.js17
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;
}