@using Oqtane.Modules.Controls @using SZUAbsolventenverein.Module.HallOfFame.Services @using SZUAbsolventenverein.Module.HallOfFame.Models @using Microsoft.AspNetCore.Components.Forms @namespace SZUAbsolventenverein.Module.HallOfFame @implements IDisposable @inherits ModuleBase @inject IHallOfFameService HallOfFameService @inject NavigationManager NavigationManager @inject IStringLocalizer Localizer @inject ISettingService SettingService
Bitte gib einen Namen ein (max. 120 Zeichen).
Bitte gib einen gültigen Jahrgang ein.
@if (_descriptionLoaded) {
Aktuell: @_currentCharCount von maximal @_charLimit Zeichen.
}
@if (!string.IsNullOrEmpty(_image)) {
Vorschau
} else {
Kein Bild
}
Nur JPG oder PNG, max. 5 MB.
@if (_uploading) {
Wird hochgeladen...
Wird hochgeladen... }
Bitte gib eine gültige URL ein (startet mit http:// oder https://).

Aktuell: @(_status ?? "Neu")

Abbrechen
@if (PageState.Action == "Edit") { }


@if (PageState.Action == "Edit") { }
@code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; public override string Actions => "Add,Edit"; public override string Title => "Hall of Fame Eintrag verwalten"; public override List Resources => new List() { new Stylesheet("_content/SZUAbsolventenverein.Module.HallOfFame/Module.css") }; private ElementReference form; private bool validated = false; private bool _uploading = false; private RichTextEditor _richTextEditorRef; private bool _descriptionLoaded = false; private int _id; private string _name; private int _year = DateTime.Now.Year; private string _description; private string _image; private string _link; private string _status = "Draft"; private string _createdby; private DateTime _createdon; 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 var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); var charLimitStr = SettingService.GetSetting(settings, "CharLimit", "500"); if (int.TryParse(charLimitStr, out var parsed) && parsed >= 4 && parsed <= 32000) { _charLimit = parsed; } _descriptionLoaded = false; if (PageState.Action == "Edit") { _id = Int32.Parse(PageState.QueryString["id"]); HallOfFame HallOfFame = await HallOfFameService.GetHallOfFameAsync(_id, ModuleState.ModuleId); if (HallOfFame != null) { if (HallOfFame.UserId != PageState.User.UserId) { NavigationManager.NavigateTo(NavigateUrl()); return; } _name = HallOfFame.Name; _year = HallOfFame.Year; _description = HallOfFame.Description; _image = HallOfFame.Image; _link = HallOfFame.Link; _status = HallOfFame.Status; _createdby = HallOfFame.CreatedBy; _createdon = HallOfFame.CreatedOn; _modifiedby = HallOfFame.ModifiedBy; _modifiedon = HallOfFame.ModifiedOn; } } else // Add Mode { var existing = await HallOfFameService.GetHallOfFameByUserIdAsync(PageState.User.UserId, ModuleState.ModuleId); if (existing != null) { NavigationManager.NavigateTo(EditUrl(existing.HallOfFameId.ToString())); } } _descriptionLoaded = true; } catch (Exception ex) { await logger.LogError(ex, "Error Loading HallOfFame {HallOfFameId} {Error}", _id, ex.Message); AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error); } } private async Task HandleFileSelected(InputFileChangeEventArgs e) { var file = e.File; if (file == null) return; if (file.Size > 5 * 1024 * 1024) { AddModuleMessage("Die Datei ist zu groß (max. 5 MB allowed).", MessageType.Warning); return; } try { _uploading = true; using var stream = file.OpenReadStream(5 * 1024 * 1024); var url = await HallOfFameService.UploadFileAsync(stream, file.Name, ModuleState.ModuleId); if (!string.IsNullOrEmpty(url)) { _image = url; AddModuleMessage("Foto erfolgreich hochgeladen.", MessageType.Success); } else { AddModuleMessage("Fehler beim Hochladen des Fotos.", MessageType.Error); } } catch (Exception ex) { await logger.LogError(ex, "Error Uploading File {Error}", ex.Message); AddModuleMessage("Ein technischer Fehler ist beim Upload aufgetreten.", MessageType.Error); } finally { _uploading = false; StateHasChanged(); } } private void RemoveImage() { _image = string.Empty; StateHasChanged(); } private async Task Save(string status) { try { ClearModuleMessage(); validated = true; // Get the HTML content from the rich text editor if (_richTextEditorRef != null) { _description = await _richTextEditorRef.GetHtml(); } 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") { HallOfFame HallOfFame = new HallOfFame(); HallOfFame.ModuleId = ModuleState.ModuleId; HallOfFame.UserId = PageState.User.UserId; HallOfFame.Name = _name; HallOfFame.Year = _year; HallOfFame.Description = _description; HallOfFame.Image = _image; HallOfFame.Link = _link; HallOfFame.Status = _status; HallOfFame = await HallOfFameService.AddHallOfFameAsync(HallOfFame); await logger.LogInformation("HallOfFame Added {HallOfFame}", HallOfFame); } else { HallOfFame HallOfFame = await HallOfFameService.GetHallOfFameAsync(_id, ModuleState.ModuleId); if (HallOfFame.UserId == PageState.User.UserId) { HallOfFame.Name = _name; HallOfFame.Year = _year; HallOfFame.Description = _description; HallOfFame.Image = _image; HallOfFame.Link = _link; HallOfFame.Status = _status; await HallOfFameService.UpdateHallOfFameAsync(HallOfFame); await logger.LogInformation("HallOfFame Updated {HallOfFame}", HallOfFame); } } NavigationManager.NavigateTo(NavigateUrl()); } else { AddModuleMessage(Localizer["Message.SaveValidation"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving HallOfFame {Error}", ex.Message); AddModuleMessage(Localizer["Message.SaveError"], MessageType.Error); } } private async Task DeleteEntry() { try { await HallOfFameService.DeleteHallOfFameAsync(_id, ModuleState.ModuleId); NavigationManager.NavigateTo(NavigateUrl()); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting HallOfFame {Error}", ex.Message); AddModuleMessage("Fehler beim Löschen des Eintrags.", MessageType.Error); } } public void Dispose() { _timer?.Stop(); _timer?.Dispose(); } }