diff --git a/assets/javascripts/discourse/connectors/category-custom-settings/question-answer-category-settings.hbs b/assets/javascripts/discourse/connectors/category-custom-settings/question-answer-category-settings.hbs new file mode 100644 index 00000000..60b71bdb --- /dev/null +++ b/assets/javascripts/discourse/connectors/category-custom-settings/question-answer-category-settings.hbs @@ -0,0 +1,7 @@ +

{{i18n "category.qa_settings_heading"}}

+
+ +
diff --git a/assets/javascripts/discourse/initializers/extend-composer-actions.js b/assets/javascripts/discourse/initializers/extend-composer-actions.js index 649d99ca..aa82c2ff 100644 --- a/assets/javascripts/discourse/initializers/extend-composer-actions.js +++ b/assets/javascripts/discourse/initializers/extend-composer-actions.js @@ -1,6 +1,7 @@ import I18n from "I18n"; import { withPluginApi } from "discourse/lib/plugin-api"; import { CREATE_TOPIC } from "discourse/models/composer"; +import { observes } from "discourse-common/utils/decorators"; export default { name: "extend-composer-actions", @@ -75,6 +76,21 @@ export default { return []; } }); + + api.modifyClass("model:composer", { + pluginId: "discourse-question-answer", + + @observes("categoryId") + categoryCreateAsQADefault() { + const createAsQA = this.category?.create_as_qa_default; + + if (this.creatingTopic && createAsQA !== this.createAsQA) { + this.set("createAsQA", createAsQA); + this.notifyPropertyChange("replyOptions"); + this.notifyPropertyChange("action"); + } + }, + }); }); }, }; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 10ca599a..dcf5a75f 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -6,6 +6,11 @@ en: question_answer_user_commented: "new comment" popup: question_answer_user_commented: '%{username} commented in "%{topic}" - %{site_title}' + + category: + qa_settings_heading: Question Answer + create_as_qa_default: New topics default to Q&A in this category. + composer: create_qa: label: "Create Q&A topic" diff --git a/lib/question_answer/engine.rb b/lib/question_answer/engine.rb index 40e0ba37..fe4b5824 100644 --- a/lib/question_answer/engine.rb +++ b/lib/question_answer/engine.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module ::QuestionAnswer + CREATE_AS_QA_DEFAULT = "create_as_qa_default" + class Engine < Rails::Engine engine_name 'question_answer' isolate_namespace QuestionAnswer diff --git a/plugin.rb b/plugin.rb index ccd8eb27..eae62df0 100644 --- a/plugin.rb +++ b/plugin.rb @@ -191,4 +191,13 @@ false end + + register_category_custom_field_type(QuestionAnswer::CREATE_AS_QA_DEFAULT, :boolean) + if Site.respond_to? :preloaded_category_custom_fields + Site.preloaded_category_custom_fields << QuestionAnswer::CREATE_AS_QA_DEFAULT + end + add_to_class(:category, :create_as_qa_default) do + ActiveModel::Type::Boolean.new.cast(self.custom_fields[QuestionAnswer::CREATE_AS_QA_DEFAULT]) + end + add_to_serializer(:basic_category, :create_as_qa_default) { object.create_as_qa_default } end diff --git a/spec/serializers/question_answer/basic_category_serializer_spec.rb b/spec/serializers/question_answer/basic_category_serializer_spec.rb new file mode 100644 index 00000000..da0fbb86 --- /dev/null +++ b/spec/serializers/question_answer/basic_category_serializer_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe BasicCategorySerializer do + fab!(:category) { Fabricate(:category) } + + let(:serialized) do + serializer = BasicCategorySerializer.new(category, root: false) + serializer.as_json + end + + before do + category.custom_fields[QuestionAnswer::CREATE_AS_QA_DEFAULT] = true + category.save_custom_fields(true) + end + + context 'qa enabled' do + before do + SiteSetting.qa_enabled = true + end + + it 'should return qa category attributes' do + expect(serialized[:create_as_qa_default]).to eq(true) + end + end + + context 'qa disabled' do + before do + SiteSetting.qa_enabled = false + end + + it 'should not return qa category attributes' do + expect(serialized.key?(:create_as_qa_default)).to eq(false) + end + end +end diff --git a/test/javascripts/acceptance/composer-test.js b/test/javascripts/acceptance/composer-test.js index a1111120..5f069211 100644 --- a/test/javascripts/acceptance/composer-test.js +++ b/test/javascripts/acceptance/composer-test.js @@ -4,6 +4,7 @@ import selectKit from "discourse/tests/helpers/select-kit-helper"; import { test } from "qunit"; import I18n from "I18n"; import { parsePostData } from "discourse/tests/helpers/create-pretender"; +import Category from "discourse/models/category"; let createAsQASetInRequest = false; @@ -76,4 +77,25 @@ acceptance("Discourse Question Answer - composer", function (needs) { "submits the right request to create topic as Q&A formatted" ); }); + + test("Creating new topic in category with Q&A create default", async function (assert) { + Category.findById(2).set("create_as_qa_default", true); + + await visit("/"); + await click("#create-topic"); + + assert.strictEqual( + query(".action-title").innerText.trim(), + I18n.t("topic.create_long") + ); + + const categoryChooser = selectKit(".category-chooser"); + await categoryChooser.expand(); + await categoryChooser.selectRowByValue(2); + + assert.strictEqual( + query(".action-title").innerText.trim(), + I18n.t("composer.create_qa.label") + ); + }); });