From bc0651cb75f130e2072fb4edc1a18081804f803c Mon Sep 17 00:00:00 2001 From: Leon Hoppe Date: Tue, 8 Oct 2024 19:21:46 +0200 Subject: [PATCH] Added order, search and delete functionality to admin page --- .../Pages/Administration/AdminPageList.razor | 74 +++++++++++++++++-- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/src/HopFrame.Web/Pages/Administration/AdminPageList.razor b/src/HopFrame.Web/Pages/Administration/AdminPageList.razor index c72a1fd..4798210 100644 --- a/src/HopFrame.Web/Pages/Administration/AdminPageList.razor +++ b/src/HopFrame.Web/Pages/Administration/AdminPageList.razor @@ -11,6 +11,7 @@ @using static Microsoft.AspNetCore.Components.Web.RenderMode @using HopFrame.Web.Components.Administration @using BlazorStrap.V5 +@using CurrieTechnologies.Razor.SweetAlert2 @using HopFrame.Database.Repositories @using HopFrame.Security.Claims @using HopFrame.Web.Admin @@ -31,7 +32,7 @@ - Add Group + Add Entry @@ -63,7 +64,7 @@ @foreach (var prop in GetListingProperties()) { - @GetValue(entry, prop).GetAwaiter().GetResult() + @GetValue(entry, prop) } @@ -95,6 +96,7 @@ @inject IServiceProvider Provider @inject ITokenContext Auth @inject IPermissionRepository Permissions +@inject SweetAlertService Alerts @code { [Parameter] @@ -139,9 +141,11 @@ private async void Reload() { _modelBuffer = await _modelRepository.ReadAllO(); + _displayedModels = _modelBuffer.ToList(); _currentSortDirection = _pageData.DefaultSortDirection; OrderBy(_pageData.DefaultSortPropertyName, false); + StateHasChanged(); } private void OrderBy(string property, bool changeDir = true) { @@ -150,9 +154,29 @@ if (_currentSortProperty != property) _currentSortDirection = ListSortDirection.Ascending; - //TODO: Handle ordering - _displayedModels = _modelBuffer.ToList(); + var prop = GetListingProperties() + .SingleOrDefault(p => p.Name == property); + var comparer = Comparer.Create((x, y) => { + if (prop.Type == typeof(DateTime)) { + DateTime dateX = (DateTime) x.GetType().GetProperty(prop.Name)?.GetValue(x)!; + DateTime dateY = (DateTime) y.GetType().GetProperty(prop.Name)?.GetValue(y)!; + return DateTime.Compare(dateX, dateY); + } + + var propX = GetValue(x, prop); + var propY = GetValue(y, prop); + + return String.CompareOrdinal(propX, propY); + }); + + if (_currentSortDirection == ListSortDirection.Ascending) { + _displayedModels = _displayedModels.Order(comparer).ToList(); + } + else { + _displayedModels = _displayedModels.OrderDescending(comparer).ToList(); + } + _currentSortProperty = property; } @@ -167,11 +191,22 @@ var timeSinceLastKeyPress = DateTime.Now - _lastSearch; if (timeSinceLastKeyPress < TimeSpan.FromMilliseconds(500)) return; - //TODO: Handle searching + if (string.IsNullOrWhiteSpace(search)) { + _displayedModels = _modelBuffer.ToList(); + } + else { + var props = GetListingProperties(); + + _displayedModels = _modelBuffer + .Where(model => props.Any(prop => GetValue(model, prop).Contains(search))) + .ToList(); + } + OrderBy(_currentSortProperty, false); + StateHasChanged(); } - private async Task GetValue(object entry, AdminPageProperty property) { + private string GetValue(object entry, AdminPageProperty property) { object propValue = entry.GetType().GetProperty(property.Name)?.GetValue(entry); return propValue?.ToString(); @@ -183,11 +218,34 @@ return ""; } + private async void Create() { + //TODO: Open create modal + } + private async void Edit(object entry) { - + //TODO: Open edit modal } private async void Delete(object entry) { - + var result = await Alerts.FireAsync(new SweetAlertOptions { + Title = "Do you really want to delete this entry?", + Text = "You won't be able to revert this!", + Icon = SweetAlertIcon.Warning, + ConfirmButtonText = "Yes", + ShowCancelButton = true, + ShowConfirmButton = true + }); + + if (result.IsConfirmed) { + await _modelRepository.DeleteO(entry); + Reload(); + + await Alerts.FireAsync(new SweetAlertOptions { + Title = "Deleted!", + Icon = SweetAlertIcon.Success, + Timer = 1500, + ShowConfirmButton = false + }); + } } } \ No newline at end of file