diff --git a/app/assets/javascripts/discourse/app/controllers/create-invite.js b/app/assets/javascripts/discourse/app/controllers/create-invite.js
index 553ffaf42d9..e4dc979f0ed 100644
--- a/app/assets/javascripts/discourse/app/controllers/create-invite.js
+++ b/app/assets/javascripts/discourse/app/controllers/create-invite.js
@@ -18,6 +18,7 @@ export default Controller.extend(
bufferedProperty("invite"),
{
allGroups: null,
+ topics: null,
flashText: null,
flashClass: null,
@@ -48,6 +49,7 @@ export default Controller.extend(
});
this.setProperties({
+ topics: [],
flashText: null,
flashClass: null,
flashLink: false,
@@ -72,7 +74,7 @@ export default Controller.extend(
},
setInvite(invite) {
- this.set("invite", invite);
+ this.setProperties({ invite, topics: invite.topics });
},
save(opts) {
@@ -201,5 +203,11 @@ export default Controller.extend(
this.set("buffered.email", result[0].email[0]);
});
},
+
+ @action
+ onChangeTopic(topicId, topic) {
+ this.set("topics", [topic]);
+ this.set("buffered.topicId", topicId);
+ },
}
);
diff --git a/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs b/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs
index c5a854dd01e..f0813af4283 100644
--- a/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs
+++ b/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs
@@ -85,12 +85,14 @@
{{#if currentUser.staff}}
- {{choose-topic
- selectedTopicId=buffered.topicId
- topicTitle=buffered.topicTitle
- additionalFilters="status:public"
- labelIcon="hand-point-right"
- label="user.invited.invite.invite_to_topic"
+
+ {{topic-chooser
+ value=buffered.topicId
+ content=topics
+ onChange=(action "onChangeTopic")
+ options=(hash
+ additionalFilters="status:public"
+ )
}}
{{else if buffered.topicTitle}}
diff --git a/app/assets/javascripts/select-kit/addon/components/topic-chooser.js b/app/assets/javascripts/select-kit/addon/components/topic-chooser.js
new file mode 100644
index 00000000000..59cf6d1ffbe
--- /dev/null
+++ b/app/assets/javascripts/select-kit/addon/components/topic-chooser.js
@@ -0,0 +1,45 @@
+import { isEmpty } from "@ember/utils";
+import { searchForTerm } from "discourse/lib/search";
+import ComboBoxComponent from "select-kit/components/combo-box";
+
+export default ComboBoxComponent.extend({
+ pluginApiIdentifiers: ["topic-chooser"],
+ classNames: ["topic-chooser"],
+
+ nameProperty: "fancy_title",
+ labelProperty: "title",
+ titleProperty: "title",
+
+ selectKitOptions: {
+ clearable: true,
+ filterable: true,
+ filterPlaceholder: "choose_topic.title.placeholder",
+ additionalFilters: "",
+ },
+
+ modifyComponentForRow() {
+ return "topic-row";
+ },
+
+ search(filter) {
+ if (isEmpty(filter) && isEmpty(this.selectKit.options.additionalFilters)) {
+ return [];
+ }
+
+ const searchParams = {};
+ if (!isEmpty(filter)) {
+ searchParams.typeFilter = "topic";
+ searchParams.restrictToArchetype = "regular";
+ searchParams.searchForId = true;
+ }
+
+ return searchForTerm(
+ `${filter} ${this.selectKit.options.additionalFilters}`,
+ searchParams
+ ).then((results) => {
+ if (results?.posts?.length > 0) {
+ return results.posts.mapBy("topic");
+ }
+ });
+ },
+});
diff --git a/app/assets/javascripts/select-kit/addon/components/topic-row.js b/app/assets/javascripts/select-kit/addon/components/topic-row.js
new file mode 100644
index 00000000000..284f9baa281
--- /dev/null
+++ b/app/assets/javascripts/select-kit/addon/components/topic-row.js
@@ -0,0 +1,7 @@
+import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row";
+import layout from "select-kit/templates/components/topic-row";
+
+export default SelectKitRowComponent.extend({
+ layout,
+ classNames: ["topic-row"],
+});
diff --git a/app/assets/javascripts/select-kit/addon/templates/components/topic-row.hbs b/app/assets/javascripts/select-kit/addon/templates/components/topic-row.hbs
new file mode 100644
index 00000000000..3e143e0cbdb
--- /dev/null
+++ b/app/assets/javascripts/select-kit/addon/templates/components/topic-row.hbs
@@ -0,0 +1,9 @@
+{{topic-status topic=item disableActions=true}}
+{{replace-emoji item.fancy_title}}
+
+ {{bound-category-link item.category
+ recursive=true
+ hideParent=true
+ link=false
+ }}
+
diff --git a/app/assets/stylesheets/common/base/share_link.scss b/app/assets/stylesheets/common/base/share_link.scss
index 9a830ea371b..561e7b4181e 100644
--- a/app/assets/stylesheets/common/base/share_link.scss
+++ b/app/assets/stylesheets/common/base/share_link.scss
@@ -187,6 +187,7 @@
textarea#invite-message,
&.invite-to-topic input[type="text"],
.group-chooser,
+ .topic-chooser,
.user-chooser,
.future-date-input-selector,
.future-date-input-date-picker,
diff --git a/app/assets/stylesheets/common/select-kit/_index.scss b/app/assets/stylesheets/common/select-kit/_index.scss
index 2b1b4b3cc9c..f4aa90dd3bd 100644
--- a/app/assets/stylesheets/common/select-kit/_index.scss
+++ b/app/assets/stylesheets/common/select-kit/_index.scss
@@ -23,5 +23,6 @@
@import "tag-chooser";
@import "tag-drop";
@import "toolbar-popup-menu-options";
+@import "topic-chooser";
@import "topic-notifications-button";
@import "user-row";
diff --git a/app/assets/stylesheets/common/select-kit/topic-chooser.scss b/app/assets/stylesheets/common/select-kit/topic-chooser.scss
new file mode 100644
index 00000000000..873e9b80618
--- /dev/null
+++ b/app/assets/stylesheets/common/select-kit/topic-chooser.scss
@@ -0,0 +1,9 @@
+.select-kit {
+ &.combo-box {
+ &.topic-chooser {
+ .select-kit-row {
+ display: initial;
+ }
+ }
+ }
+}