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")
+ );
+ });
});