DEV: Add `ai-bot-conversations-above-input` plugin outlet and update loading animation (#1284)

Update loading animation 

https://github.com/user-attachments/assets/f3bb6ca7-5d84-4231-8ea1-fa49fa402eae


- Add plugin outlet 
- update `updateInputValue` so that it can be used by plugins to update the input value
This commit is contained in:
Isaac Janzen 2025-04-24 13:33:33 -05:00 committed by GitHub
parent 298ebee7dd
commit 1a0d1d6e84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 29 deletions

View File

@ -27,9 +27,10 @@ export default class DiscourseAiBotConversations extends Controller {
} }
@action @action
updateInputValue(event) { updateInputValue(value) {
this._autoExpandTextarea(); this._autoExpandTextarea();
this.aiBotConversationsHiddenSubmit.inputValue = event.target.value; this.aiBotConversationsHiddenSubmit.inputValue =
value.target?.value || value;
} }
@action @action

View File

@ -1,8 +1,9 @@
import { hash } from "@ember/helper";
import { on } from "@ember/modifier"; import { on } from "@ember/modifier";
import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import didInsert from "@ember/render-modifiers/modifiers/did-insert";
import RouteTemplate from "ember-route-template"; import RouteTemplate from "ember-route-template";
import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner";
import DButton from "discourse/components/d-button"; import DButton from "discourse/components/d-button";
import PluginOutlet from "discourse/components/plugin-outlet";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import AiPersonaLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector"; import AiPersonaLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector";
@ -16,31 +17,36 @@ export default RouteTemplate(
/> />
<div class="ai-bot-conversations__content-wrapper"> <div class="ai-bot-conversations__content-wrapper">
<ConditionalLoadingSpinner @condition={{@controller.loading}}> <h1>{{i18n "discourse_ai.ai_bot.conversations.header"}}</h1>
<h1>{{i18n "discourse_ai.ai_bot.conversations.header"}}</h1> <PluginOutlet
<div class="ai-bot-conversations__input-wrapper"> @name="ai-bot-conversations-above-input"
<textarea @outletArgs={{hash
{{didInsert @controller.setTextArea}} updateInput=@controller.updateInputValue
{{on "input" @controller.updateInputValue}} submit=@controller.aiBotConversationsHiddenSubmit.submitToBot
{{on "keydown" @controller.handleKeyDown}} }}
id="ai-bot-conversations-input" />
placeholder={{i18n <div class="ai-bot-conversations__input-wrapper">
"discourse_ai.ai_bot.conversations.placeholder" <textarea
}} {{didInsert @controller.setTextArea}}
minlength="10" {{on "input" @controller.updateInputValue}}
rows="1" {{on "keydown" @controller.handleKeyDown}}
/> id="ai-bot-conversations-input"
<DButton placeholder={{i18n "discourse_ai.ai_bot.conversations.placeholder"}}
@action={{@controller.aiBotConversationsHiddenSubmit.submitToBot}} minlength="10"
@icon="paper-plane" disabled={{@controller.loading}}
@title="discourse_ai.ai_bot.conversations.header" rows="1"
class="ai-bot-button btn-primary ai-conversation-submit" />
/> <DButton
</div> @action={{@controller.aiBotConversationsHiddenSubmit.submitToBot}}
<p class="ai-disclaimer"> @icon="paper-plane"
{{i18n "discourse_ai.ai_bot.conversations.disclaimer"}} @isLoading={{@controller.loading}}
</p> @title="discourse_ai.ai_bot.conversations.header"
</ConditionalLoadingSpinner> class="ai-bot-button btn-primary ai-conversation-submit"
/>
</div>
<p class="ai-disclaimer">
{{i18n "discourse_ai.ai_bot.conversations.disclaimer"}}
</p>
</div> </div>
</div> </div>
</template> </template>

View File

@ -217,9 +217,16 @@ body.has-ai-conversations-sidebar {
max-width: 46em; max-width: 46em;
} }
.btn-primary { .ai-conversation-submit {
align-self: end; align-self: end;
min-height: 2.5em; min-height: 2.5em;
max-height: 2.5em;
}
.spinner {
margin: 0;
width: 2em;
height: 2em;
} }
#ai-bot-conversations-input { #ai-bot-conversations-input {
@ -228,6 +235,7 @@ body.has-ai-conversations-sidebar {
resize: none; resize: none;
border-radius: var(--d-button-border-radius); border-radius: var(--d-button-border-radius);
max-height: 30vh; max-height: 30vh;
overflow: hidden;
&:focus { &:focus {
outline: none; outline: none;