improvements, fixes, etc...
This commit is contained in:
parent
0e8ab18ca4
commit
cfe9c2c3fd
|
|
@ -75,6 +75,9 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
|
||||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
public bool IsAllOrderItemAudited => OrderItemDtos.Count > 0 && OrderItemDtos.All(oi => oi.IsAudited);
|
public bool IsAllOrderItemAudited => OrderItemDtos.Count > 0 && OrderItemDtos.All(oi => oi.IsAudited);
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public bool IsAllOrderItemAvgWeightValid => OrderItemDtos.All(oi => oi.AverageWeightIsValid);
|
||||||
|
|
||||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
public MeasuringStatus MeasuringStatus
|
public MeasuringStatus MeasuringStatus
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,16 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public double AverageWeight => IsMeasurable && OrderItemPallets.Count > 0 ? double.Round(OrderItemPallets.Sum(oip => oip.AverageWeight) / OrderItemPallets.Count, 1) : 0d;
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public double AverageWeightDifference => IsMeasurable ? double.Round(ProductDto!.AverageWeight - AverageWeight, 1) : 0;
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public bool AverageWeightIsValid => !IsMeasurable ||
|
||||||
|
(ProductDto!.AverageWeight > 0 && ((AverageWeightDifference / ProductDto!.AverageWeight) * 100) < ProductDto!.AverageWeightTreshold);
|
||||||
|
|
||||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
public bool IsAudited => OrderItemPallets.Count > 0 && OrderItemPallets.All(oip => oip.IsAudited);
|
public bool IsAudited => OrderItemPallets.Count > 0 && OrderItemPallets.All(oip => oip.IsAudited);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,5 +70,11 @@ public class ProductDto : MgProductDto, IProductDto
|
||||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
public int AvailableQuantity => StockQuantity + IncomingQuantity;
|
public int AvailableQuantity => StockQuantity + IncomingQuantity;
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public double AverageWeight => GenericAttributes.GetValueOrDefault<double>(nameof(IProductDto.AverageWeight));
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public double AverageWeightTreshold => GenericAttributes.GetValueOrDefault<double>(nameof(IProductDto.AverageWeightTreshold));
|
||||||
|
|
||||||
public bool HasMeasuringValues() => Id > 0 && NetWeight != 0 && IsMeasurable;
|
public bool HasMeasuringValues() => Id > 0 && NetWeight != 0 && IsMeasurable;
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
using FruitBank.Common.Enums;
|
using FruitBank.Common.Enums;
|
||||||
using FruitBank.Common.Interfaces;
|
using FruitBank.Common.Interfaces;
|
||||||
using LinqToDB.Mapping;
|
using LinqToDB.Mapping;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Nop.Core.Domain.Orders;
|
using Nop.Core.Domain.Orders;
|
||||||
|
|
||||||
namespace FruitBank.Common.Entities;
|
namespace FruitBank.Common.Entities;
|
||||||
|
|
@ -30,6 +31,8 @@ public class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet
|
||||||
return OrderItemId > 0 && base.IsValidSafeMeasuringValues();
|
return OrderItemId > 0 && base.IsValidSafeMeasuringValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public double AverageWeight => double.Round(NetWeight / TrayQuantity, 1);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// "Szigorúbb" mint az IsValidSafeMeasuringValues()
|
/// "Szigorúbb" mint az IsValidSafeMeasuringValues()
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,127 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
|
namespace FruitBank.Common
|
||||||
|
{
|
||||||
|
public interface IFastObservableCollection
|
||||||
|
{
|
||||||
|
public void AddRange(IEnumerable other);
|
||||||
|
public void Replace(IEnumerable other);
|
||||||
|
public void RemoveRange(IEnumerable other);
|
||||||
|
public void Synchronize(NotifyCollectionChangedEventArgs args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IFastObservableCollection<T>: IFastObservableCollection
|
||||||
|
{
|
||||||
|
public void Replace(IEnumerable<T> other);
|
||||||
|
public void Sort(IComparer<T> comparer);
|
||||||
|
public void SortAndReplace(IEnumerable<T> other, IComparer<T> comparer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FastObservableCollection<T> : ObservableCollection<T>, IFastObservableCollection<T>
|
||||||
|
{
|
||||||
|
private bool suppressChangedEvent = false;
|
||||||
|
|
||||||
|
public void Replace(IEnumerable<T> other)
|
||||||
|
{
|
||||||
|
suppressChangedEvent = true;
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
AddRange(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Replace(IEnumerable other)
|
||||||
|
{
|
||||||
|
suppressChangedEvent = true;
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
foreach (T item in other) Add(item);
|
||||||
|
|
||||||
|
suppressChangedEvent = false;
|
||||||
|
|
||||||
|
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
||||||
|
OnPropertyChanged(new(nameof(Count)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddRange(IEnumerable other)
|
||||||
|
{
|
||||||
|
suppressChangedEvent = true;
|
||||||
|
|
||||||
|
foreach (object item in other)
|
||||||
|
{
|
||||||
|
if (item is T tItem) Add(tItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
suppressChangedEvent = false;
|
||||||
|
|
||||||
|
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
||||||
|
OnPropertyChanged(new(nameof(Count)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveRange(IEnumerable other)
|
||||||
|
{
|
||||||
|
suppressChangedEvent = true;
|
||||||
|
|
||||||
|
foreach (object item in other)
|
||||||
|
{
|
||||||
|
if (item is T tItem) Remove(tItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
suppressChangedEvent = false;
|
||||||
|
|
||||||
|
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
||||||
|
OnPropertyChanged(new(nameof(Count)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SortAndReplace(IEnumerable<T> other, IComparer<T> comparer)
|
||||||
|
{
|
||||||
|
List<T> values = new(other);
|
||||||
|
|
||||||
|
values.Sort(comparer);
|
||||||
|
Replace(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Sort(IComparer<T> comparer)
|
||||||
|
{
|
||||||
|
List<T> values = new(this);
|
||||||
|
|
||||||
|
values.Sort(comparer);
|
||||||
|
Replace(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Synchronize(NotifyCollectionChangedEventArgs args)
|
||||||
|
{
|
||||||
|
if (args.Action == NotifyCollectionChangedAction.Add && args.NewItems != null)
|
||||||
|
{
|
||||||
|
AddRange(args.NewItems);
|
||||||
|
}
|
||||||
|
else if (args.Action == NotifyCollectionChangedAction.Remove && args.OldItems != null)
|
||||||
|
{
|
||||||
|
RemoveRange(args.OldItems);
|
||||||
|
}
|
||||||
|
else if (args.Action == NotifyCollectionChangedAction.Reset)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (suppressChangedEvent)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base.OnPropertyChanged(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (suppressChangedEvent)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base.OnCollectionChanged(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,7 +8,7 @@ public interface ICustomOrderSignalREndpointCommon
|
||||||
{
|
{
|
||||||
Task<List<OrderDto>?> GetAllOrderDtos();
|
Task<List<OrderDto>?> GetAllOrderDtos();
|
||||||
Task<List<OrderDto>?> GetPendingOrderDtos();
|
Task<List<OrderDto>?> GetPendingOrderDtos();
|
||||||
Task<List<OrderDto>?> GetPendingOrderDtosForMeasuring();
|
Task<List<OrderDto>?> GetPendingOrderDtosForMeasuring(int lastDaysCount);
|
||||||
Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds);
|
Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds);
|
||||||
Task<OrderDto?> GetOrderDtoById(int orderId);
|
Task<OrderDto?> GetOrderDtoById(int orderId);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,7 @@ namespace FruitBank.Common.Interfaces;
|
||||||
|
|
||||||
public interface IProductDto : IMgProductDto, ITare, IIncomingQuantity, IAvailableQuantity, IMeasuringAttributeValues
|
public interface IProductDto : IMgProductDto, ITare, IIncomingQuantity, IAvailableQuantity, IMeasuringAttributeValues
|
||||||
{
|
{
|
||||||
|
public double AverageWeight { get; }
|
||||||
|
|
||||||
|
public double AverageWeightTreshold { get; }
|
||||||
}
|
}
|
||||||
|
|
@ -53,8 +53,9 @@ public class SignalRTags : AcSignalRTags
|
||||||
public const int GetPendingOrderDtos = 114;
|
public const int GetPendingOrderDtos = 114;
|
||||||
public const int GetAllOrderDtoByProductId = 115;
|
public const int GetAllOrderDtoByProductId = 115;
|
||||||
public const int GetPendingOrderDtosForMeasuring = 116;
|
public const int GetPendingOrderDtosForMeasuring = 116;
|
||||||
public const int StartMeasuring = 117;
|
public const int GetOrderDatesForMeasuring = 117;
|
||||||
public const int SetOrderStatusToComplete = 118;
|
public const int StartMeasuring = 118;
|
||||||
|
public const int SetOrderStatusToComplete = 119;
|
||||||
|
|
||||||
public const int GetOrderItemDtoById = 120;
|
public const int GetOrderItemDtoById = 120;
|
||||||
public const int GetAllOrderItemDtos = 121;
|
public const int GetAllOrderItemDtos = 121;
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
|
@using FruitBank.Common.Models
|
||||||
|
@using FruitBankHybrid.Shared.Components.Toolbars
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject LoggedInModel LoggedInModel;
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
<MgGridBase Data="OrderDtos" IsMasterGrid="IsMasterGrid" AutoSaveLayoutName="GridDetailOrderDto"
|
<MgGridBase @ref="@Grid" Data="OrderDtos" IsMasterGrid="IsMasterGrid" AutoSaveLayoutName="GridDetailOrderDto"
|
||||||
ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||||
AutoExpandAllGroupRows="false"
|
AutoExpandAllGroupRows="false"
|
||||||
|
CssClass="@GridCss"
|
||||||
ColumnResizeMode="GridColumnResizeMode.NextColumn" VirtualScrollingEnabled="IsMasterGrid"
|
ColumnResizeMode="GridColumnResizeMode.NextColumn" VirtualScrollingEnabled="IsMasterGrid"
|
||||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||||
<Columns>
|
<Columns>
|
||||||
|
|
@ -14,9 +20,12 @@
|
||||||
<DxGridDataColumn FieldName="OrderTotal" />
|
<DxGridDataColumn FieldName="OrderTotal" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="OrderStatus" />
|
<DxGridDataColumn FieldName="OrderStatus" />
|
||||||
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
|
|
||||||
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
||||||
|
<DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" />
|
||||||
|
@* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@
|
||||||
|
|
||||||
|
<DxGridDataColumn FieldName="IsAllOrderItemAvgWeightValid" ReadOnly="true" Caption="AvgWeightValid" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="RevisorId" ReadOnly="true" />
|
<DxGridDataColumn FieldName="RevisorId" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="MeasurementOwnerId" ReadOnly="true" />
|
<DxGridDataColumn FieldName="MeasurementOwnerId" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="DateOfReceipt" />
|
<DxGridDataColumn FieldName="DateOfReceipt" />
|
||||||
|
|
@ -24,7 +33,7 @@
|
||||||
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
</Columns>
|
</Columns>
|
||||||
<DetailRowTemplate>
|
<DetailRowTemplate>
|
||||||
@if (IsMasterGrid)
|
@if (IsMasterGrid && LoggedInModel.IsDeveloper)
|
||||||
{
|
{
|
||||||
var orderDto = ((OrderDto)context.DataItem);
|
var orderDto = ((OrderDto)context.DataItem);
|
||||||
|
|
||||||
|
|
@ -35,13 +44,19 @@
|
||||||
<DxTabPage Text="Mérések">
|
<DxTabPage Text="Mérések">
|
||||||
@{
|
@{
|
||||||
var orderItemPalletDtos = orderDto?.OrderItemDtos.SelectMany(oi => oi.OrderItemPallets).ToList() ?? [];
|
var orderItemPalletDtos = orderDto?.OrderItemDtos.SelectMany(oi => oi.OrderItemPallets).ToList() ?? [];
|
||||||
<GridDetailOrderItemPallets OrderItemPallets="orderItemPalletDtos" IsMasterGrid="false"/>
|
<GridDetailOrderItemPallets OrderItemPallets="orderItemPalletDtos" IsMasterGrid="false"/>
|
||||||
}
|
}
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
|
|
||||||
</DxTabs>
|
</DxTabs>
|
||||||
}
|
}
|
||||||
</DetailRowTemplate>
|
</DetailRowTemplate>
|
||||||
|
<ToolbarTemplate>
|
||||||
|
@if (IsMasterGrid)
|
||||||
|
{
|
||||||
|
<FruitBankToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)"/>
|
||||||
|
}
|
||||||
|
</ToolbarTemplate>
|
||||||
<GroupSummary>
|
<GroupSummary>
|
||||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||||
FieldName="Quantity"
|
FieldName="Quantity"
|
||||||
|
|
@ -60,11 +75,35 @@
|
||||||
//[Parameter] public OrderDto? OrderDto { get; set; }
|
//[Parameter] public OrderDto? OrderDto { get; set; }
|
||||||
[Parameter] public List<OrderDto>? OrderDtos { get; set; }
|
[Parameter] public List<OrderDto>? OrderDtos { get; set; }
|
||||||
|
|
||||||
private int _activeTabIndex;
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
protected override void OnInitialized()
|
|
||||||
|
MgGridBase Grid;
|
||||||
|
int _activeTabIndex;
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
// if (OrderDto != null)
|
// if (OrderDto != null)
|
||||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
// OrderItemDtos = OrderDto.OrderItemDtos;
|
||||||
|
|
||||||
|
await ReloadDataFromDb(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
using (await ObjectLock.GetSemaphore<OrderDto>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (OrderDtos == null) OrderDtos = await FruitBankSignalRClient.GetAllOrderDtos() ?? [];
|
||||||
|
else if (OrderDtos.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
OrderDtos.Clear();
|
||||||
|
OrderDtos.AddRange(await FruitBankSignalRClient.GetAllOrderDtos() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (forceReload)
|
||||||
|
Grid?.Reload();
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task OnActiveTabChanged(int activeTabIndex)
|
protected async Task OnActiveTabChanged(int activeTabIndex)
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,19 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Core.Helpers
|
||||||
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
|
@using FruitBank.Common.Models
|
||||||
|
@using FruitBankHybrid.Shared.Components.Toolbars
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject LoggedInModel LoggedInModel;
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
@* <div class="mb-2">
|
<MgGridBase @ref="Grid" Data="OrderItemDtos" IsMasterGrid="IsMasterGrid"
|
||||||
Contact Phone: @OrderDto.Email
|
|
||||||
</div> *@
|
|
||||||
|
|
||||||
<MgGridBase Data="OrderItemDtos" IsMasterGrid="IsMasterGrid"
|
|
||||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||||
AutoExpandAllGroupRows="false" AutoSaveLayoutName="GridDetailOrderItemDto"
|
AutoExpandAllGroupRows="false" AutoSaveLayoutName="GridDetailOrderItemDto"
|
||||||
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
||||||
|
CssClass="@GridCss"
|
||||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||||
<Columns>
|
<Columns>
|
||||||
<DxGridDataColumn FieldName="Id" />
|
<DxGridDataColumn FieldName="Id" />
|
||||||
|
|
@ -34,15 +37,29 @@
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="Quantity" />
|
<DxGridDataColumn FieldName="Quantity" />
|
||||||
<DxGridDataColumn FieldName="NetWeight" />
|
<DxGridDataColumn FieldName="NetWeight" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
|
<DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" />
|
||||||
|
@* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@
|
||||||
|
|
||||||
|
<DxGridDataColumn FieldName="AverageWeight" ReadOnly="true" Visible="false" Caption="AvgWeight" />
|
||||||
|
<DxGridDataColumn FieldName="AverageWeightDifference" ReadOnly="true" Visible="false" Caption="AvgWeightDiff" />
|
||||||
|
<DxGridDataColumn FieldName="AverageWeightIsValid" ReadOnly="true" Caption="AvgWeightValid" />
|
||||||
<DxGridDataColumn FieldName="IsAudited" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsAudited" ReadOnly="true" />
|
||||||
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
</Columns>
|
</Columns>
|
||||||
<DetailRowTemplate>
|
<DetailRowTemplate>
|
||||||
<GridDetailOrderItemPallets OrderItemPallets="((OrderItemDto)context.DataItem).OrderItemPallets" />
|
@if (IsMasterGrid && LoggedInModel.IsDeveloper)
|
||||||
|
{
|
||||||
|
<GridDetailOrderItemPallets OrderItemPallets="((OrderItemDto)context.DataItem).OrderItemPallets" />
|
||||||
|
}
|
||||||
</DetailRowTemplate>
|
</DetailRowTemplate>
|
||||||
|
<ToolbarTemplate>
|
||||||
|
@if (IsMasterGrid)
|
||||||
|
{
|
||||||
|
<FruitBankToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)"/>
|
||||||
|
}
|
||||||
|
</ToolbarTemplate>
|
||||||
<GroupSummary>
|
<GroupSummary>
|
||||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||||
FieldName="Quantity"
|
FieldName="Quantity"
|
||||||
|
|
@ -57,15 +74,62 @@
|
||||||
</MgGridBase>
|
</MgGridBase>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
//[Parameter] public OrderDto? OrderDto { get; set; }
|
//[Parameter] public OrderDto? OrderDto { get; set; }
|
||||||
[Parameter] public List<OrderItemDto>? OrderItemDtos { get; set; }
|
[Parameter] public List<OrderItemDto>? OrderItemDtos { get; set; }
|
||||||
[Parameter] public List<ProductDto>? ProductDtos { get; set; }
|
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
|
||||||
|
|
||||||
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
|
|
||||||
|
public MgGridBase Grid;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
ProductDtos ??= await FruitBankSignalRClient.GetProductDtos();
|
await ReloadDataFromDb();
|
||||||
// if (OrderDto != null)
|
}
|
||||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
//using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
// if (ProductDtos == null || !ProductDtos.Any())
|
||||||
|
// {
|
||||||
|
// ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
|
||||||
|
|
||||||
|
// // Database.ProductDtoTable.LoadDataAsync(!forceReload).ContinueWith(x =>
|
||||||
|
// // {
|
||||||
|
// // ProductDtos = x.Result;
|
||||||
|
// // }).Forget();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<OrderItemDto>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (OrderItemDtos == null) OrderItemDtos = await FruitBankSignalRClient.GetAllOrderItemDtos() ?? [];
|
||||||
|
else if (OrderItemDtos.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
OrderItemDtos.Clear();
|
||||||
|
OrderItemDtos.AddRange(await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (forceReload)
|
||||||
|
Grid?.Reload();
|
||||||
|
|
||||||
|
if (ProductDtos == null || !ProductDtos.Any() || forceReload)
|
||||||
|
{
|
||||||
|
//ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
|
||||||
|
|
||||||
|
Database.ProductDtoTable.LoadDataAsync(!forceReload).ContinueWith(x =>
|
||||||
|
{
|
||||||
|
ProductDtos = x.Result;
|
||||||
|
}).Forget();
|
||||||
|
}
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,12 +1,18 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBank.Common.Models
|
||||||
|
@using FruitBankHybrid.Shared.Components.Toolbars
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject LoggedInModel LoggedInModel;
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
<MgGridBase @ref="gridOrderItemPallet" Data="OrderItemPallets" IsMasterGrid="IsMasterGrid" AutoSaveLayoutName="GridDetailOrderItemPallets"
|
<MgGridBase @ref="gridOrderItemPallet" Data="OrderItemPallets" IsMasterGrid="IsMasterGrid" AutoSaveLayoutName="GridDetailOrderItemPallets"
|
||||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||||
AutoExpandAllGroupRows="false"
|
AutoExpandAllGroupRows="false"
|
||||||
|
CssClass="@GridCss"
|
||||||
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
||||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||||
<Columns>
|
<Columns>
|
||||||
|
|
@ -22,11 +28,18 @@
|
||||||
<DxGridDataColumn FieldName="TrayQuantity" />
|
<DxGridDataColumn FieldName="TrayQuantity" />
|
||||||
<DxGridDataColumn FieldName="GrossWeight" />
|
<DxGridDataColumn FieldName="GrossWeight" />
|
||||||
<DxGridDataColumn FieldName="NetWeight" />
|
<DxGridDataColumn FieldName="NetWeight" />
|
||||||
|
<DxGridDataColumn FieldName="AverageWeight" ReadOnly="true" Caption="AvgWeight" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="IsAudited" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsAudited" ReadOnly="true" />
|
||||||
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
</Columns>
|
</Columns>
|
||||||
|
<ToolbarTemplate>
|
||||||
|
@if (IsMasterGrid)
|
||||||
|
{
|
||||||
|
<FruitBankToolbarTemplate Grid="gridOrderItemPallet" OnReloadDataClick="() => ReloadDataFromDb(true)" />
|
||||||
|
}
|
||||||
|
</ToolbarTemplate>
|
||||||
<GroupSummary>
|
<GroupSummary>
|
||||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||||
FieldName="TrayQuantity"
|
FieldName="TrayQuantity"
|
||||||
|
|
@ -38,28 +51,47 @@
|
||||||
</MgGridBase>
|
</MgGridBase>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
IGrid gridOrderItemPallet;
|
MgGridBase gridOrderItemPallet;
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
[Parameter] public List<OrderItemPallet>? OrderItemPallets { get; set; }
|
[Parameter] public List<OrderItemPallet>? OrderItemPallets { get; set; }
|
||||||
|
|
||||||
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if (OrderItemPallets == null)
|
await ReloadDataFromDb(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ReloadDataFromDb(bool forceReload)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
using (await ObjectLock.GetSemaphore<OrderItemPallet>().UseWaitAsync())
|
||||||
{
|
{
|
||||||
OrderItemPallets = await FruitBankSignalRClient.GetAllOrderItemPallets();
|
if (OrderItemPallets == null) OrderItemPallets = await FruitBankSignalRClient.GetAllOrderItemPallets() ?? [];
|
||||||
|
else if (OrderItemPallets.Count == 0 || forceReload)
|
||||||
if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
|
||||||
{
|
{
|
||||||
gridOrderItemPallet.BeginUpdate();
|
OrderItemPallets.Clear();
|
||||||
|
OrderItemPallets.AddRange(await FruitBankSignalRClient.GetAllOrderItemPallets() ?? []);
|
||||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
|
||||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
|
||||||
|
|
||||||
gridOrderItemPallet.EndUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
||||||
|
{
|
||||||
|
gridOrderItemPallet.BeginUpdate();
|
||||||
|
|
||||||
|
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
||||||
|
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
||||||
|
|
||||||
|
gridOrderItemPallet.EndUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceReload)
|
||||||
|
gridOrderItemPallet?.Reload();
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task OnAfterRenderAsync(bool firstRender)
|
protected override Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
|
@ -69,10 +101,10 @@
|
||||||
// if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
// if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
||||||
// {
|
// {
|
||||||
// gridOrderItemPallet.BeginUpdate();
|
// gridOrderItemPallet.BeginUpdate();
|
||||||
|
|
||||||
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
||||||
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
||||||
|
|
||||||
// gridOrderItemPallet.EndUpdate();
|
// gridOrderItemPallet.EndUpdate();
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
@using AyCode.Core.Helpers
|
@using AyCode.Core.Helpers
|
||||||
|
@using AyCode.Utils.Extensions
|
||||||
@using DevExpress.Internal.About
|
@using DevExpress.Internal.About
|
||||||
@using FruitBank.Common.Dtos
|
@using FruitBank.Common.Dtos
|
||||||
|
@using FruitBank.Common.Models
|
||||||
|
@using FruitBankHybrid.Shared.Components.Toolbars
|
||||||
@using FruitBankHybrid.Shared.Databases
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject LoggedInModel LoggedInModel;
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
<GridProductDto Data="ProductDtos" IsMasterGrid="IsMasterGrid" FocusedRowChanged="OnFocusedRowChanged" AutoSaveLayoutName="GridProductDtoTemplate">
|
<GridProductDto @ref="Grid" Data="ProductDtos" IsMasterGrid="IsMasterGrid" FocusedRowChanged="OnFocusedRowChanged"
|
||||||
|
CssClass="@GridCss" AutoSaveLayoutName="GridProductDtoTemplate">
|
||||||
<Columns>
|
<Columns>
|
||||||
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Ascending" />
|
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Ascending" />
|
||||||
<DxGridDataColumn FieldName="Name" />
|
<DxGridDataColumn FieldName="Name" />
|
||||||
|
|
@ -16,10 +21,12 @@
|
||||||
<DxGridDataColumn FieldName="IncomingQuantity" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IncomingQuantity" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="NetWeight" ReadOnly="true" />
|
<DxGridDataColumn FieldName="NetWeight" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="IsMeasurable" />
|
<DxGridDataColumn FieldName="IsMeasurable" />
|
||||||
|
<DxGridDataColumn FieldName="AverageWeight" ReadOnly="true" />
|
||||||
|
<DxGridDataColumn FieldName="AverageWeightTreshold" ReadOnly="true" />
|
||||||
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
</Columns>
|
</Columns>
|
||||||
<DetailRowTemplate>
|
<DetailRowTemplate>
|
||||||
@if (IsMasterGrid)
|
@if (IsMasterGrid && LoggedInModel.IsDeveloper)
|
||||||
{
|
{
|
||||||
var productId = ((ProductDto)context.DataItem).Id;
|
var productId = ((ProductDto)context.DataItem).Id;
|
||||||
|
|
||||||
|
|
@ -42,13 +49,20 @@
|
||||||
</DxTabs>
|
</DxTabs>
|
||||||
}
|
}
|
||||||
</DetailRowTemplate>
|
</DetailRowTemplate>
|
||||||
|
<ToolbarTemplate>
|
||||||
|
@if (IsMasterGrid)
|
||||||
|
{
|
||||||
|
<FruitBankToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
|
||||||
|
}
|
||||||
|
</ToolbarTemplate>
|
||||||
</GridProductDto>
|
</GridProductDto>
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
[Inject] public required DatabaseClient Database { get; set; }
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
|
|
||||||
private int _activeTabIndex;
|
private int _activeTabIndex;
|
||||||
|
|
||||||
private List<OrderDto>? _currentOrderDtos;
|
private List<OrderDto>? _currentOrderDtos;
|
||||||
|
|
@ -56,6 +70,7 @@
|
||||||
|
|
||||||
private readonly Dictionary<int, List<OrderDto>> _orderDtosByProductId = new();
|
private readonly Dictionary<int, List<OrderDto>> _orderDtosByProductId = new();
|
||||||
private readonly Dictionary<int, List<OrderItemDto>> _orderItemDtosByProductId = new();
|
private readonly Dictionary<int, List<OrderItemDto>> _orderItemDtosByProductId = new();
|
||||||
|
public GridProductDto Grid { get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
|
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
|
||||||
|
|
@ -64,12 +79,38 @@
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
// if (IsMasterGrid)
|
||||||
|
// {
|
||||||
|
// using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
|
||||||
|
// {
|
||||||
|
// ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
||||||
|
// }
|
||||||
|
// //ProductDtos ??= await FruitBankSignalRClient.GetProductDtos();
|
||||||
|
|
||||||
//ProductDtos ??= await FruitBankSignalRClient.GetProductDtos();
|
// // if (ProductDtos is { Count: > 0 })
|
||||||
|
// // _currentOrderDtos = await GetOrderDtosFromDbAsync(ProductDtos[0].Id);
|
||||||
|
// }
|
||||||
|
|
||||||
// if (ProductDtos is { Count: > 0 })
|
await ReloadDataFromDb(false);
|
||||||
// _currentOrderDtos = await GetOrderDtosFromDbAsync(ProductDtos[0].Id);
|
}
|
||||||
|
|
||||||
|
public async Task ReloadDataFromDb(bool forceReload)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (ProductDtos == null || !ProductDtos.Any() || forceReload) ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
|
||||||
|
}
|
||||||
|
|
||||||
|
_orderDtosByProductId.Clear();
|
||||||
|
_orderItemDtosByProductId.Clear();
|
||||||
|
|
||||||
|
// if (forceReload)
|
||||||
|
// Grid?.Reload();
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<OrderDto>> GetOrderDtosFromDbAsync(int productId)
|
private async Task<List<OrderDto>> GetOrderDtosFromDbAsync(int productId)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
@ -34,7 +36,7 @@
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
|
|
||||||
<DxTabPage Text="Szállítmány tételek">
|
<DxTabPage Text="Szállítmány tételek">
|
||||||
<GridShippingItem ShippingItems="shippingDocuments?.SelectMany(sd => sd.ShippingItems ?? [])?.ToList() ?? []" IsMasterGrid="false" />
|
<GridShippingItemTemplate ShippingItems="shippingDocuments?.SelectMany(sd => sd.ShippingItems ?? [])?.ToList() ?? []" IsMasterGrid="false" />
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
</DxTabs>
|
</DxTabs>
|
||||||
}
|
}
|
||||||
|
|
@ -77,6 +79,9 @@
|
||||||
</MgGridBase>
|
</MgGridBase>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
//[Inject] public required ObjectLock ObjectLock { get; set; }
|
||||||
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
//[Parameter] public OrderDto? OrderDto { get; set; }
|
//[Parameter] public OrderDto? OrderDto { get; set; }
|
||||||
[Parameter] public List<Shipping>? Shippings{ get; set; }
|
[Parameter] public List<Shipping>? Shippings{ get; set; }
|
||||||
|
|
@ -85,13 +90,32 @@
|
||||||
string GridSearchText = "";
|
string GridSearchText = "";
|
||||||
bool EditItemsEnabled { get; set; }
|
bool EditItemsEnabled { get; set; }
|
||||||
int FocusedRowVisibleIndex { get; set; }
|
int FocusedRowVisibleIndex { get; set; }
|
||||||
IGrid Grid { get; set; }
|
public MgGridBase Grid { get; set; }
|
||||||
|
|
||||||
private int _activeTabIndex;
|
private int _activeTabIndex;
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
Shippings ??= (await FruitBankSignalRClient.GetShippings()) ?? [];
|
await ReloadDataFromDb(false);
|
||||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
}
|
||||||
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
//ProductDtos ??= await FruitBankSignalRClient.GetProductDtos() ?? [];
|
||||||
|
//ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<Shipping>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (Shippings == null) Shippings = await FruitBankSignalRClient.GetShippings() ?? [];
|
||||||
|
else if (Shippings.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
Shippings.Clear();
|
||||||
|
Shippings.AddRange(await FruitBankSignalRClient.GetShippings() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceReload) Grid?.Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) {
|
async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
@using FruitBankHybrid.Shared.Components.FileUploads
|
@using FruitBankHybrid.Shared.Components.FileUploads
|
||||||
@using FruitBankHybrid.Shared.Databases
|
@using FruitBankHybrid.Shared.Databases
|
||||||
|
|
@ -71,12 +72,12 @@
|
||||||
|
|
||||||
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
|
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
|
||||||
<DxTabPage Text="Szállítmány tételek">
|
<DxTabPage Text="Szállítmány tételek">
|
||||||
<GridShippingItem ShippingItems="shippingDocument.ShippingItems" IsMasterGrid="false" />
|
<GridShippingItemTemplate ShippingItems="shippingDocument.ShippingItems" IsMasterGrid="false" />
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
<DxTabPage Text="Mérések">
|
<DxTabPage Text="Mérések">
|
||||||
@{
|
@{
|
||||||
var shippingItemPallets = shippingDocument?.ShippingItems?.SelectMany(oi => oi.ShippingItemPallets ?? []).ToList() ?? [];
|
var shippingItemPallets = shippingDocument?.ShippingItems?.SelectMany(oi => oi.ShippingItemPallets ?? []).ToList() ?? [];
|
||||||
// <GridDetailOrderItemPallets OrderItemPallets="orderItemPalletDtos" IsMasterGrid="false"/>
|
<GridShippingItemPallets OrderItemPallets="shippingItemPallets" IsMasterGrid="false" />
|
||||||
}
|
}
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
|
|
||||||
|
|
@ -135,13 +136,14 @@
|
||||||
</MgGridBase>
|
</MgGridBase>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
//[Inject] public required ObjectLock ObjectLock { get; set; }
|
||||||
[Inject] public required DatabaseClient Database { get; set; }
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
|
|
||||||
[Parameter] public List<Shipping>? Shippings { get; set; }
|
[Parameter] public List<Shipping>? Shippings { get; set; }
|
||||||
[Parameter] public IEnumerable<Partner>? Partners { get; set; }
|
[Parameter] public List<Partner>? Partners { get; set; }
|
||||||
[Parameter] public List<ShippingDocument>? ShippingDocuments { get; set; }
|
[Parameter] public List<ShippingDocument>? ShippingDocuments { get; set; }
|
||||||
|
|
||||||
[Parameter] public Func<List<Partner>?, Task>? OnUploadedFileParsed { get; set; }
|
[Parameter] public Func<List<Partner>?, Task>? OnUploadedFileParsed { get; set; }
|
||||||
|
|
@ -154,20 +156,54 @@
|
||||||
string GridSearchText = "";
|
string GridSearchText = "";
|
||||||
bool EditItemsEnabled { get; set; } = true;
|
bool EditItemsEnabled { get; set; } = true;
|
||||||
int FocusedRowVisibleIndex { get; set; }
|
int FocusedRowVisibleIndex { get; set; }
|
||||||
IGrid Grid { get; set; }
|
public MgGridBase Grid { get; set; }
|
||||||
|
|
||||||
private int _activeTabIndex;
|
private int _activeTabIndex;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
_localStorageKey += LoggedInModel.CustomerDto!.Id;
|
_localStorageKey += LoggedInModel.CustomerDto!.Id;
|
||||||
|
await ReloadDataFromDb();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
//ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
|
||||||
Partners ??= await FruitBankSignalRClient.GetPartners() ?? [];
|
|
||||||
Shippings ??= await FruitBankSignalRClient.GetShippings() ?? [];
|
|
||||||
//ProductDtos ??= await FruitBankSignalRClient.GetProductDtos() ?? [];
|
//ProductDtos ??= await FruitBankSignalRClient.GetProductDtos() ?? [];
|
||||||
ShippingDocuments ??= await FruitBankSignalRClient.GetShippingDocuments() ?? [];
|
//ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
||||||
// if (OrderDto != null)
|
|
||||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
using (await ObjectLock.GetSemaphore<Partner>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (Partners == null) Partners = await FruitBankSignalRClient.GetPartners() ?? [];
|
||||||
|
else if (Partners.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
Partners.Clear();
|
||||||
|
Partners.AddRange(await FruitBankSignalRClient.GetPartners() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<Shipping>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (Shippings == null) Shippings = await FruitBankSignalRClient.GetShippings() ?? [];
|
||||||
|
else if (Shippings.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
Shippings.Clear();
|
||||||
|
Shippings.AddRange(await FruitBankSignalRClient.GetShippings() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? [];
|
||||||
|
else if (ShippingDocuments.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
ShippingDocuments.Clear();
|
||||||
|
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceReload) Grid?.Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnFileUploaded(byte[] arg)
|
private async Task OnFileUploaded(byte[] arg)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
@using FruitBank.Common.Dtos
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
@ -37,29 +39,48 @@
|
||||||
</MgGridBase>
|
</MgGridBase>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
IGrid gridOrderItemPallet;
|
public MgGridBase gridOrderItemPallet;
|
||||||
|
|
||||||
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
//[Inject] public required ObjectLock ObjectLock{ get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
[Parameter] public List<ShippingItemPallet>? ShippingItemPallets { get; set; }
|
[Parameter] public List<ShippingItemPallet>? ShippingItemPallets { get; set; }
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if (ShippingItemPallets == null)
|
await ReloadDataFromDb(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<ShippingItemPallet>().UseWaitAsync())
|
||||||
{
|
{
|
||||||
//TODO: A ShippingItemPallet-eknek SignalR Endpoint! - J.
|
ShippingItemPallets ??= [];
|
||||||
ShippingItemPallets = (await FruitBankSignalRClient.GetShippingItems())!.SelectMany(si => si.ShippingItemPallets!).ToList();
|
|
||||||
|
|
||||||
if (ShippingItemPallets != null && ShippingItemPallets.Any(sip => sip.ShippingItem?.ProductDto != null))
|
if (ShippingItemPallets.Count == 0 || forceReload)
|
||||||
{
|
{
|
||||||
gridOrderItemPallet.BeginUpdate();
|
ShippingItemPallets.Clear();
|
||||||
|
|
||||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
|
||||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
|
||||||
|
|
||||||
gridOrderItemPallet.EndUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//TODO: A ShippingItemPallet-eknek SignalR Endpoint! - J.
|
||||||
|
ShippingItemPallets.AddRange((await FruitBankSignalRClient.GetShippingItems())?.SelectMany(si => si.ShippingItemPallets ?? []) ?? []);
|
||||||
|
|
||||||
|
if (ShippingItemPallets.Any(sip => sip.ShippingItem?.ProductDto != null))
|
||||||
|
{
|
||||||
|
gridOrderItemPallet.BeginUpdate();
|
||||||
|
|
||||||
|
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
||||||
|
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
||||||
|
|
||||||
|
gridOrderItemPallet.EndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (forceReload)
|
||||||
|
gridOrderItemPallet?.Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task OnAfterRenderAsync(bool firstRender)
|
protected override Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,38 @@
|
||||||
@using AyCode.Core.Extensions
|
@using AyCode.Core.Loggers;
|
||||||
|
@using AyCode.Core.Extensions
|
||||||
|
@using AyCode.Core.Helpers
|
||||||
|
@using AyCode.Utils.Extensions
|
||||||
@using FruitBank.Common.Dtos
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBankHybrid.Shared.Components.Grids.ShippingItems
|
||||||
|
@using FruitBankHybrid.Shared.Components.Toolbars
|
||||||
@using FruitBankHybrid.Shared.Databases
|
@using FruitBankHybrid.Shared.Databases
|
||||||
|
@using FruitBankHybrid.Shared.Services.Loggers;
|
||||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
|
||||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
@* <div class="mb-2">
|
@* Data="ShippingItems" IsMasterGrid="IsMasterGrid" CssClass="@GridCss" AutoSaveLayoutName="GridShippingItem"
|
||||||
Contact Phone: @OrderDto.Email
|
ValidationEnabled="false" EditMode="GridEditMode.EditRow"
|
||||||
</div> *@
|
EditModelSaving="Grid_EditModelSaving"
|
||||||
|
FocusedRowChanged="Grid_FocusedRowChanged" *@
|
||||||
|
|
||||||
<MgGridBase @ref="Grid" Data="ShippingItems" IsMasterGrid="IsMasterGrid" CssClass="@GridCss" AutoSaveLayoutName="GridShippingItem"
|
<GridShippingItemBase @ref="Grid" IsMasterGrid="IsMasterGrid" DataSource="ShippingItems" AutoSaveLayoutName="GridShippingItem"
|
||||||
|
SignalRClient="FruitBankSignalRClient" Logger="_logger"
|
||||||
|
CssClass="@GridCss" ValidationEnabled="false" EditMode="GridEditMode.EditRow"
|
||||||
|
FocusedRowChanged="Grid_FocusedRowChanged">
|
||||||
|
@* <MgGridBase Data="ShippingItems" IsMasterGrid="IsMasterGrid" CssClass="@GridCss" AutoSaveLayoutName="GridShippingItem"
|
||||||
ValidationEnabled="false" EditMode="GridEditMode.EditRow"
|
ValidationEnabled="false" EditMode="GridEditMode.EditRow"
|
||||||
EditModelSaving="Grid_EditModelSaving"
|
EditModelSaving="Grid_EditModelSaving"
|
||||||
FocusedRowChanged="Grid_FocusedRowChanged">
|
FocusedRowChanged="Grid_FocusedRowChanged"> *@
|
||||||
<Columns>
|
<Columns>
|
||||||
<DxGridDataColumn FieldName="Id" Caption="oiId" Width="125" />
|
<DxGridDataColumn FieldName="Id" Caption="oiId" Width="125" />
|
||||||
<DxGridDataColumn FieldName="ShippingDocumentId" Caption="ShippingDocument">
|
<DxGridDataColumn FieldName="ShippingDocumentId" Caption="ShippingDocument">
|
||||||
<EditSettings>
|
<EditSettings>
|
||||||
<DxComboBoxSettings Data="ShippingDocuments"
|
<DxComboBoxSettings Data="ShippingDocuments"
|
||||||
ValueFieldName="Id"
|
ValueFieldName="Id"
|
||||||
TextFieldName="DocumentIdNumber"
|
TextFieldName="@("Partner.Name")"
|
||||||
DropDownBodyCssClass="dd-body-class"
|
DropDownBodyCssClass="dd-body-class"
|
||||||
ListRenderMode="ListRenderMode.Entire"
|
ListRenderMode="ListRenderMode.Entire"
|
||||||
SearchMode="ListSearchMode.AutoSearch"
|
SearchMode="ListSearchMode.AutoSearch"
|
||||||
|
|
@ -40,13 +52,13 @@
|
||||||
<DxGridDataColumn FieldName="ProductId" Caption="Product">
|
<DxGridDataColumn FieldName="ProductId" Caption="Product">
|
||||||
<EditSettings>
|
<EditSettings>
|
||||||
<DxComboBoxSettings Data="ProductDtos"
|
<DxComboBoxSettings Data="ProductDtos"
|
||||||
ValueFieldName="Id"
|
ValueFieldName="Id"
|
||||||
TextFieldName="Name"
|
TextFieldName="Name"
|
||||||
DropDownBodyCssClass="dd-body-class"
|
DropDownBodyCssClass="dd-body-class"
|
||||||
ListRenderMode="ListRenderMode.Entire"
|
ListRenderMode="ListRenderMode.Entire"
|
||||||
SearchMode="ListSearchMode.AutoSearch"
|
SearchMode="ListSearchMode.AutoSearch"
|
||||||
SearchFilterCondition="ListSearchFilterCondition.Contains"
|
SearchFilterCondition="ListSearchFilterCondition.Contains"
|
||||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto" >
|
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto">
|
||||||
<Columns>
|
<Columns>
|
||||||
<DxListEditorColumn FieldName="@nameof(ProductDto.Id)" />
|
<DxListEditorColumn FieldName="@nameof(ProductDto.Id)" />
|
||||||
<DxListEditorColumn FieldName="@nameof(ProductDto.Name)" />
|
<DxListEditorColumn FieldName="@nameof(ProductDto.Name)" />
|
||||||
|
|
@ -73,7 +85,7 @@
|
||||||
<DxGridDataColumn FieldName="MeasuredGrossWeight" Caption="Mért br.súly(kg)" ReadOnly="true" />
|
<DxGridDataColumn FieldName="MeasuredGrossWeight" Caption="Mért br.súly(kg)" ReadOnly="true" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true"/>
|
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
|
||||||
|
|
||||||
<DxGridDataColumn FieldName="Created" ReadOnly="true" />
|
<DxGridDataColumn FieldName="Created" ReadOnly="true" />
|
||||||
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
|
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
|
||||||
|
|
@ -88,28 +100,7 @@
|
||||||
<ToolbarTemplate>
|
<ToolbarTemplate>
|
||||||
@if (IsMasterGrid)
|
@if (IsMasterGrid)
|
||||||
{
|
{
|
||||||
<DxToolbar ItemRenderStyleMode="ToolbarRenderStyleMode.Plain">
|
<FruitBankToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)"/>
|
||||||
<DxToolbarItem Text="New" Click="NewItem_Click" IconCssClass="grid-toolbar-new" />
|
|
||||||
<DxToolbarItem Text="Edit" Click="EditItem_Click" IconCssClass="grid-toolbar-edit" Enabled="EditItemsEnabled" />
|
|
||||||
<DxToolbarItem Text="Delete" Click="DeleteItem_Click" IconCssClass="grid-toolbar-delete" Enabled="EditItemsEnabled" />
|
|
||||||
<DxToolbarItem Text="Column Chooser" BeginGroup="true" Click="ColumnChooserItem_Click" IconCssClass="grid-toolbar-column-chooser" />
|
|
||||||
<DxToolbarItem Text="Export" IconCssClass="grid-toolbar-export">
|
|
||||||
<Items>
|
|
||||||
<DxToolbarItem Text="To CSV" Click="ExportCsvItem_Click" />
|
|
||||||
<DxToolbarItem Text="To XLSX" Click="ExportXlsxItem_Click" />
|
|
||||||
<DxToolbarItem Text="To XLS" Click="ExportXlsItem_Click" />
|
|
||||||
<DxToolbarItem Text="To PDF" Click="ExportPdfItem_Click" />
|
|
||||||
</Items>
|
|
||||||
</DxToolbarItem>
|
|
||||||
@* <DxToolbarItem BeginGroup="true">
|
|
||||||
<Template Context="toolbar_item_context">
|
|
||||||
<DxSearchBox @bind-Text="GridSearchText"
|
|
||||||
BindValueMode="BindValueMode.OnInput"
|
|
||||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
|
||||||
aria-label="Search" />
|
|
||||||
</Template>
|
|
||||||
</DxToolbarItem>*@
|
|
||||||
</DxToolbar>
|
|
||||||
}
|
}
|
||||||
</ToolbarTemplate>
|
</ToolbarTemplate>
|
||||||
<GroupSummary>
|
<GroupSummary>
|
||||||
|
|
@ -123,16 +114,18 @@
|
||||||
FieldName="MeasuredNetWeight"
|
FieldName="MeasuredNetWeight"
|
||||||
FooterColumnName="NetWeight" />
|
FooterColumnName="NetWeight" />
|
||||||
</GroupSummary>
|
</GroupSummary>
|
||||||
</MgGridBase>
|
</GridShippingItemBase>
|
||||||
|
@* </MgGridBase> *@
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
//[Inject] public required ObjectLock ObjectLock { get; set; }
|
||||||
[Inject] public required DatabaseClient Database { get; set; }
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
|
|
||||||
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
|
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
|
||||||
[Parameter] public List<ShippingItem>? ShippingItems { get; set; }
|
[Parameter] public List<ShippingItem>? ShippingItems { get; set; }
|
||||||
[Parameter] public IEnumerable<ShippingDocument>? ShippingDocuments { get; set; }
|
[Parameter] public List<ShippingDocument>? ShippingDocuments { get; set; }
|
||||||
|
|
||||||
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
|
|
||||||
|
|
@ -142,15 +135,43 @@
|
||||||
string GridSearchText = "";
|
string GridSearchText = "";
|
||||||
bool EditItemsEnabled { get; set; } = true;
|
bool EditItemsEnabled { get; set; } = true;
|
||||||
int FocusedRowVisibleIndex { get; set; }
|
int FocusedRowVisibleIndex { get; set; }
|
||||||
IGrid Grid { get; set; }
|
|
||||||
|
public GridShippingItemBase Grid { get; set; }
|
||||||
|
private LoggerClient<GridShippingItemTemplate> _logger;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
ProductDtos ??= await Database.ProductDtoTable.LoadDataAsync(true);
|
_logger = new LoggerClient<GridShippingItemTemplate>(LogWriters.ToArray());
|
||||||
|
|
||||||
//ProductDtos ??= await FruitBankSignalRClient.GetProductDtos() ?? [];
|
await ReloadDataFromDb(false);
|
||||||
ShippingItems ??= await FruitBankSignalRClient.GetShippingItems() ?? [];
|
}
|
||||||
ShippingDocuments ??= await FruitBankSignalRClient.GetShippingDocuments() ?? [];
|
|
||||||
|
public async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (ProductDtos == null || !ProductDtos.Any() || forceReload) ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
|
||||||
|
}
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync())
|
||||||
|
{
|
||||||
|
if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? [];
|
||||||
|
else if (ShippingDocuments.Count == 0 || forceReload)
|
||||||
|
{
|
||||||
|
ShippingDocuments.Clear();
|
||||||
|
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Grid == null) return;
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<ShippingItem>().UseWaitAsync())
|
||||||
|
if (forceReload) await Grid.ReloadDataSourceAsync();
|
||||||
|
|
||||||
|
if (forceReload)
|
||||||
|
Grid.Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task Grid_FocusedRowChanged(GridFocusedRowChangedEventArgs args)
|
async Task Grid_FocusedRowChanged(GridFocusedRowChangedEventArgs args)
|
||||||
|
|
@ -180,46 +201,9 @@
|
||||||
EditItemsEnabled = true;
|
EditItemsEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resultShippingItem != null)
|
// if (resultShippingItem != null)
|
||||||
ShippingItems!.UpdateCollection(resultShippingItem, false);
|
// ShippingItems!.UpdateCollection(resultShippingItem, false);
|
||||||
|
|
||||||
EditItemsEnabled = true;
|
EditItemsEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task NewItem_Click()
|
|
||||||
{
|
|
||||||
EditItemsEnabled = false;
|
|
||||||
await Grid.StartEditNewRowAsync();
|
|
||||||
}
|
|
||||||
async Task EditItem_Click()
|
|
||||||
{
|
|
||||||
EditItemsEnabled = false;
|
|
||||||
await Grid.StartEditRowAsync(FocusedRowVisibleIndex);
|
|
||||||
}
|
|
||||||
void DeleteItem_Click()
|
|
||||||
{
|
|
||||||
EditItemsEnabled = false;
|
|
||||||
Grid.ShowRowDeleteConfirmation(FocusedRowVisibleIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ColumnChooserItem_Click(ToolbarItemClickEventArgs e)
|
|
||||||
{
|
|
||||||
Grid.ShowColumnChooser();
|
|
||||||
}
|
|
||||||
async Task ExportXlsxItem_Click()
|
|
||||||
{
|
|
||||||
await Grid.ExportToXlsxAsync(ExportFileName);
|
|
||||||
}
|
|
||||||
async Task ExportXlsItem_Click()
|
|
||||||
{
|
|
||||||
await Grid.ExportToXlsAsync(ExportFileName);
|
|
||||||
}
|
|
||||||
async Task ExportCsvItem_Click()
|
|
||||||
{
|
|
||||||
await Grid.ExportToCsvAsync(ExportFileName);
|
|
||||||
}
|
|
||||||
async Task ExportPdfItem_Click()
|
|
||||||
{
|
|
||||||
await Grid.ExportToPdfAsync(ExportFileName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +1,170 @@
|
||||||
using AyCode.Blazor.Components.Components.Grids;
|
using AyCode.Blazor.Components.Components.Grids;
|
||||||
|
using AyCode.Core.Extensions;
|
||||||
using AyCode.Core.Interfaces;
|
using AyCode.Core.Interfaces;
|
||||||
using AyCode.Interfaces.Entities;
|
using AyCode.Interfaces.Entities;
|
||||||
|
using AyCode.Utils.Extensions;
|
||||||
|
using DevExpress.Blazor;
|
||||||
|
using FruitBank.Common.Models;
|
||||||
using FruitBankHybrid.Shared.Services.Loggers;
|
using FruitBankHybrid.Shared.Services.Loggers;
|
||||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
|
||||||
namespace FruitBankHybrid.Shared.Components.Grids;
|
namespace FruitBankHybrid.Shared.Components.Grids;
|
||||||
|
|
||||||
|
//var a = new GridDevExtremeDataSource(DataSource.AsQueryable().Where(x=>x.IsMeasurable));
|
||||||
|
|
||||||
public class FruitBankListGridBase<TDataItem> : MgGridBase<SignalRDataSourceList<TDataItem>, TDataItem, int, LoggerClient> where TDataItem : class, IId<int>
|
public class FruitBankListGridBase<TDataItem> : MgGridBase<SignalRDataSourceList<TDataItem>, TDataItem, int, LoggerClient> where TDataItem : class, IId<int>
|
||||||
{ }
|
{
|
||||||
|
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||||
|
[Inject] public required IJSRuntime JSRuntime { get; set; }
|
||||||
|
|
||||||
|
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||||
|
[Parameter] public string AutoSaveLayoutName { get; set; }
|
||||||
|
|
||||||
|
private bool _isFirstInitializeParameterCore;
|
||||||
|
private bool _isFirstInitializeParameters;
|
||||||
|
public bool PreRendered { get; set; }
|
||||||
|
|
||||||
|
//public virtual Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
//{
|
||||||
|
// throw new NotImplementedException();
|
||||||
|
//}
|
||||||
|
|
||||||
|
protected void OnCustomizeElement(GridCustomizeElementEventArgs e)
|
||||||
|
{
|
||||||
|
//if (!IsMasterGrid) e.CssClass = "hideDetailButton";
|
||||||
|
|
||||||
|
if (IsMasterGrid && e.ElementType == GridElementType.DataRow && e.VisibleIndex % 2 == 1 && !e.Grid.IsRowSelected(e.VisibleIndex) && !e.Grid.IsRowFocused(e.VisibleIndex))
|
||||||
|
{
|
||||||
|
e.CssClass = " alt-item";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(e.ElementType == GridElementType.DataRow && !LoggedInModel.IsDeveloper)
|
||||||
|
{
|
||||||
|
e.CssClass = "hideDetailButton";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.ElementType == GridElementType.HeaderCell)
|
||||||
|
{
|
||||||
|
e.Style = "background-color: #E6E6E6;";
|
||||||
|
//e.CssClass = "header-bold";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override async Task SetParametersAsyncCore(ParameterView parameters)
|
||||||
|
{
|
||||||
|
await base.SetParametersAsyncCore(parameters);
|
||||||
|
|
||||||
|
if (!_isFirstInitializeParameterCore)
|
||||||
|
{
|
||||||
|
//if (typeof(TDataItem) is IId<Guid> || typeof(TDataItem) is IId<int>)
|
||||||
|
KeyFieldName = "Id";
|
||||||
|
|
||||||
|
//base.DataItemDeleting = EventCallback.Factory.Create<GridDataItemDeletingEventArgs>(this, OnItemDeleting);
|
||||||
|
//base.EditModelSaving = EventCallback.Factory.Create<GridEditModelSavingEventArgs>(this, OnItemSaving);
|
||||||
|
|
||||||
|
CustomizeElement += OnCustomizeElement;
|
||||||
|
|
||||||
|
_isFirstInitializeParameterCore = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
base.OnParametersSet();
|
||||||
|
|
||||||
|
if (!_isFirstInitializeParameters)
|
||||||
|
{
|
||||||
|
SizeMode = DevExpress.Blazor.SizeMode.Small;
|
||||||
|
ShowGroupPanel = IsMasterGrid;
|
||||||
|
ShowSearchBox = IsMasterGrid;
|
||||||
|
ShowFilterRow = IsMasterGrid;
|
||||||
|
|
||||||
|
FilterMenuButtonDisplayMode = (IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always);
|
||||||
|
|
||||||
|
DetailRowDisplayMode = IsMasterGrid ? GridDetailRowDisplayMode.Auto : GridDetailRowDisplayMode.Never;
|
||||||
|
DetailExpandButtonDisplayMode = IsMasterGrid ? GridDetailExpandButtonDisplayMode.Auto : GridDetailExpandButtonDisplayMode.Never;
|
||||||
|
|
||||||
|
TextWrapEnabled = false;
|
||||||
|
AllowSelectRowByClick = true;
|
||||||
|
HighlightRowOnHover = true;
|
||||||
|
AutoCollapseDetailRow = true;
|
||||||
|
AutoExpandAllGroupRows = false;
|
||||||
|
|
||||||
|
PagerVisible = IsMasterGrid;
|
||||||
|
PageSize = IsMasterGrid ? (SizeMode == DevExpress.Blazor.SizeMode.Small ? 23 : 15) : 50;
|
||||||
|
|
||||||
|
AllowColumnReorder = true;
|
||||||
|
AllowGroup = IsMasterGrid;
|
||||||
|
AllowSort = true;
|
||||||
|
|
||||||
|
EditMode = GridEditMode.EditRow;
|
||||||
|
FocusedRowEnabled = true;
|
||||||
|
ColumnResizeMode = GridColumnResizeMode.NextColumn;
|
||||||
|
//VirtualScrollingEnabled = IsMasterGrid;
|
||||||
|
PageSizeSelectorVisible = true;
|
||||||
|
|
||||||
|
if (IsMasterGrid && !AutoSaveLayoutName.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
LayoutAutoLoading = Grid_LayoutAutoLoading;
|
||||||
|
LayoutAutoSaving = Grid_LayoutAutoSaving;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isFirstInitializeParameters = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnAfterRender(bool firstRender)
|
||||||
|
{
|
||||||
|
base.OnAfterRender(firstRender);
|
||||||
|
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
//PreRendered = true;
|
||||||
|
//StateHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task Grid_LayoutAutoLoading(GridPersistentLayoutEventArgs e)
|
||||||
|
{
|
||||||
|
e.Layout = await LoadLayoutFromLocalStorageAsync($"{AutoSaveLayoutName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Grid_LayoutAutoSaving(GridPersistentLayoutEventArgs e)
|
||||||
|
{
|
||||||
|
await SaveLayoutToLocalStorageAsync(e.Layout, $"{AutoSaveLayoutName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}");
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task<GridPersistentLayout?> LoadLayoutFromLocalStorageAsync(string localStorageKey)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var json = await JSRuntime.InvokeAsync<string>("localStorage.getItem", localStorageKey);
|
||||||
|
|
||||||
|
if (!json.IsNullOrWhiteSpace()) return json.JsonTo<GridPersistentLayout>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Mute exceptions for the server prerender stage
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
async Task SaveLayoutToLocalStorageAsync(GridPersistentLayout layout, string localStorageKey)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var json = layout.ToJson();
|
||||||
|
await JSRuntime.InvokeVoidAsync("localStorage.setItem", localStorageKey, json);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Mute exceptions for the server prerender stage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//public abstract class FruitBankObservableGridBase<TDataItem> : MgGridBase<SignalRDataSourceObservable<TDataItem>, TDataItem, int, LoggerClient> where TDataItem : class, IId<int>
|
//public abstract class FruitBankObservableGridBase<TDataItem> : MgGridBase<SignalRDataSourceObservable<TDataItem>, TDataItem, int, LoggerClient> where TDataItem : class, IId<int>
|
||||||
//{ }
|
//{ }
|
||||||
|
|
@ -7,9 +7,9 @@ using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
namespace FruitBankHybrid.Shared.Components.Grids.ShippingItems;
|
namespace FruitBankHybrid.Shared.Components.Grids.ShippingItems;
|
||||||
|
|
||||||
public class GridShippingItem : FruitBankListGridBase<ShippingItem>, IGrid
|
public class GridShippingItemBase : FruitBankListGridBase<ShippingItem>, IGrid
|
||||||
{
|
{
|
||||||
public GridShippingItem() : base()
|
public GridShippingItemBase() : base()
|
||||||
{
|
{
|
||||||
GetAllMessageTag = SignalRTags.GetShippingItems;
|
GetAllMessageTag = SignalRTags.GetShippingItems;
|
||||||
AddMessageTag = SignalRTags.AddShippingItem;
|
AddMessageTag = SignalRTags.AddShippingItem;
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ public class MgGridBase : DxGrid
|
||||||
e.CssClass = " alt-item";
|
e.CssClass = " alt-item";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(e.ElementType == GridElementType.DataRow && !LoggedInModel.IsDeveloper)
|
||||||
|
{
|
||||||
|
e.CssClass = "hideDetailButton";
|
||||||
|
}
|
||||||
|
|
||||||
if (e.ElementType == GridElementType.HeaderCell)
|
if (e.ElementType == GridElementType.HeaderCell)
|
||||||
{
|
{
|
||||||
e.Style = "background-color: #E6E6E6;";
|
e.Style = "background-color: #E6E6E6;";
|
||||||
|
|
@ -104,7 +109,7 @@ public class MgGridBase : DxGrid
|
||||||
|
|
||||||
EditMode = GridEditMode.EditRow;
|
EditMode = GridEditMode.EditRow;
|
||||||
FocusedRowEnabled = true;
|
FocusedRowEnabled = true;
|
||||||
ColumnResizeMode = GridColumnResizeMode.ColumnsContainer;
|
ColumnResizeMode = GridColumnResizeMode.NextColumn;
|
||||||
//VirtualScrollingEnabled = IsMasterGrid;
|
//VirtualScrollingEnabled = IsMasterGrid;
|
||||||
PageSizeSelectorVisible = true;
|
PageSizeSelectorVisible = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
@using AyCode.Core.Loggers;
|
||||||
|
@using AyCode.Core.Extensions
|
||||||
|
@using AyCode.Core.Helpers
|
||||||
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBank.Common.Models
|
||||||
|
@using FruitBankHybrid.Shared.Components.Grids.ShippingItems
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
|
@using FruitBankHybrid.Shared.Services.Loggers;
|
||||||
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
|
||||||
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
@inject LoggedInModel LoggedInModel;
|
||||||
|
|
||||||
|
<ToolbarBase @ref="Toolbar" Grid="Grid" ItemRenderStyleMode="ToolbarRenderStyleMode.Plain">
|
||||||
|
<DxToolbarItem Text="New" Click="NewItem_Click" IconCssClass="grid-toolbar-new" Enabled="LoggedInModel.IsDeveloper" />
|
||||||
|
<DxToolbarItem Text="Edit" Click="EditItem_Click" IconCssClass="grid-toolbar-edit" Enabled="@(LoggedInModel.IsDeveloper && EditItemsEnabled)" />
|
||||||
|
<DxToolbarItem Text="Delete" Click="DeleteItem_Click" IconCssClass="grid-toolbar-delete" Enabled="@(LoggedInModel.IsDeveloper && EditItemsEnabled)" />
|
||||||
|
<DxToolbarItem Text="Column Chooser" BeginGroup="true" Click="ColumnChooserItem_Click" IconCssClass="grid-toolbar-column-chooser" />
|
||||||
|
<DxToolbarItem Text="Export" IconCssClass="grid-toolbar-export" Enabled="@(LoggedInModel.IsDeveloper && EditItemsEnabled)">
|
||||||
|
<Items>
|
||||||
|
<DxToolbarItem Text="To CSV" Click="ExportCsvItem_Click" />
|
||||||
|
<DxToolbarItem Text="To XLSX" Click="ExportXlsxItem_Click" />
|
||||||
|
<DxToolbarItem Text="To XLS" Click="ExportXlsItem_Click" />
|
||||||
|
<DxToolbarItem Text="To PDF" Click="ExportPdfItem_Click" />
|
||||||
|
</Items>
|
||||||
|
</DxToolbarItem>
|
||||||
|
<DxToolbarItem Text="Reload data" BeginGroup="true" Click="ReloadData_Click" />
|
||||||
|
<DxToolbarItem BeginGroup="true">
|
||||||
|
</DxToolbarItem>
|
||||||
|
@* <DxToolbarItem BeginGroup="true">
|
||||||
|
<Template Context="toolbar_item_context">
|
||||||
|
<DxSearchBox @bind-Text="GridSearchText"
|
||||||
|
BindValueMode="BindValueMode.OnInput"
|
||||||
|
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||||
|
aria-label="Search" />
|
||||||
|
</Template>
|
||||||
|
</DxToolbarItem>*@
|
||||||
|
</ToolbarBase>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter] public IGrid Grid{ get; set; }
|
||||||
|
[Parameter] public EventCallback<ToolbarItemClickEventArgs> OnReloadDataClick { get; set; }
|
||||||
|
|
||||||
|
public ToolbarBase Toolbar { get; set; }
|
||||||
|
const string ExportFileName = "ExportResult";
|
||||||
|
public bool EditItemsEnabled { get; set; } = true;
|
||||||
|
private LoggerClient<GridShippingItemTemplate> _logger;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
_logger = new LoggerClient<GridShippingItemTemplate>(LogWriters.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task ReloadData_Click(ToolbarItemClickEventArgs e)
|
||||||
|
{
|
||||||
|
await OnReloadDataClick.InvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task NewItem_Click()
|
||||||
|
{
|
||||||
|
EditItemsEnabled = false;
|
||||||
|
await Grid.StartEditNewRowAsync();
|
||||||
|
}
|
||||||
|
async Task EditItem_Click()
|
||||||
|
{
|
||||||
|
EditItemsEnabled = false;
|
||||||
|
await Grid.StartEditRowAsync(Grid.GetFocusedRowIndex());
|
||||||
|
}
|
||||||
|
void DeleteItem_Click()
|
||||||
|
{
|
||||||
|
EditItemsEnabled = false;
|
||||||
|
Grid.ShowRowDeleteConfirmation(Grid.GetFocusedRowIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColumnChooserItem_Click(ToolbarItemClickEventArgs e)
|
||||||
|
{
|
||||||
|
Grid.ShowColumnChooser();
|
||||||
|
}
|
||||||
|
async Task ExportXlsxItem_Click()
|
||||||
|
{
|
||||||
|
await Grid.ExportToXlsxAsync(ExportFileName);
|
||||||
|
}
|
||||||
|
async Task ExportXlsItem_Click()
|
||||||
|
{
|
||||||
|
await Grid.ExportToXlsAsync(ExportFileName);
|
||||||
|
}
|
||||||
|
async Task ExportCsvItem_Click()
|
||||||
|
{
|
||||||
|
await Grid.ExportToCsvAsync(ExportFileName);
|
||||||
|
}
|
||||||
|
async Task ExportPdfItem_Click()
|
||||||
|
{
|
||||||
|
await Grid.ExportToPdfAsync(ExportFileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
using DevExpress.Blazor;
|
||||||
|
using DevExpress.Blazor.Navigation.Internal;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FruitBankHybrid.Shared.Components.Toolbars
|
||||||
|
{
|
||||||
|
public class ToolbarBase : DxToolbar
|
||||||
|
{
|
||||||
|
[Parameter] public IGrid Grid { get; set; }
|
||||||
|
[Parameter] public Func<ToolbarItemClickEventArgs, Task> RefreshClick { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,31 @@
|
||||||
using AyCode.Core.Extensions;
|
using AyCode.Core.Extensions;
|
||||||
|
using AyCode.Core.Interfaces;
|
||||||
using AyCode.Interfaces.Entities;
|
using AyCode.Interfaces.Entities;
|
||||||
|
using AyCode.Services.SignalRs;
|
||||||
|
using AyCode.Utils.Extensions;
|
||||||
using AyCode.Utils.Wrappers;
|
using AyCode.Utils.Wrappers;
|
||||||
|
using DevExpress.Blazor.Scheduler.Internal;
|
||||||
|
using FruitBank.Common;
|
||||||
using FruitBank.Common.Dtos;
|
using FruitBank.Common.Dtos;
|
||||||
|
using FruitBank.Common.Entities;
|
||||||
|
using FruitBank.Common.SignalRs;
|
||||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
using Nop.Core.Domain.Common;
|
using Nop.Core.Domain.Common;
|
||||||
using Nop.Core.Domain.Orders;
|
using Nop.Core.Domain.Orders;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using AyCode.Utils.Extensions;
|
using System.Threading;
|
||||||
|
|
||||||
namespace FruitBankHybrid.Shared.Databases;
|
namespace FruitBankHybrid.Shared.Databases;
|
||||||
|
|
||||||
|
public class ShippingTableItem : Shipping
|
||||||
|
{ }
|
||||||
|
public class ShippingDocumentTableItem : ShippingDocument
|
||||||
|
{ }
|
||||||
|
public class ShippingItemTableItem : ShippingItem
|
||||||
|
{ }
|
||||||
|
public class ShippingItemPalletTableItem : ShippingItemPallet
|
||||||
|
{ }
|
||||||
public class ProductDtoTableItem : ProductDto
|
public class ProductDtoTableItem : ProductDto
|
||||||
{
|
{
|
||||||
//[Newtonsoft.Json.JsonProperty]
|
//[Newtonsoft.Json.JsonProperty]
|
||||||
|
|
@ -25,7 +40,22 @@ public class OrderDtoTableItem : OrderDto
|
||||||
//public new ObservableCollection<GenericAttribute>? OrderItemDtos { get; set; }
|
//public new ObservableCollection<GenericAttribute>? OrderItemDtos { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : ObservableCollection<ProductDtoTableItem>
|
public class ShippingItemTable : SignalRDataSourceList<ShippingItemTableItem>
|
||||||
|
{
|
||||||
|
private static readonly SignalRCrudTags SignalRCrudTags = new(SignalRTags.GetShippingItems, 0, SignalRTags.AddShippingItem, SignalRTags.UpdateShippingItem, 0);
|
||||||
|
|
||||||
|
public ShippingItemTable(AcSignalRClientBase signalRClient, params object[]? contextIds)
|
||||||
|
: this(signalRClient, SignalRCrudTags, contextIds)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShippingItemTable(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds) : base(signalRClient, signalRCrudTags, contextIds)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : FastObservableCollection<ProductDtoTableItem>
|
||||||
{
|
{
|
||||||
private readonly SemaphoreSlim _semaphoreSlim = new(1);
|
private readonly SemaphoreSlim _semaphoreSlim = new(1);
|
||||||
public async Task<ProductDtoTable> LoadDataAsync(bool onlyIfEmpty = true)
|
public async Task<ProductDtoTable> LoadDataAsync(bool onlyIfEmpty = true)
|
||||||
|
|
@ -34,21 +64,23 @@ public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : Ob
|
||||||
|
|
||||||
using (await _semaphoreSlim.UseWaitAsync())
|
using (await _semaphoreSlim.UseWaitAsync())
|
||||||
{
|
{
|
||||||
if (Count != 0) return this;
|
//Előfordulhat, h egy másik szálban már megtörtént a refresh... - J.
|
||||||
|
if (onlyIfEmpty && Count != 0) return this;
|
||||||
|
|
||||||
var items = (await fruitBankSignalRClient.GetProductDtoTableItems() ?? []);
|
var items = (await fruitBankSignalRClient.GetProductDtoTableItems() ?? []);
|
||||||
|
|
||||||
Clear();
|
//Clear();
|
||||||
foreach (var productDto in items)
|
this.Replace(items);
|
||||||
{
|
//foreach (var productDto in items)
|
||||||
this.Add(productDto);
|
//{
|
||||||
}
|
// this.UpdateCollection(productDto, false);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : ObservableCollection<OrderDtoTableItem>
|
public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : FastObservableCollection<OrderDtoTableItem>
|
||||||
{
|
{
|
||||||
private readonly SemaphoreSlim _semaphoreSlim = new(1);
|
private readonly SemaphoreSlim _semaphoreSlim = new(1);
|
||||||
|
|
||||||
|
|
@ -62,26 +94,81 @@ public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : Obse
|
||||||
|
|
||||||
var items = (await fruitBankSignalRClient.GetAllOrderDtoTableItems() ?? []);
|
var items = (await fruitBankSignalRClient.GetAllOrderDtoTableItems() ?? []);
|
||||||
|
|
||||||
Clear();
|
//Clear();
|
||||||
foreach (var orderDto in items)
|
this.Replace(items);
|
||||||
{
|
//foreach (var orderDto in items)
|
||||||
this.Add(orderDto);
|
//{
|
||||||
}
|
// this.UpdateCollection(orderDto, false);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class DatabaseTableBase<TDataItem> : SignalRDataSourceObservable<TDataItem> where TDataItem : class, IId<int>
|
||||||
|
{
|
||||||
|
protected DatabaseTableBase(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds) : base(signalRClient, signalRCrudTags, contextIds)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//protected readonly SemaphoreSlim _semaphoreSlim = new(1);
|
||||||
|
|
||||||
|
//public async Task<OrderDtoTable> LoadDataAsync(bool onlyIfEmpty = true)
|
||||||
|
//{
|
||||||
|
// if (onlyIfEmpty && Count != 0) return this;
|
||||||
|
|
||||||
|
// using (await _semaphoreSlim.UseWaitAsync())
|
||||||
|
// {
|
||||||
|
// if (Count != 0) return this;
|
||||||
|
|
||||||
|
// var items = (await fruitBankSignalRClient.GetAllOrderDtoTableItems() ?? []);
|
||||||
|
|
||||||
|
// Clear();
|
||||||
|
// foreach (var orderDto in items)
|
||||||
|
// {
|
||||||
|
// this.Add(orderDto);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return this;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LoadingPanelVisibility
|
||||||
|
{
|
||||||
|
public static bool Visible =false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ObjectLock
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<Type, SemaphoreSlim> SemaphoresByType = new();
|
||||||
|
|
||||||
|
public static SemaphoreSlim GetSemaphore<TObject>()
|
||||||
|
{
|
||||||
|
lock (SemaphoresByType)
|
||||||
|
{
|
||||||
|
if (!SemaphoresByType.TryGetValue(typeof(TObject), out var semaphore))
|
||||||
|
{
|
||||||
|
semaphore = new SemaphoreSlim(1);
|
||||||
|
SemaphoresByType[typeof(TObject)] = semaphore;
|
||||||
|
}
|
||||||
|
|
||||||
|
return semaphore;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class DatabaseClient : DatabaseClientBase
|
public class DatabaseClient : DatabaseClientBase
|
||||||
{
|
{
|
||||||
private FruitBankSignalRClient _fruitBankSignalRClient;
|
private readonly FruitBankSignalRClient _fruitBankSignalRClient;
|
||||||
|
|
||||||
public DatabaseClient(FruitBankSignalRClient fruitBankSignalRClient)
|
public DatabaseClient(FruitBankSignalRClient fruitBankSignalRClient)
|
||||||
{
|
{
|
||||||
_fruitBankSignalRClient = fruitBankSignalRClient;
|
_fruitBankSignalRClient = fruitBankSignalRClient;
|
||||||
|
|
||||||
AddTable(new ProductDtoTable(_fruitBankSignalRClient));
|
AddTable(new ProductDtoTable(_fruitBankSignalRClient));
|
||||||
|
AddTable(new ShippingItemTable(_fruitBankSignalRClient));
|
||||||
AddTable(new OrderDtoTable(_fruitBankSignalRClient));
|
AddTable(new OrderDtoTable(_fruitBankSignalRClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
using AyCode.Core.Extensions;
|
using AyCode.Core.Extensions;
|
||||||
using AyCode.Core.Loggers;
|
using AyCode.Core.Loggers;
|
||||||
using AyCode.Services.SignalRs;
|
using AyCode.Services.SignalRs;
|
||||||
|
using AyCode.Utils.Extensions;
|
||||||
using DevExpress.Blazor;
|
using DevExpress.Blazor;
|
||||||
using FruitBank.Common.Dtos;
|
using FruitBank.Common.Dtos;
|
||||||
using FruitBank.Common.Models;
|
using FruitBank.Common.Models;
|
||||||
|
|
@ -31,7 +32,7 @@ public partial class MainLayout : LayoutComponentBase
|
||||||
// Toast fields
|
// Toast fields
|
||||||
private DxToast orderNotificationToast;
|
private DxToast orderNotificationToast;
|
||||||
private string toastTitle = "Értesítő!";
|
private string toastTitle = "Értesítő!";
|
||||||
private string toastMessage = "";
|
private string? toastMessage;
|
||||||
private string? toastOrderNumber;
|
private string? toastOrderNumber;
|
||||||
private DateTime? toastDateOfReceipt;
|
private DateTime? toastDateOfReceipt;
|
||||||
|
|
||||||
|
|
@ -59,21 +60,29 @@ public partial class MainLayout : LayoutComponentBase
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toastOrderNumber = null;
|
||||||
|
toastDateOfReceipt = null;
|
||||||
|
|
||||||
|
toastMessage = notificationMessage.Message;
|
||||||
|
|
||||||
var orderDto = notificationMessage.Content;
|
var orderDto = notificationMessage.Content;
|
||||||
if ((orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) ?? LoggedInModel.IsRevisor) || orderDto?.MeasurementOwnerId == 0)
|
var hasPermission = orderDto == null || (orderDto.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) || orderDto.MeasurementOwnerId == 0);
|
||||||
|
|
||||||
|
if (orderDto != null && hasPermission)
|
||||||
{
|
{
|
||||||
toastMessage = notificationMessage.Message;
|
toastOrderNumber = orderDto.CustomOrderNumber;
|
||||||
toastOrderNumber = orderDto?.CustomOrderNumber;
|
toastDateOfReceipt = orderDto.DateOfReceipt;
|
||||||
toastDateOfReceipt = orderDto?.DateOfReceipt;
|
|
||||||
|
|
||||||
_logger.Debug($"NotificationMessage received. {toastMessage}");
|
|
||||||
|
|
||||||
await InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
orderNotificationToast?.Show();
|
|
||||||
StateHasChanged();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!hasPermission) return;
|
||||||
|
|
||||||
|
_logger.Debug($"NotificationMessage received. {toastMessage}");
|
||||||
|
|
||||||
|
await InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
orderNotificationToast?.Show();
|
||||||
|
StateHasChanged();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLogoutClick()
|
private void OnLogoutClick()
|
||||||
|
|
|
||||||
|
|
@ -37,14 +37,16 @@
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (LoggedInModel.IsDeveloper)
|
@if (LoggedInModel.IsAdministrator)
|
||||||
{
|
{
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link" href="OrdersAdmin">
|
<NavLink class="nav-link" href="OrdersAdmin">
|
||||||
<span class="icon counter-icon" aria-hidden="true"></span> Rendelések - Adminisztrátor
|
<span class="icon counter-icon" aria-hidden="true"></span> Rendelések - Adminisztrátor
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
@if (LoggedInModel.IsDeveloper)
|
||||||
|
{
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link" href="ShippingsAdmin">
|
<NavLink class="nav-link" href="ShippingsAdmin">
|
||||||
<span class="icon counter-icon" aria-hidden="true"></span> Szállítmányok - Adminisztrátor
|
<span class="icon counter-icon" aria-hidden="true"></span> Szállítmányok - Adminisztrátor
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
@using FruitBank.Common
|
@using FruitBank.Common
|
||||||
@using FruitBank.Common.Dtos
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBank.Common.Entities
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBank.Common.Enums
|
||||||
@using FruitBank.Common.SignalRs
|
@using FruitBank.Common.SignalRs
|
||||||
@using FruitBankHybrid.Shared.Components
|
@using FruitBankHybrid.Shared.Components
|
||||||
@using FruitBankHybrid.Shared.Services
|
@using FruitBankHybrid.Shared.Services
|
||||||
|
|
@ -22,35 +23,43 @@
|
||||||
Text="Adatok szinkronizálása folyamatban...">
|
Text="Adatok szinkronizálása folyamatban...">
|
||||||
|
|
||||||
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
||||||
<DxFormLayoutItem Caption="Dátum" ColSpanMd="2"
|
<DxFormLayoutItem Caption="Dátum" ColSpanMd="3"
|
||||||
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")">
|
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")">
|
||||||
<DxDateEdit CssClass="cw-320"
|
<div class="container-fluid p-0">
|
||||||
DisplayFormat="m"
|
<div class="row">
|
||||||
Format="m"
|
<div class="col-9 p-0">
|
||||||
Context="ctxOrderDate"
|
<DxDateEdit DisplayFormat="m"
|
||||||
Date="@(SelectedOrder?.DateOfReceiptOrCreated.Date ?? DateTime.Now.Date)"
|
Format="m"
|
||||||
CustomDisabledDate="@OnCustomDisabledMeasuringDate"
|
Context="ctxOrderDate"
|
||||||
DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
|
Date="@(SelectedOrder?.DateOfReceiptOrCreated.Date ?? DateTime.Now.Date)"
|
||||||
InputId="deDisabledDates"
|
CustomDisabledDate="@OnCustomDisabledMeasuringDate"
|
||||||
PickerDisplayMode="DatePickerDisplayMode.Calendar">
|
DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
|
||||||
<DayCellTemplate>
|
InputId="deDisabledDates"
|
||||||
@{
|
PickerDisplayMode="DatePickerDisplayMode.Calendar">
|
||||||
var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate);
|
<DayCellTemplate>
|
||||||
if (!cssClass.IsNullOrWhiteSpace())
|
@{
|
||||||
{
|
var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate);
|
||||||
<a class="@GetMeasuringDateCssClassNames(ctxOrderDate)">@ctxOrderDate.Day.ToString()</a>
|
if (!cssClass.IsNullOrWhiteSpace())
|
||||||
}
|
{
|
||||||
else
|
<a class="@GetMeasuringDateCssClassNames(ctxOrderDate)">@ctxOrderDate.Day.ToString()</a>
|
||||||
{
|
}
|
||||||
<a>@ctxOrderDate.Day.ToString()</a>
|
else
|
||||||
}
|
{
|
||||||
}
|
<a>@ctxOrderDate.Day.ToString()</a>
|
||||||
|
}
|
||||||
</DayCellTemplate>
|
}
|
||||||
</DxDateEdit>
|
or
|
||||||
|
</DayCellTemplate>
|
||||||
|
</DxDateEdit>
|
||||||
|
</div>
|
||||||
|
<div class="col-3 p-0">
|
||||||
|
<DxSpinEdit T="int" Value="1" Increment="1" MinValue="1" ValueChanged="async i => await RefreshOrdersFromDb(DateTime.Now, i)"></DxSpinEdit>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="6" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="5" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
||||||
<DxComboBox Data="@SelectedDayOrders"
|
<DxComboBox Data="@SelectedDayOrders"
|
||||||
@bind-Value="@SelectedOrder"
|
@bind-Value="@SelectedOrder"
|
||||||
Text="Válasszon időpontot..."
|
Text="Válasszon időpontot..."
|
||||||
|
|
@ -80,15 +89,15 @@
|
||||||
if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess)
|
if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess)
|
||||||
{
|
{
|
||||||
<DxFormLayoutItem ColSpanMd="2">
|
<DxFormLayoutItem ColSpanMd="2">
|
||||||
<DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)"
|
<DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)"
|
||||||
CssClass="w-100"
|
CssClass="w-100"
|
||||||
Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? " Indítás" : "Folyamatban...")"
|
Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? " Indítás" : "Folyamatban...")"
|
||||||
Click="() => OnStartMeasuringClick()" />
|
Click="() => OnStartMeasuringClick()" />
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<DxFormLayoutItem ColSpanMd="2" Caption="Indította" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? " text-success" : "" )">
|
<DxFormLayoutItem ColSpanMd="2" Caption="Indította" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? " text-success" : "")">
|
||||||
<DxTextBox Enabled="false" Text="@(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder?.MeasurementOwnerId)?.LastName)" />
|
<DxTextBox Enabled="false" Text="@(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder?.MeasurementOwnerId)?.LastName)" />
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
}
|
}
|
||||||
|
|
@ -112,15 +121,21 @@
|
||||||
}
|
}
|
||||||
else if (!HasMeasuringAccess)
|
else if (!HasMeasuringAccess)
|
||||||
{
|
{
|
||||||
<div style="margin-top: 50px;">
|
<div style="margin-top: 30px;">
|
||||||
<H3>Mások végzik a mérést!</H3>
|
<H3>Mások végzik a mérést!</H3>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Átvétel dátuma október 23. [AUDITED] 15:51 - Vegetable Kft. Rendelés azonosító: #8
|
string? orderNote;
|
||||||
|
if (!(orderNote = SelectedOrder?.OrderNotes.FirstOrDefault()?.Note).IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
<div class="container-fluid p-0" style="margin-top: 20px">
|
||||||
|
<b> Megjegyzés: </b><span>@(orderNote) </span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<div style="margin-top: 50px;">
|
<div style="margin-top: 30px;">
|
||||||
<h4 style="margin-bottom: 30px;" class="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
<h4 style="margin-bottom: 30px;" class="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
||||||
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
|
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
|
||||||
</h4>
|
</h4>
|
||||||
|
|
@ -130,7 +145,7 @@
|
||||||
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
|
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
|
||||||
AnimationType="LayoutAnimationType.Slide">
|
AnimationType="LayoutAnimationType.Slide">
|
||||||
<DataMappings>
|
<DataMappings>
|
||||||
<DxAccordionDataMapping Text="ProductName"></DxAccordionDataMapping>
|
<DxAccordionDataMapping Text=ProductName></DxAccordionDataMapping>
|
||||||
@* <DxAccordionDataMapping Text="OrderItemId" Level="1"></DxAccordionDataMapping> *@
|
@* <DxAccordionDataMapping Text="OrderItemId" Level="1"></DxAccordionDataMapping> *@
|
||||||
</DataMappings>
|
</DataMappings>
|
||||||
<ItemHeaderTextTemplate>
|
<ItemHeaderTextTemplate>
|
||||||
|
|
@ -148,7 +163,10 @@
|
||||||
if (isValidAndMeasured) cssClass = "text-success";
|
if (isValidAndMeasured) cssClass = "text-success";
|
||||||
else if (isValid) cssClass = string.Empty;
|
else if (isValid) cssClass = string.Empty;
|
||||||
|
|
||||||
<h5 class="@cssClass">@($"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]")</h5>
|
var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]";
|
||||||
|
if (selectedOrderItemDto.MeasuringStatus == MeasuringStatus.Audited) displayText = $"[{selectedOrderItemDto.MeasuringStatus}] " + displayText;
|
||||||
|
|
||||||
|
<h5 class="@cssClass">@(displayText)</h5>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</ItemHeaderTextTemplate>
|
</ItemHeaderTextTemplate>
|
||||||
|
|
@ -181,7 +199,7 @@
|
||||||
|
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
|
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
|
||||||
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItem)" CssClass="w-100"
|
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItem)" CssClass="w-100"
|
||||||
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
||||||
Enabled="@(selectedOrderItem.OrderItemPallets[^1].Id > 0)" />
|
Enabled="@(selectedOrderItem.OrderItemPallets[^1].Id > 0)" />
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
|
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ namespace FruitBankHybrid.Shared.Pages
|
||||||
private LoggerClient _logger = null!;
|
private LoggerClient _logger = null!;
|
||||||
private string _errorText;
|
private string _errorText;
|
||||||
|
|
||||||
|
private int _lastDaysCount = 1;
|
||||||
public bool HasMeasuringAccess;
|
public bool HasMeasuringAccess;
|
||||||
public bool LoadingPanelVisible { get; set; } = true;
|
public bool LoadingPanelVisible { get; set; } = true;
|
||||||
public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false;
|
public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false;
|
||||||
|
|
@ -48,7 +49,7 @@ namespace FruitBankHybrid.Shared.Pages
|
||||||
|
|
||||||
FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived;
|
FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived;
|
||||||
|
|
||||||
await RefreshOrdersFromDb(DateTime.Now);
|
await RefreshOrdersFromDb(DateTime.Now, _lastDaysCount);
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,12 +146,14 @@ namespace FruitBankHybrid.Shared.Pages
|
||||||
_logger.Error($"SignalRClientOnMessageReceived message == null");
|
_logger.Error($"SignalRClientOnMessageReceived message == null");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
private async Task RefreshOrdersFromDb(DateTime dateTime, int lastDaysCount)
|
||||||
{
|
{
|
||||||
SelectedDate = dateTime;
|
|
||||||
LoadingPanelVisible = true;
|
LoadingPanelVisible = true;
|
||||||
|
|
||||||
|
_lastDaysCount = lastDaysCount;
|
||||||
|
SelectedDate = dateTime;
|
||||||
|
|
||||||
var orders = (await FruitBankSignalRClient.GetPendingOrderDtosForMeasuring() ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
var orders = (await FruitBankSignalRClient.GetPendingOrderDtosForMeasuring(_lastDaysCount) ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
|
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
|
|
@ -170,7 +173,7 @@ namespace FruitBankHybrid.Shared.Pages
|
||||||
LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J.
|
LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J.
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime);
|
private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime, _lastDaysCount);
|
||||||
|
|
||||||
private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
|
private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
|
||||||
=> MeasurementService.OnCustomDisabledDate(args, _measuringDates);
|
=> MeasurementService.OnCustomDisabledDate(args, _measuringDates);
|
||||||
|
|
@ -274,7 +277,7 @@ namespace FruitBankHybrid.Shared.Pages
|
||||||
|
|
||||||
private async Task OnOrdersRefreshClick()
|
private async Task OnOrdersRefreshClick()
|
||||||
{
|
{
|
||||||
await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now);
|
await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now, _lastDaysCount);
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,17 @@
|
||||||
@page "/OrdersAdmin"
|
@page "/OrdersAdmin"
|
||||||
@using FruitBank.Common.Dtos
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBankHybrid.Shared.Components
|
@using FruitBankHybrid.Shared.Components
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
<h3>Rendelések - Adminisztrátor</h3>
|
<h3>Rendelések - Adminisztrátor</h3>
|
||||||
|
|
||||||
<DxDialogProvider />
|
<DxDialogProvider />
|
||||||
|
|
||||||
<div style="margin-top: 30px;">
|
<div style="margin-top: 30px;">
|
||||||
|
|
||||||
<DxLoadingPanel @bind-Visible="LoadingPanelVisible"
|
<DxLoadingPanel @bind-Visible="LoadingPanelVisibility.Visible"
|
||||||
IsContentBlocked="true"
|
IsContentBlocked="true"
|
||||||
ApplyBackgroundShading="true"
|
ApplyBackgroundShading="true"
|
||||||
IndicatorAreaVisible="true"
|
IndicatorAreaVisible="false"
|
||||||
IsContentVisible="true"
|
|
||||||
IndicatorAnimationType="WaitIndicatorAnimationType.Spin"
|
|
||||||
Text="Adatok szinkronizálása folyamatban...">
|
Text="Adatok szinkronizálása folyamatban...">
|
||||||
|
|
||||||
@* @bind-ActiveTabIndex="@ActiveTabIndex" *@
|
@* @bind-ActiveTabIndex="@ActiveTabIndex" *@
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,12 @@
|
||||||
using AyCode.Core.Loggers;
|
using AyCode.Core.Loggers;
|
||||||
using AyCode.Services.Server.SignalRs;
|
using AyCode.Services.Server.SignalRs;
|
||||||
using AyCode.Services.SignalRs;
|
using AyCode.Services.SignalRs;
|
||||||
|
using AyCode.Utils.Extensions;
|
||||||
using DevExpress.Blazor;
|
using DevExpress.Blazor;
|
||||||
using FruitBank.Common.Dtos;
|
using FruitBank.Common.Dtos;
|
||||||
using FruitBank.Common.Models;
|
using FruitBank.Common.Models;
|
||||||
using FruitBank.Common.SignalRs;
|
using FruitBank.Common.SignalRs;
|
||||||
|
using FruitBankHybrid.Shared.Databases;
|
||||||
using FruitBankHybrid.Shared.Services.Loggers;
|
using FruitBankHybrid.Shared.Services.Loggers;
|
||||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
using Mango.Nop.Core.Loggers;
|
using Mango.Nop.Core.Loggers;
|
||||||
|
|
@ -16,6 +18,7 @@ namespace FruitBankHybrid.Shared.Pages;
|
||||||
|
|
||||||
public partial class OrdersAdmin : ComponentBase
|
public partial class OrdersAdmin : ComponentBase
|
||||||
{
|
{
|
||||||
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||||
[Inject] public required NavigationManager NavManager { get; set; }
|
[Inject] public required NavigationManager NavManager { get; set; }
|
||||||
|
|
@ -23,12 +26,11 @@ public partial class OrdersAdmin : ComponentBase
|
||||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||||
|
|
||||||
public required IGrid gridOrder;
|
public required IGrid gridOrder;
|
||||||
private List<ProductDto>? ProductDtos { get; set; } = null!;
|
private IEnumerable<ProductDto>? ProductDtos { get; set; } = [];
|
||||||
private List<OrderDto>? OrderDtos { get; set; } = null!;
|
private List<OrderDto>? OrderDtos { get; set; } = [];
|
||||||
private List<OrderItemDto>? OrderItemDtos { get; set; } = null!;
|
private List<OrderItemDto>? OrderItemDtos { get; set; } = [];
|
||||||
|
|
||||||
public bool AutoCollapseDetailRow { get; set; }
|
public bool AutoCollapseDetailRow { get; set; }
|
||||||
public bool LoadingPanelVisible { get; set; } = true;
|
|
||||||
|
|
||||||
private ILogger _logger = null!;
|
private ILogger _logger = null!;
|
||||||
public int ActiveTabIndex;
|
public int ActiveTabIndex;
|
||||||
|
|
@ -37,42 +39,52 @@ public partial class OrdersAdmin : ComponentBase
|
||||||
{
|
{
|
||||||
if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login");
|
if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login");
|
||||||
|
|
||||||
LoadingPanelVisible = true;
|
|
||||||
|
|
||||||
_logger = new LoggerClient<OrdersAdmin>(LogWriters.ToArray());
|
_logger = new LoggerClient<OrdersAdmin>(LogWriters.ToArray());
|
||||||
_logger.Info("OnInitializedAsync");
|
_logger.Info("OnInitializedAsync");
|
||||||
|
|
||||||
await RefreshOrdersFromDb(DateTime.Now);
|
await ReloadDataFromDb(false);
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
{
|
{
|
||||||
LoadingPanelVisible = true;
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
|
||||||
OrderDtos = (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o=>o.Id).ToList();//.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
{
|
||||||
|
if (ProductDtos == null || !ProductDtos.Any() || forceReload) ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
|
||||||
|
}
|
||||||
|
|
||||||
LoadingPanelVisible = false;
|
//using (await ObjectLock.GetSemaphore<OrderItemDto>().UseWaitAsync())
|
||||||
|
//{
|
||||||
|
// if (OrderItemDtos == null) OrderItemDtos = await FruitBankSignalRClient.GetAllOrderItemDtos() ?? [];
|
||||||
|
// else if (OrderItemDtos.Count == 0 || forceReload)
|
||||||
|
// {
|
||||||
|
// OrderItemDtos.Clear();
|
||||||
|
// OrderItemDtos.AddRange(await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task OnActiveTabChanged(int activeTabIndex)
|
protected async Task OnActiveTabChanged(int activeTabIndex)
|
||||||
{
|
{
|
||||||
ActiveTabIndex = activeTabIndex;
|
ActiveTabIndex = activeTabIndex;
|
||||||
LoadingPanelVisible = true;
|
//LoadingPanelVisibility.Visible = true;
|
||||||
|
|
||||||
switch (ActiveTabIndex)
|
switch (ActiveTabIndex)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
ProductDtos ??= (await FruitBankSignalRClient.GetProductDtos() ?? []); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
//ProductDtos ??= (await FruitBankSignalRClient.GetProductDtos() ?? []); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
OrderDtos ??= (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
//OrderDtos ??= (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
OrderItemDtos ??= (await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
//OrderItemDtos ??= (await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadingPanelVisible = false;
|
//LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,36 +1,35 @@
|
||||||
@page "/ShippingsAdmin"
|
@page "/ShippingsAdmin"
|
||||||
@using FruitBank.Common.Dtos
|
@using FruitBank.Common.Dtos
|
||||||
@using FruitBankHybrid.Shared.Components
|
@using FruitBankHybrid.Shared.Components
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
<h3>Szállítmányok - Adminisztrátor</h3>
|
<h3>Szállítmányok - Adminisztrátor</h3>
|
||||||
|
|
||||||
<DxDialogProvider />
|
<DxDialogProvider />
|
||||||
|
|
||||||
<div style="margin-top: 30px;">
|
<div style="margin-top: 30px;">
|
||||||
|
|
||||||
<DxLoadingPanel @bind-Visible="LoadingPanelVisible"
|
<DxLoadingPanel @bind-Visible="LoadingPanelVisibility.Visible"
|
||||||
IsContentBlocked="true"
|
IsContentBlocked="true"
|
||||||
ApplyBackgroundShading="true"
|
ApplyBackgroundShading="true"
|
||||||
IndicatorAreaVisible="true"
|
IndicatorAreaVisible="false"
|
||||||
IsContentVisible="true"
|
|
||||||
IndicatorAnimationType="WaitIndicatorAnimationType.Spin"
|
|
||||||
Text="Adatok szinkronizálása folyamatban...">
|
Text="Adatok szinkronizálása folyamatban...">
|
||||||
|
|
||||||
@* @bind-ActiveTabIndex="@ActiveTabIndex" *@
|
@* @bind-ActiveTabIndex="@ActiveTabIndex" *@
|
||||||
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)" RenderMode="TabsRenderMode.AllTabs" AllowTabReorder="true">
|
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)" RenderMode="TabsRenderMode.AllTabs" AllowTabReorder="true">
|
||||||
<DxTabPage Text="Termékek">
|
<DxTabPage Text="Termékek">
|
||||||
<GridProductDtoTemplate IsMasterGrid="true"></GridProductDtoTemplate>
|
<GridProductDtoTemplate @ref="gridProductDtoTemplate" IsMasterGrid="true"></GridProductDtoTemplate>
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
<DxTabPage Text="Szállítmányok">
|
<DxTabPage Text="Szállítmányok">
|
||||||
<GridShipping Shippings="Shippings" IsMasterGrid="true"></GridShipping>
|
<GridShipping @ref="gridShipping" Shippings="Shippings" IsMasterGrid="true"></GridShipping>
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
<DxTabPage Text="Szállítólevelek">
|
<DxTabPage Text="Szállítólevelek">
|
||||||
<GridShippingDocument ShippingDocuments="ShippingDocuments" Shippings="Shippings" IsMasterGrid="true"></GridShippingDocument>
|
<GridShippingDocument @ref="gridShippingDocument" ShippingDocuments="ShippingDocuments" Shippings="Shippings" IsMasterGrid="true"></GridShippingDocument>
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
<DxTabPage Text="Szállítólevél tételek">
|
<DxTabPage Text="Szállítólevél tételek">
|
||||||
<GridShippingItem ShippingItems="ShippingItems" ShippingDocuments="ShippingDocuments" IsMasterGrid="true"></GridShippingItem>
|
<GridShippingItemTemplate @ref="gridShippingItemTemplate" ShippingItems="ShippingItems" ShippingDocuments="ShippingDocuments" IsMasterGrid="true"></GridShippingItemTemplate>
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
<DxTabPage Text="Mérések">
|
<DxTabPage Text="Mérések">
|
||||||
<GridShippingItemPallets IsMasterGrid="true"></GridShippingItemPallets>
|
<GridShippingItemPallets @ref="gridShippingItemPallet" IsMasterGrid="true" ShippingItemPallets="ShippingItemPallets"></GridShippingItemPallets>
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
</DxTabs>
|
</DxTabs>
|
||||||
</DxLoadingPanel>
|
</DxLoadingPanel>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@ using DevExpress.Blazor;
|
||||||
using DevExpress.ClipboardSource.SpreadsheetML;
|
using DevExpress.ClipboardSource.SpreadsheetML;
|
||||||
using FruitBank.Common.Dtos;
|
using FruitBank.Common.Dtos;
|
||||||
using FruitBank.Common.Entities;
|
using FruitBank.Common.Entities;
|
||||||
|
using FruitBank.Common.Interfaces;
|
||||||
using FruitBank.Common.Models;
|
using FruitBank.Common.Models;
|
||||||
|
using FruitBankHybrid.Shared.Components;
|
||||||
|
using FruitBankHybrid.Shared.Components.Grids.ShippingItems;
|
||||||
using FruitBankHybrid.Shared.Databases;
|
using FruitBankHybrid.Shared.Databases;
|
||||||
using FruitBankHybrid.Shared.Services.Loggers;
|
using FruitBankHybrid.Shared.Services.Loggers;
|
||||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
|
|
@ -21,14 +24,18 @@ public partial class ShippingsAdmin : ComponentBase
|
||||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||||
[Inject] public required DatabaseClient Database { get; set; }
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
public IGrid gridShipping;
|
private GridProductDtoTemplate gridProductDtoTemplate;
|
||||||
//private List<ProductDto>? ProductDtos { get; set; } = null!;
|
private GridShipping gridShipping;
|
||||||
private List<Shipping>? Shippings { get; set; } = null!;
|
private GridShippingDocument gridShippingDocument;
|
||||||
private List<ShippingDocument>? ShippingDocuments { get; set; } = null!;
|
private GridShippingItemTemplate gridShippingItemTemplate;
|
||||||
private List<ShippingItem>? ShippingItems { get; set; } = null!;
|
private GridShippingItemPallets gridShippingItemPallet;
|
||||||
|
|
||||||
|
public List<Shipping> Shippings { get; set; } = [];
|
||||||
|
public List<ShippingDocument> ShippingDocuments { get; set; } = [];
|
||||||
|
public List<ShippingItem> ShippingItems { get; set; } = [];
|
||||||
|
public List<ShippingItemPallet> ShippingItemPallets { get; set; } = [];
|
||||||
|
|
||||||
public bool AutoCollapseDetailRow { get; set; }
|
public bool AutoCollapseDetailRow { get; set; }
|
||||||
public bool LoadingPanelVisible { get; set; } = true;
|
|
||||||
|
|
||||||
private ILogger _logger = null!;
|
private ILogger _logger = null!;
|
||||||
public int ActiveTabIndex;
|
public int ActiveTabIndex;
|
||||||
|
|
@ -37,7 +44,7 @@ public partial class ShippingsAdmin : ComponentBase
|
||||||
{
|
{
|
||||||
if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login");
|
if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login");
|
||||||
|
|
||||||
LoadingPanelVisible = true;
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
|
||||||
_logger = new LoggerClient<ShippingsAdmin>(LogWriters.ToArray());
|
_logger = new LoggerClient<ShippingsAdmin>(LogWriters.ToArray());
|
||||||
_logger.Info("OnInitializedAsync");
|
_logger.Info("OnInitializedAsync");
|
||||||
|
|
@ -48,35 +55,51 @@ public partial class ShippingsAdmin : ComponentBase
|
||||||
|
|
||||||
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
||||||
{
|
{
|
||||||
LoadingPanelVisible = true;
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
|
||||||
Shippings = (await FruitBankSignalRClient.GetShippings() ?? []).OrderByDescending(o=>o.Id).ToList();//.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
|
||||||
|
|
||||||
LoadingPanelVisible = false;
|
//Shippings.Clear();
|
||||||
|
//Shippings.AddRange((await FruitBankSignalRClient.GetShippings() ?? []).OrderByDescending(o => o.Id));//.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
|
|
||||||
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task OnActiveTabChanged(int activeTabIndex)
|
protected async Task OnActiveTabChanged(int activeTabIndex)
|
||||||
{
|
{
|
||||||
ActiveTabIndex = activeTabIndex;
|
ActiveTabIndex = activeTabIndex;
|
||||||
LoadingPanelVisible = true;
|
LoadingPanelVisibility.Visible = true;
|
||||||
|
|
||||||
switch (ActiveTabIndex)
|
switch (ActiveTabIndex)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
await Database.ProductDtoTable.LoadDataAsync(true);
|
//await Database.ProductDtoTable.LoadDataAsync(true);
|
||||||
|
gridProductDtoTemplate.Grid.Reload();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
Shippings ??= (await FruitBankSignalRClient.GetShippings() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
if (Shippings.Count == 0)
|
||||||
break;
|
{
|
||||||
case 2:
|
//Shippings.AddRange((await FruitBankSignalRClient.GetShippings() ?? []).OrderByDescending(o => o.Id)); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();}
|
||||||
ShippingDocuments ??= (await FruitBankSignalRClient.GetShippingDocuments() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
}
|
||||||
|
|
||||||
|
gridShipping.Grid.Reload();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (ShippingDocuments.Count == 0)
|
||||||
|
{
|
||||||
|
//ShippingDocuments.AddRange((await FruitBankSignalRClient.GetShippingDocuments() ?? []).OrderByDescending(o => o.Id)); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
gridShippingDocument.Grid.Reload();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ShippingItems ??= (await FruitBankSignalRClient.GetShippingItems() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
gridShippingItemTemplate.Grid.Reload();
|
||||||
|
//if(ShippingItems.Count=0) ShippingItems.AddRange((await FruitBankSignalRClient.GetShippingItems() ?? []).OrderByDescending(o => o.Id)); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
gridShippingItemPallet.gridOrderItemPallet.Reload();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadingPanelVisible = false;
|
LoadingPanelVisibility.Visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -177,8 +177,8 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
|
||||||
public Task<List<OrderDto>?> GetPendingOrderDtos()
|
public Task<List<OrderDto>?> GetPendingOrderDtos()
|
||||||
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtos);
|
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtos);
|
||||||
|
|
||||||
public Task<List<OrderDto>?> GetPendingOrderDtosForMeasuring()
|
public Task<List<OrderDto>?> GetPendingOrderDtosForMeasuring(int lastDaysCount)
|
||||||
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtosForMeasuring);
|
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtosForMeasuring, [lastDaysCount]);
|
||||||
|
|
||||||
public Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds)
|
public Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds)
|
||||||
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllOrderDtoByIds, [orderIds]);
|
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllOrderDtoByIds, [orderIds]);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ namespace FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
[Serializable]
|
[Serializable]
|
||||||
[DebuggerDisplay("Count = {Count}")]
|
[DebuggerDisplay("Count = {Count}")]
|
||||||
public class SignalRDataSourceList<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds)
|
public class SignalRDataSourceList<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds)
|
||||||
: AcSignalRDataSource<TDataItem, int, IList<TDataItem>>(signalRClient, signalRCrudTags, contextIds) where TDataItem : class, IId<int>;
|
: AcSignalRDataSource<TDataItem, int, List<TDataItem>>(signalRClient, signalRCrudTags, contextIds) where TDataItem : class, IId<int>;
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
[DebuggerDisplay("Count = {Count}")]
|
[DebuggerDisplay("Count = {Count}")]
|
||||||
|
|
|
||||||
|
|
@ -24,18 +24,33 @@
|
||||||
<Reference Include="AyCode.Core">
|
<Reference Include="AyCode.Core">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AyCode.Core.Server">
|
||||||
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.Server.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="AyCode.Entities">
|
<Reference Include="AyCode.Entities">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AyCode.Entities.Server">
|
||||||
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.Server.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="AyCode.Interfaces">
|
<Reference Include="AyCode.Interfaces">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AyCode.Interfaces.Server">
|
||||||
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.Server.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="AyCode.Models">
|
<Reference Include="AyCode.Models">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AyCode.Models.Server">
|
||||||
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="AyCode.Services">
|
<Reference Include="AyCode.Services">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AyCode.Services.Server">
|
||||||
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="AyCode.Utils">
|
<Reference Include="AyCode.Utils">
|
||||||
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath>
|
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
|
@ -44,6 +59,9 @@
|
||||||
<Reference Include="DevExpress.Blazor.v25.1.Viewer"></Reference>
|
<Reference Include="DevExpress.Blazor.v25.1.Viewer"></Reference>
|
||||||
<Reference Include="DevExpress.Data.v25.1"></Reference>
|
<Reference Include="DevExpress.Data.v25.1"></Reference>
|
||||||
<Reference Include="DevExpress.Utils.v25.1"></Reference>
|
<Reference Include="DevExpress.Utils.v25.1"></Reference>
|
||||||
|
<Reference Include="Mango.Nop.Core">
|
||||||
|
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
@ -71,6 +71,9 @@
|
||||||
<Reference Include="DevExpress.Utils.v25.1">
|
<Reference Include="DevExpress.Utils.v25.1">
|
||||||
|
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Mango.Nop.Core">
|
||||||
|
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ namespace FruitBankHybrid
|
||||||
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
builder.Services.AddSingleton<ObjectLock>();
|
||||||
builder.Services.AddSingleton<LoggedInModel>();
|
builder.Services.AddSingleton<LoggedInModel>();
|
||||||
builder.Services.AddScoped<FruitBankSignalRClient>();
|
builder.Services.AddScoped<FruitBankSignalRClient>();
|
||||||
builder.Services.AddSingleton<DatabaseClient>();
|
builder.Services.AddSingleton<DatabaseClient>();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue