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, },