From f30cc5ebed9ad8e3e97fcc241e47d06fa17759e7 Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Tue, 19 Mar 2024 12:47:18 +0800 Subject: [PATCH] FIX: Show max tag error and prevent search (#26233) Show the tag limit and prevent searches when max is 0 --- .../select-kit/mini-tag-chooser-test.js | 23 +++++++++++++++++++ .../addon/components/mini-tag-chooser.js | 7 ++++++ .../select-kit/addon/components/select-kit.js | 10 +++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js index ec336a5ce70..beaeac77581 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js @@ -67,6 +67,29 @@ module( ); }); + test("disables search and shows limit when max_tags_per_topic is zero", async function (assert) { + this.set("value", ["cat", "kit"]); + this.siteSettings.max_tags_per_topic = 0; + + await render(hbs``); + + assert.strictEqual(this.subject.header().value(), "cat,kit"); + await this.subject.expand(); + + const error = query(".select-kit-error").innerText; + assert.strictEqual( + error, + I18n.t("select_kit.max_content_reached", { + count: 0, + }) + ); + await this.subject.fillInFilter("dawg"); + assert.notOk( + exists(".select-kit-collection .select-kit-row"), + "it doesn’t show any options" + ); + }); + test("required_tag_group", async function (assert) { this.set("value", ["foo", "bar"]); diff --git a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js index ef8ab199058..62bc2acb6b0 100644 --- a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js @@ -70,6 +70,13 @@ export default MultiSelectComponent.extend(TagsMixin, { }), search(filter) { + const maximum = this.selectKit.options.maximum; + if (maximum === 0) { + const key = "select_kit.max_content_reached"; + this.addError(I18n.t(key, { count: maximum })); + return []; + } + const data = { q: filter || "", limit: this.maxTagSearchResults, diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit.js b/app/assets/javascripts/select-kit/addon/components/select-kit.js index 3b9dbd651a9..d7fc79ad70b 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit.js @@ -371,7 +371,9 @@ export default Component.extend( }, addError(error) { - this.errorsCollection.pushObject(error); + if (!this.errorsCollection.includes(error)) { + this.errorsCollection.pushObject(error); + } this._safeAfterRender(() => this.popper && this.popper.update()); }, @@ -649,6 +651,12 @@ export default Component.extend( return []; } + if (this.selectKit.options.maximum === 0) { + this.set("selectKit.isLoading", false); + this.set("selectKit.hasNoContent", false); + return []; + } + content = content.concat(makeArray(result)); content = this.selectKit.modifyContent(content).filter(Boolean);