From c0cf620fe3dd4218e62fb6328d87c808a5749432 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Fri, 16 May 2025 15:36:08 +0200 Subject: [PATCH] Refactored some text fields to use the DebouncedTextField component (#459) --- .../Assistants/Agenda/AssistantAgenda.razor | 2 +- .../Assistants/EMail/AssistantEMail.razor | 2 +- .../Translation/AssistantTranslation.razor | 2 +- .../Components/DebouncedTextField.razor | 3 + .../Components/DebouncedTextField.razor.cs | 80 +++++++++++++++++++ .../wwwroot/changelog/v0.9.44.md | 3 +- 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 app/MindWork AI Studio/Components/DebouncedTextField.razor create mode 100644 app/MindWork AI Studio/Components/DebouncedTextField.razor.cs diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor index 19e98966..8056467c 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor @@ -3,7 +3,7 @@ - + @foreach (var contentLine in this.contentLines) { diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor index 9220f499..2f8783b3 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor @@ -10,7 +10,7 @@ } - + @foreach (var contentLine in this.bulletPointsLines) { diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor index 27b902ce..571b408e 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor @@ -15,7 +15,7 @@ @if (this.liveTranslation) { - + } else { diff --git a/app/MindWork AI Studio/Components/DebouncedTextField.razor b/app/MindWork AI Studio/Components/DebouncedTextField.razor new file mode 100644 index 00000000..83e205d8 --- /dev/null +++ b/app/MindWork AI Studio/Components/DebouncedTextField.razor @@ -0,0 +1,3 @@ +@inherits MudComponentBase + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs b/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs new file mode 100644 index 00000000..885a8488 --- /dev/null +++ b/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs @@ -0,0 +1,80 @@ +using Microsoft.AspNetCore.Components; + +using Timer = System.Timers.Timer; + +namespace AIStudio.Components; + +public partial class DebouncedTextField : MudComponentBase +{ + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string Text { get; set; } = string.Empty; + + [Parameter] + public EventCallback TextChanged { get; set; } + + [Parameter] + public Func WhenTextChangedAsync { get; set; } = _ => Task.CompletedTask; + + [Parameter] + public Action WhenTextCanged { get; set; } = _ => { }; + + [Parameter] + public int Lines { get; set; } = 1; + + [Parameter] + public int MaxLines { get; set; } = 1; + + [Parameter] + public Dictionary Attributes { get; set; } = []; + + [Parameter] + public Func ValidationFunc { get; set; } = _ => null; + + [Parameter] + public string HelpText { get; set; } = string.Empty; + + [Parameter] + public string Placeholder { get; set; } = string.Empty; + + [Parameter] + public string Icon { get; set; } = string.Empty; + + [Parameter] + public TimeSpan DebounceTime { get; set; } = TimeSpan.FromMilliseconds(800); + + [Parameter] + public bool Disabled { get; set; } + + private readonly Timer debounceTimer = new(); + private string text = string.Empty; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.text = this.Text; + this.debounceTimer.AutoReset = false; + this.debounceTimer.Interval = this.DebounceTime.TotalMilliseconds; + this.debounceTimer.Elapsed += (_, _) => + { + this.debounceTimer.Stop(); + this.InvokeAsync(async () => await this.TextChanged.InvokeAsync(this.text)); + this.InvokeAsync(async () => await this.WhenTextChangedAsync(this.text)); + this.InvokeAsync(() => this.WhenTextCanged(this.text)); + }; + + await base.OnInitializedAsync(); + } + + #endregion + + private void OnTextChanged(string value) + { + this.text = value; + this.debounceTimer.Stop(); + this.debounceTimer.Start(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md index a27239e4..98f485e4 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md @@ -1,2 +1,3 @@ # v0.9.44, build 219 (2025-05-xx xx:xx UTC) -- Improved localization code & German translation. \ No newline at end of file +- Improved localization code & German translation. +- Fixed a bug with text fields when their content was read live. This issue caused the user interface to refresh too frequently, resulting in increased energy consumption. \ No newline at end of file