diff --git a/assets/javascripts/discourse/connectors/after-composer-category-input/ai-category-suggestion.gjs b/assets/javascripts/discourse/connectors/after-composer-category-input/ai-category-suggestion.gjs
index c7fed1d7..d27658c8 100644
--- a/assets/javascripts/discourse/connectors/after-composer-category-input/ai-category-suggestion.gjs
+++ b/assets/javascripts/discourse/connectors/after-composer-category-input/ai-category-suggestion.gjs
@@ -1,6 +1,8 @@
import Component from '@glimmer/component';
import AISuggestionDropdown from "../../components/ai-suggestion-dropdown";
import { inject as service } from "@ember/service";
+import showAIHelper from "../../lib/show-ai-helper";
+
export default class AICategorySuggestion extends Component {
@@ -9,5 +11,9 @@ export default class AICategorySuggestion extends Component {
{{/if}}
+ static shouldRender(outletArgs, helper) {
+ return showAIHelper(outletArgs, helper);
+ }
+
@service siteSettings;
}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.gjs b/assets/javascripts/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.gjs
index a90d0978..ae93685c 100644
--- a/assets/javascripts/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.gjs
+++ b/assets/javascripts/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.gjs
@@ -1,6 +1,7 @@
import Component from '@glimmer/component';
import AISuggestionDropdown from "../../components/ai-suggestion-dropdown";
import { inject as service } from "@ember/service";
+import showAIHelper from "../../lib/show-ai-helper";
export default class AITagSuggestion extends Component {
@@ -10,5 +11,9 @@ export default class AITagSuggestion extends Component {
{{/if}}
+ static shouldRender(outletArgs, helper) {
+ return showAIHelper(outletArgs, helper);
+ }
+
@service siteSettings;
}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/after-composer-title-input/ai-title-suggestion.gjs b/assets/javascripts/discourse/connectors/after-composer-title-input/ai-title-suggestion.gjs
index be8fd945..46af26e7 100644
--- a/assets/javascripts/discourse/connectors/after-composer-title-input/ai-title-suggestion.gjs
+++ b/assets/javascripts/discourse/connectors/after-composer-title-input/ai-title-suggestion.gjs
@@ -1,8 +1,13 @@
import Component from '@glimmer/component';
import AISuggestionDropdown from "../../components/ai-suggestion-dropdown";
+import showAIHelper from "../../lib/show-ai-helper";
export default class AITitleSuggestion extends Component {
+
+ static shouldRender(outletArgs, helper) {
+ return showAIHelper(outletArgs, helper);
+ }
}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.js b/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.js
index 17512449..365714ce 100644
--- a/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.js
+++ b/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.js
@@ -8,27 +8,11 @@ import { popupAjaxError } from "discourse/lib/ajax-error";
import { createPopper } from "@popperjs/core";
import { caretPosition, getCaretPosition } from "discourse/lib/utilities";
import { inject as service } from "@ember/service";
+import showAIHelper from "../../lib/show-ai-helper";
export default class AiHelperContextMenu extends Component {
static shouldRender(outletArgs, helper) {
- const helperEnabled =
- helper.siteSettings.discourse_ai_enabled &&
- helper.siteSettings.composer_ai_helper_enabled;
-
- const allowedGroups = helper.siteSettings.ai_helper_allowed_groups
- .split("|")
- .map((id) => parseInt(id, 10));
- const canUseAssistant = helper.currentUser?.groups.some((g) =>
- allowedGroups.includes(g.id)
- );
-
- const canShowInPM = helper.siteSettings.ai_helper_allowed_in_pm;
-
- if (outletArgs?.composer?.privateMessage) {
- return helperEnabled && canUseAssistant && canShowInPM;
- }
-
- return helperEnabled && canUseAssistant;
+ return showAIHelper(outletArgs, helper);
}
@service siteSettings;
diff --git a/assets/javascripts/discourse/lib/show-ai-helper.js b/assets/javascripts/discourse/lib/show-ai-helper.js
new file mode 100644
index 00000000..cdd5e32d
--- /dev/null
+++ b/assets/javascripts/discourse/lib/show-ai-helper.js
@@ -0,0 +1,20 @@
+export default function showAIHelper(outletArgs, helper) {
+ const helperEnabled =
+ helper.siteSettings.discourse_ai_enabled &&
+ helper.siteSettings.composer_ai_helper_enabled;
+
+ const allowedGroups = helper.siteSettings.ai_helper_allowed_groups
+ .split("|")
+ .map((id) => parseInt(id, 10));
+ const canUseAssistant = helper.currentUser?.groups.some((g) =>
+ allowedGroups.includes(g.id)
+ );
+
+ const canShowInPM = helper.siteSettings.ai_helper_allowed_in_pm;
+
+ if (outletArgs?.composer?.privateMessage) {
+ return helperEnabled && canUseAssistant && canShowInPM;
+ }
+
+ return helperEnabled && canUseAssistant;
+}
diff --git a/spec/system/ai_helper/ai_composer_helper_spec.rb b/spec/system/ai_helper/ai_composer_helper_spec.rb
index 6c3d954f..14b08710 100644
--- a/spec/system/ai_helper/ai_composer_helper_spec.rb
+++ b/spec/system/ai_helper/ai_composer_helper_spec.rb
@@ -4,6 +4,7 @@ require_relative "../../support/openai_completions_inference_stubs"
RSpec.describe "AI Composer helper", type: :system, js: true do
fab!(:user) { Fabricate(:admin) }
+ fab!(:non_member_group) { Fabricate(:group) }
before do
Group.find_by(id: Group::AUTO_GROUPS[:admins]).add(user)
@@ -330,4 +331,44 @@ RSpec.describe "AI Composer helper", type: :system, js: true do
expect(tag_selector["data-name"]).to eq(suggestion)
end
end
+
+ context "when AI helper is disabled" do
+ let(:mode) { OpenAiCompletionsInferenceStubs::GENERATE_TITLES }
+ before do
+ OpenAiCompletionsInferenceStubs.stub_prompt(mode)
+ SiteSetting.composer_ai_helper_enabled = false
+ end
+
+ it "does not trigger AI context menu" do
+ trigger_context_menu(OpenAiCompletionsInferenceStubs.translated_response)
+ expect(ai_helper_context_menu).to have_no_context_menu
+ end
+
+ it "does not trigger AI suggestion buttons" do
+ visit("/latest")
+ page.find("#create-topic").click
+ composer.fill_content(OpenAiCompletionsInferenceStubs.translated_response)
+ expect(ai_suggestion_dropdown).to have_no_suggestion_button
+ end
+ end
+
+ context "when user is not a member of AI helper allowed group" do
+ let(:mode) { OpenAiCompletionsInferenceStubs::GENERATE_TITLES }
+ before do
+ OpenAiCompletionsInferenceStubs.stub_prompt(mode)
+ SiteSetting.ai_helper_allowed_groups = non_member_group.id.to_s
+ end
+
+ it "does not trigger AI context menu" do
+ trigger_context_menu(OpenAiCompletionsInferenceStubs.translated_response)
+ expect(ai_helper_context_menu).to have_no_context_menu
+ end
+
+ it "does not trigger AI suggestion buttons" do
+ visit("/latest")
+ page.find("#create-topic").click
+ composer.fill_content(OpenAiCompletionsInferenceStubs.translated_response)
+ expect(ai_suggestion_dropdown).to have_no_suggestion_button
+ end
+ end
end