diff --git a/Client/Modules/SZUAbsolventenverein.Module.HallOfFame/Edit.razor b/Client/Modules/SZUAbsolventenverein.Module.HallOfFame/Edit.razor index 042649f..220ba79 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.HallOfFame/Edit.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.HallOfFame/Edit.razor @@ -4,6 +4,7 @@ @using Microsoft.AspNetCore.Components.Forms @namespace SZUAbsolventenverein.Module.HallOfFame +@implements IDisposable @inherits ModuleBase @inject IHallOfFameService HallOfFameService @inject NavigationManager NavigationManager @@ -42,6 +43,11 @@ { +
+ Aktuell: @_currentCharCount + von maximal @_charLimit Zeichen. +
} @@ -157,9 +163,32 @@ new Stylesheet("_content/SZUAbsolventenverein.Module.HallOfFame/Module.css") private string _modifiedby; private DateTime _modifiedon; private int _charLimit = 500; + private int _currentCharCount = 0; + private System.Timers.Timer _timer; protected override async Task OnInitializedAsync() { + _timer = new System.Timers.Timer(1000); // 1 sekunde + _timer.Elapsed += async (s, e) => + { + if (_richTextEditorRef != null && _descriptionLoaded) + { + try + { + var html = await _richTextEditorRef.GetHtml(); + var plainText = System.Text.RegularExpressions.Regex.Replace(html ?? "", "<.*?>", String.Empty); + plainText = System.Net.WebUtility.HtmlDecode(plainText); + if (_currentCharCount != plainText.Length) + { + _currentCharCount = plainText.Length; + await InvokeAsync(StateHasChanged); + } + } + catch { } // Ignore interop errors during disposal + } + }; + _timer.Start(); + try { // Load character limit setting @@ -263,6 +292,7 @@ new Stylesheet("_content/SZUAbsolventenverein.Module.HallOfFame/Module.css") { try { + ClearModuleMessage(); validated = true; // Get the HTML content from the rich text editor if (_richTextEditorRef != null) @@ -273,6 +303,16 @@ new Stylesheet("_content/SZUAbsolventenverein.Module.HallOfFame/Module.css") var interop = new Oqtane.UI.Interop(JSRuntime); if (await interop.FormValid(form)) { + // Custom character limit validation for rich text + var plainText = System.Text.RegularExpressions.Regex.Replace(_description ?? "", "<.*?>", String.Empty); + plainText = System.Net.WebUtility.HtmlDecode(plainText); + if (plainText.Length > _charLimit) + { + AddModuleMessage($"Fehler: Die Beschreibung ist zu lang (Aktuell {plainText.Length}, Maximal {_charLimit} Zeichen).", + MessageType.Warning); + return; + } + _status = status; if (PageState.Action == "Add") @@ -333,4 +373,10 @@ new Stylesheet("_content/SZUAbsolventenverein.Module.HallOfFame/Module.css") AddModuleMessage("Fehler beim Löschen des Eintrags.", MessageType.Error); } } + + public void Dispose() + { + _timer?.Stop(); + _timer?.Dispose(); + } }