diff --git a/assets/javascripts/discourse/components/custom-wizard-field-topic.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-topic.js.es6
new file mode 100644
index 00000000..0d791db6
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-topic.js.es6
@@ -0,0 +1,24 @@
+import { observes } from "discourse-common/utils/decorators";
+import Topic from "discourse/models/topic";
+import Component from "@ember/component";
+
+export default Component.extend({
+ topics: [],
+
+ didInsertElement() {
+ const value = this.field.value;
+
+ if (value) {
+ this.set("topics", value);
+ }
+ console.log(this.field)
+ },
+
+ actions: {
+ setValue(topicIds, topics) {
+ if (topics.length) {
+ this.set("field.value", topics);
+ }
+ },
+ }
+});
diff --git a/assets/javascripts/discourse/components/custom-wizard-topic-selector.js.es6 b/assets/javascripts/discourse/components/custom-wizard-topic-selector.js.es6
new file mode 100644
index 00000000..afbb3feb
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-topic-selector.js.es6
@@ -0,0 +1,72 @@
+import MultiSelectComponent from "select-kit/components/multi-select";
+import { computed } from "@ember/object";
+import { mapBy } from "@ember/object/computed";
+import { isEmpty } from "@ember/utils";
+import { searchForTerm } from "discourse/lib/search";
+import { makeArray } from "discourse-common/lib/helpers";
+
+export default MultiSelectComponent.extend({
+ classNames: ["topic-selector", "wizard-topic-selector"],
+ topics: null,
+ value: [],
+ content: [],
+ nameProperty: "fancy_title",
+ labelProperty: "title",
+ titleProperty: "title",
+
+ selectKitOptions: {
+ clearable: true,
+ filterable: true,
+ filterPlaceholder: "choose_topic.title.placeholder",
+ allowAny: false,
+ },
+
+ didReceiveAttrs() {
+ if (this.topics && !this.selectKit.hasSelection) {
+ const values = makeArray(this.topics.map(t => t.id));
+ const content = makeArray(this.topics);
+ this.selectKit.change(values, content);
+ }
+ this._super(...arguments);
+ },
+
+ modifyComponentForRow() {
+ return "topic-row";
+ },
+
+ search(filter) {
+ if (isEmpty(filter)) {
+ return [];
+ }
+
+ const searchParams = {};
+ searchParams.typeFilter = "topic";
+ searchParams.restrictToArchetype = "regular";
+ searchParams.searchForId = true;
+
+ return searchForTerm(
+ filter,
+ searchParams
+ ).then((results) => {
+ if (results?.posts?.length > 0) {
+ return results.posts.mapBy("topic");
+ }
+ });
+ },
+
+ actions: {
+ onChange(value, items) {
+ const content = items.map(t => {
+ return {
+ id: t.id,
+ title: t.title,
+ fancy_title: t.fancy_title,
+ url: t.url
+ }
+ });
+ console.log("onChange: ", value, content)
+ this.setProperties({ value, content });
+ this.onChange(value, content);
+ },
+ },
+});
diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
index b19667ad..8a6cd804 100644
--- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6
+++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
@@ -15,15 +15,16 @@ export default Component.extend(UndoChanges, {
isDropdown: equal("field.type", "dropdown"),
isUpload: equal("field.type", "upload"),
isCategory: equal("field.type", "category"),
+ isTopic: equal("field.type", "topic"),
isGroup: equal("field.type", "group"),
isTag: equal("field.type", "tag"),
isText: equal("field.type", "text"),
isTextarea: equal("field.type", "textarea"),
isUrl: equal("field.type", "url"),
isComposer: equal("field.type", "composer"),
- showPrefill: or("isText", "isCategory", "isTag", "isGroup", "isDropdown"),
- showContent: or("isCategory", "isTag", "isGroup", "isDropdown"),
- showLimit: or("isCategory", "isTag"),
+ showPrefill: or("isText", "isCategory", "isTag", "isGroup", "isDropdown", "isTopic"),
+ showContent: or("isCategory", "isTag", "isGroup", "isDropdown", "isTopic"),
+ showLimit: or("isCategory", "isTag", "isTopic"),
isTextType: or("isText", "isTextarea", "isComposer"),
isComposerPreview: equal("field.type", "composer_preview"),
categoryPropertyTypes: selectKitContent(["id", "slug"]),
diff --git a/assets/javascripts/discourse/components/wizard-table-field.js.es6 b/assets/javascripts/discourse/components/wizard-table-field.js.es6
index 93859f1f..363648c2 100644
--- a/assets/javascripts/discourse/components/wizard-table-field.js.es6
+++ b/assets/javascripts/discourse/components/wizard-table-field.js.es6
@@ -18,6 +18,7 @@ export default Component.extend({
isDropdown: equal("value.type", "dropdown"),
isTag: equal("value.type", "tag"),
isCategory: equal("value.type", "category"),
+ isTopic: equal("value.type", "topic"),
isGroup: equal("value.type", "group"),
isUserSelector: equal("value.type", "user_selector"),
isSubmittedAt: equal("field", "submitted_at"),
diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6
index 959185da..f3c59785 100644
--- a/assets/javascripts/discourse/lib/wizard-schema.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6
@@ -227,6 +227,7 @@ const filters = {
"dropdown",
"tag",
"category",
+ "topic",
"group",
"user_selector",
],
diff --git a/assets/javascripts/discourse/models/custom-wizard-field.js.es6 b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
index 9dbbb8f4..03c0d847 100644
--- a/assets/javascripts/discourse/models/custom-wizard-field.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
@@ -14,6 +14,7 @@ const StandardFieldValidation = [
"text_only",
"composer",
"category",
+ "topic",
"group",
"date",
"time",
diff --git a/assets/javascripts/discourse/models/custom-wizard-step.js.es6 b/assets/javascripts/discourse/models/custom-wizard-step.js.es6
index 5c3ce3ab..9c8f6f99 100644
--- a/assets/javascripts/discourse/models/custom-wizard-step.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-step.js.es6
@@ -63,7 +63,8 @@ export default EmberObject.extend(ValidState, {
return ajax({
url: `/w/${wizardId}/steps/${this.get("id")}`,
type: "PUT",
- data: { fields },
+ contentType: "application/json",
+ data: JSON.stringify({ fields })
}).catch((response) => {
if (response.jqXHR) {
response = response.jqXHR;
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-topic.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-topic.hbs
new file mode 100644
index 00000000..e19eb48d
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-topic.hbs
@@ -0,0 +1,5 @@
+{{custom-wizard-topic-selector
+ topics=topics
+ onChange=(action "setValue")
+ options=(hash maximum=field.limit)
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-table-field.hbs b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
index efbc7092..5d81b5f4 100644
--- a/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
@@ -122,6 +122,22 @@
{{/if}}
+ {{#if isTopic}}
+
+ {{i18n "admin.wizard.submissions.topic_id"}}:
+
+ {{#each value.value as |topic|}}
+
+ {{topic.id}}
+
+ {{/each}}
+ {{/if}}
+
{{#if isGroup}}
{{i18n "admin.wizard.submissions.group_id"}}:
diff --git a/assets/stylesheets/common/wizard/field.scss b/assets/stylesheets/common/wizard/field.scss
index 71f12d84..37bb45e2 100644
--- a/assets/stylesheets/common/wizard/field.scss
+++ b/assets/stylesheets/common/wizard/field.scss
@@ -182,7 +182,8 @@ body.custom-wizard {
}
}
- .wizard-category-selector {
+ .wizard-category-selector,
+ .wizard-topic-selector {
width: 500px;
}
}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index fa5c9deb..56e7f015 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -212,6 +212,7 @@ en:
user_field_options: "user field options"
user: "user"
category: "category"
+ topic: "topic"
tag: "tag"
group: "group"
list: "list"
@@ -229,6 +230,7 @@ en:
user_field_options: "Select field"
user: "Select user"
category: "Select category"
+ topic: "Select a topic"
tag: "Select tag"
group: "Select group"
list: "Enter item"
@@ -311,6 +313,7 @@ en:
dropdown: Dropdown
tag: Tag
category: Category
+ topic: Topic
group: Group
user_selector: User Selector
date: Date
@@ -469,6 +472,7 @@ en:
download: "Download"
group_id: "Group ID"
category_id: "Category ID"
+ topic_id: "Topic ID"
composer_preview: "Composer Preview"
api:
diff --git a/lib/custom_wizard/builder.rb b/lib/custom_wizard/builder.rb
index 0d0b689d..cf46f57d 100644
--- a/lib/custom_wizard/builder.rb
+++ b/lib/custom_wizard/builder.rb
@@ -131,7 +131,7 @@ class CustomWizard::Builder
params[:format] = field_template['format']
end
- if field_template['type'] === 'category' || field_template['type'] === 'tag'
+ if %w[category tag topic].include?(field_template['type'])
params[:limit] = field_template['limit']
end
diff --git a/lib/custom_wizard/field.rb b/lib/custom_wizard/field.rb
index ec85ff3a..9d884db8 100644
--- a/lib/custom_wizard/field.rb
+++ b/lib/custom_wizard/field.rb
@@ -129,6 +129,11 @@ class CustomWizard::Field
prefill: nil,
content: nil
},
+ topic: {
+ limit: 1,
+ prefill: nil,
+ content: nil
+ },
group: {
prefill: nil,
content: nil
diff --git a/lib/discourse_plugin_statistics/plugin.rb b/lib/discourse_plugin_statistics/plugin.rb
index 70e62889..86b207d4 100644
--- a/lib/discourse_plugin_statistics/plugin.rb
+++ b/lib/discourse_plugin_statistics/plugin.rb
@@ -33,6 +33,7 @@ module DiscoursePluginStatistics
upload: 0,
tag: 0,
category: 0,
+ topic: 0,
group: 0,
user_selector: 0,
},