Here is the Blazor Page for the transaction I mention, retrieving correct on OnInitializedAsync
method but it is not working on async Task PassiveDetail(OrderDetail orderDetail)
why it is not ?
@page "/orders"
@using IMS.CoreBusiness
@using IMS.Plugins.EFCore.Migrations
@using IMS.UseCases.Interfaces.Order
@using IMS.UseCases.Interfaces.OrderDetail
@using System.Globalization
@using System.Security.Claims
@using IMS.UseCases.Interfaces.Customer
@using IMS.UseCases.Interfaces.Vendor
@using Vendor = IMS.CoreBusiness.Vendor
@using OfficeOpenXml
@using OfficeOpenXml.Style
@inject NavigationManager NavigationManager
@inject IViewAllOrdersUseCase ViewAllOrdersUseCase
@inject IAddOrderUseCase AddOrderUseCase
@inject IEditOrderUseCase EditOrderUseCase
@inject IAddOrderDetailUseCase AddOrderDetailUseCase
@inject IEditOrderDetailUseCase EditOrderDetailUseCase
@inject IViewAllVendorsUseCase ViewAllVendorsUseCase
@inject IViewOrdersByStatusUseCase ViewOrdersByStatusUseCase
@inject ICancelOrderUseCase CancelOrderUseCase
@inject ICancelOrderDetailUseCase CancelOrderDetailUseCase
@inject IViewAllCustomersUseCase ViewAllCustomersUseCase
@inject IPassiveOrderDetailUseCase PassiveOrderDetailUseCase
@inject IJSRuntime JS
@inject AuthenticationStateProvider _authenticationStateProvider
<style>
#wrapper { overflow: auto; }
#c1 { float: right; }
#c2 { float: right; }
#c3 { float: right; }
</style>
@if (DisplayAlert) {
<div class="alert alert-success alert-dismissible d-flex align-items-center fade show">
<i class="bi-check-circle-fill"></i>
<strong class="mx-2">Success!</strong> Your message has been sent successfully.
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
<h1>Orders</h1>
<RadzenButton Icon="add_circle_outline" style="margin-bottom: 10px" Text="Add New Order" Click="@InsertRow" Disabled="@(_orderToInsert != null)"/><RadzenButton Text="Export XLS" Icon="grid_on" Click="@(args => ExportExcel())" Class="mb-4 mr-2" />
<RadzenDataGrid @ref="_grid" AllowFiltering="true" AllowPaging="true" PageSize="7" AllowSorting="true" RowClick="RowClick" ExpandMode="DataGridExpandMode.Single"
Data="@_orders" TItem="Order" EditMode="DataGridEditMode.Single" RowUpdate="@OnUpdateRow" RowCreate="@OnCreateRow" @bind-Value="@SelectedOrders"
ShowExpandColumn="false" ShowPagingSummary="true" AllowColumnResize="true" >
<Template Context="order">
<RadzenCard Style="margin-bottom: 20px">
Customer:
<b>@order?.Customer?.Name</b>
</RadzenCard>
<RadzenTabs>
<Tabs>
<RadzenTabsItem Text="Order Details">
<div id="wrapper">
<RadzenButton Icon="add_circle_outline" style="margin-bottom: 10px" Text="Add Order Detail" Click="@(() => InsertDetailRow(order.Id))" Disabled="@(_detailToInsert != null)"/>
<RadzenButton Text="Export XLS" Icon="grid_on" Click="@(args => ExportDetailExcel())" Class="mb-4 mr-2" />
<RadzenButton Icon="close" id="c3" style="margin-bottom: 10px;" ButtonStyle="ButtonStyle.Light" Click="@(args => CancelEdits(SelectedOrders.FirstOrDefault()?.OrderDetails))" />
<RadzenButton Icon="save" style="margin-bottom: 10px; margin-right: 10px" Text="Save Details" id="c2" Click="@(args => SaveRowDetails(SelectedOrders.FirstOrDefault()?.OrderDetails))"/>
<RadzenButton Icon="border_color" style="margin-bottom: 10px; margin-right: 10px" Text="Edit Details" id="c1" Click="@(args => EditRowDetails(SelectedOrders.FirstOrDefault()?.OrderDetails))" @onclick:stopPropagation="true"/>
</div>
<RadzenDataGrid @ref="_gridDetail" AllowFiltering="true" AllowPaging="true" PageSize="5" AllowSorting="true" Data="@order.OrderDetails"
TItem="OrderDetail" EditMode="DataGridEditMode.Multiple" RowUpdate="@OnUpdateRowDetail" RowCreate="@OnCreateRowDetail" AllowColumnResize="true"
AllowColumnPicking="true" ShowPagingSummary="true" ColumnWidth="150px" >
<Columns>
<RadzenDataGridColumn TItem="OrderDetail" Property="Id" Title="Product Number" Frozen="true" OrderIndex="1"/>
<RadzenDataGridColumn TItem="OrderDetail" Property="ProductCode" Title="Code" Frozen="true" OrderIndex="2">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.ProductCode" Style="width: 100%; display: block" Name="ProductCode"/>
<RadzenRequiredValidator Text="Product Code is required" Component="ProductCode" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="ProductName" Title="Name" Frozen="true" OrderIndex="3">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.ProductName" Style="width: 100%; display: block" Name="ProductName"/>
<RadzenRequiredValidator Text="Product Name is required" Component="ProductName" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Vendor.Name" Title="Vendor" Width="200px" OrderIndex="4">
<EditTemplate Context="orderDetail">
<RadzenDropDownDataGrid TValue="int" AllowFiltering="true" AllowClear="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" FilterOperator="StringFilterOperator.Contains"
Data=@_vendors Count="5" TextProperty="Name" ValueProperty="Id"
Class="w-100" @bind-Value="orderDetail.VendorId"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Currency" Title="Currency" OrderIndex="5">
<EditTemplate Context="orderDetail">
<RadzenDropDown AllowClear="true" TValue="string" Class="w-100" Data=@currency @bind-Value="orderDetail.Currency" Name="Currency" />
<RadzenRequiredValidator Text="Currency is required" Component="Currency" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Quantity" Title="Quantity" OrderIndex="6">
<EditTemplate Context="orderDetail">
<RadzenNumeric TValue="int" Min="1" @bind-Value="orderDetail.Quantity" Style="width: 100%; display: block" Name="Quantity"/>
<RadzenRequiredValidator Text="Quantity is required" Component="Quantity" Popup="true" Style="position: absolute"/>
</EditTemplate>
<FooterTemplate>
<b>@string.Format(new CultureInfo("tr-TR"), "{0:G}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.Quantity))</b>
</FooterTemplate>
</RadzenDataGridColumn>
@*<AuthorizeView Roles="Administrators"> *@
<RadzenDataGridColumn TItem="OrderDetail" Property="BuyUnitPrice" Title="Buy Unit Price" OrderIndex="7">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C2}", detail.BuyUnitPrice)
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C2}", detail.BuyUnitPrice)
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C2}", detail.BuyUnitPrice)
break;
}
</Template>
<EditTemplate Context="orderDetail">
<RadzenNumeric TValue="double" Min="1" @bind-Value="orderDetail.BuyUnitPrice" Style="width: 100%; display: block" Name="BuyUnitPrice"/>
<RadzenRequiredValidator Text="BuyUnitPrice is required" Component="BuyUnitPrice" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
@* </AuthorizeView>*@
<RadzenDataGridColumn TItem="OrderDetail" Property="TotalBuyPrice" Title="Total Buy" OrderIndex="8">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C2}", detail.BuyUnitPrice * detail.Quantity)
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C2}", detail.BuyUnitPrice * detail.Quantity)
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C2}", detail.BuyUnitPrice * detail.Quantity)
break;
}
</Template>
<FooterTemplate>
@if(SelectedOrders?.FirstOrDefault()?.OrderDetails.GroupBy(x => x.Currency).Count() == 1)
{
@switch (SelectedOrders?.FirstOrDefault()?.OrderDetails.FirstOrDefault().Currency)
{
case "Dolar":
<b>@string.Format(new CultureInfo("tr-TR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalBuyPrice))</b>
break;
case "Euro":
<b>@string.Format(new CultureInfo("en-FR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalBuyPrice))</b>
break;
default:
<b>@string.Format(new CultureInfo("tr-TR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalBuyPrice))</b>
break;
}
}
</FooterTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="CostRatio" Title="Cost Ratio" OrderIndex="9">
<Template Context="detail">
@string.Format(new CultureInfo("tr-TR"), "{0:D2}","%" + detail.CostRatio/100)
</Template>
<EditTemplate Context="orderDetail">
<RadzenNumeric TValue="double" Min="1" @bind-Value="orderDetail.CostRatio" Style="width: 100%; display: block" Name="CostRatio"/>
<RadzenRequiredValidator Text="Cost Ratio is required" Component="CostRatio" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="UnitCost" Title="Unit Cost" OrderIndex="10">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C}", (detail.BuyUnitPrice * (detail.CostRatio / 100)) + detail.BuyUnitPrice)
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C}", (detail.BuyUnitPrice * (detail.CostRatio / 100)) + detail.BuyUnitPrice)
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C}", (detail.BuyUnitPrice * (detail.CostRatio / 100)) + detail.BuyUnitPrice)
break;
}
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="TotalUnitCost" Title="Total Unit Cost" OrderIndex="11">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C}", (detail.Quantity * detail.UnitCost))
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C}", (detail.Quantity * detail.UnitCost))
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C}", (detail.Quantity * detail.UnitCost))
break;
}
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="SellUnitPrice" Title="Sell Unit Price" OrderIndex="12">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C2}", detail.SellUnitPrice)
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C2}", detail.SellUnitPrice)
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C2}", detail.SellUnitPrice)
break;
}
</Template>
<EditTemplate Context="orderDetail">
<RadzenNumeric TValue="double" Min="1" @bind-Value="orderDetail.SellUnitPrice" Style="width: 100%; display: block" Name="SellUnitPrice"/>
<RadzenRequiredValidator Text="Sell Unit price is required" Component="SellUnitPrice" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="TotalSellPrice" Title="Total Sell" OrderIndex="13">
<Template Context="detail">
@switch (detail.Currency)
{
case "Dolar":
@string.Format(new CultureInfo("en-US"), "{0:C2}", detail.SellUnitPrice * detail.Quantity)
break;
case "Euro":
@string.Format(new CultureInfo("en-FR"), "{0:C2}", detail.SellUnitPrice * detail.Quantity)
break;
default:
@string.Format(new CultureInfo("tr-TR"), "{0:C2}", detail.SellUnitPrice * detail.Quantity)
break;
}
</Template>
<FooterTemplate>
@if(SelectedOrders?.FirstOrDefault()?.OrderDetails.GroupBy(x => x.Currency).Count() == 1)
{
@switch (SelectedOrders?.FirstOrDefault()?.OrderDetails.FirstOrDefault().Currency)
{
case "Dolar":
<b>@string.Format(new CultureInfo("tr-TR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalSellPrice))</b>
break;
case "Euro":
<b>@string.Format(new CultureInfo("en-FR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalSellPrice))</b>
break;
default:
<b>@string.Format(new CultureInfo("tr-TR"), "{0:C2}", SelectedOrders?.FirstOrDefault()?.OrderDetails.Sum(o => o.TotalSellPrice))</b>
break;
}
}
</FooterTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="ShippingNumber" Title="Shipment" OrderIndex="14">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.ShippingNumber" Style="width: 100%; display: block" Name="ShippingNumber"/>
<RadzenRequiredValidator Text="Shipping Number is required" Component="ShippingNumber" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="TrackingNumber" Title="Tracking Number" OrderIndex="15">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.TrackingNumber" Style="width: 100%; display: block" Name="TrackingNumber"/>
<RadzenRequiredValidator Text="Tracking Number is required" Component="TrackingNumber" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Description" Title="Description" OrderIndex="16">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.Description" Style="width: 100%; display: block" Name="Description"/>
<RadzenRequiredValidator Text="Description is required" Component="Description" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Status" Title="Status" OrderIndex="17">
<EditTemplate Context="orderDetail">
<RadzenDropDown AllowClear="true" TValue="string" Class="w-100" Data=@detailStatusList @bind-Value="orderDetail.Status" Name="Status" Change=@(args => OnChange(args, order.Id)) />
<RadzenRequiredValidator Text="Status is required" Component="Status" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="CustomerStockCode" Title="Customer Stock" OrderIndex="18">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.CustomerStockCode" Style="width: 100%; display: block" Name="CustomerStockCode"/>
<RadzenRequiredValidator Text="Customer Stock Code is required" Component="CustomerStockCode" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="CustomerOrderNumber" Title="Customer Order" OrderIndex="19">
<EditTemplate Context="orderDetail">
<RadzenTextBox @bind-Value="orderDetail.CustomerOrderNumber" Style="width: 100%; display: block" Name="CustomerOrderNumber"/>
<RadzenRequiredValidator Text="Customer Order Number is required" Component="CustomerOrderNumber" Popup="true" Style="position: absolute" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="OrderId" Title="Order Id" OrderIndex="20"/>
<RadzenDataGridColumn TItem="OrderDetail" Context="orderDetail" Filterable="false" Sortable="false" TextAlign="TextAlign.Center" Width="200px" OrderIndex="20">
<Template Context="detail">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => EditRowDetail(detail))" @onclick:stopPropagation="true">
</RadzenButton>
</Template>
<EditTemplate Context="detail">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => SaveRowDetail(detail))">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Class="m-1" Click="@(args => CancelEditDetail(detail))">
</RadzenButton>
<RadzenButton Icon="delete" ButtonStyle="ButtonStyle.Danger" Class="m-1" Click="@(args => PassiveDetail(detail))">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</RadzenTabsItem>
</Tabs>
</RadzenTabs>
</Template>
<Columns>
<RadzenDataGridColumn TItem="Order" Property="Id" Title="Order ID" Width="120px"/>
<RadzenDataGridColumn TItem="Order" Property="Customer.Name" Title="Customer" Width="200px">
<EditTemplate Context="order">
<RadzenDropDownDataGrid TValue="int" AllowFiltering="true" AllowClear="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" FilterOperator="StringFilterOperator.Contains"
Data=@_customers Count="5" TextProperty="Name" ValueProperty="Id"
Class="w-100" @bind-Value="order.CustomerId"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="Order" Property="OrderDateTime" Title="Order Date" Width="200px">
<Template Context="order">
@($"{order.OrderDateTime:dd/MM/yyyy}")
</Template>
<EditTemplate Context="order">
<RadzenDatePicker @bind-Value="order.OrderDateTime" DateFormat="dd/MM/yyyy HH:mm" Class="w-100"/>
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="Order" Property="Status" Title="Status" Width="100px">
@*<EditTemplate Context="order">
<RadzenDropDown AllowClear="true" TValue="string" Class="w-150" Data=@orderStatusList Name="Status" @bind-Value="order.Status"/>
<RadzenRequiredValidator Text="Status is required" Component="Status" Popup="true" Style="position: absolute"/>
</EditTemplate>*@
</RadzenDataGridColumn>
@*<RadzenDataGridColumn TItem="Order" Property="DoneBy" Title="Employee">
<EditTemplate Context="order">
<RadzenTextBox @bind-Value="order.DoneBy" Style="width: 100%; display: block" Name="DoneBy"/>
<RadzenRequiredValidator Text="DoneBy is required" Component="DoneBy" Popup="true" Style="position: absolute"/>
</EditTemplate>
</RadzenDataGridColumn>*@
<RadzenDataGridColumn TItem="Order" Context="order" Filterable="false" Sortable="false" TextAlign="TextAlign.Center" Width="120px">
<Template Context="order">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => EditRow(order))" @onclick:stopPropagation="true">
</RadzenButton>
</Template>
<EditTemplate Context="order">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => SaveRow(order))">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Class="m-1" Click="@(args => CancelEdit(order))">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
@code {
[Parameter]
public bool DisplayAlert { get; set; } = false;
[Parameter]
public string? SelectedStatus { get; set; }
// Options to display in the roles dropdown when editing a user
readonly List<string> detailStatusList = new() { "At customs", "Being supplied", "Cancelled", "Completed", "Getting ready", "In warehouse", "Shipped" };
readonly List<string> orderStatusList = new() { "Continues", "Cancelled", "Completed" };
readonly List<string> currency = new() { "TL", "Dolar", "Euro"};
IList<Order?> SelectedOrders { get; set; }
IEnumerable<Order?> _orders = new List<Order?>();
IEnumerable<Vendor?> _vendors;
IEnumerable<Customer?> _customers;
IQueryable<Order?> filter;
IQueryable<OrderDetail?> filterDetail;
RadzenDataGrid<Order?> _grid;
RadzenDataGrid<OrderDetail> _gridDetail;
Order? _orderToInsert;
OrderDetail? _detailToInsert;
ClaimsPrincipal user;
protected override async Task OnInitializedAsync()
{
user = (await _authenticationStateProvider.GetAuthenticationStateAsync()).User;
//userName = user.Identity.Name;
if (!user.Identity.IsAuthenticated)
{
NavigationManager.NavigateTo("/Identity/Account/Login", false);
}
_orders = await ViewAllOrdersUseCase.ExecuteAsync(user);
SelectedOrders = new List<Order?> { _orders.FirstOrDefault() };
_vendors = await ViewAllVendorsUseCase.ExecuteAsync();
_customers = await ViewAllCustomersUseCase.ExecuteAsync();
}
private void OnChange(object args, int id)
{
if(args != null){
SelectedStatus = args.ToString();
}
}
private async Task RowClick(DataGridRowMouseEventArgs<Order> mouseClick) {
await _grid!.ExpandRow(mouseClick.Data);
}
private async Task InsertRow()
{
_orderToInsert = new Order
{
OrderDateTime = DateTime.Now,
OrderDetails = new List<OrderDetail>()
};
await _grid.InsertRow(_orderToInsert);
}
private async Task InsertDetailRow(int id)
{
_detailToInsert = new OrderDetail
{
OrderId = id
};
await _gridDetail.InsertRow(_detailToInsert);
}
private async Task OnCreateRow(Order? order)
{
if (order != null)
{
await AddOrd