FIX: AI preferences tab button not appearing unless Helper enabled (#1452)
This update fixes an issue where the AI user preferences tab was not appearing unless `SiteSetting.ai_helper_enabled` was `true`. This is because we previously checked for it's presence when user preferences only had a single setting related to Helper. However, since then, we've also added search discoveries setting there too. As such, we don't want it to depend on Helper. We also sneak in this update a modernization of converting the preferences template from `.hbs` to `.gjs`.
This commit is contained in:
@@ -3,27 +3,9 @@ import { LinkTo } from "@ember/routing";
|
||||
import dIcon from "discourse/helpers/d-icon";
|
||||
import { i18n } from "discourse-i18n";
|
||||
|
||||
function showAiPreferences(user, settings) {
|
||||
// Since we only have one AI related user setting we don't show
|
||||
// AI preferences if these conditions aren't met.
|
||||
// If we add more user settings in the future we can move this
|
||||
// logic to the the specific settings and conditionally show it in the template.
|
||||
const aiHelperEnabledFeatures =
|
||||
settings.ai_helper_enabled_features.split("|");
|
||||
|
||||
return (
|
||||
user?.user_allowed_ai_auto_image_captions &&
|
||||
aiHelperEnabledFeatures.includes("image_caption") &&
|
||||
settings.ai_helper_enabled
|
||||
);
|
||||
}
|
||||
|
||||
export default class AutoImageCaptionSetting extends Component {
|
||||
static shouldRender(outletArgs, helper) {
|
||||
return (
|
||||
helper.siteSettings.discourse_ai_enabled &&
|
||||
showAiPreferences(outletArgs.model, helper.siteSettings)
|
||||
);
|
||||
return helper.siteSettings.discourse_ai_enabled;
|
||||
}
|
||||
|
||||
<template>
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
import { get } from "@ember/helper";
|
||||
import RouteTemplate from "ember-route-template";
|
||||
import { eq } from "truth-helpers";
|
||||
import PreferenceCheckbox from "discourse/components/preference-checkbox";
|
||||
import SaveControls from "discourse/components/save-controls";
|
||||
import { i18n } from "discourse-i18n";
|
||||
|
||||
export default RouteTemplate(
|
||||
<template>
|
||||
<div class="ai-user-preferences">
|
||||
<legend class="control-label">{{i18n "discourse_ai.title"}}</legend>
|
||||
|
||||
{{#each @controller.booleanSettings as |setting|}}
|
||||
{{#if setting.isIncluded}}
|
||||
<div class="control-group ai-setting">
|
||||
<PreferenceCheckbox
|
||||
@labelKey={{setting.label}}
|
||||
@checked={{get @controller.model.user_option setting.key}}
|
||||
data-setting-name={{setting.settingName}}
|
||||
class="pref-{{setting.settingName}}"
|
||||
/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
|
||||
{{#if (eq @controller.userSettingAttributes.length 0)}}
|
||||
{{i18n "discourse_ai.user_preferences.empty"}}
|
||||
{{/if}}
|
||||
|
||||
{{#unless (eq @controller.userSettingAttributes.length 0)}}
|
||||
<SaveControls
|
||||
@id="user_ai_preference_save"
|
||||
@model={{@controller.model}}
|
||||
@action={{@controller.save}}
|
||||
@saved={{@controller.saved}}
|
||||
/>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</template>
|
||||
);
|
||||
@@ -1,29 +0,0 @@
|
||||
<div class="ai-user-preferences">
|
||||
<legend class="control-label">{{i18n "discourse_ai.title"}}</legend>
|
||||
|
||||
{{#each this.booleanSettings as |setting|}}
|
||||
{{#if setting.isIncluded}}
|
||||
<div class="control-group ai-setting">
|
||||
<PreferenceCheckbox
|
||||
@labelKey={{setting.label}}
|
||||
@checked={{get this.model.user_option setting.key}}
|
||||
data-setting-name={{setting.settingName}}
|
||||
class="pref-{{setting.settingName}}"
|
||||
/>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
|
||||
{{#if (eq this.userSettingAttributes.length 0)}}
|
||||
{{i18n "discourse_ai.user_preferences.empty"}}
|
||||
{{/if}}
|
||||
|
||||
{{#unless (eq this.userSettingAttributes.length 0)}}
|
||||
<SaveControls
|
||||
@id="user_ai_preference_save"
|
||||
@model={{this.model}}
|
||||
@action={{this.save}}
|
||||
@saved={{this.saved}}
|
||||
/>
|
||||
{{/unless}}
|
||||
</div>
|
||||
@@ -91,27 +91,6 @@ RSpec.describe "AI image caption", type: :system, js: true do
|
||||
end
|
||||
|
||||
describe "automatic image captioning" do
|
||||
context "when ai helper is disabled" do
|
||||
before { SiteSetting.ai_helper_enabled = false }
|
||||
|
||||
it "should not have the setting present in the user preferences page" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
expect(user_preferences_ai_page).to have_no_ai_preference("pref-auto-image-caption")
|
||||
end
|
||||
end
|
||||
|
||||
context "when toggling the setting from the user preferences page" do
|
||||
before { user.user_option.update!(auto_image_caption: false) }
|
||||
|
||||
it "should update the preference to enabled" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
user_preferences_ai_page.toggle_setting("pref-auto-image-caption")
|
||||
user_preferences_ai_page.save_changes
|
||||
wait_for(timeout: 5) { user.reload.user_option.auto_image_caption }
|
||||
expect(user.reload.user_option.auto_image_caption).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the user preference is disabled" do
|
||||
before { user.user_option.update!(auto_image_caption: false) }
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "User AI preferences", type: :system, js: true do
|
||||
fab!(:user) { Fabricate(:admin, refresh_auto_groups: true) }
|
||||
fab!(:llm_model)
|
||||
let(:user_preferences_ai_page) { PageObjects::Pages::UserPreferencesAi.new }
|
||||
fab!(:discovery_persona) do
|
||||
Fabricate(:ai_persona, allowed_group_ids: [Group::AUTO_GROUPS[:admins]])
|
||||
end
|
||||
|
||||
before do
|
||||
SiteSetting.discourse_ai_enabled = true
|
||||
SiteSetting.ai_bot_discover_persona = discovery_persona.id
|
||||
Group.find_by(id: Group::AUTO_GROUPS[:admins]).add(user)
|
||||
assign_fake_provider_to(:ai_helper_model)
|
||||
assign_fake_provider_to(:ai_helper_image_caption_model)
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
describe "automatic image caption setting" do
|
||||
context "when ai helper is disabled" do
|
||||
before { SiteSetting.ai_helper_enabled = false }
|
||||
|
||||
it "should not have the setting present in the user preferences page" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
expect(user_preferences_ai_page).to have_no_ai_preference("pref-auto-image-caption")
|
||||
end
|
||||
end
|
||||
|
||||
context "when toggling the setting from the user preferences page" do
|
||||
before do
|
||||
SiteSetting.ai_helper_enabled = true
|
||||
SiteSetting.ai_helper_enabled_features = "image_caption"
|
||||
user.user_option.update!(auto_image_caption: false)
|
||||
end
|
||||
|
||||
it "should update the preference to enabled" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
user_preferences_ai_page.toggle_setting("pref-auto-image-caption")
|
||||
user_preferences_ai_page.save_changes
|
||||
wait_for(timeout: 5) { user.reload.user_option.auto_image_caption }
|
||||
expect(user.reload.user_option.auto_image_caption).to eq(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "search discoveries setting" do
|
||||
context "when discoveries are enabled" do
|
||||
before { SiteSetting.ai_bot_enabled = true }
|
||||
it "should have the setting present in the user preferences page" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
expect(user_preferences_ai_page).to have_ai_preference("pref-ai-search-discoveries")
|
||||
end
|
||||
end
|
||||
|
||||
context "when discoveries are disabled" do
|
||||
SiteSetting.ai_bot_enabled = false
|
||||
SiteSetting.ai_bot_discover_persona = nil
|
||||
|
||||
it "should not have the setting present in the user preferences page" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
expect(user_preferences_ai_page).to have_no_ai_preference("pref-ai-search-discoveries")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no settings are available" do
|
||||
before do
|
||||
SiteSetting.ai_helper_enabled = false
|
||||
SiteSetting.ai_bot_enabled = false
|
||||
end
|
||||
|
||||
it "should not have any AI preferences and should show a message" do
|
||||
user_preferences_ai_page.visit(user)
|
||||
expect(user_preferences_ai_page).to have_no_ai_preference("pref-auto-image-caption")
|
||||
expect(user_preferences_ai_page).to have_no_ai_preference("pref-ai-search-discoveries")
|
||||
expect(page).to have_content(I18n.t("js.discourse_ai.user_preferences.empty"))
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user