diff --git a/client/css/post-upload.styl b/client/css/post-upload.styl
index cb6b0067..8b2ee83e 100644
--- a/client/css/post-upload.styl
+++ b/client/css/post-upload.styl
@@ -15,10 +15,13 @@ $cancel-button-color = tomato
&.inactive .skip-duplicates
&.inactive .always-upload-similar
&.inactive .pause-remain-on-error
+ &.inactive .upload-all-anonymous
+ &.inactive #common-tags,
&.uploading input[type=submit],
&.uploading .skip-duplicates,
&.uploading .always-upload-similar
&.uploading .pause-remain-on-error
+ &.uploading .upload-all-anonymous
&:not(.uploading) .cancel
display: none
@@ -30,6 +33,9 @@ $cancel-button-color = tomato
small
font-size: 60%
+ label[for=common-tags]
+ display: none !important
+
input[type=submit]
margin-top: 1em
@@ -49,9 +55,21 @@ $cancel-button-color = tomato
.pause-remain-on-error
margin-left: 1em
+ .upload-all-anonymous
+ margin-left: 1em
+
form>.messages
margin-top: 1em
+ .control-strip
+ display: flex
+ flex-direction: column
+ gap: 0.5em
+
+ .control-options
+ display: flex
+ flex-direction: column
+
.uploadables-container
list-style-type: none
margin: 0
diff --git a/client/html/post_upload.tpl b/client/html/post_upload.tpl
index 3c1b2388..83968eb9 100644
--- a/client/html/post_upload.tpl
+++ b/client/html/post_upload.tpl
@@ -5,29 +5,41 @@
-
- <%= ctx.makeCheckbox({
- text: 'Skip duplicate',
- name: 'skip-duplicates',
- checked: false,
- }) %>
-
+
+
+ <%= ctx.makeCheckbox({
+ text: 'Skip duplicate',
+ name: 'skip-duplicates',
+ checked: false,
+ }) %>
+
-
- <%= ctx.makeCheckbox({
- text: 'Force upload similar',
- name: 'always-upload-similar',
- checked: false,
- }) %>
-
+
+ <%= ctx.makeCheckbox({
+ text: 'Force upload similar',
+ name: 'always-upload-similar',
+ checked: false,
+ }) %>
+
-
- <%= ctx.makeCheckbox({
- text: 'Pause on error',
- name: 'pause-remain-on-error',
- checked: true,
- }) %>
-
+
+ <%= ctx.makeCheckbox({
+ text: 'Pause on error',
+ name: 'pause-remain-on-error',
+ checked: true,
+ }) %>
+
+
+
+ <%= ctx.makeCheckbox({
+ text: 'Upload anonymously',
+ name: 'upload-all-anonymous',
+ checked: false,
+ }) %>
+
+
+
+ <%= ctx.makeTextInput({placeholder: 'Common tags', id: 'common-tags', name: 'common-tags'}) %>
diff --git a/client/js/views/post_upload_view.js b/client/js/views/post_upload_view.js
index 4ef4c1ad..ab4f1731 100644
--- a/client/js/views/post_upload_view.js
+++ b/client/js/views/post_upload_view.js
@@ -8,6 +8,10 @@ const FileDropperControl = require("../controls/file_dropper_control.js");
const template = views.getTemplate("post-upload");
const rowTemplate = views.getTemplate("post-upload-row");
+const misc = require('../util/misc.js');
+const TagAutoCompleteControl =
+ require('../controls/tag_auto_complete_control.js');
+
function _mimeTypeToPostType(mimeType) {
return (
{
@@ -185,6 +189,16 @@ class PostUploadView extends events.EventTarget {
this._evtFormSubmit(e)
);
this._formNode.classList.add("inactive");
+
+ if (this._commonTagsInputNode) {
+ this._autoCompleteControl = new TagAutoCompleteControl(
+ this._commonTagsInputNode,
+ {
+ confirm: tag =>
+ this._autoCompleteControl.replaceSelectedText(
+ misc.escapeSearchTerm(tag.names[0]), true),
+ });
+ }
}
enableForm() {
@@ -299,14 +313,18 @@ class PostUploadView extends events.EventTarget {
uploadable.safety = safetyNode.value;
}
- const anonymousNode = rowNode.querySelector(
- ".anonymous input:checked"
- );
- if (anonymousNode) {
- uploadable.anonymous = true;
+ let anonymous = this._uploadAllAnonymous.checked;
+ if (!anonymous) {
+ anonymous = rowNode.querySelector(".anonymous input:checked");
}
+ uploadable.anonymous = anonymous;
uploadable.tags = [];
+ if (this._commonTagsInputNode) {
+ var tags = this._commonTagsInputNode.value.split(' ');
+ tags = tags.filter(t => t != "").map(t => t.replace('\\', ''));
+ uploadable.tags = uploadable.tags.concat(tags);
+ }
uploadable.relations = [];
for (let [i, lookalike] of uploadable.lookalikes.entries()) {
let lookalikeNode = rowNode.querySelector(
@@ -441,6 +459,10 @@ class PostUploadView extends events.EventTarget {
);
}
+ get _uploadAllAnonymous() {
+ return this._hostNode.querySelector("form [name=upload-all-anonymous]");
+ }
+
get _submitButtonNode() {
return this._hostNode.querySelector("form [type=submit]");
}
@@ -452,6 +474,10 @@ class PostUploadView extends events.EventTarget {
get _contentInputNode() {
return this._formNode.querySelector(".dropper-container");
}
+
+ get _commonTagsInputNode() {
+ return this._formNode.querySelector('form [name=common-tags]');
+ }
}
module.exports = PostUploadView;