summaryrefslogtreecommitdiff
path: root/client/js/views
diff options
context:
space:
mode:
authorHunternif <hunternif@gmail.com>2025-02-15 18:12:57 +0000
committerHunternif <hunternif@gmail.com>2025-02-15 18:12:57 +0000
commit6a5300502df8b4de9c8f269b444cd309f02b28ad (patch)
tree0cf2ba56bce802c94ad324f9eda7a31d37a42e2e /client/js/views
parent34e7c883808738871aed371948a3c9896a95905c (diff)
parent376f687c386f65522b2f65e98b998b21af26ee29 (diff)
Merge branch 'master' into hunternif
Diffstat (limited to 'client/js/views')
-rw-r--r--client/js/views/post_main_view.js5
-rw-r--r--client/js/views/post_upload_view.js24
-rw-r--r--client/js/views/posts_header_view.js50
-rw-r--r--client/js/views/posts_page_view.js35
-rw-r--r--client/js/views/user_tokens_view.js10
5 files changed, 110 insertions, 14 deletions
diff --git a/client/js/views/post_main_view.js b/client/js/views/post_main_view.js
index 36e3f9a..c6b312b 100644
--- a/client/js/views/post_main_view.js
+++ b/client/js/views/post_main_view.js
@@ -25,9 +25,8 @@ class PostMainView {
views.replaceContent(this._hostNode, sourceNode);
views.syncScrollPosition();
- const topNavigationNode = document.body.querySelector(
- "#top-navigation"
- );
+ const topNavigationNode =
+ document.body.querySelector("#top-navigation");
this._postContentControl = new PostContentControl(
postContainerNode,
diff --git a/client/js/views/post_upload_view.js b/client/js/views/post_upload_view.js
index c83dd0a..83fdf12 100644
--- a/client/js/views/post_upload_view.js
+++ b/client/js/views/post_upload_view.js
@@ -1,6 +1,7 @@
"use strict";
const events = require("../events.js");
+const api = require("../api.js");
const views = require("../util/views.js");
const FileDropperControl = require("../controls/file_dropper_control.js");
const TagList = require("../models/tag_list.js");
@@ -27,6 +28,7 @@ function _mimeTypeToPostType(mimeType) {
"image/heic": "image",
"video/mp4": "video",
"video/webm": "video",
+ "video/quicktime": "video",
}[mimeType] || "unknown"
);
}
@@ -40,7 +42,8 @@ class Uploadable extends events.EventTarget {
this.flags = [];
this.tags = [];
this.relations = [];
- this.anonymous = false;
+ this.anonymous = !api.isLoggedIn();
+ this.forceAnonymous = !api.isLoggedIn();
}
destroy() {}
@@ -124,6 +127,7 @@ class Url extends Uploadable {
heif: "image/heif",
heic: "image/heic",
mp4: "video/mp4",
+ mov: "video/quicktime",
webm: "video/webm",
};
for (let extension of Object.keys(mime)) {
@@ -309,7 +313,7 @@ class PostUploadView extends events.EventTarget {
for (let uploadable of this._uploadables) {
this._updateUploadableFromDom(uploadable);
}
- this._submitButtonNode.value = "Resume upload";
+ this._submitButtonNode.value = "Resume";
this._emit("submit");
}
@@ -396,6 +400,10 @@ class PostUploadView extends events.EventTarget {
skipDuplicates: this._skipDuplicatesCheckboxNode.checked,
copyTagsToOriginals:
this._copyTagsToOriginalsCheckboxNode.checked,
+ alwaysUploadSimilar:
+ this._alwaysUploadSimilarCheckboxNode.checked,
+ pauseRemainOnError:
+ this._pauseRemainOnErrorCheckboxNode.checked,
},
})
);
@@ -466,6 +474,18 @@ class PostUploadView extends events.EventTarget {
get _copyTagsToOriginalsCheckboxNode() {
return this._hostNode.querySelector("form [name=copy-tags-to-originals]");
}
+
+ get _alwaysUploadSimilarCheckboxNode() {
+ return this._hostNode.querySelector(
+ "form [name=always-upload-similar]"
+ );
+ }
+
+ get _pauseRemainOnErrorCheckboxNode() {
+ return this._hostNode.querySelector(
+ "form [name=pause-remain-on-error]"
+ );
+ }
get _submitButtonNode() {
return this._hostNode.querySelector("form [type=submit]");
diff --git a/client/js/views/posts_header_view.js b/client/js/views/posts_header_view.js
index 7f5acac..7923752 100644
--- a/client/js/views/posts_header_view.js
+++ b/client/js/views/posts_header_view.js
@@ -160,6 +160,34 @@ class BulkAddRelationEditor extends BulkEditor {
}
}
+class BulkDeleteEditor extends BulkEditor {
+ constructor(hostNode) {
+ super(hostNode);
+ this._hostNode.addEventListener("submit", (e) =>
+ this._evtFormSubmit(e)
+ );
+ }
+
+ _evtFormSubmit(e) {
+ e.preventDefault();
+ this.dispatchEvent(
+ new CustomEvent("deleteSelectedPosts", { detail: {} })
+ );
+ }
+
+ _evtOpenLinkClick(e) {
+ e.preventDefault();
+ this.toggleOpen(true);
+ this.dispatchEvent(new CustomEvent("open", { detail: {} }));
+ }
+
+ _evtCloseLinkClick(e) {
+ e.preventDefault();
+ this.toggleOpen(false);
+ this.dispatchEvent(new CustomEvent("close", { detail: {} }));
+ }
+}
+
class PostsHeaderView extends events.EventTarget {
constructor(ctx) {
super();
@@ -247,6 +275,13 @@ class PostsHeaderView extends events.EventTarget {
this._evtCloseMetricsBtnClick(e)
);
}
+
+ if (this._bulkEditDeleteNode) {
+ this._bulkDeleteEditor = new BulkDeleteEditor(
+ this._bulkEditDeleteNode
+ );
+ this._bulkEditors.push(this._bulkDeleteEditor);
+ }
for (let editor of this._bulkEditors) {
editor.addEventListener("submit", (e) => {
@@ -268,6 +303,8 @@ class PostsHeaderView extends events.EventTarget {
this._openBulkEditor(this._bulkSafetyEditor);
} else if (ctx.parameters.relations && this._bulkAddRelationEditor) {
this._openBulkEditor(this._bulkAddRelationEditor);
+ } else if (ctx.parameters.delete && this._bulkDeleteEditor) {
+ this._openBulkEditor(this._bulkDeleteEditor);
}
if (ctx.parameters.metrics && this._metricsBlockNode) {
this._toggleMetricsBlock(true);
@@ -322,6 +359,10 @@ class PostsHeaderView extends events.EventTarget {
return this._hostNode.querySelector(".bulk-add-relation");
}
+ get _bulkEditDeleteNode() {
+ return this._hostNode.querySelector(".bulk-edit-delete");
+ }
+
get _metricsButtonHolderNode() {
return this._hostNode.querySelector(".metrics-btn-holder");
}
@@ -400,9 +441,8 @@ class PostsHeaderView extends events.EventTarget {
e.target.classList.toggle("disabled");
const safety = e.target.getAttribute("data-safety");
let browsingSettings = settings.get();
- browsingSettings.listPosts[safety] = !browsingSettings.listPosts[
- safety
- ];
+ browsingSettings.listPosts[safety] =
+ !browsingSettings.listPosts[safety];
settings.save(browsingSettings, true);
this.dispatchEvent(
new CustomEvent("navigate", {
@@ -498,6 +538,10 @@ class PostsHeaderView extends events.EventTarget {
this._bulkAddRelationEditor && this._bulkAddRelationEditor.opened
? this._ctx.parameters.relations || " "
: null;
+ parameters.delete =
+ this._bulkDeleteEditor && this._bulkDeleteEditor.opened
+ ? "1"
+ : null;
this.dispatchEvent(
new CustomEvent("navigate", { detail: { parameters: parameters } })
);
diff --git a/client/js/views/posts_page_view.js b/client/js/views/posts_page_view.js
index 9885602..463468a 100644
--- a/client/js/views/posts_page_view.js
+++ b/client/js/views/posts_page_view.js
@@ -47,6 +47,13 @@ class PostsPageView extends events.EventTarget {
);
}
}
+
+ const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
+ if (deleteFlipperNode) {
+ deleteFlipperNode.addEventListener("click", (e) =>
+ this._evtBulkToggleDeleteClick(e, post)
+ );
+ }
}
this._syncBulkEditorsHighlights();
@@ -68,6 +75,10 @@ class PostsPageView extends events.EventTarget {
return listItemNode.querySelector(".relation-flipper");
}
+ _getDeleteFlipperNode(listItemNode) {
+ return listItemNode.querySelector(".delete-flipper");
+ }
+
_evtPostChange(e) {
const listItemNode = this._postIdToListItemNode[e.detail.post.id];
for (let node of listItemNode.querySelectorAll("[data-disabled]")) {
@@ -128,6 +139,20 @@ class PostsPageView extends events.EventTarget {
);
}
+ _evtBulkToggleDeleteClick(e, post) {
+ e.preventDefault();
+ const linkNode = e.target;
+ linkNode.classList.toggle("delete");
+ this.dispatchEvent(
+ new CustomEvent("markForDeletion", {
+ detail: {
+ post,
+ delete: linkNode.classList.contains("delete"),
+ },
+ })
+ );
+ }
+
_syncBulkEditorsHighlights() {
for (let listItemNode of this._listItemNodes) {
const postId = listItemNode.getAttribute("data-post-id");
@@ -159,6 +184,16 @@ class PostsPageView extends events.EventTarget {
let related = this._ctx.parameters.relations.includes(post.id);
relationFlipperNode.classList.toggle("related", related);
}
+
+ const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
+ if (deleteFlipperNode) {
+ deleteFlipperNode.classList.toggle(
+ "delete",
+ this._ctx.bulkEdit.markedForDeletion.some(
+ (x) => x.id == postId
+ )
+ );
+ }
}
}
}
diff --git a/client/js/views/user_tokens_view.js b/client/js/views/user_tokens_view.js
index 68707f0..9ba9e7c 100644
--- a/client/js/views/user_tokens_view.js
+++ b/client/js/views/user_tokens_view.js
@@ -72,9 +72,8 @@ class UserTokenView extends events.EventTarget {
_evtDelete(e) {
e.preventDefault();
- const userToken = this._tokens[
- parseInt(e.target.getAttribute("data-token-id"))
- ];
+ const userToken =
+ this._tokens[parseInt(e.target.getAttribute("data-token-id"))];
this.dispatchEvent(
new CustomEvent("delete", {
detail: {
@@ -110,9 +109,8 @@ class UserTokenView extends events.EventTarget {
_evtChangeNoteClick(e) {
e.preventDefault();
- const userToken = this._tokens[
- parseInt(e.target.getAttribute("data-token-id"))
- ];
+ const userToken =
+ this._tokens[parseInt(e.target.getAttribute("data-token-id"))];
const text = window.prompt(
"Please enter the new name:",
userToken.note !== null ? userToken.note : undefined