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

Commit 43a56d2

Browse files
committed
DEV: Various updates and save method
1 parent 1764660 commit 43a56d2

File tree

9 files changed

+148
-142
lines changed

9 files changed

+148
-142
lines changed

admin/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai-features/index.gjs

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import Component from "@glimmer/component";
2-
import { get } from "@ember/helper";
32
import { service } from "@ember/service";
43
import RouteTemplate from "ember-route-template";
54
import { gt } from "truth-helpers";
@@ -23,6 +22,18 @@ export default RouteTemplate(
2322
];
2423
}
2524

25+
get configuredFeatures() {
26+
return this.args.model.filter(
27+
(feature) => feature.enable_setting.value === true
28+
);
29+
}
30+
31+
get unconfiguredFeatures() {
32+
return this.args.model.filter(
33+
(feature) => feature.enable_setting.value === false
34+
);
35+
}
36+
2637
<template>
2738
<DBreadcrumbsItem
2839
@path="/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-features"
@@ -35,21 +46,21 @@ export default RouteTemplate(
3546
@learnMoreUrl="todo"
3647
/>
3748

38-
<div class="ai-feature-list__configured-features">
39-
<h3>{{i18n "discourse_ai.features.list.configured_features"}}</h3>
49+
{{#if (gt this.configuredFeatures.length 0)}}
50+
<div class="ai-feature-list__configured-features">
51+
<h3>{{i18n "discourse_ai.features.list.configured_features"}}</h3>
4052

41-
<table class="d-admin-table">
42-
<thead>
43-
<tr>
44-
{{#each this.tableHeaders as |header|}}
45-
<th>{{header}}</th>
46-
{{/each}}
47-
</tr>
48-
</thead>
53+
<table class="d-admin-table">
54+
<thead>
55+
<tr>
56+
{{#each this.tableHeaders as |header|}}
57+
<th>{{header}}</th>
58+
{{/each}}
59+
</tr>
60+
</thead>
4961

50-
<tbody>
51-
{{#each @model as |feature|}}
52-
{{#if feature.enabled}}
62+
<tbody>
63+
{{#each this.configuredFeatures as |feature|}}
5364
<tr class="ai-feature-list__row d-admin-row__content">
5465
<td class="d-admin-row__overview ai-feature-list__row-item">
5566
<span class="ai-feature-list__row-item-name">
@@ -82,26 +93,26 @@ export default RouteTemplate(
8293
/>
8394
</td>
8495
</tr>
85-
{{/if}}
86-
{{/each}}
87-
</tbody>
88-
</table>
89-
</div>
96+
{{/each}}
97+
</tbody>
98+
</table>
99+
</div>
100+
{{/if}}
90101

91-
<div class="ai-feature-list-editor__unconfigured-features">
92-
<h3>{{i18n "discourse_ai.features.list.unconfigured_features"}}</h3>
102+
{{#if (gt this.unconfiguredFeatures.length 0)}}
103+
<div class="ai-feature-list-editor__unconfigured-features">
104+
<h3>{{i18n "discourse_ai.features.list.unconfigured_features"}}</h3>
93105

94-
<table class="d-admin-table">
95-
<thead>
96-
<tr>
97-
<th>{{i18n "discourse_ai.features.list.header.name"}}</th>
98-
<th></th>
99-
</tr>
100-
</thead>
106+
<table class="d-admin-table">
107+
<thead>
108+
<tr>
109+
<th>{{i18n "discourse_ai.features.list.header.name"}}</th>
110+
<th></th>
111+
</tr>
112+
</thead>
101113

102-
<tbody>
103-
{{#each @model as |feature|}}
104-
{{#unless feature.enabled}}
114+
<tbody>
115+
{{#each this.unconfiguredFeatures as |feature|}}
105116
<tr class="ai-feature-list__row d-admin-row__content">
106117
<td class="d-admin-row__overview ai-feature-list__row-item">
107118
<span class="ai-feature-list__row-item-name">
@@ -117,17 +128,17 @@ export default RouteTemplate(
117128
<td class="d-admin-row_controls">
118129
<DButton
119130
class="btn-small"
120-
@translatedLabel="Set up"
131+
@label="discourse_ai.features.list.set_up"
121132
@route="adminPlugins.show.discourse-ai-features.edit"
122133
@routeModels={{feature.id}}
123134
/>
124135
</td>
125136
</tr>
126-
{{/unless}}
127-
{{/each}}
128-
</tbody>
129-
</table>
130-
</div>
137+
{{/each}}
138+
</tbody>
139+
</table>
140+
</div>
141+
{{/if}}
131142
</section>
132143
</template>
133144
}

app/controllers/discourse_ai/admin/ai_features_controller.rb

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,82 +15,85 @@ def edit
1515
end
1616

1717
def update
18-
end
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 = find_feature_by_id(params[:id].to_i)
26+
enable_value = params[:ai_feature][:enabled]
27+
persona_id = params[:ai_feature][:persona_id]
1928

20-
def destroy
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: find_feature_by_id(params[:id].to_i)
2133
end
2234

2335
private
2436

25-
# Eventually we may move this to an active record model
26-
def persona_backed_features
37+
# Eventually we may move this all to an active record model
38+
# but for now we are just using a hash
39+
# to store the features and their corresponding settings
40+
def feature_config
2741
[
2842
{
2943
id: 1,
30-
name: "Summaries",
31-
description:
32-
"Makes a summarization button available that allows visitors to summarize topics.",
33-
persona:
34-
serialize_data(
35-
AiPersona.find_by(id: SiteSetting.ai_summarization_persona),
36-
AiFeaturesPersonaSerializer,
37-
root: false,
38-
),
39-
enabled: SiteSetting.ai_summarization_enabled,
40-
enable_setting: {
41-
type: SiteSetting.ai_summarization_enabled.class,
42-
value: "ai_summarization_enabled",
43-
},
44+
name_key: "discourse_ai.features.summarization.name",
45+
description_key: "discourse_ai.features.summarization.description",
46+
persona_setting_name: "ai_summarization_persona",
47+
enable_setting_name: "ai_summarization_enabled",
4448
},
4549
{
4650
id: 2,
47-
name: "Short Summaries",
48-
description: "Adds the ability to view short summaries of topics on the topic list.",
49-
persona:
50-
serialize_data(
51-
AiPersona.find_by(id: SiteSetting.ai_summary_gists_persona),
52-
AiFeaturesPersonaSerializer,
53-
root: false,
54-
),
55-
enabled: SiteSetting.ai_summary_gists_enabled,
56-
enable_setting: {
57-
type: SiteSetting.ai_summary_gists_enabled.class,
58-
value: "ai_summary_gists_enabled",
59-
},
51+
name_key: "discourse_ai.features.gists.name",
52+
description_key: "discourse_ai.features.gists.description",
53+
persona_setting_name: "ai_summary_gists_persona",
54+
enable_setting_name: "ai_summary_gists_enabled",
6055
},
6156
{
6257
id: 3,
63-
name: "Discobot Discoveries",
64-
description: "Enhances search experience by providing AI-generated answers to queries.",
65-
persona:
66-
serialize_data(
67-
AiPersona.find_by(id: SiteSetting.ai_bot_discover_persona),
68-
AiFeaturesPersonaSerializer,
69-
root: false,
70-
),
71-
enabled: SiteSetting.ai_bot_enabled,
72-
enable_setting: {
73-
type: SiteSetting.ai_bot_enabled.class,
74-
value: "ai_bot_enabled",
75-
},
58+
name_key: "discourse_ai.features.discoveries.name",
59+
description_key: "discourse_ai.features.discoveries.description",
60+
persona_setting_name: "ai_bot_discover_persona",
61+
enable_setting_name: "ai_bot_enabled",
7662
},
7763
{
7864
id: 4,
79-
name: "Discord Search",
80-
description: "Adds the ability to search Discord channels.",
65+
name_key: "discourse_ai.features.discord_search.name",
66+
description_key: "discourse_ai.features.discord_search.description",
67+
persona_setting_name: "ai_discord_search_persona",
68+
enable_setting_name: "ai_discord_search_enabled",
69+
},
70+
]
71+
end
72+
73+
def persona_backed_features
74+
feature_config.map do |feature|
75+
{
76+
id: feature[:id],
77+
name: I18n.t(feature[:name_key]),
78+
description: I18n.t(feature[:description_key]),
8179
persona:
8280
serialize_data(
83-
AiPersona.find_by(id: SiteSetting.ai_discord_search_persona),
81+
AiPersona.find_by(id: SiteSetting.get(feature[:persona_setting_name])),
8482
AiFeaturesPersonaSerializer,
8583
root: false,
8684
),
87-
enabled: SiteSetting.ai_discord_app_id.present?,
85+
persona_setting: {
86+
name: feature[:persona_setting_name],
87+
value: SiteSetting.get(feature[:persona_setting_name]),
88+
type: SiteSetting.type_supervisor.get_type(feature[:persona_setting_name]),
89+
},
8890
enable_setting: {
89-
type: SiteSetting.ai_discord_app_id.class,
90-
value: "ai_discord_app_id",
91+
name: feature[:enable_setting_name],
92+
value: SiteSetting.get(feature[:enable_setting_name]),
93+
type: SiteSetting.type_supervisor.get_type(feature[:enable_setting_name]),
9194
},
92-
},
93-
]
95+
}
96+
end
9497
end
9598

9699
def find_feature_by_id(id)

app/jobs/regular/stream_discord_reply.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class StreamDiscordReply < ::Jobs::Base
77
def execute(args)
88
interaction = args[:interaction]
99

10+
return unless SiteSetting.ai_discord_search_enabled
11+
1012
if SiteSetting.ai_discord_search_mode == "persona"
1113
DiscourseAi::Discord::Bot::PersonaReplier.new(interaction).handle_interaction!
1214
else
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TrackedArray, TrackedObject } from "@ember-compat/tracked-built-ins";
21
import RestModel from "discourse/models/rest";
32

43
export default class AiFeature extends RestModel {
@@ -7,18 +6,9 @@ export default class AiFeature extends RestModel {
76
"id",
87
"name",
98
"description",
10-
"enabled",
119
"enable_setting",
12-
"persona"
10+
"persona",
11+
"persona_setting"
1312
);
1413
}
15-
16-
updateProperties() {
17-
const attrs = this.createProperties();
18-
19-
// TODO: add the ones to update
20-
// i.e. attrs.id = this.id;
21-
22-
return attrs;
23-
}
2414
}

0 commit comments

Comments
 (0)