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;