* Added handling saving and deleting filters
This commit is contained in:
@@ -33,8 +33,8 @@
|
||||
<SfMenu TValue="MenuItem" HamburgerMode="true" Orientation="Vertical" Title="Menu">
|
||||
<MenuItems>
|
||||
<MenuItem Text="Zamówienia DELFOR" Url="/" IconCss="fa-solid fa-landmark"></MenuItem>
|
||||
<MenuItem Text="Zamówienia klienta EDI" Url="/EdiCustomerOrders" IconCss="fa-solid fa-list-check"></MenuItem>
|
||||
<MenuItem Text="Zamówienia klienta" Url="/CustomerOrders" IconCss="fa-solid fa-database"></MenuItem>
|
||||
@* <MenuItem Text="Zamówienia klienta EDI" Url="/EdiCustomerOrders" IconCss="fa-solid fa-list-check"></MenuItem> *@
|
||||
@* <MenuItem Text="Zamówienia klienta" Url="/CustomerOrders" IconCss="fa-solid fa-database"></MenuItem> *@
|
||||
@if (UserName == "pkus")
|
||||
{
|
||||
<MenuItem Text="Admin" IconCss="fa-solid fa-screwdriver-wrench">
|
||||
|
||||
@@ -9,10 +9,12 @@
|
||||
@inject CustomAuthenticationStateProvider CustomAuthenticationStateProvider
|
||||
@inject NavigationManager NavigationManager;
|
||||
|
||||
<ScheduleOrdersGrid PageSize="20" PassGridRef="SetGridRef" GridData="_scheduleOrders" />
|
||||
<ScheduleOrdersGrid PageSize="20" @ref="_grid" PassGridRef="SetGridRef" GridData="_scheduleOrders" />
|
||||
|
||||
@code {
|
||||
private IEnumerable<ScheduleOrderDto> _scheduleOrders = [];
|
||||
|
||||
private ScheduleOrdersGrid _grid { get; set; }
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
@@ -28,8 +30,13 @@
|
||||
// {
|
||||
_scheduleOrders = await FetchScheduleOrdersAsync();
|
||||
StateHasChanged();
|
||||
//
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
await _grid.RestoreFilterFromLocalStorage();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ScheduleOrderDto>> FetchScheduleOrdersAsync()
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
@inject NavigationManager NavigationManager
|
||||
@using System.Text.Json
|
||||
@using Syncfusion.Blazor.Grids
|
||||
@using Syncfusion.Blazor.Cards
|
||||
@using Syncfusion.Blazor.Data
|
||||
@using FilterType = Syncfusion.Blazor.Grids.FilterType
|
||||
@using Syncfusion.Blazor.Navigations
|
||||
@inherits LayoutComponentBase
|
||||
|
||||
@inject ScheduleOrderService ScheduleOrderService
|
||||
@inject IJSRuntime JSRuntime
|
||||
|
||||
<div class="h-100 d-flex justify-content-center align-items-start">
|
||||
<SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;">
|
||||
@@ -25,13 +30,27 @@
|
||||
SelectionMode="GridSelectionMode.Single"
|
||||
QueryCellInfo="OnQueryCellInfo"
|
||||
RowSelected="OnRowSelected">
|
||||
<SfToolbar>
|
||||
<ToolbarItems>
|
||||
<ToolbarItem Type="ItemType.Button" Text="Zapisz Filtry" Id="SaveButton"
|
||||
PrefixIcon="e-icons e-save" OnClick="SaveFilters"/>
|
||||
<ToolbarItem Type="ItemType.Button" Id="DeleteButton" PrefixIcon="e-icons e-delete"
|
||||
Text="Usuń Zapisane Filtry" OnClick="DeleteFilters"/>
|
||||
</ToolbarItems>
|
||||
</SfToolbar>
|
||||
<GridColumns>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.PONum) HeaderText="Zamówienie Klienta" Width="150" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.PurchaserCode) HeaderText="Klient" Width="100" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.RecipientName) HeaderText="Odbiorca" Width="100" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.RecipientCode) HeaderText="Kod odbiorcy" Width="100" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.LastUpdateDate) HeaderText="Data Utworzenia" Format="d" Type="ColumnType.Date" Width="130" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.DocType) HeaderText="Typ Dokumentu" Width="100" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.PONum) HeaderText="Zamówienie Klienta" Width="150"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.PurchaserCode) HeaderText="Klient" Width="100"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.RecipientName) HeaderText="Odbiorca" Width="100"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.RecipientCode) HeaderText="Kod odbiorcy" Width="100"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.LastUpdateDate) HeaderText="Data Utworzenia" Format="d"
|
||||
Type="ColumnType.Date" Width="130" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDto.DocType) HeaderText="Typ Dokumentu" Width="100"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
</GridColumns>
|
||||
<GridTemplates>
|
||||
<DetailTemplate>
|
||||
@@ -47,12 +66,19 @@
|
||||
EnableAdaptiveUI="true"
|
||||
AdaptiveUIMode="AdaptiveMode.Both">
|
||||
<GridColumns>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.OrderNumber) HeaderText="Numer Zamówienia" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.PurchaserName) HeaderText="Klient" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.RecipientName) HeaderText="Odbiorca" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.RecipientCode) HeaderText="Kod odbiorcy" Width="100" AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.Sc_productCode) HeaderText="Pozycja" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.Sh_productCode) HeaderText="Pozycja Klienta" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.OrderNumber)
|
||||
HeaderText="Numer Zamówienia" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.PurchaserName) HeaderText="Klient"
|
||||
Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.RecipientName)
|
||||
HeaderText="Odbiorca" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.RecipientCode)
|
||||
HeaderText="Kod odbiorcy" Width="100"
|
||||
AllowFiltering="true"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.Sc_productCode)
|
||||
HeaderText="Pozycja" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDto.Sh_productCode)
|
||||
HeaderText="Pozycja Klienta" Width="100"></GridColumn>
|
||||
</GridColumns>
|
||||
<GridTemplates>
|
||||
<DetailTemplate Context="detail">
|
||||
@@ -67,16 +93,26 @@
|
||||
EnableAdaptiveUI="true"
|
||||
AdaptiveUIMode="AdaptiveMode.Both">
|
||||
<GridColumns>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.DateFrom) HeaderText="Data Od" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.DateTo) HeaderText="Data Do" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.Qty) TextAlign="TextAlign.Right" HeaderText="Ilość Sztuk" Width="50"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.QtyType) TextAlign="TextAlign.Right" HeaderText="Typ Qty" Width="50"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.QtyDesc) HeaderText="Opis Typu" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.DateFrom)
|
||||
HeaderText="Data Od" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.DateTo)
|
||||
HeaderText="Data Do" Width="100"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.Qty)
|
||||
TextAlign="TextAlign.Right" HeaderText="Ilość Sztuk"
|
||||
Width="50"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.QtyType)
|
||||
TextAlign="TextAlign.Right" HeaderText="Typ Qty"
|
||||
Width="50"></GridColumn>
|
||||
<GridColumn Field=@nameof(ScheduleOrderDetailDetailDto.QtyDesc)
|
||||
HeaderText="Opis Typu" Width="100"></GridColumn>
|
||||
</GridColumns>
|
||||
<GridFilterSettings Type="FilterType.Excel"/>
|
||||
<GridPageSettings PageSize="10"/>
|
||||
<GridSelectionSettings Mode="SelectionMode.Row" Type="SelectionType.Single"/>
|
||||
<GridEvents TValue="ScheduleOrderDetailDetailDto" OnRecordDoubleClick="OnScheduleOrderDetailDetailRowDoubleClick" RowDataBound="OnRowDataBound"/>
|
||||
<GridSelectionSettings Mode="SelectionMode.Row"
|
||||
Type="SelectionType.Single"/>
|
||||
<GridEvents TValue="ScheduleOrderDetailDetailDto"
|
||||
OnRecordDoubleClick="OnScheduleOrderDetailDetailRowDoubleClick"
|
||||
RowDataBound="OnRowDataBound"/>
|
||||
</SfGrid>
|
||||
}
|
||||
</DetailTemplate>
|
||||
@@ -84,7 +120,8 @@
|
||||
<GridFilterSettings Type="FilterType.Excel"/>
|
||||
<GridPageSettings PageSize="10"/>
|
||||
<GridSelectionSettings Mode="SelectionMode.Row" Type="SelectionType.Single"/>
|
||||
<GridEvents TValue="ScheduleOrderDetailDto" OnRecordDoubleClick="OnScheduleOrderDetailRowDoubleClick"/>
|
||||
<GridEvents TValue="ScheduleOrderDetailDto"
|
||||
OnRecordDoubleClick="OnScheduleOrderDetailRowDoubleClick"/>
|
||||
</SfGrid>
|
||||
}
|
||||
</DetailTemplate>
|
||||
@@ -131,21 +168,21 @@
|
||||
int scheduleOrderId = obj.RowData.ID;
|
||||
NavigationManager.NavigateTo($"/ScheduleOrder/{scheduleOrderId}");
|
||||
}
|
||||
|
||||
|
||||
private void OnScheduleOrderDetailRowDoubleClick(RecordDoubleClickEventArgs<ScheduleOrderDetailDto> obj)
|
||||
{
|
||||
int? scheduleOrderId = ScheduleOrderDto?.ID;
|
||||
|
||||
|
||||
if (scheduleOrderId is not null)
|
||||
{
|
||||
NavigationManager.NavigateTo($"/ScheduleOrder/{scheduleOrderId}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void OnScheduleOrderDetailDetailRowDoubleClick(RecordDoubleClickEventArgs<ScheduleOrderDetailDetailDto> obj)
|
||||
{
|
||||
int? scheduleOrderId = ScheduleOrderDto?.ID;
|
||||
|
||||
|
||||
if (scheduleOrderId is not null)
|
||||
{
|
||||
NavigationManager.NavigateTo($"/ScheduleOrder/{scheduleOrderId}");
|
||||
@@ -179,4 +216,71 @@
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RestoreFilterFromLocalStorage()
|
||||
{
|
||||
var filterJson = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "gridFilter");
|
||||
if (!string.IsNullOrEmpty(filterJson))
|
||||
{
|
||||
var options = new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
var filters = JsonSerializer.Deserialize<List<WhereFilter>>(filterJson, options);
|
||||
|
||||
await Grid.ClearFilteringAsync();
|
||||
|
||||
if (filters != null && filters.Any())
|
||||
{
|
||||
foreach (var filter in filters.GroupBy(x => x.Field))
|
||||
{
|
||||
IList<object> values = filter.Select(x => GetValueFromJsonElement((JsonElement)x.value)).ToList();
|
||||
|
||||
await Grid.FilterByColumnAsync(filter.Key, filter.First().Operator.ToLower(), values);
|
||||
}
|
||||
|
||||
await Grid.Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private object GetValueFromJsonElement(JsonElement element)
|
||||
{
|
||||
switch (element.ValueKind)
|
||||
{
|
||||
case JsonValueKind.String:
|
||||
return element.GetString();
|
||||
case JsonValueKind.Number:
|
||||
if (element.TryGetInt32(out int intValue)) return intValue;
|
||||
if (element.TryGetDouble(out double doubleValue)) return doubleValue;
|
||||
break;
|
||||
case JsonValueKind.True:
|
||||
return true;
|
||||
case JsonValueKind.False:
|
||||
return false;
|
||||
case JsonValueKind.Null:
|
||||
return null;
|
||||
default:
|
||||
Console.WriteLine($"Nieobsługiwany typ JsonElement: {element.ValueKind}");
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private async Task SaveFilters()
|
||||
{
|
||||
var filterSettings = Grid.FilterSettings.Columns;
|
||||
if (filterSettings != null && filterSettings.Any())
|
||||
{
|
||||
string filterJson = JsonSerializer.Serialize(filterSettings);
|
||||
await JSRuntime.InvokeVoidAsync("localStorage.setItem", "gridFilter", filterJson);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task DeleteFilters()
|
||||
{
|
||||
await JSRuntime.InvokeVoidAsync("localStorage.removeItem", "gridFilter");
|
||||
await Grid.ClearFilteringAsync();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,22 +16,22 @@ builder.Services.AddSyncfusionBlazor();
|
||||
builder.Services.AddBlazorBootstrap();
|
||||
builder.Services.AddBlazoredLocalStorage();
|
||||
|
||||
// builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
||||
// .AddJwtBearer(options =>
|
||||
// {
|
||||
// options.TokenValidationParameters = new TokenValidationParameters
|
||||
// {
|
||||
// ValidateIssuer = true,
|
||||
// ValidateAudience = true,
|
||||
// ValidateLifetime = true,
|
||||
// ValidateIssuerSigningKey = true,
|
||||
// ValidIssuer = builder.Configuration["Jwt:Issuer"],
|
||||
// ValidAudience = builder.Configuration["Jwt:Audience"],
|
||||
// IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"] ?? string.Empty)),
|
||||
// NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
|
||||
// };
|
||||
// });
|
||||
//
|
||||
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
||||
.AddJwtBearer(options =>
|
||||
{
|
||||
options.TokenValidationParameters = new TokenValidationParameters
|
||||
{
|
||||
ValidateIssuer = true,
|
||||
ValidateAudience = true,
|
||||
ValidateLifetime = true,
|
||||
ValidateIssuerSigningKey = true,
|
||||
ValidIssuer = builder.Configuration["Jwt:Issuer"],
|
||||
ValidAudience = builder.Configuration["Jwt:Audience"],
|
||||
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"] ?? string.Empty)),
|
||||
NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
|
||||
};
|
||||
});
|
||||
|
||||
builder.Services.AddAuthorizationCore();
|
||||
builder.Services.AddScoped<CustomAuthenticationStateProvider>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user