@page "/profile" @rendermode InteractiveWebAssembly @attribute [Authorize] @using System.Security.Claims @inject IAuthService AuthService @inject ITimetrackerService TrackerService @inject ISnackbar Snackbar @inject AuthenticationStateProvider AuthStateProvider @inject NavigationManager Nav Benutzerprofil – Timetracker @if (_loading) { Lade Profil… } else { @* ── Header ── *@ Mein Profil Persönliche Details verwalten und Account sichern @* ── Übersicht & Details ── *@ @GetInitials(_username) @_username @(_isAdmin ? "Administrator" : "Standardbenutzer") Benutzer-ID #@_userId Gleitzeit-Saldo @FormatTs(_overtime, sign: true) Sollstunden / Tag @_settings.DailyTargetHours h @* ── Einstellungen verwalten ── *@ @* Benutzername ändern *@ Benutzername ändern Speichern @* Passwort ändern *@ Passwort ändern Passwort ändern } @code { [PersistentState(AllowUpdates = true)] public AppSettings? PersistentSettings { get; set; } [PersistentState(AllowUpdates = true)] public string? PersistentUsername { get; set; } [PersistentState(AllowUpdates = true)] public string? PersistentNewUsername { get; set; } [PersistentState(AllowUpdates = true)] public bool? PersistentIsAdmin { get; set; } [PersistentState(AllowUpdates = true)] public TimeSpan? PersistentOvertime { get; set; } private bool _loading = true; private int _userId; private string _username = ""; private string _newUsername = ""; private bool _isAdmin; private AppSettings _settings = new(); private TimeSpan _overtime; // Formulare private MudForm? _renameForm; private bool _renameIsValid; private MudForm? _passwordForm; private bool _passwordIsValid; // Passwörter private string _currentPassword = ""; private string _newPassword = ""; private string _confirmPassword = ""; protected override async Task OnInitializedAsync() { if (PersistentSettings != null) { _settings = PersistentSettings; _username = PersistentUsername ?? ""; _newUsername = PersistentNewUsername ?? ""; _isAdmin = PersistentIsAdmin ?? false; _overtime = PersistentOvertime ?? TimeSpan.Zero; _loading = false; } var authState = await AuthStateProvider.GetAuthenticationStateAsync(); var claim = authState.User.FindFirst(ClaimTypes.NameIdentifier); if (claim == null) return; _userId = int.Parse(claim.Value); if (PersistentSettings == null) { _username = authState.User.Identity?.Name ?? ""; _newUsername = _username; _isAdmin = _username.Equals("marc", StringComparison.OrdinalIgnoreCase); _settings = await TrackerService.GetSettingsAsync(_userId); _overtime = await TrackerService.GetTotalOvertimeAsync(_userId, _settings); PersistentSettings = _settings; PersistentUsername = _username; PersistentNewUsername = _newUsername; PersistentIsAdmin = _isAdmin; PersistentOvertime = _overtime; _loading = false; } } private string GetInitials(string? name) { if (string.IsNullOrWhiteSpace(name)) return "U"; var parts = name.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 1) return parts[0][..Math.Min(2, parts[0].Length)].ToUpper(); return $"{parts[0][0]}{parts[1][0]}".ToUpper(); } private static string FormatTs(TimeSpan ts, bool sign = false) { if (ts == TimeSpan.Zero && sign) return "±0:00"; var prefix = sign ? (ts >= TimeSpan.Zero ? "+" : "−") : (ts < TimeSpan.Zero ? "−" : ""); var abs = ts.Duration(); return $"{prefix}{(int)abs.TotalHours}:{abs.Minutes:D2}"; } // Validierungen private string? ValidateUsername(string val) { if (string.IsNullOrWhiteSpace(val) || val.Length < 3) return "Benutzername muss mindestens 3 Zeichen lang sein."; return null; } private string? ValidatePassword(string val) { if (string.IsNullOrWhiteSpace(val) || val.Length < 6) return "Passwort muss mindestens 6 Zeichen lang sein."; return null; } private string? ValidateConfirmPassword(string val) { if (val != _newPassword) return "Die Passwörter stimmen nicht überein."; return null; } // Aktionen private async Task HandleRename() { if (_renameForm == null) return; await _renameForm.ValidateAsync(); if (!_renameForm.IsValid) return; var error = await AuthService.RenameUserAsync(_userId, _newUsername); if (error != null) { Snackbar.Add(error, Severity.Error); } else { Snackbar.Add("Benutzername erfolgreich geändert. Bitte melde dich ggf. neu an, um alle Anzeigen zu aktualisieren.", Severity.Success); _username = _newUsername; // Umleitung zur Startseite, um die neue Identity zu laden Nav.NavigateTo("/", forceLoad: true); } } private async Task HandleChangePassword() { if (_passwordForm == null) return; await _passwordForm.ValidateAsync(); if (!_passwordForm.IsValid) return; var error = await AuthService.ChangePasswordAsync(_userId, _currentPassword, _newPassword); if (error != null) { Snackbar.Add(error, Severity.Error); } else { Snackbar.Add("Passwort erfolgreich geändert.", Severity.Success); _currentPassword = ""; _newPassword = ""; _confirmPassword = ""; if (_passwordForm != null) await _passwordForm.ResetAsync(); } } }