Fix error loading Add/Edit Transaction Item page
All checks were successful
Docker Image CI / build (push) Successful in 3m8s

This commit is contained in:
2024-10-12 16:00:32 +01:00
parent 47d13ba922
commit 2c0f6f1cab
17 changed files with 99 additions and 41 deletions

View File

@ -3,7 +3,7 @@
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; Edit Transaction Item</PageTitle>
@ -19,7 +19,7 @@
<div class="row">
<button class="button button--primary" type="submit" form="editTransactionItem">Update</button>
<a class="button" href="/transaction/new/items">Cancel</a>
<a class="button" href="/transactions/new/items">Cancel</a>
<span class="row__fill"></span>
<button class="button button--danger" type="submit" form="deleteTransactionItem">Remove</button>
</div>
@ -35,7 +35,8 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();

View File

@ -3,7 +3,7 @@
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; Edit Transaction Promotion</PageTitle>
@ -35,7 +35,8 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();

View File

@ -3,7 +3,7 @@
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; New Transaction Item</PageTitle>
@ -16,7 +16,7 @@
<TransactionItemForm TransactionItem="TransactionItem">
<div class="row">
<button class="button button--primary" type="submit">Add</button>
<a class="button" href="/transaction/new/items">Cancel</a>
<a class="button" href="/transactions/new/items">Cancel</a>
</div>
</TransactionItemForm>
@ -31,7 +31,8 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();

View File

@ -2,7 +2,8 @@
@using Microsoft.EntityFrameworkCore
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; New Transaction</PageTitle>
@ -78,13 +79,15 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();
var itemIds = Transaction.Items.Select(item => item.ItemId);
itemNames = await DbContext.Items
itemNames = await dbContext.Items
.Where(item => itemIds.Contains(item.Id))
.ToDictionaryAsync(item => item.Id, item => string.Concat(item.Brand, " ", item.Name));
}

View File

@ -3,7 +3,7 @@
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; New Transaction</PageTitle>
@ -41,7 +41,8 @@
protected override async Task OnInitializedAsync()
{
stores = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
stores = await dbContext.Stores
.OrderBy(store => store.Retailer!.Name)
.ThenBy(store => store.Name)
.Select(store => new StoreModel(store.Id, string.Concat(store.Retailer!.Name, " ", store.Name)))

View File

@ -3,7 +3,7 @@
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; New Transaction Promotion</PageTitle>
@ -28,7 +28,8 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();

View File

@ -2,7 +2,8 @@
@using Microsoft.EntityFrameworkCore
@layout Layout
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; New Transaction</PageTitle>
@ -64,7 +65,8 @@
protected override async Task OnParametersSetAsync()
{
store = await DbContext.Stores
using var dbContext = DbContextFactory.CreateDbContext();
store = await dbContext.Stores
.Where(store => store.Id == Transaction.StoreId)
.Select(store => string.Concat(store.Retailer!.Name, " ", store.Name))
.SingleAsync();

View File

@ -1,7 +1,7 @@
@using Groceries.Data
@using Microsoft.EntityFrameworkCore
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<form method="post" @attributes="AdditionalAttributes">
@* Ensure form action/method are used for implicit submission instead of barcode button *@
@ -93,11 +93,12 @@
{
barcode = TransactionItem.Item?.Barcodes.FirstOrDefault();
items = await DbContext.Items
using var dbContext = DbContextFactory.CreateDbContext();
items = await dbContext.Items
.OrderBy(item => item.Brand)
.ThenBy(item => item.Name)
.GroupJoin(
DbContext.ItemPurchases.Where(purchase => purchase.IsLastPurchase),
dbContext.ItemPurchases.Where(purchase => purchase.IsLastPurchase),
item => item.Id,
lastPurchase => lastPurchase.ItemId,
(item, purchases) => new { item, purchases })

View File

@ -1,7 +1,7 @@
@using Groceries.Data
@using Microsoft.EntityFrameworkCore
@inject AppDbContext DbContext
@inject IDbContextFactory<AppDbContext> DbContextFactory
<form method="post" @attributes="AdditionalAttributes">
<div class="form-field">
@ -56,8 +56,9 @@
{
selectedItemIds = Promotion?.Items.Select(item => item.Id).ToArray() ?? [];
using var dbContext = DbContextFactory.CreateDbContext();
var itemIds = Transaction.Items.Select(item => item.ItemId);
itemNames = await DbContext.Items
itemNames = await dbContext.Items
.Where(item => itemIds.Contains(item.Id))
.ToDictionaryAsync(item => item.Id, item => string.Concat(item.Brand, " ", item.Name));
}

View File

@ -9,11 +9,11 @@ using System.Text.Json;
[Route("/transactions")]
public class TransactionsController : Controller
{
private readonly AppDbContext dbContext;
private readonly IDbContextFactory<AppDbContext> dbContextFactory;
public TransactionsController(AppDbContext dbContext)
public TransactionsController(IDbContextFactory<AppDbContext> dbContextFactory)
{
this.dbContext = dbContext;
this.dbContextFactory = dbContextFactory;
}
[HttpGet]
@ -70,6 +70,8 @@ public class TransactionsController : Controller
Item? item = null;
if (barcodeData != null && barcodeFormat != null)
{
using var dbContext = dbContextFactory.CreateDbContext();
item = await dbContext.Items
.Where(item => item.Barcodes.Any(barcode => barcode.BarcodeData == barcodeData))
.OrderByDescending(item => item.UpdatedAt)
@ -105,6 +107,8 @@ public class TransactionsController : Controller
return Results.LocalRedirect("/transactions/new");
}
using var dbContext = dbContextFactory.CreateDbContext();
var itemId = await dbContext.Items
.Where(item => EF.Functions.ILike(item.Brand, brand) && EF.Functions.ILike(item.Name, name))
.Select(item => item.Id)
@ -171,6 +175,8 @@ public class TransactionsController : Controller
return Results.LocalRedirect("/transactions/new/items");
}
using var dbContext = dbContextFactory.CreateDbContext();
var itemId = await dbContext.Items
.Where(item => EF.Functions.ILike(item.Brand, brand) && EF.Functions.ILike(item.Name, name))
.Select(item => item.Id)
@ -235,6 +241,8 @@ public class TransactionsController : Controller
return Results.LocalRedirect("/transactions/new");
}
using var dbContext = dbContextFactory.CreateDbContext();
// Work around EF trying to insert items by explicitly tracking them as unchanged
dbContext.Items.AttachRange(
transaction.Items

View File

@ -1,7 +1,10 @@
@using Groceries.Data
@using Microsoft.EntityFrameworkCore
@layout Layout
@inject AppDbContext DbContext
@implements IDisposable
@inject IDbContextFactory<AppDbContext> DbContextFactory
<PageTitle>Groceries &ndash; Transactions</PageTitle>
@ -35,14 +38,16 @@
public int TotalItems { get; init; }
}
private AppDbContext? dbContext;
private IQueryable<TransactionModel> transactions = null!;
private PaginationState pagination = new();
protected override void OnParametersSet()
{
transactions = DbContext.Transactions
dbContext ??= DbContextFactory.CreateDbContext();
transactions = dbContext.Transactions
.Join(
DbContext.TransactionTotals,
dbContext.TransactionTotals,
transaction => transaction.Id,
transactionTotal => transactionTotal.TransactionId,
(transaction, transactionTotal) => new TransactionModel
@ -55,4 +60,9 @@
})
.OrderByDescending(transaction => transaction.CreatedAt);
}
public void Dispose()
{
dbContext?.Dispose();
}
}