@using Groceries.Data @layout Layout @inject AppDbContext DbContext @inject NavigationManager Navigation @inject IHttpContextAccessor HttpContextAccessor Groceries – Transactions

Transactions

New transaction
@* *@ @foreach (var transaction in transactions) { @**@ }
Date Store Items Amount
@transaction.Store @transaction.TotalItems @transaction.TotalAmount.ToString("c")View
@code { [SupplyParameterFromQuery] public int? Page { get; set; } [SupplyParameterFromQuery(Name = "sort")] public string? SortColumnName { get; set; } [SupplyParameterFromQuery(Name = "dir")] public string? SortDirection { get; set; } private record TransactionModel(Guid Id, DateTime CreatedAt, string Store, decimal TotalAmount, int TotalItems); private ListPageModel transactions = ListPageModel.Empty(); protected override async Task OnParametersSetAsync() { var transactionsQuery = DbContext.Transactions .Join( DbContext.TransactionTotals, transaction => transaction.Id, transactionTotal => transactionTotal.TransactionId, (transaction, transactionTotal) => new { transaction.Id, transaction.CreatedAt, Store = string.Concat(transaction.Store!.Retailer!.Name, " ", transaction.Store.Name), TotalAmount = transactionTotal.Total, TotalItems = transaction.Items.Sum(item => item.Quantity), }); transactionsQuery = SortColumnName?.ToLowerInvariant() switch { "date" when SortDirection == "desc" => transactionsQuery.OrderByDescending(transaction => transaction.CreatedAt), "amount" when SortDirection == "desc" => transactionsQuery.OrderByDescending(transaction => transaction.TotalAmount), "items" when SortDirection == "desc" => transactionsQuery.OrderByDescending(transaction => transaction.TotalItems), "date" => transactionsQuery.OrderBy(transaction => transaction.CreatedAt), "amount" => transactionsQuery.OrderBy(transaction => transaction.TotalAmount), "items" => transactionsQuery.OrderBy(transaction => transaction.TotalItems), _ => transactionsQuery.OrderByDescending(transaction => transaction.CreatedAt), }; transactions = await transactionsQuery .Select(transaction => new TransactionModel( transaction.Id, transaction.CreatedAt, transaction.Store, transaction.TotalAmount, transaction.TotalItems)) .ToListPageModelAsync(Page.GetValueOrDefault(), cancellationToken: HttpContextAccessor.HttpContext!.RequestAborted); if (transactions.Page != Page) { Navigation.NavigateTo(Navigation.GetUriWithQueryParameter("page", transactions.Page)); } } private string GetColumnHeaderUri(string name) { var nextSortDirecton = name == SortColumnName ? SortDirection switch { null or "" => "asc", "asc" => "desc", _ => null, } : "asc"; return Navigation.GetUriWithQueryParameters(new Dictionary { { "sort", nextSortDirecton != null ? name : null }, { "dir", nextSortDirecton }, { "page", 1 }, }); } private string? GetColumnSortDirection(string name) { return SortDirection switch { "asc" or "desc" when name == SortColumnName => SortDirection, _ => null, }; } }