@page "/administration/{url}" @layout AdminLayout @rendermode InteractiveServer @using System.ComponentModel @using BlazorStrap @using Microsoft.AspNetCore.Components.Web @using HopFrame.Web.Admin.Models @using HopFrame.Web.Admin.Providers @using HopFrame.Web.Pages.Administration.Layout @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 @using HopFrame.Web.Components @_pageData.Title

@_pageData.Title administration

Add Entry
@foreach (var prop in GetListingProperties()) { @if (prop.Sortable) { @prop.DisplayName @if (_currentSortProperty == prop.Name) { } } else { @prop.DisplayName } } @if (_hasEditPermission || _hasDeletePermission) { Actions } @foreach (var entry in _displayedModels) { @foreach (var prop in GetListingProperties()) { @if (prop.Bold) { @GetPrintableValue(entry, prop) } else { @GetPrintableValue(entry, prop) } } @if (_hasEditPermission || _hasDeletePermission) { @if (_hasEditPermission) { Edit } @if (_hasDeletePermission) { Delete } } } @inject IAdminPagesProvider Pages @inject IServiceProvider Provider @inject ITokenContext Auth @inject IPermissionRepository Permissions @inject SweetAlertService Alerts @inject NavigationManager Navigator @code { [Parameter] public string Url { get; set; } private AdminPage _pageData; private IModelProvider _modelProvider; private IEnumerable _modelBuffer; private AdminPageModal _modal; private bool _hasEditPermission; private bool _hasDeletePermission; private string _currentSortProperty; private ListSortDirection _currentSortDirection; private DateTime _lastSearch; private IList _displayedModels; protected override async Task OnInitializedAsync() { _pageData = Pages.LoadAdminPage(Url); if (_pageData is null) { Navigator.NavigateTo("/administration", true); return; } _currentSortProperty = _pageData.DefaultSortPropertyName; _currentSortDirection = _pageData.DefaultSortDirection; if (_pageData.RepositoryProvider is null) throw new ArgumentException($"AdminPage '{_pageData.Title}' does not specify a model repository!'"); _modelProvider = _pageData.LoadModelProvider(Provider); _hasEditPermission = _pageData.Permissions.Update is null || await Permissions.HasPermission(Auth.User, _pageData.Permissions.Update); _hasDeletePermission = _pageData.Permissions.Delete is null || await Permissions.HasPermission(Auth.User, _pageData.Permissions.Delete); await Reload(); } private IList GetListingProperties() { return _pageData.Properties .Where(p => p.Ignore == false) .Where(p => p.DisplayInListing) .ToList(); } private async Task Reload() { _modelBuffer = await _modelProvider.ReadAllO(); _displayedModels = _modelBuffer.ToList(); _currentSortDirection = _pageData.DefaultSortDirection; OrderBy(_pageData.DefaultSortPropertyName, false); StateHasChanged(); } private void OrderBy(string property, bool changeDir = true) { if (_currentSortProperty == property && changeDir) _currentSortDirection = (ListSortDirection)(((int)_currentSortDirection + 1) % 2); if (_currentSortProperty != property) _currentSortDirection = ListSortDirection.Ascending; 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 = GetPrintableValue(x, prop); var propY = GetPrintableValue(y, prop); return String.CompareOrdinal(propX, propY); }); _displayedModels = _currentSortDirection == ListSortDirection.Ascending ? _displayedModels.Order(comparer).ToList() : _displayedModels.OrderDescending(comparer).ToList(); _currentSortProperty = property; } private void TriggerSearch(ChangeEventArgs e) { var search = ((string)e.Value)?.Trim(); Search(search); } private async void Search(string search) { _lastSearch = DateTime.Now; await Task.Delay(500); var timeSinceLastKeyPress = DateTime.Now - _lastSearch; if (timeSinceLastKeyPress < TimeSpan.FromMilliseconds(500)) return; if (string.IsNullOrWhiteSpace(search)) { _displayedModels = _modelBuffer.ToList(); } else { var props = GetListingProperties(); _displayedModels = _modelBuffer .Where(model => props.Any(prop => GetPrintableValue(model, prop).Contains(search))) .ToList(); } OrderBy(_currentSortProperty, false); StateHasChanged(); } private string GetPrintableValue(object element, AdminPageProperty prop) { return _modal?.MapPropertyValue(prop.GetValue(element), prop); } private async void Create() { await _modal.Show(_pageData); } private async void Edit(object entry) { await _modal.Show(_pageData, entry); } private async void Delete(object entry) { var result = await Alerts.FireAsync(new SweetAlertOptions { Title = "Are you sure?", Text = "You won't be able to revert this!", Icon = SweetAlertIcon.Warning, ConfirmButtonText = "Yes", ShowCancelButton = true, ShowConfirmButton = true }); if (result.IsConfirmed) { await _modelProvider.DeleteO(entry); await Reload(); await Alerts.FireAsync(new SweetAlertOptions { Title = "Deleted!", Icon = SweetAlertIcon.Success, Timer = 1500, ShowConfirmButton = false }); } } private string GenerateRedirectString() { return "/administration/login?redirect=" + _pageData?.Url; } }