Hi,
I am using data filter to filter a data grid.When I select Vendor name from data filter drop down, the data grid successfully filters. But after I clear the Vendor name from the data filter drop down, the data grid is not displaying the initial data, keep displaying the filtered data instead.
How can I make it display the initial data after clearing the data filter?
Working sample:
@page "/Stock"
@using System.Globalization
@using System.Security.Claims
@using AutoMapper
@using IMS.CoreBusiness
@using IMS.CoreBusiness.DTO
@using IMS.UseCases.Customers
@using IMS.UseCases.Interfaces.Stocks
@using IMS.UseCases.Interfaces.Vendor
@using IMS.UseCases.Orders
@using IMS.UseCases.Stocks
@using IMS.UseCases.Vendors
@using IMS.UseCases.WarehouseAddress
@using OfficeOpenXml
@using OfficeOpenXml.Style
@using VendorDto = IMS.CoreBusiness.DTO.VendorDto
@inject IJSRuntime JS
@inject AuthenticationStateProvider _authenticationStateProvider
@inject ILogger<Stock> _logger
@inject IMapper Mapper
@inject NavigationManager NavigationManager
@inject IViewAllVendorsUseCase ViewAllVendorsUseCase
@inject DialogService DialogService
@inject IAddStockUseCase AddStockUseCase
@inject IUpdateStocksUseCase UpdateStocksUseCase
@inject ICancelStockUseCase CancelStockUseCase
@inject IDeleteStockUseCase DeleteStockUseCase
@inject IViewStocksUseCase ViewStocksUseCase
<PageTitle>Stock</PageTitle>
<h1>Stocks</h1>
<RadzenCard class="mb-3">
<RadzenDataFilter @ref="dataFilter" Auto="true" Data="@stockDto" TItem="StockDto" ViewChanged="@(view => filteredStocks = view.ToList())"
FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive">
<Properties>
<RadzenDataFilterProperty TItem="StockDto" Property="ProductCode" Title="Product Code"/>
<RadzenDataFilterProperty TItem="StockDto" Property="Vendor.Name" Title="Vendor" FilterValue="@selectedVendor"
Type="typeof(string)" FilterOperator="FilterOperator.Equals">
<FilterTemplate>
<RadzenDropDown @bind-Value="@selectedVendor" Style="width: 100%;" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" AllowFiltering="true" Placeholder="Select..."
Change="@OnSelectedVendorChange" Data="@(_vendorsDto.Select(v => v.Name).ToList())" Multiple="false" AllowClear="true"/>
</FilterTemplate>
</RadzenDataFilterProperty>
<RadzenDataFilterProperty TItem="StockDto" Property="Quantity" Title="Quantity" />
<RadzenDataFilterProperty TItem="StockDto" Property="UnitPrice" Title="Unit Price" />
</Properties>
</RadzenDataFilter>
</RadzenCard>
<RadzenButton Icon="add_circle_outline" style="margin-bottom: 10px" Text="Add New Stock" Click="@InsertRow" Disabled="@(_stockToInsert != null)" Size="ButtonSize.Small" />
<RadzenButton Text="Export XLS" Icon="grid_on" Click="@(args => Export())" ButtonStyle="ButtonStyle.Secondary" Size="ButtonSize.Small" Class="mb-1" />
<RadzenDataGrid @ref="_grid" AllowPaging="true" AllowSorting="true" Data="@(filteredStocks ?? stockDto)" TItem="StockDto" ShowPagingSummary="true" AllowColumnResize="true"
Style="width: calc(100vw - 100px);" PageSize="20" GridLines="DataGridGridLines.Both" EditMode="DataGridEditMode.Single" RowUpdate="@OnUpdateRow" RowCreate="@OnCreateRow">
<Columns>
<RadzenDataGridColumn TItem="StockDto" Property="ProductCode" Title="Product Code" Width="150px" OrderIndex="1">
<EditTemplate Context="edit">
<RadzenTextBox @bind-Value="edit.ProductCode" Style="width: 100%; display: block" Name="ProductCode" />
<RadzenRequiredValidator Text="Product Code is Required!" Component="ProductCode" Popup="true" Style="position: absolute; z-index: 9999;" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="StockDto" Property="Vendor.Name" Title="Vendor" Width="220px" OrderIndex="2">
<EditTemplate Context="edit">
<RadzenDropDownDataGrid TValue="int" AllowFiltering="true" AllowClear="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" FilterOperator="StringFilterOperator.Contains"
Data=@_vendorsDto Count="5" TextProperty="Name" ValueProperty="Id"
Class="w-100" @bind-Value="edit.VendorId" Name="vendor" id="vendor" />
<RadzenNumericRangeValidator Component="vendor" Min="1" Text="Vendor is Required!" Popup=true Style="position: absolute; z-index: 9999;" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="StockDto" Property="Quantity" Title="Quantity" Width="80px" OrderIndex="3">
<EditTemplate Context="edit">
<RadzenNumeric TValue="int" Min="1" @bind-Value="edit.Quantity" Style="width: 100%; display: block" Name="Quantity"/>
<RadzenNumericRangeValidator Component="Quantity" Min="1" Text="Quantity must be greater than zero!" Popup=true Style="position: absolute; z-index: 9999;" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="StockDto" Property="UnitPrice" Title="Unit Price" Width="80px" OrderIndex="4">
<EditTemplate Context="edit">
<RadzenNumeric TValue="double" Min="0" @bind-Value="edit.UnitPrice" Style="width: 100%; display: block" Name="UnitPrice"/>
<RadzenNumericRangeValidator Component="UnitPrice" Min="1" Text="Price must be greater than zero!" Popup=true Style="position: absolute; z-index: 9999;" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="StockDto" Context="stock" Filterable="false" Sortable="false" TextAlign="TextAlign.Center" Width="55px">
<Template Context="stock">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => EditRow(stock))" @onclick:stopPropagation="true" Size="ButtonSize.Small">
</RadzenButton>
</Template>
<EditTemplate Context="stock">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => SaveRow(stock))" @onclick:stopPropagation="true" Size="ButtonSize.Small">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Class="m-1" Click="@(args => CancelEdit(stock))" Size="ButtonSize.Small">
</RadzenButton>
<RadzenButton Icon="delete" ButtonStyle="ButtonStyle.Danger" Class="m-1" Click="@(args => ShowInlineDialogStock(stock))" Size="ButtonSize.Small">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
@code {
IEnumerable<StockDto> stockDto;
RadzenDataGrid<StockDto> _grid;
StockDto? _stockToInsert;
IQueryable<StockDto?>? filter;
IQueryable<IMS.CoreBusiness.Stock?> stock;
IQueryable<StockDto?> stocksDto;
bool busyStockExcelExport;
IEnumerable<VendorDto?> _vendorsDto;
IEnumerable<Vendor?> _vendors;
IMS.CoreBusiness.Stock stockMap;
RadzenDataFilter<StockDto> dataFilter;
IEnumerable<StockDto> filteredStocks;
string selectedVendor;
void OnSelectedVendorChange(object value)
{
if (selectedVendor != null && !selectedVendor.Any())
{
selectedVendor = null;
}
}
protected override async Task OnInitializedAsync()
{
try
{
stock = ViewStocksUseCase.Execute();
stockDto = Mapper.ProjectTo<StockDto>(stock).ToList();
filteredStocks = stockDto.ToList();
_vendors = await ViewAllVendorsUseCase.ExecuteAsync();
_vendorsDto = Mapper.Map(_vendors, _vendorsDto);
await dataFilter.AddFilter(new CompositeFilterDescriptor()
{
Property = "ProductCode",
FilterOperator = FilterOperator.Contains
});
await dataFilter.AddFilter(new CompositeFilterDescriptor()
{
Property = "Vendor.Name",
FilterOperator = FilterOperator.Equals
});
await dataFilter.AddFilter(new CompositeFilterDescriptor()
{
Property = "Quantity",
FilterOperator = FilterOperator.Equals
});
await dataFilter.AddFilter(new CompositeFilterDescriptor()
{
Property = "UnitPrice",
FilterOperator = FilterOperator.Equals
});
}
catch (Exception e)
{
_logger.LogError(e.Message);
Console.WriteLine(e);
}
}
private async Task InsertRow()
{
_stockToInsert = new StockDto();
await _grid.InsertRow(_stockToInsert);
}
async Task EditRow(StockDto? stock)
{
await _grid.EditRow(stock);
}
async Task SaveRow(StockDto? stock)
{
await _grid.UpdateRow(stock);
if (stock.VendorId > 0)
{
if (stock == _stockToInsert)
{
_stockToInsert = null;
}
}
}
private async Task OnCreateRow(StockDto? stock)
{
if (stock != null)
{
stockMap = new CoreBusiness.Stock();
Mapper.Map(stock, stockMap);
var addedStock = await AddStockUseCase.ExecuteAsync(stockMap);
Mapper.Map(addedStock, stock);
await _grid.UpdateRow(stock);
}
}
private async Task OnUpdateRow(StockDto stock)
{
if (stock == _stockToInsert)
{
_stockToInsert = null;
}
if (stock != null)
{
stockMap = new CoreBusiness.Stock();
Mapper.Map(stock, stockMap);
var updatedStock = await UpdateStocksUseCase.ExecuteAsync(stockMap);
Mapper.Map(updatedStock, stock);
await _grid.UpdateRow(stock);
}
}
private async Task Export()
{
busyStockExcelExport = true;
filter = _grid.View;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
var stream = new MemoryStream();
using (var package = new ExcelPackage(stream))
{
var workSheet = package.Workbook.Worksheets.Add("Stocks");
var recordIndex = 2;
workSheet.Row(1).Style.Font.Bold = true;
var headerCells = workSheet.Cells["A1:D1"];
headerCells.Style.Font.Bold = true;
headerCells.Style.Font.Size = 13;
headerCells.Style.Border.BorderAround(ExcelBorderStyle.Thin);
headerCells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
headerCells.Style.Border.Left.Style = ExcelBorderStyle.Thin;
headerCells.Style.Border.Right.Style = ExcelBorderStyle.Thin;
headerCells.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
headerCells.Style.Font.Color.SetColor(System.Drawing.Color.Black);
headerCells = workSheet.Cells["A1:D1"];
// Set their background color to DarkBlue.
headerCells.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
headerCells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
workSheet.Cells[1, 1].Value = "Product Code";
workSheet.Cells[1, 2].Value = "Vendor";
workSheet.Cells[1, 3].Value = "Quantity";
workSheet.Cells[1, 4].Value = "Unit Price";
foreach (var stock in filter)
{
workSheet.Cells[recordIndex, 1].Value = stock.ProductCode;
workSheet.Cells[recordIndex, 2].Value = stock.Vendor.Name;
workSheet.Cells[recordIndex, 3].Value = stock.Quantity;
workSheet.Cells[recordIndex, 4].Value = stock.UnitPrice;
recordIndex++;
}
//Make all text fit the cells
workSheet.Cells[workSheet.Dimension.Address].AutoFitColumns();
await package.SaveAsync();
}
stream.Position = 0;
var excelName = $"Stocks-{DateTime.Now.ToString("ddMMyyyyHHmm")}.xlsx";
using var streamRef = new DotNetStreamReference(stream: stream);
await JS.InvokeVoidAsync("downloadFileFromStream", excelName, streamRef);
busyStockExcelExport = false;
}
private async Task CancelEdit(StockDto? stock)
{
if (stock == _stockToInsert)
{
_stockToInsert = null;
}
//Order Check
if (stock.Id > 0)
{
var stockOriginal = await CancelStockUseCase.Execute(stock);
Mapper.Map(stockOriginal, stock);
}
_grid.CancelEditRow(stock);
await _grid.Reload();
}
async Task ShowInlineDialogStock(StockDto stock)
{
var result = await DialogService.OpenAsync("Delete Stock", ds =>
@<div>
<p class="mb-4">Do you want to delete Stock ID <b>@stock.Id</b>, Product Code: <b>@stock.ProductCode</b>?</p>
<div class="row">
<div class="col">
<RadzenButton Text="Ok" Click="() => ds.Close(true)" Class="mr-1" Style="width: 80px;" />
<RadzenButton Text="Cancel" Click="() => ds.Close(false)" ButtonStyle="ButtonStyle.Light" Class="mr-1" />
</div>
</div>
</div>
);
if (result == null)
{
CancelEdit(stock);
}
else if (result)
{
await DeleteStock(stock);
}
else
{
CancelEdit(stock);
}
}
async Task DeleteStock(StockDto stocks)
{
stockMap = new CoreBusiness.Stock();
Mapper.Map(stocks, stockMap);
await DeleteStockUseCase.ExecuteAsync(stockMap.Id);
stock = ViewStocksUseCase.Execute();
stockDto = Mapper.ProjectTo<StockDto>(stock);
await _grid.Reload();
}
}