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 { + 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