@page "/users" @implements IDisposable Users Management - Chrono DB

Users Database (`User`)

Browse, add, edit credentials, and delete user accounts.

@if (!string.IsNullOrEmpty(alertMessage)) { }
@if (!string.IsNullOrEmpty(searchTerm)) { }
Showing @users.Count user(s)
@if (isLoading) {
Loading users from database...
} else if (!users.Any()) {
No Users Found

There are currently no users in the database.

} else {
@foreach (var user in users) { }
Username (Primary Key) Password Hash / Credential Created At Actions
@user.Username
••••••••
@user.CreatedAt.ToString("g")
}
@if (showEditModal) { } @if (showDeleteModal && userToDelete != null) { } @code { private List users = []; private bool isLoading = true; private bool isSaving; private string searchTerm = string.Empty; private bool showEditModal; private bool isNewUser; private User currentUser = new(); private bool showDeleteModal; private User? userToDelete; private string? alertMessage; private bool alertIsSuccess; protected override async Task OnInitializedAsync() { ConfigService.OnConfigurationChanged += HandleConfigChanged; await LoadUsersAsync(); } private async void HandleConfigChanged() { await InvokeAsync(LoadUsersAsync); } private async Task LoadUsersAsync() { isLoading = true; alertMessage = null; try { users = await DbService.GetUsersAsync(searchTerm); } catch (Exception ex) { alertMessage = $"Error loading users: {ex.Message}"; alertIsSuccess = false; } finally { isLoading = false; StateHasChanged(); } } private async Task FilterUsers() { users = await DbService.GetUsersAsync(searchTerm); } private async Task ClearSearch() { searchTerm = string.Empty; await LoadUsersAsync(); } private void OpenAddModal() { currentUser = new User(); isNewUser = true; showEditModal = true; } private void OpenEditModal(User user) { currentUser = new User { Username = user.Username, Password = user.Password, CreatedAt = user.CreatedAt }; isNewUser = false; showEditModal = true; } private void CloseModal() { showEditModal = false; } private async Task SaveUserAsync() { if (string.IsNullOrWhiteSpace(currentUser.Username) || string.IsNullOrWhiteSpace(currentUser.Password)) { alertMessage = "Username and password cannot be empty."; alertIsSuccess = false; return; } isSaving = true; try { var result = await DbService.SaveUserAsync(currentUser, isNewUser); alertMessage = result.Message; alertIsSuccess = result.Success; if (result.Success) { showEditModal = false; await LoadUsersAsync(); } } finally { isSaving = false; } } private void OpenDeleteModal(User user) { userToDelete = user; showDeleteModal = true; } private async Task ConfirmDeleteAsync() { if (userToDelete == null) return; isSaving = true; try { var result = await DbService.DeleteUserAsync(userToDelete.Username); alertMessage = result.Message; alertIsSuccess = result.Success; showDeleteModal = false; userToDelete = null; await LoadUsersAsync(); } finally { isSaving = false; } } private async Task SeedUsersAsync() { isLoading = true; try { var res = await DbService.SeedSampleDataAsync(); alertMessage = res.Message; alertIsSuccess = res.Success; await LoadUsersAsync(); } finally { isLoading = false; } } public void Dispose() { ConfigService.OnConfigurationChanged -= HandleConfigChanged; } }