Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 3203da6

Browse files
committed
DEV: Use settings area param instead
1 parent ce346b1 commit 3203da6

File tree

9 files changed

+32
-181
lines changed

9 files changed

+32
-181
lines changed
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
1+
import { ajax } from "discourse/lib/ajax";
12
import DiscourseRoute from "discourse/routes/discourse";
3+
import SiteSetting from "admin/models/site-setting";
24

35
export default class AdminPluginsShowDiscourseAiFeaturesEdit extends DiscourseRoute {
46
async model(params) {
57
const allFeatures = this.modelFor(
68
"adminPlugins.show.discourse-ai-features"
79
);
810
const id = parseInt(params.id, 10);
11+
const currentFeature = allFeatures.find((feature) => feature.id === id);
912

10-
return allFeatures.find((feature) => feature.id === id);
13+
const { site_settings } = await ajax("/admin/config/site_settings.json", {
14+
data: {
15+
filter_area: `ai-features/${currentFeature.ref}`,
16+
plugin: "discourse-ai",
17+
category: "discourse_ai",
18+
}
19+
});
20+
21+
22+
currentFeature.feature_settings = site_settings.map((setting) => SiteSetting.create(setting));
23+
24+
return currentFeature;
1125
}
1226
}

app/controllers/discourse_ai/admin/ai_features_controller.rb

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,6 @@ def edit
1414
render json: serialize_feature(DiscourseAi::Features.find_feature_by_id(params[:id].to_i))
1515
end
1616

17-
def update
18-
raise Discourse::InvalidParameters.new(:id) if params[:id].blank?
19-
raise Discourse::InvalidParameters.new(:ai_feature) if params[:ai_feature].blank?
20-
if params[:ai_feature][:persona_id].blank?
21-
raise Discourse::InvalidParameters.new(:persona_id)
22-
end
23-
raise Discourse::InvalidParameters.new(:enabled) if params[:ai_feature][:enabled].nil?
24-
25-
feature = DiscourseAi::Features.find_feature_by_id(params[:id].to_i)
26-
enable_value = params[:ai_feature][:enabled]
27-
persona_id = params[:ai_feature][:persona_id]
28-
29-
SiteSetting.set_and_log(feature[:enable_setting][:name], enable_value, guardian.user)
30-
SiteSetting.set_and_log(feature[:persona_setting][:name], persona_id, guardian.user)
31-
32-
render json: serialize_feature(DiscourseAi::Features.find_feature_by_id(params[:id].to_i))
33-
end
34-
3517
private
3618

3719
def serialize_features(features)

assets/javascripts/discourse/admin/models/ai-feature.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export default class AiFeature extends RestModel {
1010
"enable_setting",
1111
"persona",
1212
"persona_setting",
13-
"additional_settings"
1413
);
1514
}
1615
}
Lines changed: 6 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,16 @@
11
import Component from "@glimmer/component";
2-
import { tracked } from "@glimmer/tracking";
32
import { action } from "@ember/object";
43
import { service } from "@ember/service";
5-
import { htmlSafe } from "@ember/template";
6-
import { eq } from "truth-helpers";
74
import BackButton from "discourse/components/back-button";
8-
import Form from "discourse/components/form";
9-
import { ajax } from "discourse/lib/ajax";
105
import { popupAjaxError } from "discourse/lib/ajax-error";
116
import getURL from "discourse/lib/get-url";
12-
import discourseLater from "discourse/lib/later";
13-
import { i18n } from "discourse-i18n";
147
import SiteSettingComponent from "admin/components/site-setting";
15-
import SiteSetting from "admin/models/site-setting";
168

179
export default class AiFeatureEditor extends Component {
1810
@service toasts;
1911
@service currentUser;
2012
@service router;
2113

22-
@tracked settings = null;
23-
@tracked isLoading = false;
24-
@tracked isSaving = false;
25-
26-
constructor() {
27-
super(...arguments);
28-
this.#loadSettings();
29-
}
30-
31-
get formData() {
32-
return {
33-
enabled: this.args.model.enable_setting?.value,
34-
persona_id: this.args.model.persona?.id,
35-
additional_settings: this.args.model.additional_settings,
36-
};
37-
}
38-
39-
@action
40-
async save(formData) {
41-
this.isSaving = true;
42-
43-
try {
44-
this.args.model.save({
45-
enabled: formData.enabled,
46-
persona_id: parseInt(formData.persona_id, 10),
47-
});
48-
49-
this.toasts.success({
50-
data: {
51-
message: i18n("discourse_ai.features.editor.saved", {
52-
feature_name: this.args.model.name,
53-
}),
54-
},
55-
duration: 2000,
56-
});
57-
58-
discourseLater(() => {
59-
this.router.transitionTo(
60-
"adminPlugins.show.discourse-ai-features.index"
61-
);
62-
}, 500);
63-
} catch (error) {
64-
popupAjaxError(error);
65-
} finally {
66-
this.isSaving = false;
67-
}
68-
}
69-
70-
get personasHint() {
71-
return i18n("discourse_ai.features.editor.persona_help", {
72-
config_url: getURL("/admin/plugins/discourse-ai/ai-personas"),
73-
});
74-
}
75-
76-
async #loadSettings() {
77-
this.isLoading = true;
78-
79-
try {
80-
const result = await ajax("/admin/config/site_settings.json", {
81-
data: {
82-
filter_area: `ai-features/${this.args.model.ref}`,
83-
plugin: "discourse-ai",
84-
category: "discourse_ai",
85-
},
86-
});
87-
88-
const settings = result.site_settings;
89-
const settingsMap = settings.map((setting) =>
90-
SiteSetting.create(setting)
91-
);
92-
93-
this.settings = settingsMap;
94-
} catch (error) {
95-
// eslint-disable-next-line no-console
96-
console.warn(`Failed to load settings with error: ${error}`);
97-
} finally {
98-
this.isLoading = false;
99-
}
100-
}
101-
10214
<template>
10315
<BackButton
10416
@route="adminPlugins.show.discourse-ai-features"
@@ -109,62 +21,12 @@ export default class AiFeatureEditor extends Component {
10921
<p>{{@model.description}}</p>
11022
</section>
11123

112-
{{!-- <Form
113-
@onSubmit={{this.save}}
114-
@data={{this.formData}}
115-
class="form-horizontal ai-feature-editor"
116-
as |form|
117-
>
118-
{{#if (eq @model.enable_setting.type "bool")}}
119-
<form.Field
120-
@name="enabled"
121-
@title={{i18n "discourse_ai.features.editor.enable_setting"}}
122-
@tooltip={{i18n
123-
"discourse_ai.features.editor.enable_setting_help"
124-
[email protected]_setting.name
125-
}}
126-
@validation="required"
127-
@type="boolean"
128-
as |field|
129-
>
130-
<field.Toggle />
131-
</form.Field>
132-
{{/if}}
133-
134-
<form.Field
135-
@name="persona_id"
136-
@title={{i18n "discourse_ai.features.editor.persona"}}
137-
@format="large"
138-
@helpText={{htmlSafe this.personasHint}}
139-
@validation="required"
140-
as |field|
141-
>
142-
<field.Select @includeNone={{false}} as |select|>
143-
{{#each this.currentUser.ai_enabled_personas as |persona|}}
144-
<select.Option @value={{persona.id}}>
145-
{{persona.name}}
146-
</select.Option>
147-
{{/each}}
148-
</field.Select>
149-
</form.Field>
150-
151-
<form.Actions>
152-
<form.Submit
153-
@label="discourse_ai.features.editor.save"
154-
@disabled={{this.isSaving}}
155-
/>
156-
</form.Actions>
157-
</Form> --}}
158-
159-
<section class="ai-feature-editor__advanced-settings">
160-
<h3>{{i18n "discourse_ai.features.editor.advanced_settings"}}</h3>
161-
{{#unless this.isLoading}}
162-
{{#each this.settings as |setting|}}
163-
<div>
164-
<SiteSettingComponent @setting={{setting}} />
165-
</div>
166-
{{/each}}
167-
{{/unless}}
24+
<section class="ai-feature-editor">
25+
{{#each @model.feature_settings as |setting|}}
26+
<div>
27+
<SiteSettingComponent @setting={{setting}} />
28+
</div>
29+
{{/each}}
16830
</section>
16931
</template>
17032
}

assets/stylesheets/common/ai-features.scss

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131
}
3232
}
3333

34-
.ai-feature-editor__advanced-settings {
35-
margin-block: 1rem;
36-
padding-block: 1rem;
34+
.ai-feature-editor {
35+
&__header {
36+
border-bottom: 1px solid var(--primary-low);
37+
}
3738

3839
.setting {
3940
margin-block: 1.5rem;

config/locales/server.en.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,12 @@ en:
8181
ai_embeddings_semantic_search_hyde_model: "Model used to expand keywords to get better results during a semantic search"
8282
ai_embeddings_per_post_enabled: Generate embeddings for each post
8383

84-
ai_summarization_enabled: "Enable the topic summarization module."
85-
ai_summarization_model: "Model to use for summarization."
84+
ai_summarization_enabled: "Enable the summarize feature"
85+
ai_summarization_model: "Model to use for summarization"
86+
ai_summarization_persona: "Persona to use for summarize feature"
8687
ai_custom_summarization_allowed_groups: "Groups allowed to use create new summaries."
8788
ai_pm_summarization_allowed_groups: "Groups allowed to create and view summaries in PMs."
88-
ai_summary_gists_enabled: "Generate brief summaries of latest replies in topics automatically."
89+
ai_summary_gists_enabled: "Generate brief summaries of latest replies in topics automatically"
8990
ai_summary_gists_allowed_groups: "Groups allowed to see gists in the hot topics list."
9091
ai_summary_backfill_maximum_topics_per_hour: "Number of topic summaries to backfill per hour."
9192

@@ -104,6 +105,7 @@ en:
104105
ai_google_custom_search_api_key: "API key for the Google Custom Search API see: https://developers.google.com/custom-search"
105106
ai_google_custom_search_cx: "CX for Google Custom Search API"
106107

108+
ai_discord_search_enabled: "Enables the Discord search feature"
107109
ai_discord_app_id: "The ID of the Discord application you would like to connect Discord search to"
108110
ai_discord_app_public_key: "The public key of the Discord application you would like to connect Discord search to"
109111
ai_discord_search_mode: "Select the search mode to use for Discord search"

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
end
113113

114114
resources :ai_features,
115-
only: %i[index edit update],
115+
only: %i[index edit],
116116
path: "ai-features",
117117
controller: "discourse_ai/admin/ai_features"
118118
end

config/settings.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ discourse_ai:
234234
default: false
235235
client: true
236236
validator: "DiscourseAi::Configuration::LlmDependencyValidator"
237-
hidden: true
238237
area: "ai-features/summarization"
239238
ai_summarization_model:
240239
default: ""
@@ -260,7 +259,6 @@ discourse_ai:
260259
hidden: true
261260
ai_summary_gists_enabled:
262261
default: false
263-
hidden: true
264262
area: "ai-features/gists"
265263
ai_summary_gists_persona:
266264
default: "-12"
@@ -294,6 +292,7 @@ discourse_ai:
294292
ai_bot_enabled:
295293
default: false
296294
client: true
295+
area: "ai-features/discoveries"
297296
ai_bot_enable_chat_warning:
298297
default: false
299298
client: true

lib/features.rb

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,6 @@ def self.features
5757
value: SiteSetting.get(feature[:enable_setting_name]),
5858
type: SiteSetting.type_supervisor.get_type(feature[:enable_setting_name]),
5959
},
60-
additional_settings:
61-
(feature[:additional_settings] || []).map do |setting_name|
62-
{
63-
name: setting_name,
64-
value: SiteSetting.get(setting_name),
65-
type: SiteSetting.type_supervisor.get_type(setting_name),
66-
}
67-
end,
6860
}
6961
end
7062
end

0 commit comments

Comments
 (0)