From 5898afaa73ccd33c271f603fa13cf5a34bad5311 Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Fri, 10 Jan 2020 09:02:43 -0800 Subject: [PATCH] FEATURE: pass in excluded usernames to user-selector (#8695) --- .../discourse/components/user-selector.js.es6 | 21 ++++++----- .../components/user-selector-test.js.es6 | 36 +++++++++++++------ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/discourse/components/user-selector.js.es6 b/app/assets/javascripts/discourse/components/user-selector.js.es6 index 85e5c61dd7b..fafd0b3ff32 100644 --- a/app/assets/javascripts/discourse/components/user-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/user-selector.js.es6 @@ -60,16 +60,18 @@ export default TextField.extend({ allowAny = bool("allowAny"), disabled = bool("disabled"), allowEmails = bool("allowEmails"), - fullWidthWrap = bool("fullWidthWrap"); + fullWidthWrap = bool("fullWidthWrap"), + excludedUsernames = this.excludedUsernames || []; - const excludedUsernames = () => { + const allExcludedUsernames = () => { // hack works around some issues with allowAny eventing - const usernames = single ? [] : selected; + let usernames = single ? [] : selected; if (currentUser && excludeCurrentUser) { - return usernames.concat([currentUser.username]); + usernames.concat([currentUser.username]); } - return usernames; + + return usernames.concat(excludedUsernames); }; this.element.addEventListener("paste", this._paste); @@ -90,7 +92,7 @@ export default TextField.extend({ return userSearch({ term, topicId: userSelectorComponent.topicId, - exclude: excludedUsernames(), + exclude: allExcludedUsernames(), includeGroups, allowedUsers, includeMentionableGroups, @@ -107,7 +109,7 @@ export default TextField.extend({ } return v.username || v.name; } else { - const excludes = excludedUsernames(); + const excludes = allExcludedUsernames(); return v.usernames.filter(item => excludes.indexOf(item) === -1); } }, @@ -158,7 +160,10 @@ export default TextField.extend({ (text || "").split(/[, \n]+/).forEach(val => { val = val.replace(/^@+/, "").trim(); - if (val.length > 0) { + if ( + val.length > 0 && + (!this.excludedUsernames || !this.excludedUsernames.includes(val)) + ) { usernames.push(val); } }); diff --git a/test/javascripts/components/user-selector-test.js.es6 b/test/javascripts/components/user-selector-test.js.es6 index 407cbd67969..3b9f230ddbb 100644 --- a/test/javascripts/components/user-selector-test.js.es6 +++ b/test/javascripts/components/user-selector-test.js.es6 @@ -2,6 +2,12 @@ import componentTest from "helpers/component-test"; moduleForComponent("user-selector", { integration: true }); +function paste(element, text) { + let e = new Event("paste"); + e.clipboardData = { getData: () => text }; + element.dispatchEvent(e); +}; + componentTest("pasting a list of usernames", { template: `{{user-selector usernames=usernames class="test-selector"}}`, @@ -11,28 +17,38 @@ componentTest("pasting a list of usernames", { test(assert) { let element = find(".test-selector")[0]; - let paste = text => { - let e = new Event("paste"); - e.clipboardData = { getData: () => text }; - element.dispatchEvent(e); - }; assert.equal(this.get("usernames"), "evil,trout"); - paste("zip,zap,zoom"); + paste(element, "zip,zap,zoom"); assert.equal(this.get("usernames"), "evil,trout,zip,zap,zoom"); - paste("evil,abc,abc,abc"); + paste(element, "evil,abc,abc,abc"); assert.equal(this.get("usernames"), "evil,trout,zip,zap,zoom,abc"); this.set("usernames", ""); - paste("names with spaces"); + paste(element, "names with spaces"); assert.equal(this.get("usernames"), "names,with,spaces"); this.set("usernames", null); - paste("@eviltrout,@codinghorror sam"); + paste(element, "@eviltrout,@codinghorror sam"); assert.equal(this.get("usernames"), "eviltrout,codinghorror,sam"); this.set("usernames", null); - paste("eviltrout\nsam\ncodinghorror"); + paste(element, "eviltrout\nsam\ncodinghorror"); assert.equal(this.get("usernames"), "eviltrout,sam,codinghorror"); } }); + +componentTest("excluding usernames", { + template: `{{user-selector usernames=usernames excludedUsernames=excludedUsernames class="test-selector"}}`, + + beforeEach() { + this.set("usernames", "mark"); + this.set("excludedUsernames", ["jeff", "sam", "robin"]); + }, + + test(assert) { + let element = find(".test-selector")[0]; + paste(element, "roman,penar,jeff,robin"); + assert.equal(this.get("usernames"), "mark,roman,penar"); + } +});