diff --git a/app/assets/javascripts/discourse/app/components/emoji-uploader.js b/app/assets/javascripts/discourse/app/components/emoji-uploader.js index 16b9d5e133..2ee1448cee 100644 --- a/app/assets/javascripts/discourse/app/components/emoji-uploader.js +++ b/app/assets/javascripts/discourse/app/components/emoji-uploader.js @@ -1,4 +1,5 @@ import Component from "@ember/component"; +import { isEmpty } from "@ember/utils"; import UppyUploadMixin from "discourse/mixins/uppy-upload"; import { action } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; @@ -29,22 +30,28 @@ export default Component.extend(UppyUploadMixin, { @action createEmojiGroup(group) { + let newEmojiGroups = this.newEmojiGroups; + if (group !== DEFAULT_GROUP) { + newEmojiGroups = this.emojiGroups.concat([group]).uniq(); + } this.setProperties({ - newEmojiGroups: this.emojiGroups.concat([group]).uniq(), + newEmojiGroups, group, }); }, - @discourseComputed("hasName", "name", "hasGroup", "group") - data(hasName, name, hasGroup, group) { + _perFileData() { const payload = {}; - if (hasName) { - payload.name = name; + if (!isEmpty(this.name)) { + payload.name = this.name; + + // if uploading multiple files, we can't use the name for every emoji + this.set("name", null); } - if (hasGroup && group !== DEFAULT_GROUP) { - payload.group = group; + if (!isEmpty(this.group) && this.group !== DEFAULT_GROUP) { + payload.group = this.group; } return payload; @@ -56,6 +63,6 @@ export default Component.extend(UppyUploadMixin, { uploadDone(upload) { this.done(upload, this.group); - this.setProperties({ name: null }); + this.set("name", null); }, }); diff --git a/app/assets/javascripts/discourse/app/mixins/uppy-upload.js b/app/assets/javascripts/discourse/app/mixins/uppy-upload.js index 5b5e7f664e..f536fb16c9 100644 --- a/app/assets/javascripts/discourse/app/mixins/uppy-upload.js +++ b/app/assets/javascripts/discourse/app/mixins/uppy-upload.js @@ -133,12 +133,9 @@ export default Mixin.create(UppyS3Multipart, { return false; } - // for a single file, we want to override file meta with the - // data property (which may be computed), to override any keys - // specified by this.data (such as name) - if (fileCount === 1) { - deepMerge(Object.values(files)[0].meta, this.data); - } + Object.values(files).forEach((file) => { + deepMerge(file.meta, this._perFileData()); + }); }, }); diff --git a/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs b/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs index 2c3b01a1c9..5f52e1ffb8 100644 --- a/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs @@ -5,6 +5,7 @@
{{input + id="emoji-name" name="name" placeholderKey="admin.emoji.name" value=(readonly name) diff --git a/app/assets/javascripts/discourse/tests/integration/components/emoji-uploader-test.js b/app/assets/javascripts/discourse/tests/integration/components/emoji-uploader-test.js index 25e10324a7..50bcd63e6c 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/emoji-uploader-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/emoji-uploader-test.js @@ -8,6 +8,9 @@ import { } from "discourse/tests/helpers/qunit-helpers"; import hbs from "htmlbars-inline-precompile"; import pretender from "discourse/tests/helpers/create-pretender"; +import { fillIn } from "@ember/test-helpers"; + +let requestNumber = 1; discourseModule("Integration | Component | emoji-uploader", function (hooks) { setupRenderingTest(hooks); @@ -19,6 +22,7 @@ discourseModule("Integration | Component | emoji-uploader", function (hooks) { }}`; hooks.beforeEach(function () { + requestNumber = 1; this.setProperties({ emojiGroups: ["default", "coolemojis"], actions: { @@ -29,16 +33,30 @@ discourseModule("Integration | Component | emoji-uploader", function (hooks) { }); pretender.post("/admin/customize/emojis.json", () => { - return [ - 200, - { "Content-Type": "application/json" }, - { - group: "default", - name: "test", - url: - "//upload.s3.dualstack.us-east-2.amazonaws.com/original/1X/123.png", - }, - ]; + if (requestNumber === 1) { + return [ + 200, + { "Content-Type": "application/json" }, + { + group: "coolemojis", + name: "okey", + url: + "//upload.s3.dualstack.us-east-2.amazonaws.com/original/1X/123.png", + }, + ]; + requestNumber += 1; + } else if (requestNumber === 2) { + return [ + 200, + { "Content-Type": "application/json" }, + { + group: "coolemojis", + name: null, + url: + "//upload.s3.dualstack.us-east-2.amazonaws.com/original/1X/456.png", + }, + ]; + } }); }); @@ -86,4 +104,40 @@ discourseModule("Integration | Component | emoji-uploader", function (hooks) { .trigger("upload-mixin:emoji-uploader:add-files", [image, image2]); }, }); + + componentTest( + "clears the name after the first upload to avoid duplicate names", + { + template, + + async test(assert) { + const done = assert.async(); + await selectKit("#emoji-group-selector").expand(); + await selectKit("#emoji-group-selector").selectRowByValue("coolemojis"); + await fillIn("#emoji-name", "okey"); + + let uploadDoneCount = 0; + this.set("doneUpload", (upload) => { + if (uploadDoneCount === 0) { + assert.equal(upload.name, "okey"); + } + uploadDoneCount += 1; + + if (uploadDoneCount === 1) { + assert.equal(this.name, null); + } + + if (uploadDoneCount === 2) { + done(); + } + }); + + const image = createFile("avatar.png"); + const image2 = createFile("avatar2.png"); + await this.container + .lookup("service:app-events") + .trigger("upload-mixin:emoji-uploader:add-files", [image, image2]); + }, + } + ); });