discourse/app/assets/javascripts/select-kit/addon/components/user-chooser.js
Michael Brown d9a02d1336
Revert "Revert "Merge branch 'master' of https://github.com/discourse/discourse""
This reverts commit 20780a1eee.

* SECURITY: re-adds accidentally reverted commit:
  03d26cd6: ensure embed_url contains valid http(s) uri
* when the merge commit e62a85cf was reverted, git chose the 2660c2e2 parent to land on
  instead of the 03d26cd6 parent (which contains security fixes)
2020-05-23 00:56:13 -04:00

86 lines
2.3 KiB
JavaScript

import MultiSelectComponent from "select-kit/components/multi-select";
import { computed } from "@ember/object";
import {
default as userSearch,
skipSearch,
eagerCompleteSearch
} from "discourse/lib/user-search";
import { makeArray } from "discourse-common/lib/helpers";
export default MultiSelectComponent.extend({
pluginApiIdentifiers: ["user-chooser"],
classNames: ["user-chooser"],
valueProperty: "username",
modifyComponentForRow() {
return "user-chooser/user-row";
},
selectKitOptions: {
topicId: undefined,
categoryId: undefined,
includeGroups: false,
allowedUsers: false,
includeMentionableGroups: false,
includeMessageableGroups: false,
allowEmails: false,
groupMembersOf: undefined
},
content: computed("value.[]", function() {
return makeArray(this.value).map(x => this.defaultItem(x, x));
}),
excludedUsers: computed(
"value",
"currentUser",
"selectKit.options.{excludeCurrentUser,excludedUsernames}",
{
get() {
const options = this.selectKit.options;
let usernames = makeArray(this.value);
if (this.currentUser && options.excludeCurrentUser) {
usernames = usernames.concat([this.currentUser.username]);
}
return usernames.concat(options.excludedUsernames || []);
}
}
),
search(filter = "") {
filter = filter || "";
const options = this.selectKit.options;
// prevents doing ajax request for nothing
const skippedSearch = skipSearch(filter, options.allowEmails);
const eagerComplete = eagerCompleteSearch(
filter,
options.topicId || options.categoryId
);
if (skippedSearch || (filter === "" && !eagerComplete)) {
return;
}
return userSearch({
term: filter,
topicId: options.topicId,
categoryId: options.categoryId,
exclude: this.excludedUsers,
includeGroups: options.includeGroups,
allowedUsers: options.allowedUsers,
includeMentionableGroups: options.includeMentionableGroups,
includeMessageableGroups: options.includeMessageableGroups,
groupMembersOf: options.groupMembersOf,
allowEmails: options.allowEmails
}).then(result => {
if (typeof result === "string") {
// do nothing promise probably got cancelled
} else {
return result;
}
});
}
});