diff options
| author | Hunternif <hunternif@gmail.com> | 2025-02-15 18:12:57 +0000 |
|---|---|---|
| committer | Hunternif <hunternif@gmail.com> | 2025-02-15 18:12:57 +0000 |
| commit | 6a5300502df8b4de9c8f269b444cd309f02b28ad (patch) | |
| tree | 0cf2ba56bce802c94ad324f9eda7a31d37a42e2e /client/js/views | |
| parent | 34e7c883808738871aed371948a3c9896a95905c (diff) | |
| parent | 376f687c386f65522b2f65e98b998b21af26ee29 (diff) | |
Merge branch 'master' into hunternif
Diffstat (limited to 'client/js/views')
| -rw-r--r-- | client/js/views/post_main_view.js | 5 | ||||
| -rw-r--r-- | client/js/views/post_upload_view.js | 24 | ||||
| -rw-r--r-- | client/js/views/posts_header_view.js | 50 | ||||
| -rw-r--r-- | client/js/views/posts_page_view.js | 35 | ||||
| -rw-r--r-- | client/js/views/user_tokens_view.js | 10 |
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 |