Skip to content

Commit 04c4ff8

Browse files
authored
UX: No admin header for edit personas tools or llms (#1021)
In this PR, we added functionality to hide the admin header for edit/new actions - discourse/discourse#30175 To make it work properly, we have to rename `show` to `edit` which is also a more accurate name.
1 parent 47c1ea3 commit 04c4ff8

21 files changed

+50
-28
lines changed

admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-llms-show.js renamed to admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-llms-edit.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DiscourseRoute from "discourse/routes/discourse";
22

3-
export default class AdminPluginsShowDiscourseAiLlmsShow extends DiscourseRoute {
3+
export default class AdminPluginsShowDiscourseAiLlmsEdit extends DiscourseRoute {
44
async model(params) {
55
const allLlms = this.modelFor("adminPlugins.show.discourse-ai-llms");
66
const id = parseInt(params.id, 10);

admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-personas-show.js renamed to admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-personas-edit.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DiscourseRoute from "discourse/routes/discourse";
22

3-
export default class AdminPluginsShowDiscourseAiPersonasShow extends DiscourseRoute {
3+
export default class AdminPluginsShowDiscourseAiPersonasEdit extends DiscourseRoute {
44
async model(params) {
55
const allPersonas = this.modelFor(
66
"adminPlugins.show.discourse-ai-personas"

admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-tools-show.js renamed to admin/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-tools-edit.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DiscourseRoute from "discourse/routes/discourse";
22

3-
export default class DiscourseAiToolsShowRoute extends DiscourseRoute {
3+
export default class DiscourseAiToolsEditRoute extends DiscourseRoute {
44
async model(params) {
55
const allTools = this.modelFor("adminPlugins.show.discourse-ai-tools");
66
const id = parseInt(params.id, 10);

app/controllers/discourse_ai/admin/ai_llms_controller.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ def index
3030
}
3131
end
3232

33-
def show
33+
def new
34+
end
35+
36+
def edit
3437
llm_model = LlmModel.find(params[:id])
3538
render json: LlmModelSerializer.new(llm_model)
3639
end

app/controllers/discourse_ai/admin/ai_personas_controller.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Admin
55
class AiPersonasController < ::Admin::AdminController
66
requires_plugin ::DiscourseAi::PLUGIN_NAME
77

8-
before_action :find_ai_persona, only: %i[show update destroy create_user]
8+
before_action :find_ai_persona, only: %i[edit update destroy create_user]
99

1010
def index
1111
ai_personas =
@@ -33,7 +33,10 @@ def index
3333
render json: { ai_personas: ai_personas, meta: { tools: tools, llms: llms } }
3434
end
3535

36-
def show
36+
def new
37+
end
38+
39+
def edit
3740
render json: LocalizedAiPersonaSerializer.new(@ai_persona)
3841
end
3942

app/controllers/discourse_ai/admin/ai_tools_controller.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ module Admin
55
class AiToolsController < ::Admin::AdminController
66
requires_plugin ::DiscourseAi::PLUGIN_NAME
77

8-
before_action :find_ai_tool, only: %i[test show update destroy]
8+
before_action :find_ai_tool, only: %i[test edit update destroy]
99

1010
def index
1111
ai_tools = AiTool.all
1212
render_serialized({ ai_tools: ai_tools }, AiCustomToolListSerializer, root: false)
1313
end
1414

15-
def show
15+
def new
16+
end
17+
18+
def edit
1619
render_serialized(@ai_tool, AiCustomToolSerializer)
1720
end
1821

assets/javascripts/discourse/admin-discourse-ai-plugin-route-map.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ export default {
66
map() {
77
this.route("discourse-ai-personas", { path: "ai-personas" }, function () {
88
this.route("new");
9-
this.route("show", { path: "/:id" });
9+
this.route("edit", { path: "/:id/edit" });
1010
});
1111

1212
this.route("discourse-ai-llms", { path: "ai-llms" }, function () {
1313
this.route("new");
14-
this.route("show", { path: "/:id" });
14+
this.route("edit", { path: "/:id/edit" });
1515
});
1616

1717
this.route("discourse-ai-tools", { path: "ai-tools" }, function () {
1818
this.route("new");
19-
this.route("show", { path: "/:id" });
19+
this.route("edit", { path: "/:id/edit" });
2020
});
2121
this.route("discourse-ai-spam", { path: "ai-spam" });
2222
this.route("discourse-ai-usage", { path: "ai-usage" });

assets/javascripts/discourse/components/ai-llms-list-editor.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export default class AiLlmsListEditor extends Component {
167167
</td>
168168
<td class="d-admin-row__controls">
169169
<LinkTo
170-
@route="adminPlugins.show.discourse-ai-llms.show"
170+
@route="adminPlugins.show.discourse-ai-llms.edit"
171171
class="btn btn-default btn-small ai-llm-list__edit-button"
172172
@model={{llm.id}}
173173
>

assets/javascripts/discourse/components/ai-persona-editor.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export default class PersonaEditor extends Component {
135135
if (isNew && this.args.model.rag_uploads.length === 0) {
136136
this.args.personas.addObject(this.args.model);
137137
this.router.transitionTo(
138-
"adminPlugins.show.discourse-ai-personas.show",
138+
"adminPlugins.show.discourse-ai-personas.edit",
139139
this.args.model
140140
);
141141
} else {

assets/javascripts/discourse/components/ai-persona-list-editor.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export default class AiPersonaListEditor extends Component {
9292
</td>
9393
<td class="d-admin-row__controls">
9494
<LinkTo
95-
@route="adminPlugins.show.discourse-ai-personas.show"
95+
@route="adminPlugins.show.discourse-ai-personas.edit"
9696
@model={{persona}}
9797
class="btn btn-text btn-small"
9898
>{{i18n "discourse_ai.ai_persona.edit"}} </LinkTo>

assets/javascripts/discourse/components/ai-tool-editor.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export default class AiToolEditor extends Component {
103103
}
104104

105105
this.router.transitionTo(
106-
"adminPlugins.show.discourse-ai-tools.show",
106+
"adminPlugins.show.discourse-ai-tools.edit",
107107
this.args.model
108108
);
109109
} catch (e) {

assets/javascripts/discourse/components/ai-tool-list-editor.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default class AiToolListEditor extends Component {
5757
</td>
5858
<td class="d-admin-row__controls">
5959
<LinkTo
60-
@route="adminPlugins.show.discourse-ai-tools.show"
60+
@route="adminPlugins.show.discourse-ai-tools.edit"
6161
@model={{tool}}
6262
class="btn btn-text btn-small"
6363
>{{I18n.t "discourse_ai.tools.edit"}}</LinkTo>

config/routes.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@
5353

5454
scope "/admin/plugins/discourse-ai", constraints: AdminConstraint.new do
5555
resources :ai_personas,
56-
only: %i[index create show update destroy],
56+
only: %i[index new create edit update destroy],
5757
path: "ai-personas",
5858
controller: "discourse_ai/admin/ai_personas"
5959

6060
post "/ai-personas/stream-reply" => "discourse_ai/admin/ai_personas#stream_reply"
6161

6262
resources(
6363
:ai_tools,
64-
only: %i[index create show update destroy],
64+
only: %i[index new create edit update destroy],
6565
path: "ai-tools",
6666
controller: "discourse_ai/admin/ai_tools",
6767
)
@@ -85,7 +85,7 @@
8585
post "/ai-spam/test", to: "discourse_ai/admin/ai_spam#test"
8686

8787
resources :ai_llms,
88-
only: %i[index create show update destroy],
88+
only: %i[index new create edit update destroy],
8989
path: "ai-llms",
9090
controller: "discourse_ai/admin/ai_llms" do
9191
collection { get :test }

spec/requests/admin/ai_personas_controller_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@
141141
end
142142
end
143143

144-
describe "GET #show" do
144+
describe "GET #edit" do
145145
it "returns a success response" do
146-
get "/admin/plugins/discourse-ai/ai-personas/#{ai_persona.id}.json"
146+
get "/admin/plugins/discourse-ai/ai-personas/#{ai_persona.id}/edit.json"
147147
expect(response).to be_successful
148148
expect(response.parsed_body["ai_persona"]["name"]).to eq(ai_persona.name)
149149
end
@@ -152,7 +152,7 @@
152152
upload = Fabricate(:upload)
153153
RagDocumentFragment.link_target_and_uploads(ai_persona, [upload.id])
154154

155-
get "/admin/plugins/discourse-ai/ai-personas/#{ai_persona.id}.json"
155+
get "/admin/plugins/discourse-ai/ai-personas/#{ai_persona.id}/edit.json"
156156
expect(response).to be_successful
157157

158158
serialized_persona = response.parsed_body["ai_persona"]

spec/requests/admin/ai_tools_controller_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
end
3636
end
3737

38-
describe "GET #show" do
38+
describe "GET #edit" do
3939
it "returns a success response" do
40-
get "/admin/plugins/discourse-ai/ai-tools/#{ai_tool.id}.json"
40+
get "/admin/plugins/discourse-ai/ai-tools/#{ai_tool.id}/edit.json"
4141
expect(response).to be_successful
4242
expect(response.parsed_body["ai_tool"]["name"]).to eq(ai_tool.name)
4343
end

spec/system/admin_ai_persona_spec.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
RSpec.describe "Admin AI persona configuration", type: :system, js: true do
44
fab!(:admin)
5+
let(:admin_header) { PageObjects::Components::AdminHeader.new }
56

67
before do
78
SiteSetting.ai_bot_enabled = true
@@ -11,7 +12,13 @@
1112

1213
it "allows creation of a persona" do
1314
visit "/admin/plugins/discourse-ai/ai-personas"
15+
16+
expect(admin_header).to be_visible
17+
1418
find(".ai-persona-list-editor__new-button").click()
19+
20+
expect(admin_header).to be_hidden
21+
1522
find(".ai-persona-editor__name").set("Test Persona")
1623
find(".ai-persona-editor__description").fill_in(with: "I am a test persona")
1724
find(".ai-persona-editor__system_prompt").fill_in(with: "You are a helpful bot")
@@ -35,7 +42,7 @@
3542

3643
expect(page).not_to have_current_path("/admin/plugins/discourse-ai/ai-personas/new")
3744

38-
persona_id = page.current_path.split("/").last.to_i
45+
persona_id = page.current_path.split("/")[-2].to_i
3946

4047
persona = AiPersona.find(persona_id)
4148
expect(persona.name).to eq("Test Persona")
@@ -46,15 +53,15 @@
4653
end
4754

4855
it "will not allow deletion or editing of system personas" do
49-
visit "/admin/plugins/discourse-ai/ai-personas/#{DiscourseAi::AiBot::Personas::Persona.system_personas.values.first}"
56+
visit "/admin/plugins/discourse-ai/ai-personas/#{DiscourseAi::AiBot::Personas::Persona.system_personas.values.first}/edit"
5057
expect(page).not_to have_selector(".ai-persona-editor__delete")
5158
expect(find(".ai-persona-editor__system_prompt")).to be_disabled
5259
end
5360

5461
it "will enable persona right away when you click on enable but does not save side effects" do
5562
persona = Fabricate(:ai_persona, enabled: false)
5663

57-
visit "/admin/plugins/discourse-ai/ai-personas/#{persona.id}"
64+
visit "/admin/plugins/discourse-ai/ai-personas/#{persona.id}/edit"
5865

5966
find(".ai-persona-editor__name").set("Test Persona 1")
6067
PageObjects::Components::DToggleSwitch.new(".ai-persona-editor__enabled").toggle

spec/system/ai_bot/tool_spec.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
describe "AI Tool Management", type: :system do
66
fab!(:admin)
7+
let(:admin_header) { PageObjects::Components::AdminHeader.new }
78

89
before do
910
SiteSetting.ai_embeddings_enabled = true
@@ -36,9 +37,11 @@ def ensure_can_run_test
3637
it "allows admin to create a new AI tool from preset" do
3738
visit "/admin/plugins/discourse-ai/ai-tools"
3839

40+
expect(admin_header).to be_visible
3941
expect(page).to have_content("Tools")
4042

4143
find(".ai-tool-list-editor__new-button").click
44+
expect(admin_header).to be_hidden
4245

4346
select_kit = PageObjects::Components::SelectKit.new(".ai-tool-editor__presets")
4447
select_kit.expand
@@ -58,7 +61,7 @@ def ensure_can_run_test
5861
expect(page).to have_content("Tool saved")
5962

6063
last_tool = AiTool.order("id desc").limit(1).first
61-
visit "/admin/plugins/discourse-ai/ai-tools/#{last_tool.id}"
64+
visit "/admin/plugins/discourse-ai/ai-tools/#{last_tool.id}/edit"
6265

6366
ensure_can_run_test
6467

spec/system/llms/ai_llm_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
RSpec.describe "Managing LLM configurations", type: :system, js: true do
44
fab!(:admin)
5+
let(:admin_header) { PageObjects::Components::AdminHeader.new }
56

67
before do
78
SiteSetting.ai_bot_enabled = true
@@ -36,8 +37,10 @@
3637

3738
it "manually configures an LLM" do
3839
visit "/admin/plugins/discourse-ai/ai-llms"
40+
expect(admin_header).to be_visible
3941

4042
find("[data-llm-id='none'] button").click()
43+
expect(admin_header).to be_hidden
4144

4245
find("input.ai-llm-editor__display-name").fill_in(with: "Self-hosted LLM")
4346
find("input.ai-llm-editor__name").fill_in(with: "llava-hf/llava-v1.6-mistral-7b-hf")

0 commit comments

Comments
 (0)