@page "/stock/new" @page "/stock/{Id:int}" @inject StockItemService StockItemService @inject MaterialService MaterialService @inject SupplierService SupplierService @inject NavigationManager Navigation @using CutList.Core.Formatting @(IsNew ? "Add Stock Item" : "Edit Stock Item")

@(IsNew ? "Add Stock Item" : $"{stockItem.Material?.DisplayName} - {ArchUnits.FormatFromInches((double)stockItem.LengthInches)}")

@if (loading) {

Loading...

} else {
Stock Item Details
@if (IsNew) { } else { }
@if (!string.IsNullOrEmpty(errorMessage)) {
@errorMessage
}
@(IsNew ? "Cancel" : "Back to List")
@if (!IsNew) {
Supplier Offerings
@if (showOfferingForm) {
@(editingOffering == null ? "Add Offering" : "Edit Offering")
@if (!string.IsNullOrEmpty(offeringErrorMessage)) {
@offeringErrorMessage
}
} @if (offerings.Count == 0) {

No supplier offerings configured yet.

} else { @foreach (var offering in offerings) { }
Supplier Part # Price Actions
@offering.Supplier.Name @(offering.PartNumber ?? "-") @(offering.Price.HasValue ? offering.Price.Value.ToString("C") : "-")
}
}
} @code { [Parameter] public int? Id { get; set; } private StockItem stockItem = new(); private List materials = new(); private List suppliers = new(); private List offerings = new(); private bool loading = true; private bool saving; private bool savingOffering; private string? errorMessage; private string? offeringErrorMessage; private bool showOfferingForm; private SupplierOffering newOffering = new(); private SupplierOffering? editingOffering; private ConfirmDialog deleteOfferingDialog = null!; private SupplierOffering? offeringToDelete; private string deleteOfferingMessage = ""; private bool IsNew => !Id.HasValue; protected override async Task OnInitializedAsync() { materials = await MaterialService.GetAllAsync(); suppliers = await SupplierService.GetAllAsync(); if (Id.HasValue) { var existing = await StockItemService.GetByIdAsync(Id.Value); if (existing == null) { Navigation.NavigateTo("stock"); return; } stockItem = existing; offerings = existing.SupplierOfferings.Where(o => o.IsActive).ToList(); } loading = false; } private async Task SaveStockItemAsync() { errorMessage = null; saving = true; try { if (stockItem.MaterialId == 0) { errorMessage = "Please select a material"; return; } if (stockItem.LengthInches <= 0) { errorMessage = "Length must be greater than zero"; return; } var exists = await StockItemService.ExistsAsync( stockItem.MaterialId, stockItem.LengthInches, IsNew ? null : stockItem.Id); if (exists) { errorMessage = "A stock item with this material and length already exists"; return; } if (IsNew) { var created = await StockItemService.CreateAsync(stockItem); Navigation.NavigateTo($"stock/{created.Id}"); } else { await StockItemService.UpdateAsync(stockItem); } } finally { saving = false; } } private void ShowAddOfferingForm() { editingOffering = null; newOffering = new SupplierOffering { StockItemId = Id!.Value }; showOfferingForm = true; offeringErrorMessage = null; } private void EditOffering(SupplierOffering offering) { editingOffering = offering; newOffering = new SupplierOffering { Id = offering.Id, StockItemId = offering.StockItemId, SupplierId = offering.SupplierId, PartNumber = offering.PartNumber, SupplierDescription = offering.SupplierDescription, Price = offering.Price, Notes = offering.Notes }; showOfferingForm = true; offeringErrorMessage = null; } private void CancelOfferingForm() { showOfferingForm = false; editingOffering = null; offeringErrorMessage = null; } private async Task SaveOfferingAsync() { offeringErrorMessage = null; savingOffering = true; try { if (newOffering.SupplierId == 0) { offeringErrorMessage = "Please select a supplier"; return; } var exists = await SupplierService.OfferingExistsAsync( newOffering.SupplierId, newOffering.StockItemId, editingOffering?.Id); if (exists) { offeringErrorMessage = "This supplier already has an offering for this stock item"; return; } if (editingOffering == null) { await SupplierService.AddOfferingAsync(newOffering); } else { await SupplierService.UpdateOfferingAsync(newOffering); } // Refresh the stock item to get updated offerings var updated = await StockItemService.GetByIdAsync(Id!.Value); if (updated != null) { stockItem = updated; offerings = updated.SupplierOfferings.Where(o => o.IsActive).ToList(); } showOfferingForm = false; editingOffering = null; } finally { savingOffering = false; } } private void ConfirmDeleteOffering(SupplierOffering offering) { offeringToDelete = offering; deleteOfferingMessage = $"Are you sure you want to delete the offering from {offering.Supplier.Name}?"; deleteOfferingDialog.Show(); } private async Task DeleteOfferingConfirmed() { if (offeringToDelete != null) { await SupplierService.DeleteOfferingAsync(offeringToDelete.Id); // Refresh the stock item to get updated offerings var updated = await StockItemService.GetByIdAsync(Id!.Value); if (updated != null) { stockItem = updated; offerings = updated.SupplierOfferings.Where(o => o.IsActive).ToList(); } } } }