diff --git a/report-app/src/app/shared/ai-assistant/ai-assistant.html b/report-app/src/app/shared/ai-assistant/ai-assistant.html index f705c23..d9df3c6 100644 --- a/report-app/src/app/shared/ai-assistant/ai-assistant.html +++ b/report-app/src/app/shared/ai-assistant/ai-assistant.html @@ -15,7 +15,7 @@

AI Assistant

} - @if (isLoading) { + @if (isLoading()) {
@@ -47,12 +47,13 @@

AI Assistant

-
diff --git a/report-app/src/app/shared/ai-assistant/ai-assistant.scss b/report-app/src/app/shared/ai-assistant/ai-assistant.scss index aa8e0d7..8cc49ba 100644 --- a/report-app/src/app/shared/ai-assistant/ai-assistant.scss +++ b/report-app/src/app/shared/ai-assistant/ai-assistant.scss @@ -7,7 +7,7 @@ width: 500px; height: 650px; border-radius: 12px; - box-shadow: var(--shadow); + box-shadow: var(--overlay-shadow); background-color: var(--card-bg-color); overflow: hidden; display: flex; @@ -38,7 +38,6 @@ .header-title { display: flex; - flex-direction: column; gap: 8px; flex: 1; min-width: 0; @@ -52,7 +51,7 @@ h2 { margin: 0; - font-size: 1em; + font-size: 1.2em; color: var(--text-primary); } @@ -158,7 +157,7 @@ font-family: inherit; font-size: 1em; line-height: 1.4; - max-height: 100px; + height: 45px; &:focus { outline: none; diff --git a/report-app/src/app/shared/ai-assistant/ai-assistant.ts b/report-app/src/app/shared/ai-assistant/ai-assistant.ts index 1e1327b..abc3290 100644 --- a/report-app/src/app/shared/ai-assistant/ai-assistant.ts +++ b/report-app/src/app/shared/ai-assistant/ai-assistant.ts @@ -1,5 +1,5 @@ import {HttpClient} from '@angular/common/http'; -import {Component, input, output} from '@angular/core'; +import {Component, inject, input, output, signal} from '@angular/core'; import {FormsModule} from '@angular/forms'; import {firstValueFrom} from 'rxjs'; import { @@ -20,7 +20,7 @@ interface Model { styleUrl: './ai-assistant.scss', imports: [FormsModule, MessageSpinner], host: { - '[class.expanded]': 'isExpanded', + '[class.expanded]': 'isExpanded()', }, }) export class AiAssistant { @@ -28,9 +28,11 @@ export class AiAssistant { readonly close = output(); protected messages: AiChatMessage[] = []; - protected userInput = ''; - protected isLoading = false; - protected isExpanded = false; + protected userInput = signal(''); + protected isLoading = signal(false); + protected isExpanded = signal(false); + + private readonly http = inject(HttpClient); protected readonly models: Model[] = [ {id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash'}, @@ -39,23 +41,21 @@ export class AiAssistant { ]; protected selectedModel = this.models[0].id; - constructor(private readonly http: HttpClient) {} - protected toggleExpanded(): void { - this.isExpanded = !this.isExpanded; + this.isExpanded.set(!this.isExpanded()); } async send(): Promise { - if (!this.userInput.trim() || this.isLoading) { + if (!this.userInput().trim() || this.isLoading()) { return; } const pastMessages = this.messages.slice(); - this.messages.push({role: 'user', text: this.userInput}); - const prompt = this.userInput; - this.userInput = ''; - this.isLoading = true; + this.messages.push({role: 'user', text: this.userInput()}); + const prompt = this.userInput(); + this.userInput.set(''); + this.isLoading.set(true); const payload: AiChatRequest = { prompt, @@ -75,7 +75,7 @@ export class AiAssistant { text: 'Sorry, I failed to get a response. Please try again.', }); } finally { - this.isLoading = false; + this.isLoading.set(false); } } } diff --git a/report-app/src/styles.scss b/report-app/src/styles.scss index 6cf25e1..016c12f 100644 --- a/report-app/src/styles.scss +++ b/report-app/src/styles.scss @@ -45,6 +45,7 @@ 0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.05), 0 4px 6px -1px rgb(0 0 0 / 0.2), 0 2px 4px -2px rgb(0 0 0 / 0.2) ); + --overlay-shadow: 0 3px 10px rgba(0, 0, 0, 0.15); --transition-speed: 0.2s; --main-container-width: 1200px; --control-height: 36px;